aboutsummaryrefslogtreecommitdiffstats
path: root/sound/usb/usbmidi.c
diff options
context:
space:
mode:
authorKarsten Wiese <fzu@wemgehoertderstaat.de>2008-07-30 09:13:29 -0400
committerJaroslav Kysela <perex@perex.cz>2008-08-01 07:37:12 -0400
commit030a07e441296c372f946cd4065b5d831d8dc40c (patch)
tree4032eba646f9bf1c6f146adc40b449cf50b59a47 /sound/usb/usbmidi.c
parent896e6cc20e67038af12e1a7711eef32647e62f23 (diff)
ALSA: Add USB US122L driver
Added a new US122L usb-audio driver. This driver works together with a dedicated alsa-lib plugin. Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Diffstat (limited to 'sound/usb/usbmidi.c')
-rw-r--r--sound/usb/usbmidi.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/sound/usb/usbmidi.c b/sound/usb/usbmidi.c
index 6676a177c99e..c0c7770198ad 100644
--- a/sound/usb/usbmidi.c
+++ b/sound/usb/usbmidi.c
@@ -669,6 +669,42 @@ static struct usb_protocol_ops snd_usbmidi_raw_ops = {
669 .output = snd_usbmidi_raw_output, 669 .output = snd_usbmidi_raw_output,
670}; 670};
671 671
672static void snd_usbmidi_us122l_input(struct snd_usb_midi_in_endpoint *ep,
673 uint8_t *buffer, int buffer_length)
674{
675 if (buffer_length != 9)
676 return;
677 buffer_length = 8;
678 while (buffer_length && buffer[buffer_length - 1] == 0xFD)
679 buffer_length--;
680 if (buffer_length)
681 snd_usbmidi_input_data(ep, 0, buffer, buffer_length);
682}
683
684static void snd_usbmidi_us122l_output(struct snd_usb_midi_out_endpoint *ep)
685{
686 int count;
687
688 if (!ep->ports[0].active)
689 return;
690 count = ep->urb->dev->speed == USB_SPEED_HIGH ? 1 : 2;
691 count = snd_rawmidi_transmit(ep->ports[0].substream,
692 ep->urb->transfer_buffer,
693 count);
694 if (count < 1) {
695 ep->ports[0].active = 0;
696 return;
697 }
698
699 memset(ep->urb->transfer_buffer + count, 0xFD, 9 - count);
700 ep->urb->transfer_buffer_length = count;
701}
702
703static struct usb_protocol_ops snd_usbmidi_122l_ops = {
704 .input = snd_usbmidi_us122l_input,
705 .output = snd_usbmidi_us122l_output,
706};
707
672/* 708/*
673 * Emagic USB MIDI protocol: raw MIDI with "F5 xx" port switching. 709 * Emagic USB MIDI protocol: raw MIDI with "F5 xx" port switching.
674 */ 710 */
@@ -1714,6 +1750,9 @@ int snd_usb_create_midi_interface(struct snd_usb_audio* chip,
1714 umidi->usb_protocol_ops = 1750 umidi->usb_protocol_ops =
1715 &snd_usbmidi_maudio_broken_running_status_ops; 1751 &snd_usbmidi_maudio_broken_running_status_ops;
1716 break; 1752 break;
1753 case QUIRK_MIDI_US122L:
1754 umidi->usb_protocol_ops = &snd_usbmidi_122l_ops;
1755 /* fall through */
1717 case QUIRK_MIDI_FIXED_ENDPOINT: 1756 case QUIRK_MIDI_FIXED_ENDPOINT:
1718 memcpy(&endpoints[0], quirk->data, 1757 memcpy(&endpoints[0], quirk->data,
1719 sizeof(struct snd_usb_midi_endpoint_info)); 1758 sizeof(struct snd_usb_midi_endpoint_info));