changeset 13434:2df414ae2d2a

allow to select an alsa mixer channel index. Patch by Eric Yagerlener [eyager (at) chartermi (dot) net]. Applied with slight modifications, see also bugzilla bug #69.
author reimar
date Wed, 22 Sep 2004 14:12:53 +0000
parents 0aca41a3e2ec
children 8ec040ae2f30
files DOCS/man/en/mplayer.1 libao2/ao_alsa.c
diffstat 2 files changed, 30 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/DOCS/man/en/mplayer.1	Wed Sep 22 11:30:33 2004 +0000
+++ b/DOCS/man/en/mplayer.1	Wed Sep 22 14:12:53 2004 +0000
@@ -1669,7 +1669,7 @@
 For ALSA this is the mixer name.
 .
 .TP
-.B \-mixer-channel <mixer line> (\-ao oss and \-ao alsa only)
+.B \-mixer-channel <mixer line>[,mixer index] (\-ao oss and \-ao alsa only)
 This option will tell MPlayer to use a different channel for controlling
 volume than the default PCM.
 Options for OSS include
@@ -1678,6 +1678,12 @@
 /usr/\:include/\:linux/\:soundcard.h.
 For ALSA you can use the names e.g.\& alsamixer displays, like
 .B Master, Line, PCM.
+.br
+.I NOTE:
+ALSA mixer channel names followed by a number must be specified in the
+<name,number> format, i.e. a channel labeled 'PCM 1' in alsamixer must
+be converted to
+.B PCM,1.
 .
 .TP
 .B \-nowaveheader (\-ao pcm only)
--- a/libao2/ao_alsa.c	Wed Sep 22 11:30:33 2004 +0000
+++ b/libao2/ao_alsa.c	Wed Sep 22 14:12:53 2004 +0000
@@ -101,12 +101,28 @@
 
       static char *mix_name = "PCM";
       static char *card = "default";
+      static int mix_index = 0;
 
       long pmin, pmax;
       long get_vol, set_vol;
       float f_multi;
 
-      if(mixer_channel) mix_name = mixer_channel;
+      if(mixer_channel) {
+	 char *test_mix_index;
+
+	 mix_name = strdup(mixer_channel);
+	 if (test_mix_index = strchr(mix_name, ',')){
+		*test_mix_index = 0;
+		test_mix_index++;
+		mix_index = strtol(test_mix_index, &test_mix_index, 0);
+
+		if (*test_mix_index){
+		  mp_msg(MSGT_AO,MSGL_ERR,
+		    "alsa-control: invalid mixer index. Defaulting to 0\n");
+		  mix_index = 0 ;
+		}
+	 }
+      }
       if(mixer_device) card = mixer_device;
 
       if(ao_data.format == AFMT_AC3)
@@ -116,9 +132,14 @@
       snd_mixer_selem_id_alloca(&sid);
 	
       //sets simple-mixer index and name
-      snd_mixer_selem_id_set_index(sid, 0);
+      snd_mixer_selem_id_set_index(sid, mix_index);
       snd_mixer_selem_id_set_name(sid, mix_name);
 
+      if (mixer_channel) {
+	free(mix_name);
+	mix_name = NULL;
+      }
+
       if ((err = snd_mixer_open(&handle, 0)) < 0) {
 	mp_msg(MSGT_AO,MSGL_ERR,"alsa-control: mixer open error: %s\n", snd_strerror(err));
 	return CONTROL_ERROR;