Linux ALSA 驅動及其應用心得彙總


首先,主要參看的網上的資料就是ALSA的官方主頁以及一些博客。

1.驅動部分

Linux ALSA聲卡驅動之一:ALSA架構簡介

Linux ALSA聲卡驅動之二:聲卡的創建

Linux ALSA聲卡驅動之三:PCM設備的創建

Linux ALSA聲卡驅動之四:Control設備的創建

Linux ALSA聲卡驅動之五:移動設備中的ALSA(ASoC)

Linux ALSA聲卡驅動之六:ASoC架構中的Machine

Linux ALSA聲卡驅動之七:ASoC架構中的Codec

Linux ALSA聲卡驅動之八:ASoC架構中的Platform

DAPM之一概述

DAPM之二:audio paths與dapm kcontrol

對沒有開發過聲卡驅動的人來說,有幾個事情要好好研究一下。

  • ASoC下的ALSA驅動結構
  • 使用的聲卡的數據接口是什麼格式的,與聲卡控制是什麼接口,一般是I2C接口的
大部分做移植的人,並不需要自己去寫聲卡的驅動,這些都會有聲卡的廠商提供,不過驅動的質量就因不同廠商而不同了。
另外在向驅動廠商要驅動的時候,一定要提及Linux的版本,2.6和3.0是有區別的,雖然不大。但在沒有搞明白的時候,修改還是需要花費一番功夫的。
那麼在有了驅動廠家的codec驅動後,自然是要加入你所使用的內核當中了。移植的過程後面會有實例說明。
那麼爲了證明驅動程序的正確,第一肯定是要在系統中先看到你所添加的聲卡。然後可以使用alsamixer來對聲卡進行配置,alsamixer裏面的控件其實就是在驅動中添加進去的。

2. 應用部分

ALSA 自帶的example

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。


更新中。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章