2010-01-03 10 views
1

J'écris une application qui nécessite que l'utilisateur soit dans un environnement silencieux. Pour ce faire, je vérifie périodiquement la puissance de lecture du microphone. (Je suis conscient de la valeur retournée étant en dBFS ou, dans ce cas, un flottant dans l'intervalle [0, 1].)AudioQueueGetProperty renvoie une valeur hors de portée pour la propriété kAudioQueueProperty_CurrentLevelMeter

Mon problème est que le code ci-dessous fonctionne très bien ... sauf quand il renvoie 18466064732283753157623808.00000. Je ne vois aucune sortie NSLog indiquant AudioQueueGetProperty retournant un échec. La valeur étrange est toujours la valeur mentionnée.

-(float)instantaneousPeakPower { 
    UInt32 dataSize = sizeof(AudioQueueLevelMeterState) * recordFormat.mChannelsPerFrame; 
    AudioQueueLevelMeterState *levels = (AudioQueueLevelMeterState*)malloc(dataSize); 

    OSStatus rc = AudioQueueGetProperty(audioQueue, kAudioQueueProperty_CurrentLevelMeter, levels, &dataSize); 
    if (rc) { 
    NSLog(@"NoiseLeveMeter>>takeSample - AudioQueueGetProperty(CurrentLevelMeter) returned %@", rc); 
    } 

    float channelAvg = 0; 
    for (int i = 0; i < recordFormat.mChannelsPerFrame; i++) { 
    channelAvg += levels[i].mPeakPower; 
    } 
    free(levels); 

    // This works because in this particular case one channel always has an mAveragePower of 0. 
    return channelAvg; 
} 

Ce qui donne? Est-ce que le modèle binaire de la valeur donne peut-être un indice?

Répondre

6

Avez-vous activé la mesure de niveau audio?

UInt32 trueValue = true; 
AudioQueueSetProperty(audioQueue,kAudioQueueProperty_EnableLevelMetering,&trueValue,sizeof (UInt32)); 
+0

Au moins vous avez répondu à ma - maintenant non-demandé - question! Merci – virtualnobi