首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AudioQueue PropertyListener IsRunning仅回调一次

AudioQueue PropertyListener IsRunning仅回调一次
EN

Stack Overflow用户
提问于 2012-11-13 14:48:41
回答 1查看 649关注 0票数 1
代码语言:javascript
复制
 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);

或音频延伸到末尾。

代码语言:javascript
复制
static void isRunningProc(void *              inUserData,
                      AudioQueueRef           inAQ,
                      AudioQueuePropertyID    inID)

我错过了什么?

EN

回答 1

Stack Overflow用户

发布于 2013-12-01 23:24:45

我对此做了一个简短的测试:

它确实看起来像是回调,当你恢复暂停时,它既不是为了暂停,也不是为了开始。

但这并不是你不能解决的问题。不知怎么的你开始了这首歌。这将触发属性侦听器。同样的,如果歌曲停止。或者你停止它。您可能需要在您的play例程中以某种方式触发属性侦听器:

代码语言:javascript
复制
if (bytesRead == 0) {
    //This will trigger the property listener
    AudioQueueStop(inAQ, false);
}
else {
    AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL);
}

对于AudioQueue来说,只要你一直给它提供音频缓冲区来播放,它仍然在播放。(我还测试了根本不提供任何缓冲区,这不会触发停止,因此必须显式调用stop才能触发属性侦听器。)

这意味着你已经知道你的歌曲是否正在播放。单击您的按钮可请求暂停或取消暂停。如果歌曲没有播放,什么也不要做。如果歌曲正在播放,请调用AudioQueuePause并设置一个标记,表明您已暂停音乐。记得检查错误代码。(见下文(1) )。如果标志指示您暂停了音乐,请调用AudioQueueStart,并清除指示您是否已暂停的标志。再次检查错误代码。

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

首先,虽然不太可能,但可能会出现错误,因为这是一个蓝月亮。

然而,我关心的是多线程。显然,AudioQueue运行在与图形用户界面不同的线程上。这意味着,如果您测试一个标志是否正在播放音乐,则不能完全信任此状态,因为它可能在您测试状态后发生了更改。另一个线程可能会潜入您的测试和基于该测试的操作之间。

假设您检查歌曲是否已经在播放。(确实如此。)然后你让这首歌暂停,但这首歌实际上已经停止了,因为在你要求这首歌暂停之前,它已经结束了。然后你要求暂停这首歌。但它已经停止了。

然后会发生什么呢?我真的不知道。在这种情况下,这甚至可能不是问题,但像这样的事情值得考虑。它需要测试,或者至少需要参考文档。

那另一种情况呢?如果歌曲被停止,而您要求重新启动它,该怎么办?我认为这是一个更糟糕的情况,但这可能不是问题。再次考虑这些情况,并检查文档,甚至测试自己。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13356582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档