Промяна на режимите на AVAudioSession в приложението

Възможно ли е да промените категорията и опциите на сесията, когато е необходимо конкретно поведение в приложението? Например настройка:

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

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

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

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

когато възпроизвеждането започне, така че приложението да зачита безшумния превключвател. И ако го направя, как това ще се отрази на маршрутизирането? Състояние на Apple Docs:

Категорията и режимът на сесията заедно определят как приложението възнамерява да използва аудио. Обикновено трябва да зададете категорията и режима, преди да активирате сесията. Можете също да зададете категорията или режима, докато сесията е активна, но това ще доведе до незабавна промяна на маршрута.


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