summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Kahn Gillmor <dkg@fifthhorseman.net>2009-04-28 09:15:48 +0200
committerMax Kellermann <max@duempel.org>2009-04-28 09:15:48 +0200
commit05dfdfdb398146f3427be154bfe599fac61ed025 (patch)
treed0f115cd57594d2f0c6a29119e267f0d14b542a5
parent70d322b296247cd6d09de894f6d1cb06f5cf0d11 (diff)
alsa_mixer: add mixer_index option
This allows you to select controls with duplicate names.
-rw-r--r--NEWS2
-rw-r--r--doc/mpd.conf.56
-rw-r--r--doc/mpdconf.example1
-rw-r--r--src/mixer/alsa_mixer.c9
4 files changed, 16 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index ba5e84f8d..1ba01763e 100644
--- a/NEWS
+++ b/NEWS
@@ -50,6 +50,8 @@ ver 0.15 (200?/??/??)
* mixers:
- rewritten mixer code to support multiple mixers
- new pulseaudio mixer
+ - alsa: new mixer_index option supports choosing between multiple
+ identically-named controls on a device.
* Add audio archive extraction support:
- bzip2
- iso9660
diff --git a/doc/mpd.conf.5 b/doc/mpd.conf.5
index f6ac80f63..f5f4f8227 100644
--- a/doc/mpd.conf.5
+++ b/doc/mpd.conf.5
@@ -293,6 +293,12 @@ This specifies which mixer control to use (sometimes referred to as the
"device"). Examples of mixer controls are PCM, Line1, Master, etc. An example
for OSS is "Pcm", and an example for alsa is "PCM".
.TP
+.B mixer_index <mixer index>
+A number identifying the index of the named mixer control. This is
+probably only useful if your alsa device has more than one
+identically\-named mixer control. The default is "0". (Use "amixer
+scontrols" to see the list of controls with their indexes)
+.TP
.B use_mmap <yes or no>
Setting this allows you to use memory-mapped I/O. Certain hardware setups may
benefit from this, but most do not. Most users do not need to set this. The
diff --git a/doc/mpdconf.example b/doc/mpdconf.example
index abaef1c1c..919326236 100644
--- a/doc/mpdconf.example
+++ b/doc/mpdconf.example
@@ -181,6 +181,7 @@ input {
# format "44100:16:2" # optional
# mixer_device "default" # optional
# mixer_control "PCM" # optional
+# mixer_index "0" # optional
#}
#
# An example of an OSS output:
diff --git a/src/mixer/alsa_mixer.c b/src/mixer/alsa_mixer.c
index fb0834338..52f30b6f4 100644
--- a/src/mixer/alsa_mixer.c
+++ b/src/mixer/alsa_mixer.c
@@ -25,6 +25,7 @@
#define VOLUME_MIXER_ALSA_DEFAULT "default"
#define VOLUME_MIXER_ALSA_CONTROL_DEFAULT "PCM"
+#define VOLUME_MIXER_ALSA_INDEX_DEFAULT 0
struct alsa_mixer {
/** the base mixer class */
@@ -32,6 +33,7 @@ struct alsa_mixer {
const char *device;
const char *control;
+ unsigned int index;
snd_mixer_t *handle;
snd_mixer_elem_t *elem;
@@ -51,6 +53,8 @@ alsa_mixer_init(const struct config_param *param)
VOLUME_MIXER_ALSA_DEFAULT);
am->control = config_get_block_string(param, "mixer_control",
VOLUME_MIXER_ALSA_CONTROL_DEFAULT);
+ am->index = config_get_block_unsigned(param, "mixer_index",
+ VOLUME_MIXER_ALSA_INDEX_DEFAULT);
return &am->base;
}
@@ -117,8 +121,9 @@ alsa_mixer_open(struct mixer *data)
while (elem) {
if (snd_mixer_elem_get_type(elem) == SND_MIXER_ELEM_SIMPLE) {
- if (strcasecmp(am->control,
- snd_mixer_selem_get_name(elem)) == 0) {
+ if ((strcasecmp(am->control,
+ snd_mixer_selem_get_name(elem)) == 0) &&
+ (am->index == snd_mixer_selem_get_index(elem))) {
break;
}
}