diff options
author | Takashi Iwai <tiwai@suse.de> | 2014-11-18 05:02:14 -0500 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2014-11-20 15:46:32 -0500 |
commit | 5aeee3424fa5926a53885b9defb593971e446d77 (patch) | |
tree | 9456382d8eb2a3530314b04789de371e18b7ce56 /sound/usb/mixer.c | |
parent | a69862d8d04e4877965cc938140c9f8e6da0b827 (diff) |
ALSA: usb-audio: Refactor ignore_ctl_error checks
Introduce an internal helper macro for avoiding many open codes.
The only slight behavior change is in a couple of get ballcks where
the value is reset at error no matter whether ignore_ctl_error is set
or not. Actually this is even safer than before.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/usb/mixer.c')
-rw-r--r-- | sound/usb/mixer.c | 39 |
1 files changed, 16 insertions, 23 deletions
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index c6209ce5a430..a4fbfff63191 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c | |||
@@ -136,6 +136,10 @@ check_mapped_name(const struct usbmix_name_map *p, char *buf, int buflen) | |||
136 | return strlcpy(buf, p->name, buflen); | 136 | return strlcpy(buf, p->name, buflen); |
137 | } | 137 | } |
138 | 138 | ||
139 | /* ignore the error value if ignore_ctl_error flag is set */ | ||
140 | #define filter_error(cval, err) \ | ||
141 | ((cval)->mixer->ignore_ctl_error ? 0 : (err)) | ||
142 | |||
139 | /* check whether the control should be ignored */ | 143 | /* check whether the control should be ignored */ |
140 | static inline int | 144 | static inline int |
141 | check_ignored_ctl(const struct usbmix_name_map *p) | 145 | check_ignored_ctl(const struct usbmix_name_map *p) |
@@ -1088,7 +1092,7 @@ static int mixer_ctl_feature_get(struct snd_kcontrol *kcontrol, | |||
1088 | continue; | 1092 | continue; |
1089 | err = snd_usb_get_cur_mix_value(cval, c + 1, cnt, &val); | 1093 | err = snd_usb_get_cur_mix_value(cval, c + 1, cnt, &val); |
1090 | if (err < 0) | 1094 | if (err < 0) |
1091 | return cval->mixer->ignore_ctl_error ? 0 : err; | 1095 | return filter_error(cval, err); |
1092 | val = get_relative_value(cval, val); | 1096 | val = get_relative_value(cval, val); |
1093 | ucontrol->value.integer.value[cnt] = val; | 1097 | ucontrol->value.integer.value[cnt] = val; |
1094 | cnt++; | 1098 | cnt++; |
@@ -1098,7 +1102,7 @@ static int mixer_ctl_feature_get(struct snd_kcontrol *kcontrol, | |||
1098 | /* master channel */ | 1102 | /* master channel */ |
1099 | err = snd_usb_get_cur_mix_value(cval, 0, 0, &val); | 1103 | err = snd_usb_get_cur_mix_value(cval, 0, 0, &val); |
1100 | if (err < 0) | 1104 | if (err < 0) |
1101 | return cval->mixer->ignore_ctl_error ? 0 : err; | 1105 | return filter_error(cval, err); |
1102 | val = get_relative_value(cval, val); | 1106 | val = get_relative_value(cval, val); |
1103 | ucontrol->value.integer.value[0] = val; | 1107 | ucontrol->value.integer.value[0] = val; |
1104 | } | 1108 | } |
@@ -1120,7 +1124,7 @@ static int mixer_ctl_feature_put(struct snd_kcontrol *kcontrol, | |||
1120 | continue; | 1124 | continue; |
1121 | err = snd_usb_get_cur_mix_value(cval, c + 1, cnt, &oval); | 1125 | err = snd_usb_get_cur_mix_value(cval, c + 1, cnt, &oval); |
1122 | if (err < 0) | 1126 | if (err < 0) |
1123 | return cval->mixer->ignore_ctl_error ? 0 : err; | 1127 | return filter_error(cval, err); |
1124 | val = ucontrol->value.integer.value[cnt]; | 1128 | val = ucontrol->value.integer.value[cnt]; |
1125 | val = get_abs_value(cval, val); | 1129 | val = get_abs_value(cval, val); |
1126 | if (oval != val) { | 1130 | if (oval != val) { |
@@ -1133,7 +1137,7 @@ static int mixer_ctl_feature_put(struct snd_kcontrol *kcontrol, | |||
1133 | /* master channel */ | 1137 | /* master channel */ |
1134 | err = snd_usb_get_cur_mix_value(cval, 0, 0, &oval); | 1138 | err = snd_usb_get_cur_mix_value(cval, 0, 0, &oval); |
1135 | if (err < 0) | 1139 | if (err < 0) |
1136 | return cval->mixer->ignore_ctl_error ? 0 : err; | 1140 | return filter_error(cval, err); |
1137 | val = ucontrol->value.integer.value[0]; | 1141 | val = ucontrol->value.integer.value[0]; |
1138 | val = get_abs_value(cval, val); | 1142 | val = get_abs_value(cval, val); |
1139 | if (val != oval) { | 1143 | if (val != oval) { |
@@ -1628,12 +1632,10 @@ static int mixer_ctl_procunit_get(struct snd_kcontrol *kcontrol, | |||
1628 | int err, val; | 1632 | int err, val; |
1629 | 1633 | ||
1630 | err = get_cur_ctl_value(cval, cval->control << 8, &val); | 1634 | err = get_cur_ctl_value(cval, cval->control << 8, &val); |
1631 | if (err < 0 && cval->mixer->ignore_ctl_error) { | 1635 | if (err < 0) { |
1632 | ucontrol->value.integer.value[0] = cval->min; | 1636 | ucontrol->value.integer.value[0] = cval->min; |
1633 | return 0; | 1637 | return filter_error(cval, err); |
1634 | } | 1638 | } |
1635 | if (err < 0) | ||
1636 | return err; | ||
1637 | val = get_relative_value(cval, val); | 1639 | val = get_relative_value(cval, val); |
1638 | ucontrol->value.integer.value[0] = val; | 1640 | ucontrol->value.integer.value[0] = val; |
1639 | return 0; | 1641 | return 0; |
@@ -1647,11 +1649,8 @@ static int mixer_ctl_procunit_put(struct snd_kcontrol *kcontrol, | |||
1647 | int val, oval, err; | 1649 | int val, oval, err; |
1648 | 1650 | ||
1649 | err = get_cur_ctl_value(cval, cval->control << 8, &oval); | 1651 | err = get_cur_ctl_value(cval, cval->control << 8, &oval); |
1650 | if (err < 0) { | 1652 | if (err < 0) |
1651 | if (cval->mixer->ignore_ctl_error) | 1653 | return filter_error(cval, err); |
1652 | return 0; | ||
1653 | return err; | ||
1654 | } | ||
1655 | val = ucontrol->value.integer.value[0]; | 1654 | val = ucontrol->value.integer.value[0]; |
1656 | val = get_abs_value(cval, val); | 1655 | val = get_abs_value(cval, val); |
1657 | if (val != oval) { | 1656 | if (val != oval) { |
@@ -1923,11 +1922,8 @@ static int mixer_ctl_selector_get(struct snd_kcontrol *kcontrol, | |||
1923 | 1922 | ||
1924 | err = get_cur_ctl_value(cval, cval->control << 8, &val); | 1923 | err = get_cur_ctl_value(cval, cval->control << 8, &val); |
1925 | if (err < 0) { | 1924 | if (err < 0) { |
1926 | if (cval->mixer->ignore_ctl_error) { | 1925 | ucontrol->value.enumerated.item[0] = 0; |
1927 | ucontrol->value.enumerated.item[0] = 0; | 1926 | return filter_error(cval, err); |
1928 | return 0; | ||
1929 | } | ||
1930 | return err; | ||
1931 | } | 1927 | } |
1932 | val = get_relative_value(cval, val); | 1928 | val = get_relative_value(cval, val); |
1933 | ucontrol->value.enumerated.item[0] = val; | 1929 | ucontrol->value.enumerated.item[0] = val; |
@@ -1942,11 +1938,8 @@ static int mixer_ctl_selector_put(struct snd_kcontrol *kcontrol, | |||
1942 | int val, oval, err; | 1938 | int val, oval, err; |
1943 | 1939 | ||
1944 | err = get_cur_ctl_value(cval, cval->control << 8, &oval); | 1940 | err = get_cur_ctl_value(cval, cval->control << 8, &oval); |
1945 | if (err < 0) { | 1941 | if (err < 0) |
1946 | if (cval->mixer->ignore_ctl_error) | 1942 | return filter_error(cval, err); |
1947 | return 0; | ||
1948 | return err; | ||
1949 | } | ||
1950 | val = ucontrol->value.enumerated.item[0]; | 1943 | val = ucontrol->value.enumerated.item[0]; |
1951 | val = get_abs_value(cval, val); | 1944 | val = get_abs_value(cval, val); |
1952 | if (val != oval) { | 1945 | if (val != oval) { |