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>
This commit is contained in:

committed by
Jaroslav Kysela

parent
896e6cc20e
commit
030a07e441
@@ -669,6 +669,42 @@ static struct usb_protocol_ops snd_usbmidi_raw_ops = {
|
||||
.output = snd_usbmidi_raw_output,
|
||||
};
|
||||
|
||||
static void snd_usbmidi_us122l_input(struct snd_usb_midi_in_endpoint *ep,
|
||||
uint8_t *buffer, int buffer_length)
|
||||
{
|
||||
if (buffer_length != 9)
|
||||
return;
|
||||
buffer_length = 8;
|
||||
while (buffer_length && buffer[buffer_length - 1] == 0xFD)
|
||||
buffer_length--;
|
||||
if (buffer_length)
|
||||
snd_usbmidi_input_data(ep, 0, buffer, buffer_length);
|
||||
}
|
||||
|
||||
static void snd_usbmidi_us122l_output(struct snd_usb_midi_out_endpoint *ep)
|
||||
{
|
||||
int count;
|
||||
|
||||
if (!ep->ports[0].active)
|
||||
return;
|
||||
count = ep->urb->dev->speed == USB_SPEED_HIGH ? 1 : 2;
|
||||
count = snd_rawmidi_transmit(ep->ports[0].substream,
|
||||
ep->urb->transfer_buffer,
|
||||
count);
|
||||
if (count < 1) {
|
||||
ep->ports[0].active = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
memset(ep->urb->transfer_buffer + count, 0xFD, 9 - count);
|
||||
ep->urb->transfer_buffer_length = count;
|
||||
}
|
||||
|
||||
static struct usb_protocol_ops snd_usbmidi_122l_ops = {
|
||||
.input = snd_usbmidi_us122l_input,
|
||||
.output = snd_usbmidi_us122l_output,
|
||||
};
|
||||
|
||||
/*
|
||||
* Emagic USB MIDI protocol: raw MIDI with "F5 xx" port switching.
|
||||
*/
|
||||
@@ -1714,6 +1750,9 @@ int snd_usb_create_midi_interface(struct snd_usb_audio* chip,
|
||||
umidi->usb_protocol_ops =
|
||||
&snd_usbmidi_maudio_broken_running_status_ops;
|
||||
break;
|
||||
case QUIRK_MIDI_US122L:
|
||||
umidi->usb_protocol_ops = &snd_usbmidi_122l_ops;
|
||||
/* fall through */
|
||||
case QUIRK_MIDI_FIXED_ENDPOINT:
|
||||
memcpy(&endpoints[0], quirk->data,
|
||||
sizeof(struct snd_usb_midi_endpoint_info));
|
||||
|
Reference in New Issue
Block a user