Ответ 1
В каждом выпуске iOS больше свойств audioSession переносятся на AVFoundation, поэтому вы должны использовать их по своему усмотрению всякий раз, когда это доступно.
Так как iOS 6 kAudioSessionProperty_OverrideAudioRoute
представлен в AVAudioSession методом
- (BOOL)overrideOutputAudioPort:error:
Доступные значения: AVAudioSessionPortOverrideNone
и AVAudioSessionPortOverrideSpeaker
Вот пример аудио сессии, сконфигурированный полностью с помощью AVFoundation:
- (void)configureAVAudioSession
{
// Get your app audioSession singleton object
AVAudioSession *session = [AVAudioSession sharedInstance];
// Error handling
BOOL success;
NSError *error;
// set the audioSession category.
// Needs to be Record or PlayAndRecord to use audioRouteOverride:
success = [session setCategory:AVAudioSessionCategoryPlayAndRecord
error:&error];
if (!success) {
NSLog(@"AVAudioSession error setting category:%@",error);
}
// Set the audioSession override
success = [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
error:&error];
if (!success) {
NSLog(@"AVAudioSession error overrideOutputAudioPort:%@",error);
}
// Activate the audio session
success = [session setActive:YES error:&error];
if (!success) {
NSLog(@"AVAudioSession error activating: %@",error);
}
else {
NSLog(@"AudioSession active");
}
}
ОБНОВЛЕНИЕ
Начиная с iOS 7.0, API API сеансов аудио сессий теперь полностью устарел в пользу AVAudioSession.
ОБНОВЛЕНИЕ 2
- (BOOL)overrideOutputAudioPort:error:
- это метод, а не свойство, и он устанавливает базовое значение UInt32 для записи. Вы не можете получить текущее значение, и вы должны рассматривать метод как установку временного состояния. Если аудиомаршрут изменяется или прерывается, свойство сбрасывается до значения по умолчанию (AVAudioSessionPortOverrideNone
). Вы можете получать уведомления о прерываниях через AVAudioSessionDelegate
.