代码之家  ›  专栏  ›  技术社区  ›  Cliff

在iPhone上使用KaudioSessionProperty_OtherMixableAudioshouldBuck

  •  4
  • Cliff  · 技术社区  · 14 年前

    我正试图从iPhone上的KaudioSessionProperty和OtherMixeableAudioshouldDuck属性中获得一致的行为,以允许iPod音乐混合,我遇到了麻烦。在我的应用程序开始时,我设置了一个环境类别,如下所示:

    -(void) initialize
    {
     [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryAmbient error: nil];
    }
    

    稍后,当我尝试播放音频时,我使用以下方法设置duck属性:

    //this will crossfade the audio with the ipod music
    - (void) toggleCrossfadeOn:(UInt32)onOff
    {
     //crossfade the ipod music
     AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck,sizeof(onOff),&onOff);
     AudioSessionSetActive(onOff);
    }
    

    我称之为在播放音频之前传递一个数字“1”,就像这样:

      [self toggleCrossfadeOn:1];
      [player play];
    

    然后,我再次调用交叉淡入淡出方法,当我的应用程序的音频使用播放完成时,传递一个零,就像这样停止回调:

    -(void) playbackIsStoppingForPlayer:(MQAudioPlayer*)audioPlayer
    {
      NSLog(@"Releasing player");
      [audioPlayer release];
      [self toggleCrossfadeOn:0];
    }
    

    在我的生产应用程序中,这个确切的代码按预期工作,导致iPod在播放我的应用程序的音频之前淡出,然后在音频播放完后淡入。在我最近开始的一个新项目中,我得到了不同的行为。iPod音频会逐渐减弱,永不再减弱。在我的生产应用程序中,我使用avaudioplayer,在我的新应用程序中,我编写了一个使用音频队列的自定义音频播放器。有人能帮助我理解这些区别以及如何正确使用这个API吗?

    2 回复  |  直到 13 年前
        1
  •  3
  •   Cliff    14 年前

    我刚发现问题的一部分。这似乎与时间有关。我相信我的定制播放器仍然在为音频系统供电,当我打电话把音频混入。如果我在playbackisstoppingforplayer方法中设置了一个断点,那么当断点停止执行足够长的时间后,剩余的音频就可以完成它在音频队列中的运行时,它似乎可以按预期工作。

        2
  •  2
  •   lucius    13 年前

    在我们的一个应用程序中,我们调用 AudioSessionSetActive(YES) 然后马上打电话 AudioSessionSetActive(NO) 当我们想消除鸭,以解决这个问题。