[alsa-devel] [RFC] Channel mapping API

Takashi Iwai tiwai at suse.de
Tue Aug 21 12:31:57 CEST 2012


this is a progress report of my longstanding TODO, the channel map API
implementation.  I'm going to cover this at Plumbers audio uconf, so
we can discuss details there, too.

The channel mapping API provides a method for user-space to query, get
and set the channel map of a PCM stream.  It's required for assigning
channels properly for multi-channel streams.


In my latest attempt, I implemented with control elements.  A control
element is created for each PCM substream with the corresponding
device and substream index.  Then it gives a TLV for querying maps, a
read op for obtaining the current map, and optionally a write op for
setting the map.  The obvious merit by this way is that no extra
kernel ABI is required.

A couple of new helper functions are provided for assigning standard
channel maps.  Currently, HD-audio and AC97 drivers has some


The additional alsa-lib API functions look like:

  int **snd_pcm_query_chmaps(snd_pcm_t *pcm);
  int *snd_pcm_get_chmap(snd_pcm_t *pcm);
  int snd_pcm_set_chmap(snd_pcm_t *pcm, const int *map);

snd_pcm_query_chmaps() returns the list of channel maps.  A channel
map is represented by an integer array, beginning with the channel map
type, followed by the number of channels, and the position of each
channel, e.g.

snd_pcm_get_chmap() returns the currently assigned channel map for the
given PCM stream.  If the PCM is before prepared, it fills UNKNOWN.

When a driver allows user to change the channel map, user can call
snd_pcm_set_chmap().  For example, HDMI allows you to choose whether
it's 4.0 or 3.1 output.


The latest kernel patchset is found in sound-unstable tree
topic/tlv-chmap branch.
  git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-unstable.git topic/tlv-chmap

The alsa-lib portion is found in a tree on github topic/chmap branch.
  git://github.com/tiwai/alsa-lib.git topic/chmap



More information about the Alsa-devel mailing list