[pulseaudio-discuss] [PATCH] alsa: Silence some Valgrind warnings

David Henningsson david.henningsson at canonical.com
Thu Jan 30 14:00:47 PST 2014


On 01/29/2014 07:58 PM, Tanu Kaskinen wrote:
> I don't know if there's some bug in alsa-lib or not, but reading dB
> values seems to irritate Valgrind a lot. These changes remove all
> warnings that can be removed within our own code, but reading dB
> values still causes warnings within alsa-lib code.

I tried to fix this in Valgrind two years ago, but got stalled:

http://valgrind.10908.n7.nabble.com/Missing-ioctl-for-SNDRV-CTL-IOCTL-TLV-READ-td42711.html

> ---
>  src/modules/alsa/alsa-mixer.c | 59 ++++++++++++++++++++++++++++++++++++++-----
>  1 file changed, 52 insertions(+), 7 deletions(-)
> 
> diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
> index 99de0ec..b6e2fd8 100644
> --- a/src/modules/alsa/alsa-mixer.c
> +++ b/src/modules/alsa/alsa-mixer.c
> @@ -653,7 +653,10 @@ static int element_get_volume(pa_alsa_element *e, snd_mixer_t *m, const pa_chann
>                  continue;
>  
>  #ifdef HAVE_VALGRIND_MEMCHECK_H
> -                VALGRIND_MAKE_MEM_DEFINED(&value, sizeof(value));
> +            /* snd_mixer_selem_get_playback_dB() and
> +             * snd_mixer_selem_get_capture_dB() do something dubious that makes
> +             * Valgrind complain that value depends on uninitialized values. */
> +            VALGRIND_MAKE_MEM_DEFINED(&value, sizeof(value));
>  #endif
>  
>              f = from_alsa_dB(value);
> @@ -858,6 +861,13 @@ static int element_get_nearest_alsa_dB(snd_mixer_elem_t *me, snd_mixer_selem_cha
>          if (r < 0)
>              return r;
>  
> +#ifdef HAVE_VALGRIND_MEMCHECK_H
> +        /* snd_mixer_selem_ask_playback_vol_dB() does something dubious that
> +         * makes Valgrind complain that value_high depends on uninitialized
> +         * values. */
> +        VALGRIND_MAKE_MEM_DEFINED(&value_high, sizeof(value_high));
> +#endif
> +
>          if (value_high == *value_dB)
>              return r;
>  
> @@ -870,6 +880,13 @@ static int element_get_nearest_alsa_dB(snd_mixer_elem_t *me, snd_mixer_selem_cha
>          if (r < 0)
>              return r;
>  
> +#ifdef HAVE_VALGRIND_MEMCHECK_H
> +        /* snd_mixer_selem_ask_capture_vol_dB() does something dubious that
> +         * makes Valgrind complain that value_high depends on uninitialized
> +         * values. */
> +        VALGRIND_MAKE_MEM_DEFINED(&value_high, sizeof(value_high));
> +#endif
> +
>          if (value_high == *value_dB)
>              return r;
>  
> @@ -880,6 +897,13 @@ static int element_get_nearest_alsa_dB(snd_mixer_elem_t *me, snd_mixer_selem_cha
>      if (r < 0)
>          return r;
>  
> +#ifdef HAVE_VALGRIND_MEMCHECK_H
> +    /* snd_mixer_selem_ask_playback_vol_dB() and
> +     * snd_mixer_selem_ask_capture_vol_dB() do something dubious that makes
> +     * Valgrind complain that value_low depends on unitialized values. */
> +    VALGRIND_MAKE_MEM_DEFINED(&value_low, sizeof(value_low));
> +#endif
> +
>      if (labs(value_high - *value_dB) < labs(value_low - *value_dB))
>          *value_dB = value_high;
>      else
> @@ -1002,6 +1026,12 @@ static int element_set_volume(pa_alsa_element *e, snd_mixer_t *m, const pa_chann
>                  continue;
>  
>  #ifdef HAVE_VALGRIND_MEMCHECK_H
> +            /* snd_mixer_selem_get_playback_dB(),
> +             * snd_mixer_selem_ask_playback_vol_dB(),
> +             * snd_mixer_selem_get_capture_dB() and
> +             * snd_mixer_selem_ask_capture_vol_dB() do something dubious that
> +             * makes Valgrind complain that value depends on unitialized
> +             * values. */
>              VALGRIND_MAKE_MEM_DEFINED(&value, sizeof(value));
>  #endif
>  
> @@ -1427,7 +1457,6 @@ static int element_probe(pa_alsa_element *e, snd_mixer_t *m) {
>          }
>  
>          if (e->volume_use != PA_ALSA_VOLUME_IGNORE) {
> -            long min_dB = 0, max_dB = 0;
>              int r;
>  
>              e->direction_try_other = false;
> @@ -1453,6 +1482,7 @@ static int element_probe(pa_alsa_element *e, snd_mixer_t *m) {
>                  e->volume_use = PA_ALSA_VOLUME_IGNORE;
>  
>              } else {
> +                long min_dB = 0, max_dB = 0;
>                  bool is_mono;
>                  pa_channel_position_t p;
>  
> @@ -1479,6 +1509,17 @@ static int element_probe(pa_alsa_element *e, snd_mixer_t *m) {
>                  else
>                      e->has_dB = snd_mixer_selem_get_capture_dB_range(me, &min_dB, &max_dB) >= 0;
>  
> +                if (e->has_dB) {
> +#ifdef HAVE_VALGRIND_MEMCHECK_H
> +                    /* snd_mixer_selem_get_playback_dB_range() and
> +                     * snd_mixer_selem_get_capture_dB_range() do something
> +                     * dubious that makes Valgrind complain that min_dB and
> +                     * max_dB depend on uninitialized values. */
> +                    VALGRIND_MAKE_MEM_DEFINED(&min_dB, sizeof(min_dB));
> +                    VALGRIND_MAKE_MEM_DEFINED(&max_dB, sizeof(max_dB));
> +#endif
> +                }
> +
>                  /* Check that the kernel driver returns consistent limits with
>                   * both _get_*_dB_range() and _ask_*_vol_dB(). */
>                  if (e->has_dB && !e->db_fix) {
> @@ -1505,6 +1546,15 @@ static int element_probe(pa_alsa_element *e, snd_mixer_t *m) {
>                          return -1;
>                      }
>  
> +#ifdef HAVE_VALGRIND_MEMCHECK_H
> +                    /* snd_mixer_selem_ask_playback_vol_dB() and
> +                     * snd_mixer_selem_ask_capture_vol_dB() do something
> +                     * dubious that makes Valgrind complain that min_dB_checked
> +                     * and max_dB_checked depend on uninitialized values. */
> +                    VALGRIND_MAKE_MEM_DEFINED(&min_dB_checked, sizeof(min_dB_checked));
> +                    VALGRIND_MAKE_MEM_DEFINED(&max_dB_checked, sizeof(max_dB_checked));
> +#endif
> +
>                      if (min_dB != min_dB_checked || max_dB != max_dB_checked) {
>                          pa_log_warn("Your kernel driver is broken: the reported dB range for %s (from %0.2f dB to %0.2f dB) "
>                                      "doesn't match the dB values at minimum and maximum volume levels: %0.2f dB at level %li, "
> @@ -1517,11 +1567,6 @@ static int element_probe(pa_alsa_element *e, snd_mixer_t *m) {
>                  }
>  
>                  if (e->has_dB) {
> -#ifdef HAVE_VALGRIND_MEMCHECK_H
> -                    VALGRIND_MAKE_MEM_DEFINED(&min_dB, sizeof(min_dB));
> -                    VALGRIND_MAKE_MEM_DEFINED(&max_dB, sizeof(max_dB));
> -#endif
> -
>                      e->min_dB = ((double) min_dB) / 100.0;
>                      e->max_dB = ((double) max_dB) / 100.0;
>  
> 



-- 
David Henningsson, Canonical Ltd.
https://launchpad.net/~diwic


More information about the pulseaudio-discuss mailing list