Как мне направлять аудио на спикер без использования функции AudioSessionSetProperty? - программирование
Подтвердить что ты не робот

Как мне направлять аудио на спикер без использования функции AudioSessionSetProperty?

Поскольку AudioSessionSetProperty может стать deprecated, я пытаюсь найти пример кода, как маршрутизировать аудио в speaker, используя другие средства.

Ранее я сделал следующее:

-(void)setSpeakerEnabled
{
    debugLog(@"%s",__FUNCTION__);
    UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;

    AudioSessionSetProperty (
                         kAudioSessionProperty_OverrideAudioRoute,
                         sizeof (audioRouteOverride),
                         &audioRouteOverride
                         );
}

Попытка получить тот же результат, но without call до AudioSessionSetProperty.

4b9b3361

Ответ 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.

Ответ 2

NSError *error;
[[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker 
                                                   error:&error];    
if(error)
{ 
    NSLog(@"Error: AudioSession cannot use speakers");
}

Ответ 3

Решение Foundrys вместе с этот блог от Mario Diana также разрешило мне обновить код настройки сеанса аудио, устаревший в iOS 7. Мой старый код была основана на AudioBufferPlayer by Matthijs Hollemans.  Не забудьте добавить AVFoundation.framework.