有人能解釋如何snd_pcm_writei如何使用ALSA的snd_pcm_writei()?
snd_pcm_sframes_t snd_pcm_writei(snd_pcm_t *pcm, const void *buffer,
snd_pcm_uframes_t size)
的作品?
我已經用它像這樣:
for (int i = 0; i < 1; i++) {
f = snd_pcm_writei(handle, buffer, frames);
...
}
完整的源代碼在http://pastebin.com/m2f28b578
這是否意味着,我不應該在buffer
給snd_pcm_writei()
的 數所有的幀,但只
SAMPLE_RATE *延遲= frames
?
因此,如果我例如有: SAMPLE_RATE = 44100 延遲= 0.5 [秒] all_frames = 100000
幀,我應該給snd_pcm_writei()
的數目將是
SAMPLE_RATE *延遲=幀 44100×0.5 = 22050
and for循環的迭代次數應該是:
(int)100000/22050 = 4;與幀= 22050
和一個額外的,但只有
100000 MOD 22050 = 11800個
幀?
它是如何工作的?
路易絲
http://www.alsa-project.org/alsa-doc/alsa-lib/group___p_c_m.html#gf13067c0ebde29118ca05af76e5b17a9
我只需要打出〜17000架,在應用端這樣的延遲,會好起來的。最奇怪的是,如果我給snd_pcm_writei()所有幀,並刪除for循環,則不播放任何內容。如果我保留for循環和例如將其設置爲5次迭代,它將在〜17000幀中循環兩次。如果我在第11行查看libsndfile的示例http://pastebin.com/m559397b3,他會遍歷緩衝區。當我這樣做時,什麼都不玩。另外我覺得奇怪的是,snd_pcm_writei()總是返回我給它的相同數量的幀。它永遠不會返回一個更低的數字,這是我所期望的。 ? – Louise 2010-02-02 23:42:04
17000個採樣少於1秒的播放時間。通過反覆將聲音緩衝區寫入聲卡驅動程序,您基本上一次又一次地播放該聲卡,但是從您的描述中可以看出,系統中的某些內容會阻止播放聲音的開始。 首先,通過緩衝區是正確的事情;你不需要多次寫一個樣本。 其次,要查看您的聲卡驅動程序或聲卡是否無法播放聲音的開頭,請嘗試在開始處填充緩衝區大約一秒鐘的0個採樣點,然後查看該問題是否有所幫助。 – 2010-02-03 15:36:24
非常感謝你清除所有這一切。現在當你提到它時,我在播放ALSA時遇到了一些音頻問題。 MPlayer的。前2秒左右沒有什麼玩,然後它播放。我會嘗試升級到Fedora 12,然後再試一次。再次感謝=) – Louise 2010-02-03 23:14:56