AVAudioRecorder averagePowerForChannel всегда возвращает -120.0

Я пытаюсь использовать метод AVAudioRecorder averagePowerForChannel для мониторинга уровней входного сигнала на микрофоне для приложения iPad / iPhone. У меня есть обратный вызов, который опрашивает средний уровень в цикле - на iPhone он работает нормально и возвращает разумные уровни, но по какой-то причине на iPad он всегда возвращает -120.0.

Вот часть моего кода настройки:

- (void) setupMic {
if (micInput) {
    [micInput release];
    micInput = nil;
}
NSURL *newURL = [[NSURL alloc] initFileURLWithPath:@"/dev/null"];

NSMutableDictionary *recordSettings = [[NSMutableDictionary alloc] init];

[recordSettings setObject:[NSNumber numberWithInt:kAudioFormatAppleLossless] forKey: AVFormatIDKey];
[recordSettings setObject:[NSNumber numberWithFloat:22050.0] forKey: AVSampleRateKey];
//  [recordSettings setObject:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey];
[recordSettings setObject:[NSNumber numberWithInt:12800] forKey:AVEncoderBitRateKey];
[recordSettings setObject:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
[recordSettings setObject:[NSNumber numberWithInt: AVAudioQualityLow] forKey: AVEncoderAudioQualityKey];

micInput = [[AVAudioRecorder alloc] initWithURL:newURL settings:recordSettings error:nil];
//  [micInput setMeteringEnabled:YES];

[newURL release];
[recordSettings removeAllObjects];
[recordSettings release];
}

А также мой метод начала записи:

- (void) startRecording {
NSLog(@"startRecording!");
[micInput pause];
[micInput prepareToRecord];
micInput.meteringEnabled = YES;
[micInput record];
[micInput updateMeters];
levelTimer = [[NSTimer alloc] initWithFireDate:[NSDate dateWithTimeIntervalSinceNow:0.0] interval:0.03 target:self selector:@selector(levelTimerCallback:) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:levelTimer forMode:NSDefaultRunLoopMode];
}

и немного обратного вызова levelTimer:

- (void)levelTimerCallback:(NSTimer *)timer {
[micInput updateMeters];
double avgPowerForChannel = pow(10, (0.05 * [micInput averagePowerForChannel:0]));
[micSprite receiveInput:avgPowerForChannel];

NSLog(@"Avg. Power: %f", [micInput averagePowerForChannel:0]);

 ...

}

Где на iPhone инструкция NSLog будет возвращать разумные значения, а iPad всегда будет возвращать -120,0.

Примечание: я использую это внутри приложения cocos2d. По какой-то причине, если я перезапускаю текущую сцену на iPad, уровни микрофона вернут правильные значения.

У кого-нибудь есть предложения? Я серьезно здесь в растерянности. Спасибо!

10
задан Mahesh 16 February 2011 в 21:51
поделиться