虛擬 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”。