7

当应用程序在后台时,我想让我的虚拟乐器应用程序能够被使用(通过 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 之前将音乐播放器静音。

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

马库斯

4

3 回答 3

18

从 iOS 6.0 开始,您可以使用

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

斯威夫特 5:

try? AVAudioSession.sharedInstance().setCategory(.playback, options: .mixWithOthers)
于 2013-03-26T12:29:26.437 回答
16

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

// 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];

这个解决方案对我有用。但是根据您的描述,您提到您确实在更改类别之前/之后尝试激活/停用会话,但会导致其他问题。您是否以与上述完全相同的方式进行停用/激活?如果是这样,请提供有关其他问题的更多信息,也许我可以提供帮助。

于 2012-05-28T14:17:55.583 回答
-6

我不得不不同意 M0rph3v5。

withOptions 参数的唯一有效值是AVAudioSessionInterruptionOptionShouldResume

于 2013-04-25T07:07:21.023 回答