diff mbox series

[v2] ALSA: usb-audio: Re-add sample rate quirk for Pioneer DJM-750

Message ID 20210124184209.x2bf42wtild4v6fb@base.nu (mailing list archive)
State New, archived
Headers show
Series [v2] ALSA: usb-audio: Re-add sample rate quirk for Pioneer DJM-750 | expand

Commit Message

Olivia Mackintosh Jan. 24, 2021, 6:42 p.m. UTC
Re-add the sample-rate quirk originally implemented by Dmitry
Panchenko for the DJM-900NXS2 but for the DJM-750.  This commit only
adds it again for the DJM-750 since I can only verify that it is
absolutely required for this device. Other models may need this patch
but I'm hesitant to add them as I cannot test.

The 'wIndex' is passed literally in the function call as we cannot
derive this from 'fmt->sync_ep' due to it not being set.  We can change
this if and when we revisit implicit FB.

Signed-off-by: Olivia Mackintosh <livvy@base.nu>
---
 sound/usb/quirks.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

Comments

Olivia Mackintosh Jan. 24, 2021, 8:50 p.m. UTC | #1
After dialogue with František Kučera I determined that this was
(originally) removed in 87cb9af9f8a2 in favour of using the UAC1 sample
rate setup function. Between that commit and removing the implicit FB
in 532a208ad610, there seems to have either been a regression or it was
never working in the first-place. It's hard for me to determine since
implicit FB never worked for the DJM-750 so I cannot test 87cb9af9f8a2.

It should be noted that I'm still unsure if the DJM-750 is even
compliant to the spec in relation to setting the sample rate. If it is,
this should be fixed, otherwise I think we'll need this patch.

Hope that makes sense and I haven't created any unnecessary confusion.

Kind Regards,
Olivia


On Sun, Jan 24, 2021 at 06:42:09PM +0000, Olivia Mackintosh wrote:
> Re-add the sample-rate quirk originally implemented by Dmitry
> Panchenko for the DJM-900NXS2 but for the DJM-750.  This commit only
> adds it again for the DJM-750 since I can only verify that it is
> absolutely required for this device. Other models may need this patch
> but I'm hesitant to add them as I cannot test.
> 
> The 'wIndex' is passed literally in the function call as we cannot
> derive this from 'fmt->sync_ep' due to it not being set.  We can change
> this if and when we revisit implicit FB.
> 
> Signed-off-by: Olivia Mackintosh <livvy@base.nu>
> ---
>  sound/usb/quirks.c | 20 ++++++++++++++++++++
>  1 file changed, 20 insertions(+)
> 
> diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
> index e196e364cef1..b49a66f863f3 100644
> --- a/sound/usb/quirks.c
> +++ b/sound/usb/quirks.c
> @@ -1470,6 +1470,23 @@ static void set_format_emu_quirk(struct snd_usb_substream *subs,
>  	subs->pkt_offset_adj = (emu_samplerate_id >= EMU_QUIRK_SR_176400HZ) ? 4 : 0;
>  }
>  
> +static int pioneer_djm_set_format_quirk(struct snd_usb_substream *subs,
> +					u16 windex)
> +{
> +	unsigned int cur_rate = subs->data_endpoint->cur_rate;
> +	u8 sr[3];
> +	// Convert to little endian
> +	sr[0] = cur_rate&0xff;
> +	sr[1] = (cur_rate>>8)&0xff;
> +	sr[2] = (cur_rate>>16)&0xff;
> +	usb_set_interface(subs->dev, 0, 1);
> +	// we should derive windex from fmt-sync_ep but it's not set
> +	snd_usb_ctl_msg(subs->stream->chip->dev,
> +		usb_rcvctrlpipe(subs->stream->chip->dev, 0),
> +		0x01, 0x22, 0x0100, windex, &sr, 0x0003);
> +	return 0;
> +}
> +
>  void snd_usb_set_format_quirk(struct snd_usb_substream *subs,
>  			      const struct audioformat *fmt)
>  {
> @@ -1483,6 +1500,9 @@ void snd_usb_set_format_quirk(struct snd_usb_substream *subs,
>  	case USB_ID(0x534d, 0x2109): /* MacroSilicon MS2109 */
>  		subs->stream_offset_adj = 2;
>  		break;
> +	case USB_ID(0x08e4, 0x017f): /* Pioneer DJM-750 */
> +		pioneer_djm_set_format_quirk(subs, 0x0086);
> +		break;
>  	}
>  }
>  
> -- 
> 2.30.0
>
diff mbox series

Patch

diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
index e196e364cef1..b49a66f863f3 100644
--- a/sound/usb/quirks.c
+++ b/sound/usb/quirks.c
@@ -1470,6 +1470,23 @@  static void set_format_emu_quirk(struct snd_usb_substream *subs,
 	subs->pkt_offset_adj = (emu_samplerate_id >= EMU_QUIRK_SR_176400HZ) ? 4 : 0;
 }
 
+static int pioneer_djm_set_format_quirk(struct snd_usb_substream *subs,
+					u16 windex)
+{
+	unsigned int cur_rate = subs->data_endpoint->cur_rate;
+	u8 sr[3];
+	// Convert to little endian
+	sr[0] = cur_rate&0xff;
+	sr[1] = (cur_rate>>8)&0xff;
+	sr[2] = (cur_rate>>16)&0xff;
+	usb_set_interface(subs->dev, 0, 1);
+	// we should derive windex from fmt-sync_ep but it's not set
+	snd_usb_ctl_msg(subs->stream->chip->dev,
+		usb_rcvctrlpipe(subs->stream->chip->dev, 0),
+		0x01, 0x22, 0x0100, windex, &sr, 0x0003);
+	return 0;
+}
+
 void snd_usb_set_format_quirk(struct snd_usb_substream *subs,
 			      const struct audioformat *fmt)
 {
@@ -1483,6 +1500,9 @@  void snd_usb_set_format_quirk(struct snd_usb_substream *subs,
 	case USB_ID(0x534d, 0x2109): /* MacroSilicon MS2109 */
 		subs->stream_offset_adj = 2;
 		break;
+	case USB_ID(0x08e4, 0x017f): /* Pioneer DJM-750 */
+		pioneer_djm_set_format_quirk(subs, 0x0086);
+		break;
 	}
 }