brintos

brintos / linux-shallow public Read only

0
0
Text · 4.4 KiB · e163522 Raw
121 lines · plain
1.. SPDX-License-Identifier: GPL-2.02 3The Virtual PCM Test Driver4===========================5 6The Virtual PCM Test Driver emulates a generic PCM device, and can be used for7testing/fuzzing of the userspace ALSA applications, as well as for testing/fuzzing of8the PCM middle layer. Additionally, it can be used for simulating hard to reproduce9problems with PCM devices.10 11What can this driver do?12~~~~~~~~~~~~~~~~~~~~~~~~13 14At this moment the driver can do the following things:15	* Simulate both capture and playback processes16	* Generate random or pattern-based capturing data17	* Inject delays into the playback and capturing processes18	* Inject errors during the PCM callbacks19 20It supports up to 8 substreams and 4 channels. Also it supports both interleaved and21non-interleaved access modes.22 23Also, this driver can check the playback stream for containing the predefined pattern,24which is used in the corresponding selftest (alsa/pcmtest-test.sh) to check the PCM middle25layer data transferring functionality. Additionally, this driver redefines the default26RESET ioctl, and the selftest covers this PCM API functionality as well.27 28Configuration29-------------30 31The 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 40Capture Data Generation41-----------------------42 43The driver has two modes of data generation: the first (0 in the fill_mode parameter)44means random data generation, the second (1 in the fill_mode) - pattern-based45data generation. Let's look at the second mode.46 47First of all, you may want to specify the pattern for data generation. You can do it48by writing the pattern to the debugfs file. There are pattern buffer debugfs entries49for 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]_len53 54To set the pattern for the channel 0 you can execute the following command:55 56.. code-block:: bash57 58	echo -n mycoolpattern > /sys/kernel/debug/pcmtest/fill_pattern059 60Then, after every capture action performed on the 'pcmtest' device the buffer for the61channel 0 will contain 'mycoolpatternmycoolpatternmycoolpatternmy...'.62 63The pattern itself can be up to 4096 bytes long.64 65Delay injection66---------------67 68The driver has 'inject_delay' parameter, which has very self-descriptive name and69can be used for time delay/speedup simulations. The parameter has integer type, and70it means the delay added between module's internal timer ticks.71 72If the 'inject_delay' value is positive, the buffer will be filled slower, if it is73negative - faster. You can try it yourself by starting a recording in any74audiorecording application (like Audacity) and selecting the 'pcmtest' device as a75source.76 77This parameter can be also used for generating a huge amount of sound data in a very78short period of time (with the negative 'inject_delay' value).79 80Errors injection81----------------82 83This module can be used for injecting errors into the PCM communication process. This84action can help you to figure out how the userspace ALSA program behaves under unusual85circumstances.86 87For example, you can make all 'hw_params' PCM callback calls return EBUSY error by88writing '1' to the 'inject_hwpars_err' module parameter:89 90.. code-block:: bash91 92	echo 1 > /sys/module/snd_pcmtest/parameters/inject_hwpars_err93 94Errors can be injected into the following PCM callbacks:95 96	* hw_params (EBUSY)97	* prepare (EINVAL)98	* trigger (EINVAL)99 100Playback test101-------------102 103This driver can be also used for the playback functionality testing - every time you104write the playback data to the 'pcmtest' PCM device and close it, the driver checks the105buffer for containing the looped pattern (which is specified in the fill_pattern106debugfs file for each channel). If the playback buffer content represents the looped107pattern, 'pc_test' debugfs entry is set into '1'. Otherwise, the driver sets it to '0'.108 109ioctl redefinition test110-----------------------111 112The driver redefines the 'reset' ioctl, which is default for all PCM devices. To test113this functionality, we can trigger the reset ioctl and check the 'ioctl_test' debugfs114entry:115 116.. code-block:: bash117 118	cat /sys/kernel/debug/pcmtest/ioctl_test119 120If the ioctl is triggered successfully, this file will contain '1', and '0' otherwise.121