AudioQueue PropertyListener仅一次回调


 OSStatus err = AudioQueueNewOutput(&audioDescription, AudioPlayerAQOutputCallback, ( void* )self, nil, nil, 0, &audioQueue);
    if( err != noErr )
        NSLog(@"Couldn't open AudioFile.");
    err = AudioQueueAddPropertyListener(audioQueue, kAudioQueueProperty_IsRunning, isRunningProc, self);
    if( err != noErr )
        NSLog(@"Couldn't register for playback state changes.");

此回调函数仅在Audioqueuestart(AudioQueue,null);

之后一次调用一次

我称之为AudioQueUepause(AudioQueue);

或音频到达结束。

static void isRunningProc(void *              inUserData,
                      AudioQueueRef           inAQ,
                      AudioQueuePropertyID    inID)

我错过了什么?

我对此做了简短的测试:

确实,当您恢复暂停时,它的确似乎不是为了暂停或开始。

,但这不是您无法解决的。您以某种方式开始了这首歌。这将触发属性侦听器。同样,如果歌曲停止。或者您停止它。您可能必须以某种方式在播放程序中使用类似的内容触发属性侦听器:

if (bytesRead == 0) {
    //This will trigger the property listener
    AudioQueueStop(inAQ, false);
}
else {
    AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL);
}

作为AudioQueue,只要您继续使用音频缓冲区播放,它仍在播放。(我还测试了根本没有喂食任何缓冲区,这没有触发停止,因此您必须明确打电话以触发属性侦听器。)

这意味着您已经知道您的歌曲是否在播放。通过单击按钮,请求暂停或取消暂停。如果这首歌不播放,请不要做任何事情。如果这首歌正在播放,请致电AudioqueUepause,并设置您暂停音乐的标志。请记住检查错误代码。(请参阅下面的(1))。如果旗帜说您已经暂停了音乐,请致电Audioqueuestart,并清除标志,指示您是否停下来。再次检查错误代码。

(1)为什么检查错误代码?

首先,尽管不太可能发生错误,因为它是蓝色的月亮。

但是,我关注的是多个线程。AudioQueue显然在单独的线程上比您的GUI运行。这意味着,如果您测试音乐是否在播放,则无法完全信任此状态,因为自从测试状态以来,它可能已经改变。根据该测试,另一个线程可能已经在您的测试和操作之间偷偷摸摸。

说您检查了这首歌已经在播放。(这是。)然后,您要求这首歌停下来,但是这首歌确实停止了,因为它在同时到达结束,然后才要求这首歌停下来。然后,您要求暂停这首歌。但是它已经停止了。

那会发生什么呢?我真的不知道。在这种情况下,这甚至可能不是问题,但是值得考虑的事情。它需要测试,或至少对文档进行咨询。

另一种情况怎么样?如果这首歌停止了,您要求重新开始。我认为这是一个更糟糕的情况,但这可能不是问题。再次考虑这些案例并检查文档,甚至您自己测试。

最新更新