虚拟 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,该 ioctl 是所有 PCM 设备的默认设置。为了测试此功能,我们可以触发 reset ioctl 并检查 ‘ioctl_test’ debugfs 条目
cat /sys/kernel/debug/pcmtest/ioctl_test
如果 ioctl 触发成功,则此文件将包含 ‘1’,否则包含 ‘0’。