Provided by: alsa-utils_1.2.9-1ubuntu5_amd64 bug

NAME

       axfer-transfer - transferrer of audio data frame for sound devices and nodes.

SYNOPSIS

       axfer transfer direction [ common-options ] [ backend-options ] [ filepath ]

       axfer transfer direction [ common-options ] [ backend-options ] -I | --separate-channels filepath ...

       direction = capture | playback

       common-options = ( read OPTIONS section )

       backend-options = ( read OPTIONS section )

       filepaths = ( read OPTIONS section )

DESCRIPTION

       The  transfer  subcommand  of  axfer  performs transmission of audio data frames for devices available in
       supported backends. This program is essentially designed to use  alsa-lib  APIs  (libasound  backend)  to
       handle sound devices supported by Linux sound subsystem (ALSA).

OPTIONS

   Direction
       capture
              Operates for capture transmission.

       playback
              Operates for playback transmission.

   Filepath
       Filepath  is  handled  as  a path relative to current working directory of run time if it's not full path
       from root directory.

       The standard input or output is used if filepath is not specified or given as '-' .

       For playback transmission, container format of given filepath is detected automatically and  metadata  is
       used  for  parameters  of  sample format, channels, rate, duration. If nothing detected, content of given
       file path is handled as raw data. In this case, the parameters should be indicated as options.

       Multiple filepaths are allowed with -I | --separate-channels option. In this  case,  standard  input  and
       output is not available. The same filepath is not allowed except for paths listed below:
        - /dev/null
        - /dev/zero
        - /dev/full
        - /dev/random
        - /dev/urandom

   Common options
       -h, --help
              Print help messages and finish run time.

       -q, --quiet
              Quiet mode. Suppress messages (not sound :))

       -v, --verbose
              Verbose  mode. Runtime dumps supplemental information according to the number of this option given
              in command line.

       -d, --duration=#
              Interrupt after # seconds. A value of zero means infinity. The default is zero, so if this  option
              is  omitted  then  the transmission process will run until it is killed. Either -d or -s option is
              available exclusively.

       -s, --samples=#
              Interrupt after transmission of # number of data frames. A  value  of  zero  means  infinity.  The
              default  is zero, so if this options is omitted then the transmission process will run until it is
              killed. Either -d or -s option is available exclusively.

       -f, --format=FORMAT
              Indicate format  of  audio  sample.  This  is  required  for  capture  transmission,  or  playback
              transmission with files including raw audio data.

              Available sample format is listed below:
               - [S8|U8|S16|U16|S32|U32][_LE|_BE]
               - [S24|U24][_LE|_BE]
               - FLOAT[_LE|_BE]
               - FLOAT64[_LE|_BE]
               - IEC958_SUBFRAME[_LE|_BE]
               - MU_LAW
               - A_LAW
               - [S20|U20][_LE|_BE]
               - [S24|U24][_3LE|_3BE]
               - [S20|U20][_3LE|_3BE]
               - [S18|U18][_3LE|_3BE]
               - DSD_U8
               - DSD_[U16|U32][_LE|_BE]

              If endian-ness is omitted, host endian-ness is used.

              Some special formats are available:
               - cd (16 bit little endian, 44100, stereo) [= -f S16_LE -c 2 -r 44100]
               - cdr (16 bit big endian, 44100, stereo) [= -f S16_BE -c 2 -f 44100]
               - dat (16 bit little endian, 48000, stereo) [= -f S16_LE -c 2 -r 48000]

              If  omitted, U8 is used as a default. Actual available formats are restricted by each transmission
              backend.

              Unavailable sample format is listed below. These format has size of data frame unaligned  to  byte
              unit.

               - IMA_ADPCM
               - MPEG
               - GSM
               - SPECIAL
               - G723_24
               - G723_24_1B
               - G723_40
               - G723_40_1B

       -c, --channels=#
              Indicate the number of audio data samples per frame. This is required for capture transmission, or
              playback  transmission with files including raw audio data. The value should be between 1 to 256 .
              If omitted, 1 is used as a default.

       -r, --rate=#
              Indicate the number of audio data frame per second. This is required for capture transmission,  or
              playback  transmission  with files including raw audio data. If the value is less than 1000 , it's
              interpreted by kHz unit. The value should be between 2000 and 192000 . If omitted, 8000 is used as
              a default.

       -t, --file-type=TYPE
              Indicate the type of file. This is required for capture transmission. Available types  are  listed
              below:
               - wav: Microsoft/IBM RIFF/Wave format
               - au, sparc: Sparc AU format
               - voc: Creative Tech. voice format
               - raw: raw data

              When  nothing  is  indicated, for capture transmission, the type is decided according to suffix of
              filepath , and raw type is used for fallback.

       -I, --separate-channels
              Indicate this option when several files are going to be handled. For capture transmission, if  one
              filepath   is   given   as   filepath   ,   a   list  of  filepaths  is  generated  in  a  formula
              '<filepath>-<sequential number>[.suffix]'.  The suffix is omitted when raw format of container  is
              used.

       --dump-hw-params
              Dump hardware parameters and finish run time if backend supports it.

       --xfer-backend=BACKEND
              Select backend of transmission from a list below. The default is libasound.
               - libasound
               - libffado (optional if compiled)

   Backend options for libasound
       -D, --device=NODE

              This  option  is  used  to  select PCM node in libasound configuration space.  Available nodes are
              listed by pcm operation of list subcommand.

       -N, --nonblock

              With this option, PCM substream is opened in non-blocking mode.  When  audio  data  frame  is  not
              available  in  buffer  of  the  PCM  substream, I/O operation immediately returns without blocking
              process. This option implicitly uses --waiter-type option as well to prevent heavy consumption  of
              CPU time.

       -M, --mmap

              With  this  option,  audio data frame is processed directly in buffer of PCM substream if selected
              node supports this operation. Without the option, temporary buffers are used to  copy  audio  data
              frame  for  buffer  of PCM substream.  This option implicitly uses --waiter-type option as well to
              prevent heavy consumption of CPU time.

       -F, --period-size=#

              This option configures given value  to  period_size  hardware  parameter  of  PCM  substream.  The
              parameter  indicates  the  number  of  audio data frame per period in buffer of the PCM substream.
              Actual number is decided as a result of interaction between  each  implementation  of  PCM  plugin
              chained from the selected PCM node, and in-kernel driver or PCM I/O plugins.

              Ideally,  the same amount of audio data frame as the value should be handled in one I/O operation.
              Actually, it is not, depending on implementation of the PCM plugins,  in-kernel  driver,  PCM  I/O
              plugins  and scheduling model. For 'hw' PCM plugin in 'irq' scheduling model, the value is used to
              decide intervals of hardware interrupt, thus the same amount of audio data frame as the  value  is
              expected to be available for one I/O operation.

       --period-time=#

              This option configures given value to period_time hardware parameter of PCM substream. This option
              is similar to --period-size option, however its unit is micro-second.

       -B, --buffer-size=#

              This  option  configures  given  value  to  buffer_size  hardware  parameter of PCM substream. The
              parameter indicates the number of audio data frame in buffer of PCM substream.  Actual  number  is
              decided  as  a  result  of  interaction between each implementation of PCM plugin chained from the
              selected PCM node, and in-kernel driver or PCM I/O plugins.

              Ideally, this is multiples of the number of audio data frame per period, thus the size of  period.
              Actually,  it is not, depending on implementation of the PCM plugins, in-kernel driver and PCM I/O
              plugins.

       --buffer-time=#

              This option configures given value to buffer_time hardware parameter of PCM substream. This option
              is similar to --buffer-size option, however its unit is micro-second.

       --waiter-type=TYPE

              This option indicates the type of waiter for  event  notification.  At  present,  four  types  are
              available;  default  , select , poll and epoll . With default type, 'snd_pcm_wait()' is used. With
              select type, 'select(2)' system call is used. With poll type, 'poll(2)' system call is used.  With
              epoll type, Linux-specific 'epoll(7)' system call is used.

              This  option  should  correspond  to  one  of  --nonblock  or  --mmap  options,  or timer value of
              --sched-model option.  Neither this option nor --test-nowait is available at the same time.

       --sched-model=MODEL

              This option selects scheduling model for  process  of  this  program.  One  of  irq  or  timer  is
              available. In detail, please read 'SCHEDULING MODEL' section.

              When nothing specified, irq model is used.

       -A, --avail-min=#

              This  option  configures given value to avail-min software parameter of PCM substream. In blocking
              mode, the value is used as threshold of the number of available audio data frames in buffer of PCM
              substream to wake up process blocked by I/O operation. In non-blocking  mode,  any  I/O  operation
              returns -EAGAIN until the available number of audio data frame reaches the threshold.

              This option has an effect in cases neither --mmap nor timer value of --sched-model option is used.

       -R, --start-delay=#

              This  option  configures  given  value to start_threshold software parameter of PCM substream. The
              value is used as threshold to start PCM substream automatically. At present, this  option  has  an
              effect in cases neither --mmap nor timer value of --sched-model option is used.

              For  playback  transmission,  when  the  number  of  accumulated audio data frame in buffer of PCM
              substream to which this program writes  out  reaches  the  threshold,  the  PCM  substream  starts
              automatically without an explicit call of snd_pcm_start() to the PCM substream.

              For  capture  transmission,  this option is useless. The number of accumulated audio data frame is
              not increased without an explicit call of snd_pcm_start() to the PCM substream.

              This option has an effect in cases neither --mmap nor timer value of --sched-model option is used.

       -T, --stop-delay=#

              This option configures given value to stop_threshold software  parameter  of  PCM  substream.  The
              value  is  used  as  threshold to stop PCM substream automatically. At present, this option has an
              effect in cases neither --mmap nor timer value of --sched-model option is used.

              For capture transmission, when the number of  accumulated  audio  data  frame  in  buffer  of  PCM
              substream to which a driver or alsa-lib PCM plugins write reaches the threshold, the PCM substream
              stops  automatically  without  an  explicit call of snd_pcm_stop() to the PCM substream. This is a
              case that this program leaves the audio data frames without reading for a while.

              For playback transmission, when the number available audio data frame in buffer of  PCM  substream
              from  which  a  driver or alsa-lib PCM plugins read reaches the threshold, the PCM substream stops
              automatically without an explicit call of snd_pcm_stop() to the PCM substream. This is a case that
              this program leaves the audio data frames without writing for a while.

              This option has an effect in cases neither --mmap nor timer value of --sched-model option is used.

       --disable-resample

              This option has an effect for 'plug' plugin in alsa-lib to suppress conversion  of  sampling  rate
              for audio data frame.

       --disable-channels

              This  option  has  an  effect for 'plug' plugin in alsa-lib to suppress conversion of channels for
              audio data frame.

       --disable-format

              This option has an effect for 'plug' plugin in alsa-lib to suppress conversion  of  sample  format
              for audio data frame.

       --disable-softvol

              This  option  has an effect for 'softvol' plugin in alsa-lib to suppress conversion of samples for
              audio data frame via additional control element.

       --fatal-errors

              This option suppresses recovery operation from XRUN state of running PCM substream,  then  process
              of this program is going to finish as usual.

       --test-nowait

              This  option  disables any waiter for I/O event notification. I/O operations are iterated till any
              of audio data frame is available. The option brings heavy load in consumption of CPU time.

   Backend options for libffado
       This backend is automatically available when configure script detects  ffado_streaming_init()  symbol  in
       libffado shared object.

       -p, --port=#

              This  option  uses  given  value to decide which 1394 OHCI controller is used to communicate. When
              Linux system has two 1394 OHCI controllers, 0 or 1 are available. Neither this option  nor  -g  is
              available  at  the  same  time. If nothing specified, libffado performs to communicate to units on
              IEEE 1394 bus managed by all of 1394 OHCI controller available in Linux system.

       -n, --node=#

              This option uses given value to decide which unit is used to communicate. This option requires  -p
              option to indicate which 1394 OHCI controller is used to communicate to the specified unit.

       -g, --guid=HEXADECIMAL

              This  option uses given value to decide a target unit to communicate. The value should be prefixed
              with '0x' and consists of hexadecimal literal letters (0-9, a-f, A-F). Neither this option nor  -p
              is  available at the same time. If nothing specified, libffado performs to communicate to units on
              IEEE 1394 bus managed by all of 1394 OHCI controller available in Linux system.

       --frames-per-period=#

              This option uses given value to decide the number of audio data frame in one read/write operation.
              The operation is blocked till the number of available audio data frame exceeds the given value. As
              a default, 512 audio data frames is used.

       --periods-per-buffer=#

              This option uses given value to decide the size of intermediate buffer between  this  program  and
              libffado. As a default, 2 periods per buffer is used.

       --slave

              This option allows this program to run slave mode. In this mode, libffado adds unit directory into
              configuration ROM of 1394 OHCI controller where Linux system runs. The unit directory can be found
              by  the  other  node  on  the same bus.  Linux system running on the node can transfer isochronous
              packet with audio data frame to the unit. This program can receive the packet and demultiplex  the
              audio data frame.

       --snoop

              This  option  allows  this  program  to run snoop mode. In this mode, libffado listens isochronous
              channels to which device transfers isochronous packet. When isochronous  communication  starts  by
              any unit on the same bus, the packets can be handled by this program.

       --sched-priority=#

              This  option  executes  pthread_setschedparam()  in  a call of ffado_streaming_init() to configure
              scheduling  policy  and  given  value  as  its  priority  for  threads  related   to   isochronous
              communication.   The  given value should be within RLIMIT_RTPRIO parameter of process. Please read
              getrlimit(2) for details.

POSIX SIGNALS

       During transmission, SIGINT and SIGTERM will close handled files and PCM substream to be going to  finish
       run time.

       SIGTSTP  will  suspend  PCM  substream  and  SIGCONT will resume it. No XRUNs are expected. With libffado
       backend, the suspend/resume is not supported and runtime is aborted immediately.

       The other signals perform default behaviours.

EXAMPLES

           $ axfer transfer playback -d 1 something

       The above will transfer audio data frame in 'something' file for playback during 1  second.   The  sample
       format  is  detected  automatically  as a result to parse 'something' as long as it's compliant to one of
       Microsoft/IBM RIFF/Wave, Sparc AU, Creative Tech. voice formats. If nothing detected,  -r  ,  -c  and  -f
       should be given, or -f should be given with special format.

           $ axfer transfer playback -r 22050 -c 1 -f S16_LE -t raw something

       The  above  will transfer audio data frame in 'something' file including no information of sample format,
       as sample format of 22050 Hz, monaural, signed 16 bit little endian PCM for  playback.  The  transmission
       continues till catching SIGINT from keyboard or SIGTERM by kill(1) .

           $ axfer transfer capture -d 10 -f cd something.wav

       The  above  will  transfer  audio  data  frame  to  'something.wav'  file as sample format of 44.1 kHz, 2
       channels, signed 16 bit little endian PCM, during 10 seconds. The file format is Microsoft/IBM  RIFF/Wave
       according to suffix of the given filepath .

           $ axfer transfer capture -s 1024 -r 48000 -c 2 -f S32_BE -I -t au channels

       The  above  will  transfer  audio  data frame as sample format of 48.0 kHz, 2 channels, signed 32 bit big
       endian PCM for 1,024 number of data frames to files named 'channels-1.au' and 'channels-2.au'.

SCHEDULING MODEL

       In a design  of  ALSA  PCM  core,  runtime  of  PCM  substream  supports  two  modes;  period-wakeup  and
       no-period-wakeup.  These two modes are for different scheduling models.

   IRQ-based scheduling model
       As  a  default,  period-wakeup  mode  is used. In this mode, in-kernel drivers should operate hardware to
       generate periodical notification for transmission of audio data frame. The interval  of  notification  is
       equivalent to the same amount of audio data frame as one period of buffer, against actual time.

       In  a  handler  assigned  to  the  notification, a helper function of ALSA PCM core is called to update a
       position to head of hardware transmission, then compare  it  with  a  position  to  head  of  application
       operation to judge overrun/underrun (XRUN) and to wake up blocked processes.

       For  this  purpose,  hardware  IRQ of controller for serial audio bus such as Inter-IC sound is typically
       used. In this case, the controller generates the IRQ according to transmission on the serial  audio  bus.
       In the handler assigned to the IRQ, direct media access (DMA) transmission is requested between dedicated
       host memory and device memory.

       If target hardware doesn't support this kind of mechanism, the periodical notification should be emulated
       by  any  timer; e.g. hrtimer, kernel timer.  External PCM plugins generated by PCM plugin SDK in alsa-lib
       should also emulate the above behaviour.

       In this mode, PCM applications are programmed according to typical way of I/O  operations.  They  execute
       blocking system calls to read/write audio data frame in buffer of PCM substream, or blocking system calls
       to wait until any audio data frame is available. In axfer , this is called IRQ-based scheduling model and
       a  default  behaviour. Users can explicitly configure this mode by usage of --sched-model option with irq
       value.

   Timer-based scheduling model
       The no-period-wakeup mode is an optional mode of runtime of PCM substream. The mode  assumes  a  specific
       feature  of hardware and assist of in-kernel driver and PCM applications. In this mode, in-kernel drivers
       don't operate hardware to generate periodical notification for transmission of  audio  data  frame.   The
       hardware  should  automatically continue transmission of audio data frame without periodical operation of
       the drivers; e.g. according to auto-triggered DMA transmission, a chain of registered descriptors.

       In this mode, nothing wakes up blocked processes, therefore PCM applications should be programmed without
       any blocking operation. For this reason, this mode  is  enabled  when  the  PCM  applications  explicitly
       configure  hardware  parameter to runtime of PCM substream, to prevent disorder of existing applications.
       Additionally, nothing  maintains  timing  for  transmission  of  audio  data  frame,  therefore  the  PCM
       applications should voluntarily handle any timer to queue audio data frame in buffer of the PCM substream
       for  lapse  of time. Furthermore, instead of driver, the PCM application should call a helper function of
       ALSA PCM core to update a position to head of hardware transmission and to check XRUN.

       In axfer , this is called timer-based scheduling model and available as long as  hardware/driver  assists
       no-period-wakeup  runtime.  Users  should  explicitly set this mode by usage of --sched-model option with
       timer value.

       In the scheduling model, PCM applications need to care of available space on PCM buffer by lapse of time,
       typically by yielding CPU and wait  for  rescheduling.  For  the  yielding,  timeout  is  calculated  for
       preferable  amount  of  PCM  frames  to process. This is convenient to a kind of applications, like sound
       servers. when an I/O thread of the server wait for the timeout, the other threads can process audio  data
       frames  for server clients. Furthermore, with usage of rewinding/forwarding, applications can achieve low
       latency between transmission position and handling position even if they uses large size of PCM buffers.

   Advantages and issues
       Ideally, timer-based scheduling model has some advantages than IRQ-based scheduling model. At  first,  no
       interrupt  context  runs  for PCM substream. The PCM substream is handled in any process context only. No
       need to care of race conditions between IRQ and process contexts. This reduces  some  concerns  for  some
       developers  of  drivers  and  applications. Secondary, CPU time is not used for handlers on the interrupt
       context. The CPU time can be dedicated for the other tasks. This is good  in  a  point  of  Time  Sharing
       System.  Thirdly, hardware is not configured to generate interrupts. This is good in a point of reduction
       of overall power consumption possibly.

       In either scheduling model, the hardware should allow drivers to read the  number  of  audio  data  frame
       transferred  between  the  dedicated  memory  and  the  device  memory  for audio serial bus. However, in
       timer-based scheduling model, fine granularity and accuracy of the value is important. Actually  hardware
       performs  transmission  between dedicated memory and device memory for a small batch of audio data frames
       or bytes. In a view of PCM applications, the granularity in current transmission is  required  to  decide
       correct  timeout  for  each  I/O  operation.  As  of  Linux  kernel  v4.21,  ALSA  PCM  interface between
       kernel/userspace has no feature to report it.

COMPATIBILITY TO APLAY

       The transfer subcommand of axfer is designed to keep compatibility  to  aplay(1).  However  some  options
       below are not compatible due to several technical reasons.

       -I, --separate-channels
              This  option is supported just for files to store audio data frames corresponding to each channel.
              In aplay(1) implementation, this option has an additional effect to  use  PCM  buffer  aligned  to
              non-interleaved order if a target device supports. As of 2018, PCM buffer of non-interleaved order
              is hardly used by sound devices.

       -A, --avail-min=#
              This  option indicates threshold to wake up blocked process in a unit of audio data frame. Against
              aplay(1) implementation, this option has no  effect  with  --mmap  option  as  well  as  timer  of
              --sched-model option.

       -R, --start-delay=#
              This  option  indicates  threshold  to start prepared PCM substream in a unit of audio data frame.
              Against aplay(1) implementation, this option has no effect with --mmap option as well as timer  of
              --sched-model option.

       -T, --stop-delay=#
              This  option  indicates  threshold  to  stop  running PCM substream in a unit of audio data frame.
              Against aplay(1) implementation, this option has no effect with --mmap option as well as timer  of
              --sched-model option.

       --max-file-time=#
              This  option  is  unsupported.  In  aplay(1)  implementation, the option has an effect for capture
              transmission to save files up to the same number of data frames as the given value by second unit,
              or the maximum number of data  frames  supported  by  used  file  format.  When  reaching  to  the
              limitation,  used  file  is  closed,  then  new  file is opened and audio data frames are written.
              However, this option requires extra handling of files and shall increase complexity of  main  loop
              of axfer.

       --use-strftime=FORMAT
              This  option  is  unsupported.  In  aplay(1)  implementation, the option has an effect for capture
              transmission to generate file paths according to given format in  which  some  extra  formats  are
              available  as well as formats supported by strftime(3). However, this option requires extra string
              processing for file paths and it's bothersome if written in C language.

       --process-id-file=FILEPATH
              This option is unsupported. In aplay(1) implementation, the option has an effect to create a  file
              for  given value and write out process ID to it. This file allows users to get process ID and send
              any POSIX signal to aplay process.  However, this idea has some troubles  for  file  locking  when
              multiple aplay processes run with the same file.

       -V, --vumeter=TYPE
              This  option is not supported at present. In aplay(1) implementation, this option has an effect to
              occupy stdout with some terminal control characters and display vumeter for  monaural  and  stereo
              channels.  However, some problems lay; this feature is just for audio data frames with PCM format,
              this feature brings disorder of terminal after aborting, stdout is not available for pipeline.

       -i, --interactive
              This option is not supported at present. In aplay(1) implementation, this option has an effect  to
              occupy  stdin  for  key  input  and  suspend/resume  PCM  substream according to pushed enter key.
              However, this feature requires an additional input handling in  main  loop  and  leave  bothersome
              operation to maintain PCM substream.

       -m, --chmap=CH1,CH2,...
              ALSA PCM core and control core doesn't support this feature, therefore remapping should be done in
              userspace.  This  brings  overhead  to  align  audio  data  frames, especially for mmap operation.
              Furthermore, as of alsa-lib v1.1.8, some plugins don't support this feature expectedly, thus  this
              option  is  a  lack  of transparent operation. At present, this option is not supported yet not to
              confuse users.

       SIGTSTP, SIGCONT
              This performs suspend/resume of PCM substream. In aplay(1) implementation, these operations  bring
              XRUN  state  to  the  substream, and suspend/resume is done in interactive mode in the above. Some
              developers use the signal for recovery test from XRUN. At present, no alternative is supported for
              the test.

       SIGUSR1
              This is not supported. In aplay(1) implementation, this signal is assigned to a handler to close a
              current file to store audio data frame and open a new file to  continue  processing.  However,  as
              well as --max-file-time option, this option should increase complexity of main loop of axfer.

DESIGN

   Modular structure
       This  program  consists  of  three modules; xfer , mapper and container .  Each module has an abstraction
       layer to enable actual implementation.

                  --------     ----------     -------------
       device <-> | xfer | <-> | mapper | <-> | container | <-> file
                  --------     ----------     -------------
                   libasound    single         wav
                   libffado     multiple       au
                                               voc
                                               raw

       The xfer module performs  actual  transmission  to  devices  and  nodes.  The  module  can  have  several
       transmission  backends.  As  a  default  backend,  libasound  backend is used to perform transmission via
       alsa-lib APIs. The module allows each backend to parse own command line options.

       The container module performs to read/write audio data frame via descriptor for file/stream of multimedia
       container or raw data. The module automatically detect type of multimedia container and parse  parameters
       in  its  metadata  of  data  header.  At  present,  three  types  of multimedia containers are supported;
       Microsoft/IBM RIFF/Wave ( wav ), Sparc AU ( au ) and Creative Technology voice ( voc ).  Additionally,  a
       special container is prepared for raw audio data ( raw ).

       The  mapper  module handles buffer layout and alignment for transmission of audio data frame.  The module
       has two implementations; single and multiple .  The single backend uses one container  to  construct  the
       buffer. The multiple backend uses several containers to construct it.

   Care of copying audio data frame
       Between  the  xfer  module  and mapper module, a pointer to buffer including audio data frames is passed.
       This buffer has two shapes for interleaved and non-interleaved order. For the former, the pointer  points
       to one buffer. For the latter, the pointer points to an array in which each element points to one buffer.
       Between the mapper module and container module, a pointer to one buffer is passed because supported media
       containers including raw type store audio data frames in interleaved order.

       In passing audio data frame between the modules, axfer is programmed to avoid copying between a buffer to
       another  buffer  as  much  as  possible.  For example, in some scenarios below, no copying occurs between
       modules.

        - xfer(mmap/interleaved), mapper(single), container(any)
        - xfer(mmap/non-interleaved), mapper(multiple), containers(any)

   Unit test
       For each of the mapper and container module, unit test is available. To  run  the  tests,  execute  below
       command:

       $ make test

       Each  test  iterates  writing  to  file  and reading to the file for many times and it takes long time to
       finish. Please take care of the execution time if running on any CI environment.

SEE ALSO

        axfer(1), axfer-list(1), alsamixer(1), amixer(1)

AUTHOR

       Takashi Sakamoto <o-takashi@sakamocchi.jp>

alsa-utils                                      28 November 2018                               AXFER-TRANSFER(1)