mirror of
https://github.com/alsa-project/alsa-utils
synced 2024-11-10 03:45:42 +01:00
a37703614a
I note that libffado backend has no support for suspend/resume because libffado has enough implementation for these features even if it exports some symbols for them. For this backend, reception of signals for the features brings abortion of runtime. Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Takashi Iwai <tiwai@suse.de>
583 lines
16 KiB
Groff
583 lines
16 KiB
Groff
.TH AXFER\-TRANSFER 1 "28 November 2018" "alsa\-utils"
|
|
|
|
.SH NAME
|
|
axfer\-transfer \- transferrer of audio data frame for sound devices and nodes.
|
|
|
|
.SH SYNOPSIS
|
|
|
|
.B axfer transfer
|
|
.I direction
|
|
[
|
|
.I common\-options
|
|
] [
|
|
.I backend\-options
|
|
] [
|
|
.I filepath
|
|
]
|
|
|
|
.B axfer transfer
|
|
.I direction
|
|
[
|
|
.I common\-options
|
|
] [
|
|
.I backend\-options
|
|
]
|
|
.I \-I
|
|
|
|
|
.I \-\-separate\-channels filepath ...
|
|
|
|
direction =
|
|
.B capture
|
|
|
|
|
.B playback
|
|
|
|
common\-options = ( read
|
|
.I OPTIONS
|
|
section )
|
|
|
|
backend\-options = ( read
|
|
.I OPTIONS
|
|
section )
|
|
|
|
filepaths = ( read
|
|
.I OPTIONS
|
|
section )
|
|
|
|
.SH DESCRIPTION
|
|
The
|
|
.B transfer
|
|
subcommand of
|
|
.B 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).
|
|
|
|
.SH OPTIONS
|
|
|
|
.SS Direction
|
|
|
|
.TP
|
|
.B capture
|
|
Operates for capture transmission.
|
|
|
|
.TP
|
|
.B playback
|
|
Operates for playback transmission.
|
|
|
|
.SS Filepath
|
|
|
|
Filepath is handled as a path relative to current working directory of run time
|
|
if it\(aqs not full path from root directory.
|
|
|
|
The standard input or output is used if filepath is not specified or given as
|
|
.I \(aq\-\(aq
|
|
\&.
|
|
|
|
For playback transmission, container format of given
|
|
\I 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
|
|
.I filepaths
|
|
are allowed with
|
|
.I \-I
|
|
|
|
|
.I \-\-separate\-channels
|
|
option. In this case, standard input and output is not available. The same
|
|
.I filepath
|
|
is not allowed except for paths listed below:
|
|
\- /dev/null
|
|
\- /dev/zero
|
|
\- /dev/full
|
|
\- /dev/random
|
|
\- /dev/urandom
|
|
|
|
.SS Common options
|
|
|
|
.TP
|
|
.B \-h, \-\-help
|
|
Print help messages and finish run time. Not yet implemented.
|
|
|
|
.TP
|
|
.B \-q, \-\-quiet
|
|
Quiet mode. Suppress messages (not sound :))
|
|
|
|
.TP
|
|
.B \-v, \-\-verbose
|
|
Verbose mode. Runtime dumps supplemental information according to the number of
|
|
this option given in command line.
|
|
|
|
.TP
|
|
.B \-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
|
|
.I \-d
|
|
or
|
|
.I \-s
|
|
option is available exclusively.
|
|
|
|
.TP
|
|
.B \-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
|
|
.I \-d
|
|
or
|
|
.I \-s
|
|
option is available exclusively.
|
|
|
|
.TP
|
|
.B \-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,
|
|
.I 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
|
|
|
|
.TP
|
|
.B \-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
|
|
.I 1 to
|
|
.I 256
|
|
\&. If omitted,
|
|
.I 1
|
|
is used as a default.
|
|
|
|
.TP
|
|
.B \-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
|
|
.I 1000
|
|
, it\(aqs interpreted by
|
|
.I kHz
|
|
unit. The value should be between
|
|
.I 2000
|
|
and
|
|
.I 192000
|
|
\&. If omitted,
|
|
.I 8000
|
|
is used as a default.
|
|
|
|
.TP
|
|
.B \-t, \-\-file\-type=TYPES
|
|
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
|
|
.I filepath
|
|
, and
|
|
.I raw
|
|
type is used for fallback.
|
|
|
|
.TP
|
|
.B \-I, \-\-separate\-channels
|
|
Indicate this option when several files are going to be handled. For capture
|
|
transmission, if one filepath is given as
|
|
.I filepath
|
|
, a list of
|
|
.I filepaths
|
|
is generated in a formula \(aq<filepath>\-<sequential number>[.suffix]\(aq.
|
|
The suffix is omitted when raw format of container is used.
|
|
|
|
.TP
|
|
.B \-\-dump\-hw\-params
|
|
Dump hardware parameters and finish run time if backend supports it.
|
|
|
|
.TP
|
|
.B \-\-xfer\-backend=BACKEND
|
|
Select backend of transmission from a list below. The default is libasound.
|
|
.br
|
|
- libasound
|
|
- libffado (optional if compiled)
|
|
|
|
.SS Backend options for libasound
|
|
|
|
(placeholder)
|
|
|
|
.SS Backend options for libffado
|
|
|
|
This backend is automatically available when configure script detects
|
|
.I ffado_streaming_init()
|
|
symbol in libffado shared object.
|
|
|
|
.TP
|
|
.B \-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,
|
|
.I 0
|
|
or
|
|
.I 1
|
|
are available. Neither this option nor
|
|
.I \-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.
|
|
|
|
.TP
|
|
.B \-n, \-\-node
|
|
|
|
This option uses given value to decide which unit is used to communicate. This
|
|
option requires
|
|
.I \-p
|
|
option to indicate which 1394 OHCI controller is used to communicate to the
|
|
specified unit.
|
|
|
|
.TP
|
|
.B \-g, \-\-guid
|
|
|
|
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
|
|
.I \-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.
|
|
|
|
.TP
|
|
.B \-\-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.
|
|
|
|
.TP
|
|
.B \-\-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.
|
|
|
|
.TP
|
|
.B \-\-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.
|
|
|
|
.TP
|
|
.B \-\-snoop
|
|
|
|
This option allows this program to run snoop mode. In this mode, libffado
|
|
listens all isochronous channels. When isochronous communication starts
|
|
by any unit on the same bus, the packets can be handled by this program.
|
|
|
|
.TP
|
|
.B \-\-sched\-priority
|
|
|
|
This option executes
|
|
.I pthread_setschedparam()
|
|
in a call of
|
|
.I 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
|
|
.I RLIMIT_RTPRIO
|
|
parameter of process. Please read
|
|
.I getrlimit(2)
|
|
for details.
|
|
|
|
.SH POSIX SIGNALS
|
|
During transmission,
|
|
.I SIGINT
|
|
and
|
|
.I SIGTERM
|
|
will close handled files and PCM substream to be going to finish run time.
|
|
|
|
.I SIGTSTP
|
|
will suspend PCM substream and
|
|
.I SIGCONT
|
|
will resume it. No XRUNs are expected. With libffado backend, the suspend/resume
|
|
is not supported and runtime is aboeted immediately.
|
|
|
|
The other signals perform default behaviours.
|
|
|
|
.SH EXAMPLES
|
|
|
|
.PP
|
|
.in +4n
|
|
.EX
|
|
.B $ axfer transfer playback \-d 1 something
|
|
.EE
|
|
.in
|
|
.PP
|
|
|
|
The above will transfer audio data frame in \(aqsomething\(aq file for playback
|
|
during 1 second. The sample format is detected automatically as a result to
|
|
parse \(aqsomething\(aq as long as it\(aqs compliant to one of Microsoft/IBM
|
|
RIFF/Wave, Sparc AU, Creative Tech. voice formats. If nothing detected,
|
|
.I \-r
|
|
,
|
|
.I \-c
|
|
and
|
|
.I \-f
|
|
should be given,
|
|
or
|
|
.I \-f
|
|
should be given with special format.
|
|
|
|
.PP
|
|
.in +4n
|
|
.EX
|
|
.B $ axfer transfer playback \-r 22050 \-c 1 \-f S16_LE \-t raw something
|
|
.EE
|
|
.in
|
|
.PP
|
|
|
|
The above will transfer audio data frame in \(aqsomething\(aq 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
|
|
.I SIGINT
|
|
from keyboard or
|
|
.I SIGTERM
|
|
by
|
|
.I kill(1)
|
|
\&.
|
|
|
|
.PP
|
|
.in +4n
|
|
.EX
|
|
.B $ axfer transfer capture \-d 10 \-f cd something.wav
|
|
.EE
|
|
.in
|
|
.PP
|
|
|
|
The above will transfer audio data frame to \(aqsomething.wav\(aq 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
|
|
.I filepath
|
|
\&.
|
|
|
|
.PP
|
|
.in +4n
|
|
.EX
|
|
.B $ axfer transfer capture \-s 1024 \-r 48000 \-c 2 \-f S32_BE \-I \-t au channels
|
|
.EE
|
|
.in
|
|
.PP
|
|
|
|
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 \(aqchannels\-1.au\(aq and \(aqchannels\-2.au\(aq.
|
|
|
|
.SH COMPATIBILITY TO APLAY
|
|
|
|
The
|
|
.B transfer
|
|
subcommand of
|
|
.B axfer
|
|
is designed to keep compatibility to aplay(1). However some options below are
|
|
not compatible due to several technical reasons.
|
|
|
|
.TP
|
|
.I \-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.
|
|
|
|
.TP
|
|
.I \-\-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.
|
|
|
|
.TP
|
|
.I \-\-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\(aqs bothersome if written in C language.
|
|
|
|
.TP
|
|
.I \-\-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.
|
|
|
|
.TP
|
|
.I \-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.
|
|
|
|
.TP
|
|
.I \-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.
|
|
|
|
.TP
|
|
.I 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.
|
|
|
|
.TP
|
|
.I 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
|
|
.I \-\-max\-file\-time
|
|
option, this option should increase complexity of main loop of axfer.
|
|
|
|
.SH DESIGN
|
|
|
|
.SS Modular structure
|
|
|
|
This program consists of three modules;
|
|
.I xfer
|
|
,
|
|
.I mapper
|
|
and
|
|
.I container
|
|
\&.
|
|
Each module has an abstraction layer to enable actual implementation.
|
|
|
|
.nf
|
|
-------- ---------- -------------
|
|
device <-> | xfer | <-> | mapper | <-> | container | <-> file
|
|
-------- ---------- -------------
|
|
libasound single wav
|
|
libffado multiple au
|
|
voc
|
|
raw
|
|
.fi
|
|
|
|
The
|
|
.I xfer
|
|
module performs actual transmission to devices and nodes. The module can have
|
|
several transmission backends. As a default backend,
|
|
.I libasound
|
|
backend is used to perform transmission via alsa\-lib APIs. The module allows
|
|
each backend to parse own command line options.
|
|
|
|
The
|
|
.I 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 (
|
|
.I wav
|
|
), Sparc AU (
|
|
.I au
|
|
) and Creative Technology voice (
|
|
.I voc
|
|
). Additionally, a special container is prepared for raw audio data (
|
|
.I raw
|
|
).
|
|
|
|
The
|
|
.I mapper
|
|
module handles buffer layout and alignment for transmission of audio data frame.
|
|
The module has two implementations;
|
|
.I single
|
|
and
|
|
.I multiple
|
|
\&.
|
|
The
|
|
.I single
|
|
backend uses one container to construct the buffer. The
|
|
.I multiple
|
|
backend uses several containers to construct it.
|
|
|
|
.SS Care of copying audio data frame
|
|
|
|
Between the
|
|
.I xfer
|
|
module and
|
|
.I 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
|
|
.I mapper
|
|
module and
|
|
.I 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)
|
|
|
|
.SH SEE ALSO
|
|
\fB
|
|
axfer(1),
|
|
axfer\-list(1),
|
|
alsamixer(1),
|
|
amixer(1)
|
|
\fP
|
|
|
|
.SH AUTHOR
|
|
Takashi Sakamoto <o\-takashi@sakamocchi.jp>
|