有它通過網絡流文件的音頻應用程序,一切工作正常,但一兩件事。要在後臺自動播放下一首曲目,在調用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尚未作爲沒有數據可以播放)。一個代碼方案將遵循所有感興趣的人。 –