虛擬 PCM 測試驅動

虛擬 PCM 測試驅動模擬一個通用的 PCM 裝置,可用於測試/模糊測試使用者空間 ALSA 應用程式,以及測試/模糊測試 PCM 中間層。此外,它還可用於模擬難以重現的 PCM 裝置問題。

此驅動程式可以做什麼?

目前,該驅動程式可以執行以下操作
  • 模擬捕獲和播放過程

  • 生成隨機或基於模式的捕獲資料

  • 將延遲注入到播放和捕獲過程中

  • 在 PCM 回撥期間注入錯誤

它支援最多 8 個子流和 4 個通道。此外,它還支援交錯和非交錯訪問模式。

此外,此驅動程式可以檢查播放流是否包含預定義的模式,該模式用於相應的自測 (alsa/pcmtest-test.sh) 以檢查 PCM 中間層資料傳輸功能。此外,此驅動程式重新定義了預設的 RESET ioctl,並且自測也涵蓋了此 PCM API 功能。

配置

除了常見的 ALSA 模組引數外,該驅動程式還有幾個引數

  • fill_mode (bool) - 緩衝區填充模式(見下文)

  • inject_delay (int)

  • inject_hwpars_err (bool)

  • inject_prepare_err (bool)

  • inject_trigger_err (bool)

捕獲資料生成

驅動程式有兩種資料生成模式:第一種(fill_mode 引數中的 0)表示隨機資料生成,第二種(fill_mode 中的 1)表示基於模式的資料生成。讓我們看看第二種模式。

首先,您可能需要指定用於資料生成的模式。您可以透過將模式寫入 debugfs 檔案來完成此操作。每個通道都有模式緩衝區 debugfs 條目,以及包含模式緩衝區長度的條目。

  • /sys/kernel/debug/pcmtest/fill_pattern[0-3]

  • /sys/kernel/debug/pcmtest/fill_pattern[0-3]_len

要為通道 0 設定模式,您可以執行以下命令

echo -n mycoolpattern > /sys/kernel/debug/pcmtest/fill_pattern0

然後,在對“pcmtest”裝置執行的每個捕獲操作之後,通道 0 的緩衝區將包含“mycoolpatternmycoolpatternmycoolpatternmy...”

模式本身最長可達 4096 位元組。

延遲注入

該驅動程式具有“inject_delay”引數,該引數具有非常自描述的名稱,可用於時間延遲/加速模擬。該引數具有整數型別,它表示在模組內部計時器節拍之間新增的延遲。

如果“inject_delay”值為正,則緩衝區將填充得更慢;如果為負,則填充得更快。您可以透過在任何錄音應用程式(如 Audacity)中啟動錄音並選擇“pcmtest”裝置作為源來自己嘗試。

此引數也可用於在很短的時間內生成大量聲音資料(使用負的“inject_delay”值)。

錯誤注入

此模組可用於將錯誤注入到 PCM 通訊過程中。此操作可以幫助您瞭解使用者空間 ALSA 程式在異常情況下如何執行。

例如,您可以透過將“1”寫入“inject_hwpars_err”模組引數,使所有“hw_params”PCM 回撥呼叫返回 EBUSY 錯誤

echo 1 > /sys/module/snd_pcmtest/parameters/inject_hwpars_err

錯誤可以注入到以下 PCM 回撥中

  • hw_params (EBUSY)

  • prepare (EINVAL)

  • trigger (EINVAL)

播放測試

此驅動程式也可用於播放功能測試 - 每次您將播放資料寫入“pcmtest”PCM 裝置並關閉它時,驅動程式都會檢查緩衝區是否包含迴圈模式(在每個通道的 fill_pattern debugfs 檔案中指定)。如果播放緩衝區內容表示迴圈模式,則“pc_test”debugfs 條目將設定為“1”。否則,驅動程式將其設定為“0”。

ioctl 重新定義測試

驅動程式重新定義了“reset”ioctl,這是所有 PCM 裝置的預設設定。要測試此功能,我們可以觸發 reset ioctl 並檢查“ioctl_test”debugfs 條目

cat /sys/kernel/debug/pcmtest/ioctl_test

如果 ioctl 成功觸發,則此檔案將包含“1”,否則包含“0”。