ALSA 中的跟蹤點¶
2017/07/02 Takasahi Sakamoto
ALSA PCM 核心中的跟蹤點¶
ALSA PCM 核心向核心跟蹤點系統註冊 snd_pcm 子系統。該子系統包含兩類跟蹤點:PCM 緩衝區狀態和 PCM 硬體引數處理。當相應的核心配置啟用時,這些跟蹤點可用。當啟用 CONFIG_SND_DEBUG 時,後一類跟蹤點可用。如果另外啟用 SND_PCM_XRUN_DEBUG,則啟用前一類跟蹤點。
PCM 緩衝區狀態的跟蹤點¶
此類包含四個跟蹤點:hwptr、applptr、xrun 和 hw_ptr_error。
PCM 硬體引數處理的跟蹤點¶
此類包含兩個跟蹤點:hw_mask_param 和 hw_interval_param。
在 ALSA PCM 核心的設計中,資料傳輸被抽象為 PCM 子流。應用程式管理 PCM 子流以維護 PCM 幀的資料傳輸。在開始資料傳輸之前,應用程式需要配置 PCM 子流。在此過程中,PCM 硬體引數由應用程式和 ALSA PCM 核心之間的互動決定。一旦確定,PCM 子流的執行時將保持這些引數。
這些引數在 struct snd_pcm_hw_params 中描述。此結構包含幾種型別的引數。應用程式將首選值設定為這些引數,然後使用 SNDRV_PCM_IOCTL_HW_REFINE 或 SNDRV_PCM_IOCTL_HW_PARAMS 執行 ioctl(2)。前者僅用於最佳化可用引數集。後者用於實際確定引數。
struct snd_pcm_hw_params 結構具有以下成員
flags可配置。ALSA PCM 核心和一些驅動程式處理此標誌以選擇方便的引數或更改其行為。
masks可配置。此類引數在 struct snd_mask 中描述,並表示掩碼值。截至 PCM 協議 v2.0.13,定義了三種類型。
SNDRV_PCM_HW_PARAM_ACCESS
SNDRV_PCM_HW_PARAM_FORMAT
SNDRV_PCM_HW_PARAM_SUBFORMAT
intervals可配置。此類引數在 struct snd_interval 中描述,並表示具有範圍的值。截至 PCM 協議 v2.0.13,定義了十二種型別。
SNDRV_PCM_HW_PARAM_SAMPLE_BITS
SNDRV_PCM_HW_PARAM_FRAME_BITS
SNDRV_PCM_HW_PARAM_CHANNELS
SNDRV_PCM_HW_PARAM_RATE
SNDRV_PCM_HW_PARAM_PERIOD_TIME
SNDRV_PCM_HW_PARAM_PERIOD_SIZE
SNDRV_PCM_HW_PARAM_PERIOD_BYTES
SNDRV_PCM_HW_PARAM_PERIODS
SNDRV_PCM_HW_PARAM_BUFFER_TIME
SNDRV_PCM_HW_PARAM_BUFFER_SIZE
SNDRV_PCM_HW_PARAM_BUFFER_BYTES
SNDRV_PCM_HW_PARAM_TICK_TIME
rmask可配置。僅在具有 SNDRV_PCM_IOCTL_HW_REFINE 的 ioctl(2) 中進行評估。應用程式可以選擇 ALSA PCM 核心可以更改哪些掩碼/間隔引數。對於 SNDRV_PCM_IOCTL_HW_PARAMS,將忽略此掩碼,並且將更改所有引數。
cmask只讀。從 ioctl(2) 返回後,使用者空間中用於 struct snd_pcm_hw_params 的緩衝區包含每個操作的結果。此掩碼錶示實際更改了哪些掩碼/間隔引數。
info只讀。這表示硬體/驅動程式的功能,作為帶有 SNDRV_PCM_INFO_XXX 的位標誌。通常,應用程式使用 SNDRV_PCM_IOCTL_HW_REFINE 執行 ioctl(2) 以檢索此標誌,然後確定引數的候選項並使用 SNDRV_PCM_IOCTL_HW_PARAMS 執行 ioctl(2) 以配置 PCM 子流。
msbits只讀。此值表示 PCM 樣本 MSB 側可用的位寬。當 SNDRV_PCM_HW_PARAM_SAMPLE_BITS 的引數被確定為固定數字時,也會根據它計算此值。否則,為零。但此行為取決於驅動程式端的實現。
rate_num只讀。此值表示分數表示法中取樣率的分子。基本上,當 SNDRV_PCM_HW_PARAM_RATE 的引數被確定為單個值時,也會根據它計算此值。否則,為零。但此行為取決於驅動程式端的實現。
rate_den只讀。此值表示分數表示法中取樣率的分母。基本上,當 SNDRV_PCM_HW_PARAM_RATE 的引數被確定為單個值時,也會根據它計算此值。否則,為零。但此行為取決於驅動程式端的實現。
fifo_size只讀。此值表示硬體序列聲音介面中 FIFO 的大小。基本上,每個驅動程式都可以為該引數分配適當的值,但某些驅動程式會故意將其設定為零,並注意硬體設計或資料傳輸協議。
當應用程式使用 SNDRV_PCM_HW_REFINE 或 SNDRV_PCM_HW_PARAMS 執行 ioctl(2) 時,ALSA PCM 核心會處理 struct snd_pcm_hw_params 的緩衝區。緩衝區中的引數根據 struct snd_pcm_hardware 和執行時的約束規則進行更改。該結構描述了處理的硬體的功能。這些規則描述了根據幾個引數確定引數的依賴關係。規則具有回撥函式,驅動程式可以註冊任意函式來計算目標引數。ALSA PCM 核心預設將一些規則註冊到執行時。
只要驅動程式在 struct snd_pcm_ops.open 的回撥中準備好兩件事,每個驅動程式都可以加入互動。
在回撥中,驅動程式應根據相應硬體的容量,更改執行時中 struct snd_pcm_hardware 型別的成員。
在同一個回撥中,當由於硬體設計導致幾個引數具有依賴關係時,驅動程式還應將其他約束規則註冊到執行時。
驅動程式可以參考 struct snd_pcm_ops.hw_params 回撥中的互動結果,但不應更改內容。
此類中的跟蹤點旨在跟蹤掩碼/間隔引數的更改。當 ALSA PCM 核心更改它們時,會根據更改的引數型別探測 hw_mask_param 或 hw_interval_param 事件。
ALSA PCM 核心還為每個跟蹤點提供了一個漂亮的列印格式。下面是 hw_mask_param 的一個示例。
hw_mask_param: pcmC0D0p 001/023 FORMAT 00000000000000000000001000000044 00000000000000000000001000000044
下面是 hw_interval_param 的一個示例。
hw_interval_param: pcmC0D0p 000/023 BUFFER_SIZE 0 0 [0 4294967295] 0 1 [0 4294967295]
前三個欄位是通用的。它們依次表示 ALSA PCM 字元裝置的名稱、約束規則和更改的引數的名稱。約束規則的欄位由兩個子欄位組成:應用的規則的索引和新增到執行時的規則總數。作為例外,索引 000 表示引數由 ALSA PCM 核心更改,與規則無關。
其餘欄位表示更改前後引數的狀態。這些欄位根據引數的型別而不同。對於掩碼型別的引數,這些欄位表示引數內容的十六進位制轉儲。對於間隔型別的引數,這些欄位按此順序表示 struct snd_interval 中 empty、integer、openmin、min、max、openmax 的每個成員的值。
驅動程式中的跟蹤點¶
一些驅動程式具有跟蹤點,以方便開發人員。對於它們,請參閱每個文件或實現。