diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c index ead601a9b..201f8358c 100644 --- a/src/modules/alsa/alsa-mixer.c +++ b/src/modules/alsa/alsa-mixer.c @@ -50,6 +50,58 @@ #include "alsa-mixer.h" #include "alsa-util.h" +#ifdef HAVE_VALGRIND_MEMCHECK_H +/* These macros are workarounds for a bug in valgrind, which is not handling the + * ALSA TLV syscalls correctly. See + * http://valgrind.10908.n7.nabble.com/Missing-ioctl-for-SNDRV-CTL-IOCTL-TLV-READ-td42711.html */ + +static inline int vgfix_get_capture_dB(snd_mixer_elem_t *a, snd_mixer_selem_channel_id_t b, long *c) { + int r = snd_mixer_selem_get_capture_dB(a, b, c); + VALGRIND_MAKE_MEM_DEFINED(c, sizeof(*c)); + return r; +} + +static inline int vgfix_get_playback_dB(snd_mixer_elem_t *a, snd_mixer_selem_channel_id_t b, long *c) { + int r = snd_mixer_selem_get_playback_dB(a, b, c); + VALGRIND_MAKE_MEM_DEFINED(c, sizeof(*c)); + return r; +} + +static inline int vgfix_ask_capture_vol_dB(snd_mixer_elem_t *a, long b, long *c) { + int r = snd_mixer_selem_ask_capture_vol_dB(a, b, c); + VALGRIND_MAKE_MEM_DEFINED(c, sizeof(*c)); + return r; +} + +static inline int vgfix_ask_playback_vol_dB(snd_mixer_elem_t *a, long b, long *c) { + int r = snd_mixer_selem_ask_playback_vol_dB(a, b, c); + VALGRIND_MAKE_MEM_DEFINED(c, sizeof(*c)); + return r; +} + +static inline int vgfix_get_capture_dB_range(snd_mixer_elem_t *a, long *b, long *c) { + int r = snd_mixer_selem_get_capture_dB_range(a, b, c); + VALGRIND_MAKE_MEM_DEFINED(b, sizeof(*b)); + VALGRIND_MAKE_MEM_DEFINED(c, sizeof(*c)); + return r; +} + +static inline int vgfix_get_playback_dB_range(snd_mixer_elem_t *a, long *b, long *c) { + int r = snd_mixer_selem_get_playback_dB_range(a, b, c); + VALGRIND_MAKE_MEM_DEFINED(b, sizeof(*b)); + VALGRIND_MAKE_MEM_DEFINED(c, sizeof(*c)); + return r; +} + +#define snd_mixer_selem_get_capture_dB(a, b, c) vgfix_get_capture_dB(a, b, c) +#define snd_mixer_selem_get_playback_dB(a, b, c) vgfix_get_playback_dB(a, b, c) +#define snd_mixer_selem_ask_capture_vol_dB(a, b, c) vgfix_ask_capture_vol_dB(a, b, c) +#define snd_mixer_selem_ask_playback_vol_dB(a, b, c) vgfix_ask_playback_vol_dB(a, b, c) +#define snd_mixer_selem_get_capture_dB_range(a, b, c) vgfix_get_capture_dB_range(a, b, c) +#define snd_mixer_selem_get_playback_dB_range(a, b, c) vgfix_get_playback_dB_range(a, b, c) + +#endif + static int setting_select(pa_alsa_setting *s, snd_mixer_t *m); struct description_map { @@ -1001,10 +1053,6 @@ static int element_set_volume(pa_alsa_element *e, snd_mixer_t *m, const pa_chann if (r < 0) continue; -#ifdef HAVE_VALGRIND_MEMCHECK_H - VALGRIND_MAKE_MEM_DEFINED(&value, sizeof(value)); -#endif - f = from_alsa_dB(value); } else { @@ -1517,11 +1565,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;