1. 程式人生 > >alsa分析:alsa的那些配置檔案 ( 1 )

alsa分析:alsa的那些配置檔案 ( 1 )

在根檔案系統下,alsa相關的配置檔案有:

在/system/usr/share/alsa目錄下:

 

/system/etc/asound.state

這些配置檔案是如何工作的?

alsa-lib是如何解析這些指令碼的?

上層app是如何實現不同需要中的通道選擇,音量調整等???比如手機使用過程中打電話/錄音/藍芽耳機輸入/外放喇叭輸入.......

下面分別分析這些配置指令碼。

+++++++++++++++++++++++++++++++++++++++++++++++

【/system/etc/asound.state】

asound.state用來控制音訊通道的初始設定。使用方法:

1 使用alsa_ctl store來將當前音訊的初始設定匯出為asound.state檔案。

2 修改檔案內容:設定播放/錄製的通道,增益等。

3 使用alsa_ctl restore 重新載入修改過的配置。

4 在init.rc中新增一行,用於系統啟動是自動載入此配置:

 

asound.state中的資訊是抽取在驅動裡面註冊的snd_controls的資訊。

【/system/usr/share/alsa/alsa.conf】

這裡主要參考整理 http://hi.baidu.com/zmjdx/blog/item/35d570347a36e947241f1475.html

ALSA的配置檔案alsa.conf定義了一些簡單的語法,通過這些語法記錄了alsa環境變數。

該檔案開頭處包含了使用者可以配置的hook.

使用者自定義的配置資訊可以儲存在/etc/asound.conf或~/.asoundrc裡,當然也可以自己定義的位置。

我們感興趣的是,alsa lib是如何解析這些配置的。

首先我們可以從使用alsa lib時,最先的入口函式snd_pcm_open處開始說起:

 

其中呼叫了函式snd_config_update(),這個函式就是載入alsa的配置檔案中配置資訊的。

這個函式直接呼叫了 snd_config_update_r,見下面函式註釋:

 

引數一和二:snd_config, snd_config_global_update 都是全域性變數,定義在conf.c中。

第三個引數cfgs,是包含配置檔名的字串,snd_config_update呼叫它時沒有傳遞該引數,所以為空。

snd_config_udpate_r首先分析第三個引數cfgs,如果為空,就獲取系統環境變數ALSA_CONFIG_PATH_VAR值,如果還是為空,就取ALSA_CONFIG_PATH_DEFAULT.

 

然後提取cfgs裡的檔名。

注意cfgs可以包含多個檔名,以:或空格分開。並把每個檔案的檔案資訊儲存在snd_config_update_t變數local中,其成員count記錄了有多少個檔案,finfo則是對應的檔案資訊連結串列。

接下來分析第二個引數update,如果該引數值為空(前面提到過,最開始是為空),就重新去讀配置檔案,否則與local變數比較,如果發現不一樣(配置檔案被修改過),也會跳轉到重讀配置檔案的程式碼。

重新讀取配置檔案的程式碼主要做三件事:

第一,以第一個引數snd_config_t * top為引數呼叫snd_config_top(top);

第二,開啟local中儲存的每一個配置檔案,並呼叫 snd_config_load(top,in),其中in是snd_input_t型別,是alsa內部定義的結構,代表輸入流; 

第三,snd_config_hooks(top,NULL);

+++++++++++++++++++++++++++++++++++++++

暫時分析到這裡,未完待續。