当应用程序在后台时,我想让我的虚拟乐器应用程序能够被使用(通过 MIDI 键盘)。通过将 UIBackgroundModes 设置为“音频”并将 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 键盘)演奏虚拟乐器以配合音乐播放器,并决定启动另一个应用程序,例如幻灯片放映以享受演奏乐器的原因。所以他/她进入我的应用程序的设置视图并激活后台操作。然后执行上面的代码。砰,音乐应用程序变得安静。据我了解,kAudioSessionProperty_OverrideCategoryMixWithOthers 属性只能在设置类别后设置,但是当我将类别设置为 AVAudioSessionCategoryPlayback 时,系统会在我有机会设置 kAudioSessionProperty_OverrideCategoryMixWithOthers 之前将音乐播放器静音。
这是发生了吗?有什么可以做的吗?我试图在更改类别之前/之后停用/激活会话,但这会导致其他麻烦。
马库斯