[PATCH v2] ALSA: usb-audio: Re-add sample rate quirk for Pioneer DJM-750
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; } }
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
participants (1)
-
Olivia Mackintosh