Re: [alsa-devel] [Pkg-alsa-devel] [PATCH] amixer and special 'front...' channels
This isn't Ubuntu/Debian specific and should be applied upstream?
On Sat, 07 Jul 2007 the mental interface of David Decotigny told:
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
Hi,
Imagine you have this kind of control:
Simple mixer control 'Input Source',0 Capabilities: enum Items: 'Mic' 'Front Mic' 'Line' Item0: 'Mic'
... and you want to set it to 'Front Mic':
shell> amixer sset 'Input Source' 'Front Mic' Simple mixer control 'Input Source',0 Capabilities: enum Items: 'Mic' 'Front Mic' 'Line' Item0: 'Mic'
This does not work ! Because amixer will think that 'Front' is a modifier for 'Mic'.
Attached is a patch against alsa-utils-1.0.13-1ubuntu5 that solves this. With this patch, one can bypass the modifier parsing: one simply escapes the parameter with one or more backslash(es), and that's all:
shell> amixer sset 'Input Source' '\Front Mic' Simple mixer control 'Input Source',0 Capabilities: enum Items: 'Mic' 'Front Mic' 'Line' Item0: 'Front Mic'
What this patch also does, is that it adds correct identification of items. With the original version, given the following enumeration: foo foobar Then the parameter 'foobar' will be identified as 'foo', not 'foobar'. The patch should solve this potential problem (not tested though).
Bye, -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iD8DBQFGj/X0ld7vhusVrCERAjIZAJ9w9GLD+QBwDCaTs32hpW6i9nVMfgCfdS5w jhipZ2jm87fq4zx4f5Q9Vsc= =M2KP -----END PGP SIGNATURE-----
diff -ru alsa-utils-1.0.13/amixer/amixer.1 alsa-utils-1.0.13-mine/amixer/amixer.1 --- alsa-utils-1.0.13/amixer/amixer.1 2006-09-29 04:53:26.000000000 -0700 +++ alsa-utils-1.0.13-mine/amixer/amixer.1 2007-07-07 13:09:04.000000000 -0700 @@ -44,11 +44,14 @@ The parameters \fIcap, nocap, mute, unmute, toggle\fP are used to change capture (recording) and muting for the group specified.
-The optional modifiers can be put as extra parameters to specify -the stream direction or channels to apply. -The modifiers \fIplayback\fP and \fIcapture\fP specify the stream, -and the modifiers \fIfront, rear, center, woofer\fP are used to specify -channels to be changed. +The optional modifiers can be put as extra parameters to specify the +stream direction or channels to apply. The modifiers \fIplayback\fP +and \fIcapture\fP specify the stream, and the modifiers \fIfront, +rear, center, woofer\fP are used to specify channels to be changed. If +there is a confusion between the parameter and these modifiers, then +any character in the parameter may be escaped with a backslash to +disambiguate: '\Front Mic' will be understood as "parameter 'Front +Mic'", and not as "modifier 'Front' applied to 'Mic' parameter".
A simple mixer control must be specified. Only one device can be controlled at a time. diff -ru alsa-utils-1.0.13/amixer/amixer.c alsa-utils-1.0.13-mine/amixer/amixer.c --- alsa-utils-1.0.13/amixer/amixer.c 2007-07-07 13:03:39.000000000 -0700 +++ alsa-utils-1.0.13-mine/amixer/amixer.c 2007-07-07 12:59:19.000000000 -0700 @@ -1333,6 +1333,16 @@ return def; }
+/** Transform '\a\b c \de' into 'ab c de' */ +static void unescape(char * arg) +{
- char * c;
- for (c = arg ; arg && *arg ; arg ++)
- if (*arg != '\')
*(c++) = *arg;
- *c = '\0';
+}
static int get_enum_item_index(snd_mixer_elem_t *elem, char **ptrp) { char *ptr = *ptrp; @@ -1347,7 +1357,7 @@ if (snd_mixer_selem_get_enum_item_name(elem, i, sizeof(name)-1, name) < 0) continue; len = strlen(name);
if (! strncmp(name, ptr, len)) {
if (!strncmp(name, ptr, len) && (ptr[len] == '\0')) { if (! ptr[len] || ptr[len] == ',' || ptr[len] == '\n') { ptr += len; *ptrp = ptr;
@@ -1428,6 +1438,7 @@ dir = dir_mask(&ptr, dir); if (*ptr == '\0') continue;
multi = (strchr(ptr, ',') != NULL); optr = ptr; for (chn = 0; chn <= SND_MIXER_SCHN_LAST; chn++) {unescape(ptr);
Pkg-alsa-devel mailing list Pkg-alsa-devel@lists.alioth.debian.org http://lists.alioth.debian.org/mailman/listinfo/pkg-alsa-devel
At Sun, 8 Jul 2007 00:19:25 +0200, Elimar Riesebieter wrote:
This isn't Ubuntu/Debian specific and should be applied upstream?
Sorry, no, it's too hackish.
There is no reason to parse the channel for enum items. It should be passed simply as it is. I'll fix (and clean up the mess) later...
Takashi
On Sat, 07 Jul 2007 the mental interface of David Decotigny told:
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
Hi,
Imagine you have this kind of control:
Simple mixer control 'Input Source',0 Capabilities: enum Items: 'Mic' 'Front Mic' 'Line' Item0: 'Mic'
... and you want to set it to 'Front Mic':
shell> amixer sset 'Input Source' 'Front Mic' Simple mixer control 'Input Source',0 Capabilities: enum Items: 'Mic' 'Front Mic' 'Line' Item0: 'Mic'
This does not work ! Because amixer will think that 'Front' is a modifier for 'Mic'.
Attached is a patch against alsa-utils-1.0.13-1ubuntu5 that solves this. With this patch, one can bypass the modifier parsing: one simply escapes the parameter with one or more backslash(es), and that's all:
shell> amixer sset 'Input Source' '\Front Mic' Simple mixer control 'Input Source',0 Capabilities: enum Items: 'Mic' 'Front Mic' 'Line' Item0: 'Front Mic'
What this patch also does, is that it adds correct identification of items. With the original version, given the following enumeration: foo foobar Then the parameter 'foobar' will be identified as 'foo', not 'foobar'. The patch should solve this potential problem (not tested though).
Bye, -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iD8DBQFGj/X0ld7vhusVrCERAjIZAJ9w9GLD+QBwDCaTs32hpW6i9nVMfgCfdS5w jhipZ2jm87fq4zx4f5Q9Vsc= =M2KP -----END PGP SIGNATURE-----
diff -ru alsa-utils-1.0.13/amixer/amixer.1 alsa-utils-1.0.13-mine/amixer/amixer.1 --- alsa-utils-1.0.13/amixer/amixer.1 2006-09-29 04:53:26.000000000 -0700 +++ alsa-utils-1.0.13-mine/amixer/amixer.1 2007-07-07 13:09:04.000000000 -0700 @@ -44,11 +44,14 @@ The parameters \fIcap, nocap, mute, unmute, toggle\fP are used to change capture (recording) and muting for the group specified.
-The optional modifiers can be put as extra parameters to specify -the stream direction or channels to apply. -The modifiers \fIplayback\fP and \fIcapture\fP specify the stream, -and the modifiers \fIfront, rear, center, woofer\fP are used to specify -channels to be changed. +The optional modifiers can be put as extra parameters to specify the +stream direction or channels to apply. The modifiers \fIplayback\fP +and \fIcapture\fP specify the stream, and the modifiers \fIfront, +rear, center, woofer\fP are used to specify channels to be changed. If +there is a confusion between the parameter and these modifiers, then +any character in the parameter may be escaped with a backslash to +disambiguate: '\Front Mic' will be understood as "parameter 'Front +Mic'", and not as "modifier 'Front' applied to 'Mic' parameter".
A simple mixer control must be specified. Only one device can be controlled at a time. diff -ru alsa-utils-1.0.13/amixer/amixer.c alsa-utils-1.0.13-mine/amixer/amixer.c --- alsa-utils-1.0.13/amixer/amixer.c 2007-07-07 13:03:39.000000000 -0700 +++ alsa-utils-1.0.13-mine/amixer/amixer.c 2007-07-07 12:59:19.000000000 -0700 @@ -1333,6 +1333,16 @@ return def; }
+/** Transform '\a\b c \de' into 'ab c de' */ +static void unescape(char * arg) +{
- char * c;
- for (c = arg ; arg && *arg ; arg ++)
- if (*arg != '\')
*(c++) = *arg;
- *c = '\0';
+}
static int get_enum_item_index(snd_mixer_elem_t *elem, char **ptrp) { char *ptr = *ptrp; @@ -1347,7 +1357,7 @@ if (snd_mixer_selem_get_enum_item_name(elem, i, sizeof(name)-1, name) < 0) continue; len = strlen(name);
if (! strncmp(name, ptr, len)) {
if (!strncmp(name, ptr, len) && (ptr[len] == '\0')) { if (! ptr[len] || ptr[len] == ',' || ptr[len] == '\n') { ptr += len; *ptrp = ptr;
@@ -1428,6 +1438,7 @@ dir = dir_mask(&ptr, dir); if (*ptr == '\0') continue;
multi = (strchr(ptr, ',') != NULL); optr = ptr; for (chn = 0; chn <= SND_MIXER_SCHN_LAST; chn++) {unescape(ptr);
Pkg-alsa-devel mailing list Pkg-alsa-devel@lists.alioth.debian.org http://lists.alioth.debian.org/mailman/listinfo/pkg-alsa-devel
-- "Talking much about oneself can also be a means to conceal oneself." -Friedrich Nietzsche
participants (2)
-
Elimar Riesebieter
-
Takashi Iwai