如何使用kAudioSessionProperty_OverrideCategoryMixWithOthers

我想让我的虚拟乐器应用程序能够在应用程序处于后台时使用(通过MIDI键盘)。 这工作正常通过设置UIBackgroundModes为“audio”,并将AudioSessions的类别设置为AVAudioSessionCategoryPlayback。 此外,为了允许与音乐播放器应用程序混合,我设置属性kAudioSessionProperty_OverrideCategoryMixWithOthers。

为了节约电池能量,build议在不需要的时候让用户关掉后台操作。 所以在我的应用程序中有一个开关在类别AVAudioSessionCategoryAmbient和类别AVAudioSessionCategoryPlayback(与kAudioSessionProperty_OverrideCategoryMixWithOthers)之间切换。 代码是这样的(error handling省略):

NSString *category = supportsBackgroundOperation ? AVAudioSessionCategoryPlayback : AVAudioSessionCategoryAmbient; [session setCategory:category error:nil]; if (category == AVAudioSessionCategoryPlayback) { UInt32 allowMixing = true; AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing); } 

现在的问题是:假设音乐应用程序正在后台播放。 用户正在前台(通过MIDI键盘)弹奏虚拟乐器以伴随音乐播放器,并决定开始另一个应用程序,比如幻灯片放映,以欣赏为什么要弹奏乐器。 所以他/她进入我的应用程序的设置视图,并激活后台操作。 然后执行上面的代码。 繁荣,音乐应用程序得到沉默。 据我所知,kAudioSessionProperty_OverrideCategoryMixWithOthers属性只能设置类别设置,但是当我将类别设置为AVAudioSessionCategoryPlayback时,在我有机会设置kAudioSessionProperty_OverrideCategoryMixWithOthers之前,音乐播放器会被系统消音。

这是否发生? 有什么可以做的吗? 我试图在更改类别之前/之后禁用/激活会话,但这会导致其他问题。

马库斯

你可以做到这一点。 原则是首先停用您的audio会话,设置您的audio会话的所有属性,然后激活audio会话。 这样,在其他应用程序中播放的音乐将不会被屏蔽。

 // Initialize audio session AVAudioSession *audioSession = [AVAudioSession sharedInstance]; // Active your audio session [audioSession setActive: NO error: nil]; // Set audio session category [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil]; // Modifying Playback Mixing Behavior, allow playing music in other apps OSStatus propertySetError = 0; UInt32 allowMixing = true; propertySetError = AudioSessionSetProperty ( kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof (allowMixing), &allowMixing); // Active your audio session [audioSession setActive: YES error: nil]; 

这个解决scheme适用于我。 但是根据你的描述,你提到你在更改类别之前/之后尝试激活/停用会话,但是导致其他问题。 你是否用完全相同的方式去激活/激活? 如果是的话,提供更多关于其他麻烦的信息,也许我可以帮助。

由于iOS 6.0可以使用

 [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil]; 

我不得不不同意M0rph3v5。

withOptions参数的唯一有效值是AVAudioSessionInterruptionOptionShouldResume