[alsa-devel] snd_mixer_selem_get_playback_volume return value outside allowed range

Raymond Yau superquad.vortex2 at gmail.com
Thu Jun 17 02:35:54 CEST 2010


2010/5/25 Clemens Ladisch <clemens at ladisch.de>

> James Courtier-Dutton wrote:
> > On 25 May 2010 09:38, Clemens Ladisch <clemens at ladisch.de> wrote:
> > > All the others seem to be mistakes:
> > >
> > > > soc/codecs/stac9766.c:...
> > > > soc/codecs/wm8350.c:...
> > > > soc/codecs/wm8400.c:...
> > > > soc/codecs/wm8990.c:...
> >
> > Could this maybe explain why pulseaudio was having such problems with
> > alsa with regards to gain controls????
>
> Only if it happens on embedded hardware that uses these particular
> codecs.
>
>
> Regards,
> Clemens
>

http://git.alsa-project.org/?p=alsa-utils.git;a=commit;h=c9b86f49a8a1a8c337bf0c1b7f12749e8be781ed

your patch did not fix the buggy driver (e.g. alsa-pulse plugin) which
return volume outside the alllowed range


amixer -D pulse
Simple mixer control 'Master',0
  Capabilities: pvolume pswitch pswitch-joined
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 65536
  Mono:
  Front Left: Playback 98304 [150%] [on]
  Front Right: Playback 98304 [150%] [on]




Should snd_mixer_selem_get_playback_volume() perform range check ?

tatic int get_volume_ops(snd_mixer_elem_t *elem, int dir,
              snd_mixer_selem_channel_id_t channel, long *value)
{
    selem_none_t *s = snd_mixer_elem_get_private(elem);
    if (s->selem.caps & SM_CAP_GVOLUME)
        dir = SM_PLAY;
    if ((unsigned int) channel >= s->str[dir].channels)
        return -EINVAL;
    *value = s->str[dir].vol[channel];
+       if (*value > s->str[dir].max)
+                return -EINVAL;
+       if (*value < s->str[dir].min)
+                return -EINVAL;
    return 0;


More information about the Alsa-devel mailing list