| From dc88eef8f55e85e92d016cdf7e291f5560efd79b Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?C=C3=A1ssio=20Gabriel?= <cassiogabrielcontato@gmail.com> |
| Date: Thu, 16 Apr 2026 10:24:40 -0300 |
| Subject: ALSA: 6fire: Fix input volume change detection |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Cássio Gabriel <cassiogabrielcontato@gmail.com> |
| |
| commit dc88eef8f55e85e92d016cdf7e291f5560efd79b upstream. |
| |
| usb6fire_control_input_vol_put() stores the analog capture volume |
| as a signed offset in rt->input_vol[] (-15..+15), but it compares |
| the cached value against the user-visible mixer value (0..30) |
| before subtracting 15. |
| |
| This mixes two domains in the change detection path. Since the |
| runtime is zero-initialized, the visible default is 15; writing 0 |
| right after probe is ignored, while writing 15 is reported as a |
| change even though the cached value remains 0. |
| |
| Normalize the user value before comparing it with the cached offset. |
| |
| Fixes: 06bb4e743501 ("ALSA: snd-usb-6fire: add analog input volume control") |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Cássio Gabriel <cassiogabrielcontato@gmail.com> |
| Link: https://patch.msgid.link/20260416-alsa-6fire-input-volume-change-detection-v1-1-ec78299168df@gmail.com |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| sound/usb/6fire/control.c | 10 ++++++---- |
| 1 file changed, 6 insertions(+), 4 deletions(-) |
| |
| --- a/sound/usb/6fire/control.c |
| +++ b/sound/usb/6fire/control.c |
| @@ -290,15 +290,17 @@ static int usb6fire_control_input_vol_pu |
| struct snd_ctl_elem_value *ucontrol) |
| { |
| struct control_runtime *rt = snd_kcontrol_chip(kcontrol); |
| + int vol0 = ucontrol->value.integer.value[0] - 15; |
| + int vol1 = ucontrol->value.integer.value[1] - 15; |
| int changed = 0; |
| |
| - if (rt->input_vol[0] != ucontrol->value.integer.value[0]) { |
| - rt->input_vol[0] = ucontrol->value.integer.value[0] - 15; |
| + if (rt->input_vol[0] != vol0) { |
| + rt->input_vol[0] = vol0; |
| rt->ivol_updated &= ~(1 << 0); |
| changed = 1; |
| } |
| - if (rt->input_vol[1] != ucontrol->value.integer.value[1]) { |
| - rt->input_vol[1] = ucontrol->value.integer.value[1] - 15; |
| + if (rt->input_vol[1] != vol1) { |
| + rt->input_vol[1] = vol1; |
| rt->ivol_updated &= ~(1 << 1); |
| changed = 1; |
| } |