我想让虚拟乐器应用程序在后台时能够(通过MIDI键盘)被使用。通过将UIBackgroundModes设置为“audio”,并将AudioSessions的类别设置为AVAudioSessionCategoryPlayback,可以很好地工作。此外,为了与音乐播放器应用程序混合,我设置了属性kAudioSessionProperty_OverrideCategoryMixWithOthers。
为了节省电池能量,建议用户在不需要时关闭后台操作。因此,我的应用程序中有一个切换,可以在类别AVAudioSessionCategoryAmbient和类别AVAudioSessionCategoryPlayback(带有kAudioSessionProperty_OverrideCategoryMixWithOthers)之间进行切换。代码是这样的(省略错误处理):
NSString *category = supportsBackgroundOperation ? AVAudioSessionCategoryPlayback : AVAudioSessionCategoryAmbient;
[session setCategory:category error:nil];
if (category == AVAudioSessionCategoryPlayback) {
UInt32 allowMixing = true;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing);
}
现在的问题是:假设“音乐”应用程序正在后台播放。用户正在(通过MIDI键盘)在前台播放虚拟乐器,以伴随音乐播放器,并决定启动另一个应用程序,例如幻灯片播放,以欣赏演奏该乐器的原因。因此,他/她进入了我的应用程序的设置 View ,并激活了后台操作。然后执行上面的代码。繁荣,音乐应用程序变得无声。据我了解,只能在设置类别之后才能将kAudioSessionProperty_OverrideCategoryMixWithOthers属性设置为,但是当我将类别设置为AVAudioSessionCategoryPlayback时,系统将使音乐播放器静音,然后才能设置kAudioSessionProperty_OverrideCategoryMixWithOthers。
这是发生了吗?有什么可以做的吗?我尝试在更改类别之前/之后停用/激活 session ,但这会导致其他麻烦。
马库斯
最佳答案
您可以实现这一目标。原理是先停用 Audio Session ,设置 Audio Session 的所有属性,然后再激活 Audio Session 。这样,在其他应用程序中播放的音乐将不会被静音。
// 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];
这个解决方案对我有用。但是从您的描述中,您提到您确实尝试过在更改类别之前/之后激活/停用 session ,但会导致其他问题。您是否以与上述完全相同的方式进行停用/激活?如果是这样,请提供有关其他麻烦的更多信息,也许我可以帮忙。