Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
AXFER-TRANSFER(1)	    General Commands Manual	     AXFER-TRANSFER(1)

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 es-
       sentially  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  de-
       tected automatically and	metadata is used for parameters	of sample for-
       mat,  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 transmis-
	      sion 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 re-
	      quired  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  re-
	      quired  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	trans-
	      mission. 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>-<se-
	      quential number>[.suffix]'.  The suffix is omitted when raw for-
	      mat 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  configura-
	      tion 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 sub-
	      stream,  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	opera-
	      tion. Without the	option,	temporary buffers are used to copy au-
	      dio data frame for buffer	of PCM substream.  This	option implic-
	      itly uses	--waiter-type option as	well to	prevent	heavy consump-
	      tion of CPU time.

       -F, --period-size=#

	      This option configures given value to period_size	hardware para-
	      meter of PCM substream. The parameter indicates  the  number  of
	      audio  data frame	per period in buffer of	the PCM	substream. Ac-
	      tual 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 hard-
	      ware 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 para-
	      meter  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 para-
	      meter 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 para-
	      meter 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 op-
	      tions, or	timer value of --sched-model option.  Neither this op-
	      tion nor --test-nowait is	available at the same time.

       --sched-model=MODEL

	      This  option  selects  scheduling	model for process of this pro-
	      gram. 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 parame-
	      ter  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 auto-
	      matically	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 ex-
	      plicit 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  sub-
	      stream   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  sup-
	      press conversion of sampling rate	for audio data frame.

       --disable-channels

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

       --disable-format

	      This option has an effect	for 'plug' plugin in alsa-lib to  sup-
	      press 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	 addi-
	      tional 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	avail-
	      able. 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  con-
	      troller  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 communi-
	      cate. 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  man-
	      aged 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	 peri-
	      ods 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  de-
	      multiplex	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  pro-
	      gram.

       --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	commu-
	      nication.	 The given value should	be within RLIMIT_RTPRIO	 para-
	      meter 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  sup-
       ported 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 play-
       back during 1 second.  The sample format	is detected automatically as a
       result to parse 'something' as long as it's compliant  to  one  of  Mi-
       crosoft/IBM RIFF/Wave, Sparc AU,	Creative Tech. voice formats. If noth-
       ing  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,	monau-
       ral, 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  dri-
       vers  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 transmis-
       sion, 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  gen-
       erates  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 periodi-
       cal 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 au-
       dio  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  explic-
       itly  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  sub-
       stream.	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	trans-
       mission of audio	data frame.  The hardware  should  automatically  con-
       tinue  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	appli-
       cations	should	be programmed without any blocking operation. For this
       reason, this mode is enabled when the PCM applications explicitly  con-
       figure  hardware	parameter to runtime of	PCM substream, to prevent dis-
       order 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/for-
       warding,	 applications can achieve low latency between transmission po-
       sition 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	impor-
       tant.  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  fea-
       ture 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)  implementa-
	      tion,  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 op-
	      tion 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	 writ-
	      ten.  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  op-
	      tion  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 op-
	      tion 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) implementa-
	      tion,  this option has an	effect to occupy stdout	with some ter-
	      minal 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) implementa-
	      tion,  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  sub-
	      stream.

       -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	opera-
	      tion. 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) im-
	      plementation, these operations bring  XRUN  state	 to  the  sub-
	      stream,  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 de-
       scriptor	for file/stream	of multimedia container	or raw data. The  mod-
       ule automatically detect	type of	multimedia container and parse parame-
       ters  in	its metadata of	data header. At	present, three types of	multi-
       media containers	are supported; Microsoft/IBM RIFF/Wave ( wav ),	 Sparc
       AU  (  au ) and Creative	Technology voice ( voc ). Additionally,	a spe-
       cial 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 includ-
       ing audio data frames is	passed.	This buffer has	two shapes for	inter-
       leaved 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  con-
       tainer  module, a pointer to one	buffer is passed because supported me-
       dia containers including	raw type store audio  data  frames  in	inter-
       leaved 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  mod-
       ules.

	- 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	execu-
       tion 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)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=axfer-transfer&sektion=1&manpath=FreeBSD+Ports+14.3.quarterly>

home | help