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