Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

docs: sound: add 'pcmtest' driver documentation

Add documentation for the new Virtual PCM Test Driver. It covers all
possible usage cases: errors and delay injections, random and
pattern-based data generation, playback and ioctl redefinition
functionalities testing.

We have a lot of different virtual media drivers, which can be used for
testing of the userspace applications and media subsystem middle layer.
However, all of them are aimed at testing the video functionality and
simulating the video devices. For audio devices we have only snd-dummy
module, which is good in simulating the correct behavior of an ALSA device.
I decided to write a tool, which would help to test the userspace ALSA
programs (and the PCM middle layer as well) under unusual circumstances
to figure out how they would behave. So I came up with this Virtual PCM
Test Driver.

This new Virtual PCM Test Driver has several features which can be useful
during the userspace ALSA applications testing/fuzzing, or testing/fuzzing
of the PCM middle layer. Not all of them can be implemented using the
existing virtual drivers (like dummy or loopback). Here is what can this
driver do:

- Simulate both capture and playback processes
- Check the playback stream for containing the looped pattern
- Generate random or pattern-based capture data
- Inject delays into the playback and capturing processes
- Inject errors during the PCM callbacks

Also, this driver can check the playback stream for containing the
predefined pattern, which is used in the corresponding selftest to check
the PCM middle layer data transferring functionality. Additionally, this
driver redefines the default RESET ioctl, and the selftest covers this PCM
API functionality as well.

The driver supports both interleaved and non-interleaved access modes, and
have separate pattern buffers for each channel. The driver supports up to
4 channels and up to 8 substreams.

Signed-off-by: Ivan Orlov <ivan.orlov0322@gmail.com>
Acked-by: Jaroslav Kysela <perex@perex.cz>
Link: https://lore.kernel.org/r/20230606193254.20791-1-ivan.orlov0322@gmail.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>

authored by

Ivan Orlov and committed by
Takashi Iwai
f091ec76 a4d2b853

+121
+1
Documentation/sound/cards/index.rst
··· 17 17 hdspm 18 18 serial-u16550 19 19 img-spdif-in 20 + pcmtest
+120
Documentation/sound/cards/pcmtest.rst
··· 1 + .. SPDX-License-Identifier: GPL-2.0 2 + 3 + The Virtual PCM Test Driver 4 + =========================== 5 + 6 + The Virtual PCM Test Driver emulates a generic PCM device, and can be used for 7 + testing/fuzzing of the userspace ALSA applications, as well as for testing/fuzzing of 8 + the PCM middle layer. Additionally, it can be used for simulating hard to reproduce 9 + problems with PCM devices. 10 + 11 + What can this driver do? 12 + ~~~~~~~~~~~~~~~~~~~~~~~~ 13 + 14 + At this moment the driver can do the following things: 15 + * Simulate both capture and playback processes 16 + * Generate random or pattern-based capturing data 17 + * Inject delays into the playback and capturing processes 18 + * Inject errors during the PCM callbacks 19 + 20 + It supports up to 8 substreams and 4 channels. Also it supports both interleaved and 21 + non-interleaved access modes. 22 + 23 + Also, this driver can check the playback stream for containing the predefined pattern, 24 + which is used in the corresponding selftest (alsa/pcmtest-test.sh) to check the PCM middle 25 + layer data transferring functionality. Additionally, this driver redefines the default 26 + RESET ioctl, and the selftest covers this PCM API functionality as well. 27 + 28 + Configuration 29 + ------------- 30 + 31 + The driver has several parameters besides the common ALSA module parameters: 32 + 33 + * fill_mode (bool) - Buffer fill mode (see below) 34 + * inject_delay (int) 35 + * inject_hwpars_err (bool) 36 + * inject_prepare_err (bool) 37 + * inject_trigger_err (bool) 38 + 39 + 40 + Capture Data Generation 41 + ----------------------- 42 + 43 + The driver has two modes of data generation: the first (0 in the fill_mode parameter) 44 + means random data generation, the second (1 in the fill_mode) - pattern-based 45 + data generation. Let's look at the second mode. 46 + 47 + First of all, you may want to specify the pattern for data generation. You can do it 48 + by writing the pattern to the debugfs file. There are pattern buffer debugfs entries 49 + for each channel, as well as entries which contain the pattern buffer length. 50 + 51 + * /sys/kernel/debug/pcmtest/fill_pattern[0-3] 52 + * /sys/kernel/debug/pcmtest/fill_pattern[0-3]_len 53 + 54 + To set the pattern for the channel 0 you can execute the following command: 55 + 56 + .. code-block:: bash 57 + 58 + echo -n mycoolpattern > /sys/kernel/debug/pcmtest/fill_pattern0 59 + 60 + Then, after every capture action performed on the 'pcmtest' device the buffer for the 61 + channel 0 will contain 'mycoolpatternmycoolpatternmycoolpatternmy...'. 62 + 63 + The pattern itself can be up to 4096 bytes long. 64 + 65 + Delay injection 66 + --------------- 67 + 68 + The driver has 'inject_delay' parameter, which has very self-descriptive name and 69 + can be used for time delay/speedup simulations. The parameter has integer type, and 70 + it means the delay added between module's internal timer ticks. 71 + 72 + If the 'inject_delay' value is positive, the buffer will be filled slower, if it is 73 + negative - faster. You can try it yourself by starting a recording in any 74 + audiorecording application (like Audacity) and selecting the 'pcmtest' device as a 75 + source. 76 + 77 + This parameter can be also used for generating a huge amount of sound data in a very 78 + short period of time (with the negative 'inject_delay' value). 79 + 80 + Errors injection 81 + ---------------- 82 + 83 + This module can be used for injecting errors into the PCM communication process. This 84 + action can help you to figure out how the userspace ALSA program behaves under unusual 85 + circumstances. 86 + 87 + For example, you can make all 'hw_params' PCM callback calls return EBUSY error by 88 + writing '1' to the 'inject_hwpars_err' module parameter: 89 + 90 + .. code-block:: bash 91 + 92 + echo 1 > /sys/module/snd_pcmtest/parameters/inject_hwpars_err 93 + 94 + Errors can be injected into the following PCM callbacks: 95 + 96 + * hw_params (EBUSY) 97 + * prepare (EINVAL) 98 + * trigger (EINVAL) 99 + 100 + Playback test 101 + ------------- 102 + 103 + This driver can be also used for the playback functionality testing - every time you 104 + write the playback data to the 'pcmtest' PCM device and close it, the driver checks the 105 + buffer for containing the looped pattern (which is specified in the fill_pattern 106 + debugfs file for each channel). If the playback buffer content represents the looped 107 + pattern, 'pc_test' debugfs entry is set into '1'. Otherwise, the driver sets it to '0'. 108 + 109 + ioctl redefinition test 110 + ----------------------- 111 + 112 + The driver redefines the 'reset' ioctl, which is default for all PCM devices. To test 113 + this functionality, we can trigger the reset ioctl and check the 'ioctl_test' debugfs 114 + entry: 115 + 116 + .. code-block:: bash 117 + 118 + cat /sys/kernel/debug/pcmtest/ioctl_test 119 + 120 + If the ioctl is triggered successfully, this file will contain '1', and '0' otherwise.