alsa-devel.alsa-project.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] ALSA: usb-audio: Extend DragonFly dB scale quirk to cover other variants
@ 2016-09-23  3:43 Anssi Hannula
  2016-09-23  6:34 ` Takashi Iwai
  0 siblings, 1 reply; 2+ messages in thread
From: Anssi Hannula @ 2016-09-23  3:43 UTC (permalink / raw)
  To: Takashi Iwai; +Cc: alsa-devel, stable

The DragonFly quirk added in 42e3121d90f4 ("ALSA: usb-audio: Add a more
accurate volume quirk for AudioQuest DragonFly") applies a custom dB map
on the volume control when its range is reported as 0..50 (0 .. 0.2dB).

However, there exists at least one other variant (hw v1.0c, as opposed
to the tested v1.2) which reports a different non-sensical volume range
(0..53) and the custom map is therefore not applied for that device.

This results in all of the volume change appearing close to 100% on
mixer UIs that utilize the dB TLV information.

Add a fallback case where no dB TLV is reported at all if the control
range is not 0..50 but still 0..N where N <= 1000 (3.9 dB). Also
restrict the quirk to only apply to the volume control as there is also
a mute control which would match the check otherwise.

Signed-off-by: Anssi Hannula <anssi.hannula@iki.fi>
Reported-by: David W <regulars@d-dub.org.uk>
Tested-by: David W <regulars@d-dub.org.uk>
Cc: <stable@vger.kernel.org>
---
 sound/usb/mixer_quirks.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
index f6c3bf79af9a..f0de14a293ce 100644
--- a/sound/usb/mixer_quirks.c
+++ b/sound/usb/mixer_quirks.c
@@ -1831,6 +1831,7 @@ void snd_usb_mixer_rc_memory_change(struct usb_mixer_interface *mixer,
 }
 
 static void snd_dragonfly_quirk_db_scale(struct usb_mixer_interface *mixer,
+					 struct usb_mixer_elem_info *cval,
 					 struct snd_kcontrol *kctl)
 {
 	/* Approximation using 10 ranges based on output measurement on hw v1.2.
@@ -1848,10 +1849,18 @@ static void snd_dragonfly_quirk_db_scale(struct usb_mixer_interface *mixer,
 		41, 50, TLV_DB_MINMAX_ITEM(-441, 0),
 	);
 
-	usb_audio_info(mixer->chip, "applying DragonFly dB scale quirk\n");
-	kctl->tlv.p = scale;
-	kctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_TLV_READ;
-	kctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK;
+	if (cval->min == 0 && cval->max == 50) {
+		usb_audio_info(mixer->chip, "applying DragonFly dB scale quirk (0-50 variant)\n");
+		kctl->tlv.p = scale;
+		kctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_TLV_READ;
+		kctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK;
+
+	} else if (cval->min == 0 && cval->max <= 1000) {
+		/* Some other clearly broken DragonFly variant.
+		 * At least a 0..53 variant (hw v1.0) exists. */
+		usb_audio_info(mixer->chip, "ignoring too narrow dB range on a DragonFly device");
+		kctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK;
+	}
 }
 
 void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer,
@@ -1860,8 +1869,8 @@ void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer,
 {
 	switch (mixer->chip->usb_id) {
 	case USB_ID(0x21b4, 0x0081): /* AudioQuest DragonFly */
-		if (unitid == 7 && cval->min == 0 && cval->max == 50)
-			snd_dragonfly_quirk_db_scale(mixer, kctl);
+		if (unitid == 7 && cval->control == UAC_FU_VOLUME)
+			snd_dragonfly_quirk_db_scale(mixer, cval, kctl);
 		break;
 	}
 }
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] ALSA: usb-audio: Extend DragonFly dB scale quirk to cover other variants
  2016-09-23  3:43 [PATCH] ALSA: usb-audio: Extend DragonFly dB scale quirk to cover other variants Anssi Hannula
@ 2016-09-23  6:34 ` Takashi Iwai
  0 siblings, 0 replies; 2+ messages in thread
From: Takashi Iwai @ 2016-09-23  6:34 UTC (permalink / raw)
  To: Anssi Hannula; +Cc: alsa-devel, stable

On Fri, 23 Sep 2016 05:43:47 +0200,
Anssi Hannula wrote:
> 
> The DragonFly quirk added in 42e3121d90f4 ("ALSA: usb-audio: Add a more
> accurate volume quirk for AudioQuest DragonFly") applies a custom dB map
> on the volume control when its range is reported as 0..50 (0 .. 0.2dB).
> 
> However, there exists at least one other variant (hw v1.0c, as opposed
> to the tested v1.2) which reports a different non-sensical volume range
> (0..53) and the custom map is therefore not applied for that device.
> 
> This results in all of the volume change appearing close to 100% on
> mixer UIs that utilize the dB TLV information.
> 
> Add a fallback case where no dB TLV is reported at all if the control
> range is not 0..50 but still 0..N where N <= 1000 (3.9 dB). Also
> restrict the quirk to only apply to the volume control as there is also
> a mute control which would match the check otherwise.
> 
> Signed-off-by: Anssi Hannula <anssi.hannula@iki.fi>
> Reported-by: David W <regulars@d-dub.org.uk>
> Tested-by: David W <regulars@d-dub.org.uk>
> Cc: <stable@vger.kernel.org>

Thanks, I applied with Fixes tag.


Takashi

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2016-09-23  6:34 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-09-23  3:43 [PATCH] ALSA: usb-audio: Extend DragonFly dB scale quirk to cover other variants Anssi Hannula
2016-09-23  6:34 ` Takashi Iwai

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).