ALSA中PCM參數配置

步驟如下:
1)PCM設備的句柄.
2) 指定同時可供回放或截獲的PCM流的方向
3)提供一些關於我們想要使用的設置選項的信息,比如緩衝區大小,採樣率,PCM數據格式等
4) 檢查硬件是否支持設置選項.
   4.1) 初始化PCM變量
   4.2)分配hwparams結構
   4.3) 打開PCM設備
   4.4)以聲卡的全部設置選項空間來初始化hwparams結構
   4.5)指定訪問類型,採樣格式,採樣率,聲道號碼,週期數目以及週期大小
       a) 訪問類型 :指定了哪一個多聲道數據儲存在緩衝區的方法.
            *對於交錯訪問,緩衝區裏的每一個幀爲聲道容納連續的採樣數據.
            *對於非交錯訪問,每一個週期爲第一個聲道容納所有采樣數據接着是第二個聲道的採樣數據
       b) 緩衝區尺寸的單元依賴於函數.一些時候是字節,一些時候是必須指定的幀的數目.
          一個幀是對所有聲道的採樣數據數組.對於16位立體聲數據,一個幀的長度是4個字節.
          如果你的硬件不支持2的N次方的緩衝區大小,你可以使用snd_pcm_hw_params_set_buffer_size_near函數.這個函數工作起來與snd_pcm_hw_params_set_rate_near相似.
5) 爲PCM設備申請由pcm_handle指向的設置選項
備註資料:
設備命名
API 庫使用邏輯設備名而不是設備文件。設備名字可以是真實的硬件名字也可以是插件名字。硬件名字使用hw:i,j這樣的格式。其中i是卡號,j是這塊聲卡上的設備號。第一個聲音設備是hw:0,0.這個別名默認引用第一塊聲音設備並且在本文示例中一真會被用到。插件使用另外的唯一名字。比如plughw:,表示一個插件,這個插件不提供對硬件設備的訪問,而是提供像採樣率轉換這樣的軟件特性,硬件本身並不支持這樣的特性
聲音緩存和數據傳輸
每個聲卡都有一個聲卡硬件緩存區(牛逼聲卡纔有聲卡硬件緩存,很多arm架構都是ap和codec,codec沒有什麼硬件緩存,ap把數據丟給codec播放)來保存記錄下來的樣本。當緩存區足夠滿時,聲卡將產生一箇中斷。內核聲卡驅動然後使用直接內存(DMA)訪問通道將樣本傳送到內存中的應用程序緩存區。類似地,對於回放,任何應用程序使用DMA將自己的緩存區數據傳送到聲卡的硬件緩存區中。
這樣硬件緩存區是環緩存。也就是說當數據到達緩存區末尾時將重新回到緩存區的起始位置。ALSA維護一個指針來指向硬件緩存以及應用程序緩存區中數據操作的當前位置。從內核外部看,我們只對應用程序的緩存區感興趣,所以本文只討論應用程序緩存區。千萬不要把這個不要誤解這個應用程序緩存區了,他說的從內核外部看,應該是從alsa的最底下往上看,是audiointerface以上的,alsa驅動也屬於這個範疇裏的,因此,這個是什麼你懂的!
應用程序緩存區的大小可以通過ALSA庫函數調用來控制。應用程序緩存區可以很大,一次傳輸操作可能會導致不可接受的延遲,我們把它稱爲延時(latency)。爲了解決這個問題,ALSA將緩存區拆分成一系列週期(period)(OSS/Free中叫片斷fragments).ALSA以period爲單元來傳送數據。——如果應用程序緩存填滿了才通知cpu,那延時太慢了!
一個週期(period)存儲一些幀(frames)。每一幀包含時間上一個點所抓取的樣本。對於立體聲設備,一個幀會包含兩個信道上的樣本。
【王道的】ALSA中PCM參數配置
圖1展示了分解過程:一個緩存區分解成周期,然後是幀,然後是樣本。圖中包含一些假定的數值。圖中左右信道信息被交替地存儲在一個幀內。這稱爲交錯(interleaved)模式。在非交錯模式中,一個信道的所有樣本數據存儲在另外一個信道的數據之後。
period(週期):硬件中中斷間的間隔時間。它表示輸入延時。
聲卡接口中有一個指針來指示聲卡硬件緩存區中當前的讀寫位置。只要接口在運行,這個指針將循環地指向緩存區中的某個位置。
frame size = sizeof(one sample) * nChannels
alsa中配置的緩存(buffer)和週期(size)大小在runtime中是以幀(frames)形式存儲的。
period_bytes = frames_to_bytes(runtime,runtime->period_size);
bytes_to_frames()
The period and buffer sizes are not dependent on the sample formatbecause they are measured in frames; you do not need to changethem.
Over and Under Run
當一個聲卡活動時,數據總是連續地在硬件緩存區和應用程序緩存區間傳輸。但是也有例外。在錄音例子中,如果應用程序讀取數據不夠快,循環緩存區將會被新的數據覆蓋。這種數據的丟失被稱爲overrun.在回放例子中,如果應用程序寫入數據到緩存區中的速度不夠快,緩存區將會"餓死"。這樣的錯誤被稱爲"underrun"。在ALSA文檔中,有時將這兩種情形統稱爲"XRUN"。適當地設計應用程序可以最小化XRUN並且可以從中恢復過來
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章