diff options
author | Takashi Iwai <tiwai@suse.de> | 2015-05-29 16:15:16 +0200 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2015-05-29 16:15:16 +0200 |
commit | f394c925b080e3538f0d5ec9941a295bd0db0945 (patch) | |
tree | 822501b3cca498e6a90d54aaa97598fff2d80548 | |
parent | b4a47a4cc4bcceff11970d39bb1902c1f68dd17c (diff) | |
download | salsa-lib-f394c925b080e3538f0d5ec9941a295bd0db0945.tar.gz |
mixer: Fix snd_mixer_selem_set_*_dB()
snd_mixer_selem_set_*_dB() calls are lacking of the actual volume update
calls, thus it remain in zero. For fixing the bug, rearrange the
relevant helper calls and use the new _snd_selem_update_volume()
(and _all() variant).
Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r-- | src/mixer.c | 49 | ||||
-rw-r--r-- | src/mixer_func.h | 8 | ||||
-rw-r--r-- | src/mixer_macros.h | 69 |
3 files changed, 56 insertions, 70 deletions
diff --git a/src/mixer.c b/src/mixer.c index a89e3df..c0ccc3d 100644 --- a/src/mixer.c +++ b/src/mixer.c @@ -778,10 +778,8 @@ const char * const _snd_mixer_selem_channels[SND_MIXER_SCHN_LAST + 1] = { /* */ -static int update_volume(snd_mixer_elem_t *elem, - int type, int channel, long value) +int _snd_selem_update_volume(snd_selem_vol_item_t *str, int channel, long value) { - snd_selem_vol_item_t *str = elem->items[type]; snd_ctl_elem_value_t *ctl; int err; @@ -805,45 +803,20 @@ static int update_volume(snd_mixer_elem_t *elem, return snd_hctl_elem_write(str->head.helem, ctl); } -int snd_mixer_selem_set_playback_volume(snd_mixer_elem_t *elem, - snd_mixer_selem_channel_id_t channel, - long value) +int _snd_selem_update_volume_all(snd_selem_vol_item_t *str, long value) { - return update_volume(elem, SND_SELEM_ITEM_PVOLUME, channel, value); -} - -static int update_volume_all(snd_mixer_elem_t *elem, int type, long value) -{ - snd_selem_vol_item_t *str = elem->items[type]; int i, err; if (!str) return -EINVAL; for (i = 0; i < str->head.channels; i++) { - err = update_volume(elem, type, i, value); + err = _snd_selem_update_volume(str, i, value); if (err < 0) return err; } return 0; } -int snd_mixer_selem_set_playback_volume_all(snd_mixer_elem_t *elem, long value) -{ - return update_volume_all(elem, SND_SELEM_ITEM_PVOLUME, value); -} - -int snd_mixer_selem_set_capture_volume(snd_mixer_elem_t *elem, - snd_mixer_selem_channel_id_t channel, - long value) -{ - return update_volume(elem, SND_SELEM_ITEM_CVOLUME, channel, value); -} - -int snd_mixer_selem_set_capture_volume_all(snd_mixer_elem_t *elem, long value) -{ - return update_volume_all(elem, SND_SELEM_ITEM_CVOLUME, value); -} - static int set_volume_range(snd_mixer_elem_t *elem, int type, long min, long max) { @@ -1109,7 +1082,21 @@ int _snd_selem_vol_set_dB(snd_selem_vol_item_t *item, db_gain, &value, xdir); if (err < 0) return err; - item->vol[USR_IDX(channel)] = convert_to_user(item, value); + return _snd_selem_update_volume(item, channel, convert_to_user(item, value)); +} + +int _snd_selem_vol_set_dB_all(snd_selem_vol_item_t *vol, long db_gain, int xdir) +{ + unsigned int i; + int err; + + if (!vol) + return -EINVAL; + for (i = 0; i < vol->head.channels; i++) { + err = _snd_selem_vol_set_dB(vol, i, db_gain, xdir); + if (err < 0) + return err; + } return 0; } diff --git a/src/mixer_func.h b/src/mixer_func.h index 3eb0174..9048036 100644 --- a/src/mixer_func.h +++ b/src/mixer_func.h @@ -76,14 +76,6 @@ int snd_mixer_selem_register(snd_mixer_t *mixer, snd_mixer_elem_t *snd_mixer_find_selem(snd_mixer_t *mixer, const snd_mixer_selem_id_t *id); -int snd_mixer_selem_set_playback_volume(snd_mixer_elem_t *elem, - snd_mixer_selem_channel_id_t channel, - long value); -int snd_mixer_selem_set_capture_volume(snd_mixer_elem_t *elem, - snd_mixer_selem_channel_id_t channel, - long value); -int snd_mixer_selem_set_playback_volume_all(snd_mixer_elem_t *elem, long value); -int snd_mixer_selem_set_capture_volume_all(snd_mixer_elem_t *elem, long value); int snd_mixer_selem_set_playback_switch(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t channel, int value); diff --git a/src/mixer_macros.h b/src/mixer_macros.h index 4c8d9c5..51be74b 100644 --- a/src/mixer_macros.h +++ b/src/mixer_macros.h @@ -478,6 +478,38 @@ int snd_mixer_selem_get_capture_switch(snd_mixer_elem_t *elem, channel, value); } +extern int _snd_selem_update_volume(snd_selem_vol_item_t *str, int channel, + long value); +extern int _snd_selem_update_volume_all(snd_selem_vol_item_t *str, long value); + +__SALSA_EXPORT_FUNC +int snd_mixer_selem_set_playback_volume(snd_mixer_elem_t *elem, + snd_mixer_selem_channel_id_t channel, + long value) +{ + return _snd_selem_update_volume(elem->items[SND_SELEM_ITEM_PVOLUME], channel, value); +} + +__SALSA_EXPORT_FUNC +int snd_mixer_selem_set_capture_volume(snd_mixer_elem_t *elem, + snd_mixer_selem_channel_id_t channel, + long value) +{ + return _snd_selem_update_volume(elem->items[SND_SELEM_ITEM_CVOLUME], channel, value); +} + +__SALSA_EXPORT_FUNC +int snd_mixer_selem_set_playback_volume_all(snd_mixer_elem_t *elem, long value) +{ + return _snd_selem_update_volume_all(elem->items[SND_SELEM_ITEM_PVOLUME], value); +} + +__SALSA_EXPORT_FUNC +int snd_mixer_selem_set_capture_volume_all(snd_mixer_elem_t *elem, long value) +{ + return _snd_selem_update_volume_all(elem->items[SND_SELEM_ITEM_CVOLUME], value); +} + __SALSA_EXPORT_FUNC int snd_mixer_selem_is_enumerated(snd_mixer_elem_t *elem) { @@ -562,8 +594,9 @@ extern int _snd_selem_vol_get_dB_range(snd_selem_vol_item_t *item, extern int _snd_selem_vol_get_dB(snd_selem_vol_item_t *item, int channel, long *value); extern int _snd_selem_vol_set_dB(snd_selem_vol_item_t *item, - snd_mixer_selem_channel_id_t channel, - long db_gain, int xdir); + int channel, long db_gain, int xdir); +extern int _snd_selem_vol_set_dB_all(snd_selem_vol_item_t *item, + long db_gain, int xdir); extern int _snd_selem_ask_vol_dB(snd_selem_vol_item_t *item, long value, long *dBvalue); extern int _snd_selem_ask_dB_vol(snd_selem_vol_item_t *item, long dBvalue, @@ -608,27 +641,14 @@ int snd_mixer_selem_set_playback_dB(snd_mixer_elem_t *elem, long value, int dir) { return _snd_selem_vol_set_dB((snd_selem_vol_item_t *)elem->items[SND_SELEM_ITEM_PVOLUME], - channel, value, dir); + (int)channel, value, dir); } __SALSA_EXPORT_FUNC int snd_mixer_selem_set_playback_dB_all(snd_mixer_elem_t *elem, long value, int dir) { - unsigned int i; - int err; - snd_selem_vol_item_t *vol = - (snd_selem_vol_item_t *) elem->items[SND_SELEM_ITEM_PVOLUME]; - if (!vol) - return -EINVAL; - for (i = 0; i < vol->head.channels; i++) { - err = _snd_selem_vol_set_dB(vol, - (snd_mixer_selem_channel_id_t)i, - value, dir); - if (err < 0) - return err; - } - return 0; + return _snd_selem_vol_set_dB_all(elem->items[SND_SELEM_ITEM_PVOLUME], value, dir); } __SALSA_EXPORT_FUNC @@ -677,20 +697,7 @@ __SALSA_EXPORT_FUNC int snd_mixer_selem_set_capture_dB_all(snd_mixer_elem_t *elem, long value, int dir) { - unsigned int i; - int err; - snd_selem_vol_item_t *vol = - (snd_selem_vol_item_t *) elem->items[SND_SELEM_ITEM_CVOLUME]; - if (!vol) - return -EINVAL; - for (i = 0; i < vol->head.channels; i++) { - err = _snd_selem_vol_set_dB(vol, - (snd_mixer_selem_channel_id_t)i, - value, dir); - if (err < 0) - return err; - } - return 0; + return _snd_selem_vol_set_dB_all(elem->items[SND_SELEM_ITEM_CVOLUME], value, dir); } #else /* SALSA_HAS_TLV_SUPPORT */ |