[alsa-devel] [Alsa-user] Master volume control
Paul D. DeRocco
pderocco at ix.netcom.com
Wed Mar 13 17:47:59 CET 2013
> From: Clemens Ladisch [mailto:cladisch at googlemail.com]
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <alsa/asoundlib.h>
>
> static void check(int err, const char *f)
> {
> if (err < 0) {
> fprintf(stderr, "%s failed: %s\n", f,
> snd_strerror(err));
> exit(EXIT_FAILURE);
> }
> }
> #define CHECK(f) check(f, #f)
>
> int main()
> {
> snd_ctl_t *ctl;
> snd_ctl_elem_value_t *value;
>
> CHECK(snd_ctl_open(&ctl, "default", 0));
>
> snd_ctl_elem_value_alloca(&value);
> snd_ctl_elem_value_set_interface(value,
> SND_CTL_ELEM_IFACE_MIXER);
> snd_ctl_elem_value_set_name(value, "Master Playback Volume");
> snd_ctl_elem_value_set_integer(value, 0, 42);
> CHECK(snd_ctl_elem_write(ctl, value));
>
> snd_ctl_close(ctl);
> return 0;
> }
Well, I finally got a chance to try this. It "works", but the
snd_ctl_elem_write call takes a couple of milliseconds (that's around a
million instructions on my Atom), and it apparently spends this time in
kernel state, because it causes my sound thread to underrun, so it's not
usable.
If I use alsamixer, I don't have this problem; I can manipulate the master
volume smoothly while I'm playing my synth app. So I went through the
source, and found that it's using snd_mixer_selem_set_playback_volume. This
is apparently part of something called the "Simple Mixer Interface", yet
another section of ALSA which is completely undocumented, other than the
Doxygen stuff (which is only meaningful as a reference for someone who
already knows it inside out, but can't remember e.g. whether playback_pcm
comes before or after capture_pcm in the snd_mixer_selem_regopt structure).
So what's the minimum I need to do in order to get at the Master Playback
Volume, via the Simple Mixer Interface?
--
Ciao, Paul D. DeRocco
Paul mailto:pderocco at ix.netcom.com
More information about the Alsa-devel
mailing list