在iPhone上使用kAudioSessionProperty_OtherMixableAudioShouldDuck

4

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

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

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

//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个回答

3

我刚刚找到了问题的一部分。看起来与时间有关。我相信当我调用混合音频时,我的自定义播放器仍在向音频系统提供音频。如果我在playbackIsStoppingForPlayer方法中设置断点,那么它似乎按预期工作,因为断点会停止执行足够长的时间,以便剩余的音频完成通过音频队列的过程。


2
在我们的一个应用程序中,当我们想要解决这个问题时,我们调用AudioSessionSetActive(YES),然后立即调用AudioSessionSetActive(NO)来删除音频淡入淡出效果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接