mirror of
https://github.com/alsa-project/alsa-utils
synced 2024-12-22 22:26:29 +01:00
axfer: add a section about design of transfer subcommand
An implementation of transfer subcommand is the most large part and complicated somehow. This commit adds a section titled 'DESIGN' to manual to overall design of the subcommand. Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
c8fde3a6e1
commit
422036f64c
1 changed files with 84 additions and 0 deletions
|
@ -404,6 +404,90 @@ 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),
|
||||
|
|
Loading…
Reference in a new issue