summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Henningsson <david.henningsson@canonical.com>2014-02-28 08:57:05 +0100
committerTakashi Iwai <tiwai@suse.de>2014-02-28 09:13:58 +0100
commit8ad8d22216f818872a764ef5dafcaae1adeee211 (patch)
treee2b160bdc80de81b8a03b65e1c90b325ca173590
parent2da7b0c2c194a457de9d9a1a9b93c47e2dad1507 (diff)
downloadalsa-lib-8ad8d22216f818872a764ef5dafcaae1adeee211.tar.gz
pcm: route: Allow chmap syntax for slave channels in ttable
Instead of writing e g "0" and "1", one can now write "FL" and "FR" instead. E g: ttable.0.FL 1 ttable.1.FR 1 ttable.2.LFE 1 Signed-off-by: David Henningsson <david.henningsson@canonical.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r--src/pcm/pcm_route.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/pcm/pcm_route.c b/src/pcm/pcm_route.c
index 2beedf68..56318d47 100644
--- a/src/pcm/pcm_route.c
+++ b/src/pcm/pcm_route.c
@@ -789,6 +789,24 @@ static void snd_pcm_route_dump(snd_pcm_t *pcm, snd_output_t *out)
snd_pcm_dump(route->plug.gen.slave, out);
}
+static int strtochannel(const char *id, long *channel)
+{
+ int err;
+ int ch;
+ err = safe_strtol(id, channel);
+ if (err >= 0)
+ return err;
+
+ ch = (int) snd_pcm_chmap_from_string(id);
+ if (ch == -1)
+ return -EINVAL;
+
+ /* For now, assume standard channel mapping */
+ *channel = ch - SND_CHMAP_FL;
+ return 0;
+}
+
+
static const snd_pcm_ops_t snd_pcm_route_ops = {
.close = snd_pcm_route_close,
.info = snd_pcm_generic_info,
@@ -983,7 +1001,7 @@ int snd_pcm_route_determine_ttable(snd_config_t *tt,
const char *id;
if (snd_config_get_id(jnode, &id) < 0)
continue;
- err = safe_strtol(id, &schannel);
+ err = strtochannel(id, &schannel);
if (err < 0) {
SNDERR("Invalid slave channel: %s", id);
return -EINVAL;
@@ -1046,7 +1064,7 @@ int snd_pcm_route_load_ttable(snd_config_t *tt, snd_pcm_route_ttable_entry_t *tt
const char *id;
if (snd_config_get_id(jnode, &id) < 0)
continue;
- err = safe_strtol(id, &schannel);
+ err = strtochannel(id, &schannel);
if (err < 0 ||
schannel < 0 || (unsigned int) schannel > tt_ssize ||
(schannels > 0 && schannel >= schannels)) {