首页 文章

如何使用kAudioSessionProperty_OverrideCategoryMixWithOthers

提问于
浏览
7

当应用程序在后台时,我想让我的虚拟乐器应用程序能够被使用(通过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键盘)播放虚拟乐器以伴随音乐播放器并决定启动另一个应用程序,例如幻灯片放映以享受播放乐器的原因 . 所以他/她进入我的应用程序的设置视图并激活后台操作 . 然后执行上面的代码 . Boom,音乐应用程序变得沉默 . 据我了解,kAudioSessionProperty_OverrideCategoryMixWithOthers属性只能设置 after 设置类别,但是当我将类别设置为AVAudioSessionCategoryPlayback时,系统会在我有机会设置kAudioSessionProperty_OverrideCategoryMixWithOthers之前使音乐播放器静音 .

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

马库斯

3 回答

  • -6

    我不同意M0rph3v5 .

    withOptions参数的唯一有效值是 AVAudioSessionInterruptionOptionShouldResume

  • 17

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

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

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

  • 16

    从iOS 6.0开始就可以使用了

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

相关问题