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:,表示一個插件,這個插件不提供對硬件設備的訪問,而是提供像采樣率轉換這樣的軟件特性,硬件本身並不支持這樣的特性。

聲音緩存和數據傳輸
每個聲卡都有一個硬件緩存區來保存記錄下來的樣本。當緩存區足夠滿時,聲卡將產生一個中斷。內核聲卡驅動然后使用直接內存(DMA)訪問通道將樣本傳送到內存中的應用程序緩存區。類似地,對於回放,任何應用程序使用DMA將自己的緩存區數據傳送到聲卡的硬件緩存區中。
這樣硬件緩存區是環緩存。也就是說當數據到達緩存區末尾時將重新回到緩存區的起始位置。ALSA維護一個指針來指向硬件緩存以及應用程序緩存區中數據操作的當前位置。從內核外部看,我們只對應用程序的緩存區感興趣,所以本文只討論應用程序緩存區。

應 用程序緩存區的大小可以通過ALSA庫函數調用來控制。緩存區可以很大,一次傳輸操作可能會導致不可接受的延遲,我們把它稱為延時(latency)。為 了解決這個問題,ALSA將緩存區拆分成一系列周期(period)(OSS/Free中叫片斷fragments).ALSA以period為單元來傳 送數據。
一個周期(period)存儲一些幀(frames)。每一幀包含時間上一個點所抓取的樣本。對於立體聲設備,一個幀會包含兩個信道上的樣本。

圖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 format because they are measured in frames; you do not need to change them.

Over and Under Run
當 一個聲卡活動時,數據總是連續地在硬件緩存區和應用程序緩存區間傳輸。但是也有例外。在錄音例子中,如果應用程序讀取數據不夠快,循環緩存區將會被新的數 據覆蓋。這種數據的丟失被稱為overrun.在回放例子中,如果應用程序寫入數據到緩存區中的速度不夠快,緩存區將會"餓死"。這樣的錯誤被稱 為"underrun"。在ALSA文檔中,有時將這兩種情形統稱為"XRUN"。適當地設計應用程序可以最小化XRUN並且可以從中恢復過來


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM