虚拟 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”。