當與音頻重放工作我用以下模式:哪個線程用於音頻解碼?
- 一個磁盤(或網絡)螺紋,其從磁盤讀取(或網絡)的數據,並填充一個ringbuffer
- 一個聲音線程,其讀取從ringbuffer數據,可能執行DSP,並寫入音頻硬件 (拉或推API)
這工作得很好,而且也有,比如說,WAV文件工作時沒有問題。
現在,如果源數據以Vorbis或MP3等壓縮格式編碼,則解碼需要一些時間。
而且在磁盤/網絡線程中執行解碼似乎很常見。
但是這不是錯誤的設計?當磁盤或網絡訪問被阻塞時,一些CPU時間可用於解碼,但是如果解碼發生在同一線程中則會浪費時間。
在我看來,如果網絡變慢,那麼如果解碼順序發生,那麼緩衝區欠載的風險就會更高。
那麼,不應該在音頻線程中執行解碼?
在我的情況下,我寧願避免添加專用的解碼線程。它適用於移動平臺,SMP現在非常罕見。但是請告訴您一個專用的解碼線程是否真的對您有意義。
你說得對,在2線程的情況下,解碼應該在網絡線程中執行。我在寫完後意識到,由於音頻解碼是基於數據包的,因此它可能會在每N個音頻週期阻塞很長時間,這會導致xrun。也就是說,專用解碼線程對我來說越來越有吸引力,特別是對於網絡(或慢速磁盤/存儲)流。 – olivierg 2011-05-09 20:24:48