AVAudioSession автоматически перенаправляет звук с iPhone?
У меня проблемы с AVAudioSession с использованием AVAudioRecorder в игре cocos2d, над которой я работаю.
Я пытаюсь захватить микрофонный вход, используя простой пример AVAudioRecorder, чтобы определить, когда пользователь издает звук в микрофоне (сам звук не имеет значения, поскольку я записываю в /dev/null).
Вот мой код настройки для микрофона:
NSURL *newURL = [[NSURL alloc] initFileURLWithPath:@"/dev/null"];
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord error: nil];
NSDictionary *recordSettings =
[[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithFloat: 22050.0], AVSampleRateKey,
[NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
[NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
[NSNumber numberWithInt: AVAudioQualityLow],
AVEncoderAudioQualityKey,
nil];
micInput = [[AVAudioRecorder alloc] initWithURL:newURL settings:recordSettings error:nil];
[newURL release];
[recordSettings release];
[micInput setMeteringEnabled:YES];
На iPhone с приведенным выше кодом сцена начинается с того, что все аудио (звуковые эффекты, фоновая музыка и т. Д.) Воспроизводятся с очень низким уровнем, потому что они воспроизводятся только через динамик телефона, а не через внешний динамик. Когда я проверяю это на iPad или iPod Touch, фоновый звук воспроизводится через внешний динамик, как и ожидалось. Это проблема, так как громкость игры резко снижается при игре на версии для iPhone во время этой конкретной части игры.
Когда я закомментирую строку настройки AVAudioSession, звуки воспроизводятся через внешний динамик, но, конечно, я больше не могу получить микрофонный вход. Есть ли обходной путь или решение этой проблемы? Мне нужно иметь возможность записи с AVAudioRecorder, но все еще иметь аудио выход из внешнего динамика iPhone.
Спасибо!
1 ответ
Попробуйте что-то вроде следующего после настройки аудио-сеанса:
UInt32 ASRoute = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (
kAudioSessionProperty_OverrideAudioRoute,
sizeof (ASRoute),
&ASRoute
);