有它通过网络流文件的音频应用程序,一切工作正常,但一两件事。要在后台自动播放下一首曲目,在调用AudioQueueStop之后,CFReadStream被初始化(我可以在日志中看到它),但回调永远不会被调用(编辑:实际被调用一次),直到应用程序进入前景。这段代码为流初始化:CFReadStream - 在后台启动
//also tried main runloop just for test, no luck
CFReadStreamScheduleWithRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);
有线的事情是,应用程序是功能性的队列停止后,流正在初始化,但只有当流在前台模式初始化的回调是正常调用。这里是回调的一段代码:
CFReadStreamSetClient(stream,
kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered,
MyReadStreamCallBack,
&context);
在另一方面,当应用程序在后台和下轨被自动触发不能不与应用程序,委托(具有相同的回调被称为功能)。
我不完全理解这三种情况之间有区别,请大家帮忙。
编辑。而MyReadStreamCallBack被称为只是一次
OSStatus status = AudioFileStreamOpen(self, MyAudioListener ...
MyAudioListener回调被调用。
编辑2
的ReadStream回调是最经常不会被调用甚至一度,一个时间是最大的什么,我能看到。
在另一方面,这驱使我发生了什么事的误解,后,以前的AudioQueue停止和下轨是本地文件,然后另一AudioQueue打开,它读取文件与AudioFileReadPackets和我没有从后台唤醒应用程序启动下一个轨迹回放为它起着本身的背景。
这是非常有帮助的,为什么AudioQueue开始,并在后台运行的任何评论但如果下一曲目存储在本地并使用另一个流器(它不会等待网络回调,而是使用递归的AudioFileReadPackets)? –
只是一个猜测,但如果下一首曲目的音频数据立即可用,并且在AQ真正完全停止(而不是被要求停止)之前可用,它可能并不真正停止。 – hotpaw2
的确有很大的帮助,我终于为网络流式传输器添加了后台任务,直到回调接收到足够的数据以填充其中一个缓冲区并启动了AudioQueue(它并未真正启动 - AudioQueueStart尚未作为没有数据可以播放)。一个代码方案将遵循所有感兴趣的人。 –