123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- ===================
- Tracepoints in ALSA
- ===================
- 2017/07/02
- Takasahi Sakamoto
- Tracepoints in ALSA PCM core
- ============================
- ALSA PCM core registers ``snd_pcm`` subsystem to kernel tracepoint system.
- This subsystem includes two categories of tracepoints; for state of PCM buffer
- and for processing of PCM hardware parameters. These tracepoints are available
- when corresponding kernel configurations are enabled. When ``CONFIG_SND_DEBUG``
- is enabled, the latter tracepoints are available. When additional
- ``SND_PCM_XRUN_DEBUG`` is enabled too, the former trace points are enabled.
- Tracepoints for state of PCM buffer
- ------------------------------------
- This category includes four tracepoints; ``hwptr``, ``applptr``, ``xrun`` and
- ``hw_ptr_error``.
- Tracepoints for processing of PCM hardware parameters
- -----------------------------------------------------
- This category includes two tracepoints; ``hw_mask_param`` and
- ``hw_interval_param``.
- In a design of ALSA PCM core, data transmission is abstracted as PCM substream.
- Applications manage PCM substream to maintain data transmission for PCM frames.
- Before starting the data transmission, applications need to configure PCM
- substream. In this procedure, PCM hardware parameters are decided by
- interaction between applications and ALSA PCM core. Once decided, runtime of
- the PCM substream keeps the parameters.
- The parameters are described in struct snd_pcm_hw_params. This
- structure includes several types of parameters. Applications set preferable
- value to these parameters, then execute ioctl(2) with SNDRV_PCM_IOCTL_HW_REFINE
- or SNDRV_PCM_IOCTL_HW_PARAMS. The former is used just for refining available
- set of parameters. The latter is used for an actual decision of the parameters.
- The struct snd_pcm_hw_params structure has below members:
- ``flags``
- Configurable. ALSA PCM core and some drivers handle this flag to select
- convenient parameters or change their behaviour.
- ``masks``
- Configurable. This type of parameter is described in
- struct snd_mask and represent mask values. As of PCM protocol
- v2.0.13, three types are defined.
- - SNDRV_PCM_HW_PARAM_ACCESS
- - SNDRV_PCM_HW_PARAM_FORMAT
- - SNDRV_PCM_HW_PARAM_SUBFORMAT
- ``intervals``
- Configurable. This type of parameter is described in
- struct snd_interval and represent values with a range. As of
- PCM protocol v2.0.13, twelve types are defined.
- - SNDRV_PCM_HW_PARAM_SAMPLE_BITS
- - SNDRV_PCM_HW_PARAM_FRAME_BITS
- - SNDRV_PCM_HW_PARAM_CHANNELS
- - SNDRV_PCM_HW_PARAM_RATE
- - SNDRV_PCM_HW_PARAM_PERIOD_TIME
- - SNDRV_PCM_HW_PARAM_PERIOD_SIZE
- - SNDRV_PCM_HW_PARAM_PERIOD_BYTES
- - SNDRV_PCM_HW_PARAM_PERIODS
- - SNDRV_PCM_HW_PARAM_BUFFER_TIME
- - SNDRV_PCM_HW_PARAM_BUFFER_SIZE
- - SNDRV_PCM_HW_PARAM_BUFFER_BYTES
- - SNDRV_PCM_HW_PARAM_TICK_TIME
- ``rmask``
- Configurable. This is evaluated at ioctl(2) with
- SNDRV_PCM_IOCTL_HW_REFINE only. Applications can select which
- mask/interval parameter can be changed by ALSA PCM core. For
- SNDRV_PCM_IOCTL_HW_PARAMS, this mask is ignored and all of parameters
- are going to be changed.
- ``cmask``
- Read-only. After returning from ioctl(2), buffer in user space for
- struct snd_pcm_hw_params includes result of each operation.
- This mask represents which mask/interval parameter is actually changed.
- ``info``
- Read-only. This represents hardware/driver capabilities as bit flags
- with SNDRV_PCM_INFO_XXX. Typically, applications execute ioctl(2) with
- SNDRV_PCM_IOCTL_HW_REFINE to retrieve this flag, then decide candidates
- of parameters and execute ioctl(2) with SNDRV_PCM_IOCTL_HW_PARAMS to
- configure PCM substream.
- ``msbits``
- Read-only. This value represents available bit width in MSB side of
- a PCM sample. When a parameter of SNDRV_PCM_HW_PARAM_SAMPLE_BITS was
- decided as a fixed number, this value is also calculated according to
- it. Else, zero. But this behaviour depends on implementations in driver
- side.
- ``rate_num``
- Read-only. This value represents numerator of sampling rate in fraction
- notation. Basically, when a parameter of SNDRV_PCM_HW_PARAM_RATE was
- decided as a single value, this value is also calculated according to
- it. Else, zero. But this behaviour depends on implementations in driver
- side.
- ``rate_den``
- Read-only. This value represents denominator of sampling rate in
- fraction notation. Basically, when a parameter of
- SNDRV_PCM_HW_PARAM_RATE was decided as a single value, this value is
- also calculated according to it. Else, zero. But this behaviour depends
- on implementations in driver side.
- ``fifo_size``
- Read-only. This value represents the size of FIFO in serial sound
- interface of hardware. Basically, each driver can assigns a proper
- value to this parameter but some drivers intentionally set zero with
- a care of hardware design or data transmission protocol.
- ALSA PCM core handles buffer of struct snd_pcm_hw_params when
- applications execute ioctl(2) with SNDRV_PCM_HW_REFINE or SNDRV_PCM_HW_PARAMS.
- Parameters in the buffer are changed according to
- struct snd_pcm_hardware and rules of constraints in the runtime. The
- structure describes capabilities of handled hardware. The rules describes
- dependencies on which a parameter is decided according to several parameters.
- A rule has a callback function, and drivers can register arbitrary functions
- to compute the target parameter. ALSA PCM core registers some rules to the
- runtime as a default.
- Each driver can join in the interaction as long as it prepared for two stuffs
- in a callback of struct snd_pcm_ops.open.
- 1. In the callback, drivers are expected to change a member of
- struct snd_pcm_hardware type in the runtime, according to
- capacities of corresponding hardware.
- 2. In the same callback, drivers are also expected to register additional rules
- of constraints into the runtime when several parameters have dependencies
- due to hardware design.
- The driver can refers to result of the interaction in a callback of
- struct snd_pcm_ops.hw_params, however it should not change the
- content.
- Tracepoints in this category are designed to trace changes of the
- mask/interval parameters. When ALSA PCM core changes them, ``hw_mask_param`` or
- ``hw_interval_param`` event is probed according to type of the changed parameter.
- ALSA PCM core also has a pretty print format for each of the tracepoints. Below
- is an example for ``hw_mask_param``.
- ::
- hw_mask_param: pcmC0D0p 001/023 FORMAT 00000000000000000000001000000044 00000000000000000000001000000044
- Below is an example for ``hw_interval_param``.
- ::
- hw_interval_param: pcmC0D0p 000/023 BUFFER_SIZE 0 0 [0 4294967295] 0 1 [0 4294967295]
- The first three fields are common. They represent name of ALSA PCM character
- device, rules of constraint and name of the changed parameter, in order. The
- field for rules of constraint consists of two sub-fields; index of applied rule
- and total number of rules added to the runtime. As an exception, the index 000
- means that the parameter is changed by ALSA PCM core, regardless of the rules.
- The rest of field represent state of the parameter before/after changing. These
- fields are different according to type of the parameter. For parameters of mask
- type, the fields represent hexadecimal dump of content of the parameter. For
- parameters of interval type, the fields represent values of each member of
- ``empty``, ``integer``, ``openmin``, ``min``, ``max``, ``openmax`` in
- struct snd_interval in this order.
- Tracepoints in drivers
- ======================
- Some drivers have tracepoints for developers' convenience. For them, please
- refer to each documentation or implementation.
|