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