2010-07-03 31 views
1

Est-il possible que xcode possède un indicateur de niveau audio?objectif c audiomètre

Je veux faire quelque chose comme ceci:

if (audioLevel = 100) { 
} 

ou quelque chose de similaire ...

Toutes les idées ?? Exemple de code s'il vous plaît?

Je suis TRÈS nouveau à l'objectif c donc plus j'explique le mieux! : D

+0

Xcode est juste un IDE - vous parlez probablement de Cocoa (Mac OS X) ou CocoaTouch (iPhone, iPad, etc.)? –

+0

Oui, c'est correct. – objectiveccoder001

Répondre

6

Malheureusement, il n'existe pas d'API très simple pour cela. Vous devez utiliser le niveau bas AudioToolbox.framework.

Heureusement, d'autres ont déjà résolu ce problème pour vous. Voici un peu de code que j'ai simplifié légèrement pour être des fonctions C droites, à partir de CocoaDev. Vous devez créer un lien vers AudioToolbox pour compiler ce code (see here for documentation on how to do so).

#import <AudioToolbox/AudioServices.h> 

AudioDeviceID getDefaultOutputDeviceID() 
{ 
    AudioDeviceID outputDeviceID = kAudioObjectUnknown; 

    // get output device device 
    OSStatus status = noErr; 
    AudioObjectPropertyAddress propertyAOPA; 
    propertyAOPA.mScope = kAudioObjectPropertyScopeGlobal; 
    propertyAOPA.mElement = kAudioObjectPropertyElementMaster; 
    propertyAOPA.mSelector = kAudioHardwarePropertyDefaultOutputDevice; 

    if (!AudioHardwareServiceHasProperty(kAudioObjectSystemObject, &propertyAOPA)) 
    { 
     printf("Cannot find default output device!"); 
     return outputDeviceID; 
    } 

    status = AudioHardwareServiceGetPropertyData(kAudioObjectSystemObject, &propertyAOPA, 0, NULL, (UInt32[]){sizeof(AudioDeviceID)}, &outputDeviceID); 

    if (status != 0) 
    { 
     printf("Cannot find default output device!"); 
    } 
    return outputDeviceID; 
} 

float getVolume() 
{ 
    Float32 outputVolume; 

    OSStatus status = noErr; 
    AudioObjectPropertyAddress propertyAOPA; 
    propertyAOPA.mElement = kAudioObjectPropertyElementMaster; 
    propertyAOPA.mSelector = kAudioHardwareServiceDeviceProperty_VirtualMasterVolume; 
    propertyAOPA.mScope = kAudioDevicePropertyScopeOutput; 

    AudioDeviceID outputDeviceID = getDefaultOutputDeviceID(); 

    if (outputDeviceID == kAudioObjectUnknown) 
    { 
     printf("Unknown device"); 
     return 0.0; 
    } 

    if (!AudioHardwareServiceHasProperty(outputDeviceID, &propertyAOPA)) 
    { 
     printf("No volume returned for device 0x%0x", outputDeviceID); 
     return 0.0; 
    } 

    status = AudioHardwareServiceGetPropertyData(outputDeviceID, &propertyAOPA, 0, NULL, (UInt32[]){sizeof(Float32)}, &outputVolume); 

    if (status) 
    { 
     printf("No volume returned for device 0x%0x", outputDeviceID); 
     return 0.0; 
    } 

    if (outputVolume < 0.0 || outputVolume > 1.0) return 0.0; 

    return outputVolume; 
} 

int main (int argc, char const *argv[]) 
{ 
    printf("%f", getVolume()); 
    return 0; 
} 

Notez qu'il existe également une fonction setVolume.

+0

Wow! Merci beaucoup! Vous venez de faire ma journée! : D – objectiveccoder001

+0

@Elijah: Heureux d'être utile. Si la réponse de quelqu'un a résolu votre problème, vous pouvez l'accepter comme réponse en cochant la case. :) –