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