Изменение режимов AVAudioSession в приложении

Можно ли изменить категорию и параметры сеанса, когда в приложении требуется определенное поведение? Например установка:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];

в соответствии с документами Apple не будет соблюдать тихий переключатель.

Приложение записывает и воспроизводит аудио. При воспроизведении аудио приложение должно учитывать переключатель без звука. Вопрос: Могу ли я установить категорию так:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:&sessionError];

когда начинается воспроизведение, чтобы приложение соблюдал тихий переключатель. И если я так сделаю, как это повлияет на маршрутизацию? Документы Apple утверждают:

Категория и режим сеанса вместе определяют, как приложение намеревается использовать звук. Как правило, вы должны установить категорию и режим перед активацией сеанса. Вы также можете установить категорию или режим во время активного сеанса, но это приведет к немедленному изменению маршрута.


person Chris    schedule 23.03.2014    source источник
comment
Эй, Крис, тебе когда-нибудь везло с этим?   -  person Mike    schedule 10.06.2014
comment
Я так и сделал, оказывается можно менять категорию на лету так сказать. Мне пришлось бы снова вытащить код, чтобы увидеть, как именно мы его реализовали, но он действительно работал.   -  person Chris    schedule 12.06.2014


Ответы (2)


Можно изменить, цитируя документы:

Каждое приложение, работающее в iOS, имеет один аудиосеанс, который, в свою очередь, имеет одну категорию. Вы можете изменить категорию аудиосеанса во время работы приложения.

https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVAudioSession_ClassReference/#//apple_ref/doc/constant_group/Audio_Session_Categories

Так что это просто вопрос вызова метода setCategory:, когда вы хотите, чтобы приложение изменило режим.

Например, вы запускаете свое приложение, позволяя воспроизводить звук из других приложений:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil]
    (...)
}

И когда пользователь нажимает кнопку воспроизведения в вашем пользовательском интерфейсе, перейдите в режим воспроизведения:

- (void)playAudio {
    if ([AVAudioSession sharedInstance].otherAudioPlaying) {
        // you can check and play only if there is no other audio playing
        // maybe use another category, or enable mixing or duck option
        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionDuckOthers error:nil];
    } else {
        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
    }
    [[AVAudioSession sharedInstance] setActive:YES error:nil];
}

Если вы хотите возобновить звук другого приложения после воспроизведения, вы можете сделать уведомление или просто закрыть сеанс, чтобы остановить звук другого приложения:

- (void)stopAudio {
    if (self.otherAudioShouldResume) {
        [[AVAudioSession sharedInstance] setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil];
    } else {
        [[AVAudioSession sharedInstance] setActive:NO error:nil];
}

Этот код является только обзором, вам может потребоваться выполнить больше функций, чтобы получить работающий пример, также не забудьте проверить возврат этих функций (BOOL) и зарегистрировать ошибки для отладки.

person lkraider    schedule 04.08.2015

На основе в документе Apple об AVAudioSession -setMode:error:.

Обсуждение

Категория и режим сеанса вместе определяют, как приложение намеревается использовать звук. Как правило, вы устанавливаете категорию и режим перед активацией сеанса. Вы также можете установить категорию или режим во время сеанса, но это приведет к немедленному изменению маршрута.

Похоже, что setCategory:error: и '-setMode:error:' обычно вызываются перед setActive:error:. Но если эти методы вызываются, когда сеанс активен, аудиомаршрут изменится немедленно.

В моем случае,

- (void)playAudio
{
   /// call `-setMode:error:` for playing audio
}

- (void)stopAudio
{
   /// call `-setMode:error:` back to original configuration, or set to another mode. It will result in route change immediately.
}
person AechoLiu    schedule 02.11.2015