AVAudioSessionSilenceSecondaryAudioHintNotification与AVAudioSessionCategoryPlayAndRecord和选项AVAudioSessionCategoryOptionMixWithOthers

时间:2015-07-02 22:39:58

标签: ios audio

我正在尝试在IOS 8.0 AVAudioSessionSilenceSecondaryAudioHintNotification中使用新的通知调用,这样当其他背景音频(如系统音乐播放器)播放停止/启动时,我可以相应地播放/暂停我的iPad应用音乐效果将继续,并与应用程序或背景音乐混合)。当我没有播放任何音乐时,我会正确收到通知。然而,当我使用AVAudioPlayer来实际播放我的应用音乐时,通知从未被调用(我正在使用我的耳塞上的遥控器启动和停止系统音乐进行测试)。

如果我切换到使用音频会话类别AVAudioSessionCategoryAmbient,它的行为正常并发送通知,但我需要使用类别AVAudioSessionCategoryPlayAndRecord,因为我在应用期间也在录制。

我发现默认情况下AVAudioSessionCategoryPlayAndRecord是不可混合的,人们不会指望它的行为类似于AVAudioSessionCategoryAmbient,但我正在设置类别AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers,所以我的播放/录制音频会话应该像AVAudioSessionCategoryAmbient一样可混合。我希望AVAudioSessionSilenceSecondaryAudioHintNotification可以在这种情况下工作。

我想知道是否有人在应用AVAudioSessionSilenceSecondaryAudioHintNotification游戏期间让AVAudioPlayer成功运作 AVAudioSessionCategoryPlayAndRecord + withOptions:AVAudioSessionCategoryOptionMixWithOthers

谢谢!我希望这个问题足够具体,我很想在StackOverflow上发帖。

编辑:添加一些代码示例(虽然我知道此代码确实有效,但结果只会因音频会话类别/选项而异。)

这是在app delegate的didFinishLaunchingWithOptions的音频init中调用的 设置背景通知(例如系统播放器)音频状态更改:

[[NSNotificationCenter defaultCenter]
  addObserver:self
    selector:@selector(handleOtherAudioStatusChanged:)
    name:AVAudioSessionSilenceSecondaryAudioHintNotification
    object:[AVAudioSession sharedInstance]];

这是通知回调

-(void)handleOtherAudioStatusChanged:(id)notification {
#if DEBUG_MODE
    NSLog(@"handleOtherAudioStatusChanged notification");
#endif
    NSNotification *n = (NSNotification *)notification;
    NSDictionary *interuptionDict = n.userInfo;

    if(interuptionDict && (n.name == AVAudioSessionSilenceSecondaryAudioHintNotification)) {

        // Get the AVAudioSessionInterruptionTypeKey enum from the dictionary
        NSInteger hintType = [[interuptionDict valueForKey:AVAudioSessionSilenceSecondaryAudioHintTypeKey] integerValue];

        // Decide what to do based on interruption type...
        switch(hintType) {

            case(AVAudioSessionSilenceSecondaryAudioHintTypeBegin): {
             // OTHER AUDIO STARTED
               // The system is indicating that another application's primary audio has started
#if DEBUG_MODE
                NSLog(@"In handleOtherAudioStatusChanged, other background audio started, stop game music if enabled/playing");
#endif
                // TEST AND STOP GAME MUSIC IF NEEDED                  
                break;
            } // end case

             case(AVAudioSessionSilenceSecondaryAudioHintTypeEnd): {
             // OTHER AUDIO STOPPED
             // The system is indicating that another application's primary audio has stopped

#if DEBUG_MODE
                NSLog(@"In handleOtherAudioStatusChanged, other background audio stopped, play game music if enabled/during game");
#endif
                // TEST AND START GAME MUSIC IF NEEDED
                break;
            }// end case
        } // end switch
    }      
}

此音频会话类别一直有效,而我的应用正在播放音乐:

[audioSession setCategory:AVAudioSessionCategoryAmbient
                        error:&setCategoryError];

这仅适用于我的应用不播放音乐的情况。随着 withOptions覆盖,这应该像AVAudioSessionCategoryAmbient一样混合,所以我很惊讶:

[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord    
                    withOptions:AVAudioSessionCategoryOptionMixWithOthers
                            error:&setCategoryError]; 

我也试过这个只是为了测试而且它只在我的应用不播放音乐时才有用。但是这个覆盖选项也可以混合......

[audioSession setCategory:AVAudioSessionCategoryPlayback
                     withOptions:AVAudioSessionCategoryOptionMixWithOthers
                            error:&setCategoryError];

我正在进行音频会话setCategory / setMode / setActive in:

  1. didFinishLaunchingWithOptions(音频初始化)
  2. didBecomeActive
  3. 音频中断方法(仅限END)
  4. 我正在测试是否需要在BEGIN中断后再次执行setActive,如果匹配的END没有发生(但我的测试用例显示通知失败,即使没有发生音频中断)
  5. 我的应用音乐使用AVAudioPlayer appMusicPlayer播放;

    self.appMusicPlayer.numberOfLoops = AFCAudioLoopForever;
    [self.appMusicPlayer prepareToPlay];
    [self.appMusicPlayer play];
    

    我有其他AVAudioPlayer用于其他非常简短的声音效果,并且一些测试表明,在我之前提到的类别/选项中,播放它们时也会干扰AVAudioSessionSilenceSecondaryAudioHintNotification

    希望有所帮助。

0 个答案:

没有答案