在app中更改AVAudioSession模式

时间:2014-03-23 15:15:51

标签: ios cocoa-touch avaudiosession

在应用中需要特定行为时,是否可以更改会话类别和选项?例如设置:

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

根据苹果文档不会尊重无声开关。

该应用程序记录并播放音频。在音频播放时,应用程序需要遵守静音开关。问题是:我可以像这样设置类别:

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

播放开始时应用程序遵循静音开关。如果我这样做,这将如何影响路由? Apple Docs声明:

  

会话的类别和模式共同定义了应用程序的方式   打算使用音频。通常,您应该设置类别和模式   在激活会话之前。您也可以设置类别或模式   会话处于活动状态,但这会立即产生   路线变化。

2 个答案:

答案 0 :(得分:6)

可以更改,引用文档:

  

在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)并记录错误以进行调试。

答案 1 :(得分:0)

Based on the Apple document, about 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.
}