2010-01-03 3 views
1

조용한 환경에 있어야하는 응용 프로그램을 작성하고 있습니다. 이를 위해 마이크를 읽는 전원을 주기적으로 확인합니다. (dBFS 또는이 경우 [0, 1] 간격의 부동 소수점으로 반환되는 값을 알고 있습니다.)AudioQueueGetProperty가 kAudioQueueProperty_CurrentLevelMeter 속성의 범위를 벗어난 값을 반환합니다.

내 문제는 아래 코드가 제대로 작동한다는 것입니다. 18466064732283753157623808.00000을 반환합니다. AudioQueueGetProperty가 실패를 나타내는 NSLog 출력이 표시되지 않습니다. 이상한 값은 입니다. 항상입니다.

-(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; 
} 

무엇을 제공합니까? 값의 비트 패턴이 아마도 단서를 제공합니까?

답변

6

오디오 레벨 미터링을 활성화 했습니까?

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

적어도 내 질문에 답했습니다. 감사 – virtualnobi