diff options
author | Karsten Wiese <fzu@wemgehoertderstaat.de> | 2008-07-30 09:13:29 -0400 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2008-08-01 07:37:12 -0400 |
commit | 030a07e441296c372f946cd4065b5d831d8dc40c (patch) | |
tree | 4032eba646f9bf1c6f146adc40b449cf50b59a47 /sound/usb/usbmidi.c | |
parent | 896e6cc20e67038af12e1a7711eef32647e62f23 (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.c | 39 |
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 | ||
672 | static 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 | |||
684 | static 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 | |||
703 | static 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)); |