[v2] ALSA: usb: Add support for Zoom R16/24 capture and midi interfaces
diff mbox

Message ID 1417365940-25381-1-git-send-email-pmatilai@laiskiainen.org
State Accepted
Commit dacacb0aa0cb6fdeb69313db6acfc82456945d7e
Headers show

Commit Message

Panu Matilainen Nov. 30, 2014, 4:45 p.m. UTC
This makes the midi interface and capture work out of the box with
R16 (and presumably R24 too but untested). Playback stream would also
seem to function fine except for one caveat: no sound is produced,
so it is disabled for now. Mixer descriptors are garbage and will
require further quirks to enable functionality, also disabled here.

Signed-off-by: Panu Matilainen <pmatilai@laiskiainen.org>
---
 sound/usb/quirks-table.h | 40 ++++++++++++++++++++++++++++++++++++++++
 sound/usb/quirks.c       |  8 ++++++++
 2 files changed, 48 insertions(+)

Comments

Takashi Iwai Dec. 1, 2014, 4:38 p.m. UTC | #1
At Sun, 30 Nov 2014 18:45:40 +0200,
Panu Matilainen wrote:
> 
> This makes the midi interface and capture work out of the box with
> R16 (and presumably R24 too but untested). Playback stream would also
> seem to function fine except for one caveat: no sound is produced,
> so it is disabled for now. Mixer descriptors are garbage and will
> require further quirks to enable functionality, also disabled here.
> 
> Signed-off-by: Panu Matilainen <pmatilai@laiskiainen.org>

Thanks, applied.


Takashi

> ---
>  sound/usb/quirks-table.h | 40 ++++++++++++++++++++++++++++++++++++++++
>  sound/usb/quirks.c       |  8 ++++++++
>  2 files changed, 48 insertions(+)
> 
> diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h
> index c657752..c955663 100644
> --- a/sound/usb/quirks-table.h
> +++ b/sound/usb/quirks-table.h
> @@ -3203,6 +3203,46 @@ YAMAHA_DEVICE(0x7010, "UB99"),
>  
>  {
>  	/*
> +	 * ZOOM R16/24 in audio interface mode.
> +	 * Mixer descriptors are garbage, further quirks will be needed
> +	 * to make any of it functional, thus disabled for now.
> +	 * Playback stream appears to start and run fine but no sound
> +	 * is produced, so also disabled for now.
> +	 */
> +	USB_DEVICE(0x1686, 0x00dd),
> +	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
> +		.ifnum = QUIRK_ANY_INTERFACE,
> +		.type = QUIRK_COMPOSITE,
> +		.data = (const struct snd_usb_audio_quirk[]) {
> +			{
> +				/* Mixer */
> +				.ifnum = 0,
> +				.type = QUIRK_IGNORE_INTERFACE,
> +			},
> +			{
> +				/* Playback  */
> +				.ifnum = 1,
> +				.type = QUIRK_IGNORE_INTERFACE,
> +			},
> +			{
> +				/* Capture */
> +				.ifnum = 2,
> +				.type = QUIRK_AUDIO_STANDARD_INTERFACE,
> +			},
> +			{
> +				/* Midi */
> +				.ifnum = 3,
> +				.type = QUIRK_MIDI_STANDARD_INTERFACE
> +			},
> +			{
> +				.ifnum = -1
> +			},
> +		}
> +	}
> +},
> +
> +{
> +	/*
>  	 * Some USB MIDI devices don't have an audio control interface,
>  	 * so we have to grab MIDI streaming interfaces here.
>  	 */
> diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
> index a5941f8..2e49193 100644
> --- a/sound/usb/quirks.c
> +++ b/sound/usb/quirks.c
> @@ -1160,6 +1160,14 @@ void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe,
>  			break;
>  		}
>  	}
> +
> +	/* Zoom R16/24 needs a tiny delay here, otherwise requests like
> +	 * get/set frequency return as failed despite actually succeeding.
> +	 */
> +	if ((le16_to_cpu(dev->descriptor.idVendor) == 0x1686) &&
> +	    (le16_to_cpu(dev->descriptor.idProduct) == 0x00dd) &&
> +	    (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS)
> +		mdelay(1);
>  }
>  
>  /*
> -- 
> 1.9.3
> 
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel@alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
>

Patch
diff mbox

diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h
index c657752..c955663 100644
--- a/sound/usb/quirks-table.h
+++ b/sound/usb/quirks-table.h
@@ -3203,6 +3203,46 @@  YAMAHA_DEVICE(0x7010, "UB99"),
 
 {
 	/*
+	 * ZOOM R16/24 in audio interface mode.
+	 * Mixer descriptors are garbage, further quirks will be needed
+	 * to make any of it functional, thus disabled for now.
+	 * Playback stream appears to start and run fine but no sound
+	 * is produced, so also disabled for now.
+	 */
+	USB_DEVICE(0x1686, 0x00dd),
+	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+		.ifnum = QUIRK_ANY_INTERFACE,
+		.type = QUIRK_COMPOSITE,
+		.data = (const struct snd_usb_audio_quirk[]) {
+			{
+				/* Mixer */
+				.ifnum = 0,
+				.type = QUIRK_IGNORE_INTERFACE,
+			},
+			{
+				/* Playback  */
+				.ifnum = 1,
+				.type = QUIRK_IGNORE_INTERFACE,
+			},
+			{
+				/* Capture */
+				.ifnum = 2,
+				.type = QUIRK_AUDIO_STANDARD_INTERFACE,
+			},
+			{
+				/* Midi */
+				.ifnum = 3,
+				.type = QUIRK_MIDI_STANDARD_INTERFACE
+			},
+			{
+				.ifnum = -1
+			},
+		}
+	}
+},
+
+{
+	/*
 	 * Some USB MIDI devices don't have an audio control interface,
 	 * so we have to grab MIDI streaming interfaces here.
 	 */
diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
index a5941f8..2e49193 100644
--- a/sound/usb/quirks.c
+++ b/sound/usb/quirks.c
@@ -1160,6 +1160,14 @@  void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe,
 			break;
 		}
 	}
+
+	/* Zoom R16/24 needs a tiny delay here, otherwise requests like
+	 * get/set frequency return as failed despite actually succeeding.
+	 */
+	if ((le16_to_cpu(dev->descriptor.idVendor) == 0x1686) &&
+	    (le16_to_cpu(dev->descriptor.idProduct) == 0x00dd) &&
+	    (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS)
+		mdelay(1);
 }
 
 /*