aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2015-05-29 16:15:16 +0200
committerTakashi Iwai <tiwai@suse.de>2015-05-29 16:15:16 +0200
commitf394c925b080e3538f0d5ec9941a295bd0db0945 (patch)
tree822501b3cca498e6a90d54aaa97598fff2d80548
parentb4a47a4cc4bcceff11970d39bb1902c1f68dd17c (diff)
downloadsalsa-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.c49
-rw-r--r--src/mixer_func.h8
-rw-r--r--src/mixer_macros.h69
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 */