首先,主要參看的網上的資料就是ALSA的官方主頁以及一些博客。
1.驅動部分
Linux ALSA聲卡驅動之五:移動設備中的ALSA(ASoC)
Linux ALSA聲卡驅動之六:ASoC架構中的Machine
Linux ALSA聲卡驅動之七:ASoC架構中的Codec
Linux ALSA聲卡驅動之八:ASoC架構中的Platform
DAPM之二:audio paths與dapm kcontrol
對沒有開發過聲卡驅動的人來說,有幾個事情要好好研究一下。
- ASoC下的ALSA驅動結構
- 使用的聲卡的數據接口是什麼格式的,與聲卡控制是什麼接口,一般是I2C接口的
2. 應用部分
3. ALSA lib實戰應用要點
在寫ALSA的應用當中,有很多問題,因爲沒找到比較好的文檔,只有官方doxygen生成的藉口函數文檔,加上看的匆忙,走了些彎路。最後還是參看aplay的源碼,程序才穩定點。
-
snd_pcm_sframes_t snd_pcm_writei (snd_pcm_t * pcm, const void * buffer, snd_pcm_uframes_t size)
中的參數snd_pcm_uframes_t 是一個frame的size,並不是要播放聲音的字節的大小。
static size_t bits_per_sample, bits_per_frame; static size_t chunk_bytes; chunk_bytes = chunk_size * bits_per_frame / 8;
- ALSA lib的播放機制,根據我的猜測,聲音數據被循環放入一個固定大小的buffer中,buffer的大小是預先設置好的,ALSA的驅動每次從buffer取指定大小的數據,指定的大小也是在初始化的時候設定好的。這樣就產生一個問題,如果用戶給的數據小於驅動取的數據,就會將buffer中後面隨機的數據播放出來。由於這個原因,我們每次調用snd_pcm_writei類的函數,其數據大小要等於驅動每次播放的大小。這個值就是chunk_size。
更新中。。。。