У меня есть аудиоплеер, который имеет возможность переключать аудиовыход с динамика на приемник/наушник (независимо от того, подключена ли гарнитура), когда датчик приближения уведомляет 1. Ниже приведен мой код для этого.
- (void) switchAudioOutput:(NSString*)output{
AVAudioSession* audioSession = [AVAudioSession sharedInstance];
BOOL success;
NSError* error;
if([output isEqualToString:keAudioOutputReciever]){
//Force current audio out through reciever
//set the audioSession override
success = [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideNone
error:&error];
if (!success)
NSLog(@"AVAudioSession error overrideOutputAudioPort:%@",error);
//activate the audio session
success = [audioSession setActive:YES error:&error];
if (!success)
NSLog(@"AVAudioSession error activating: %@",error);
else
NSLog(@"AVAudioSession active with override: AVAudioSessionPortOverrideNone");
}else if([output isEqualToString:keAudioOutputSpeaker]){
//set the audioSession override
success = [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
error:&error];
if (!success)
NSLog(@"AVAudioSession error overrideOutputAudioPort:%@",error);
//activate the audio session
success = [audioSession setActive:YES error:&error];
if (!success)
NSLog(@"AVAudioSession error activating: %@",error);
else
NSLog(@"AVAudioSession active with override: AVAudioSessionPortOverrideSpeaker");
}
}
Это было основано на ответе Toggle Button направить звук на динамик и приемник и ввести здесь описание ссылки. Я заметил, что это только принудительно передает аудио на динамик, но не гарантирует, что маршрут идет только к приемнику. Более того, при переключении на динамик я получаю следующую ошибку:
Ошибка AVAudioSession overrideOutputAudioPort:Error Domain=NSOSStatusErrorDomain Code=-50 «Операция не может быть завершена. (Ошибка OSStatus -50.)»