Commit c347e9fc authored by Clemens Ladisch's avatar Clemens Ladisch Committed by Jaroslav Kysela

[ALSA] usb-audio: fix Emagic MIDI protocol handling

USB generic driver
Emagic devices pad their packets not with 0xff bytes but with a 0xff
byte followed by garbage, so we have to stop at the first such byte.
Signed-off-by: default avatarClemens Ladisch <clemens@ladisch.de>
parent a278655f
...@@ -594,17 +594,20 @@ static void snd_usbmidi_emagic_finish_out(snd_usb_midi_out_endpoint_t* ep) ...@@ -594,17 +594,20 @@ static void snd_usbmidi_emagic_finish_out(snd_usb_midi_out_endpoint_t* ep)
static void snd_usbmidi_emagic_input(snd_usb_midi_in_endpoint_t* ep, static void snd_usbmidi_emagic_input(snd_usb_midi_in_endpoint_t* ep,
uint8_t* buffer, int buffer_length) uint8_t* buffer, int buffer_length)
{ {
/* ignore padding bytes at end of buffer */ int i;
while (buffer_length > 0 && buffer[buffer_length - 1] == 0xff)
--buffer_length; /* FF indicates end of valid data */
for (i = 0; i < buffer_length; ++i)
if (buffer[i] == 0xff) {
buffer_length = i;
break;
}
/* handle F5 at end of last buffer */ /* handle F5 at end of last buffer */
if (ep->seen_f5) if (ep->seen_f5)
goto switch_port; goto switch_port;
while (buffer_length > 0) { while (buffer_length > 0) {
int i;
/* determine size of data until next F5 */ /* determine size of data until next F5 */
for (i = 0; i < buffer_length; ++i) for (i = 0; i < buffer_length; ++i)
if (buffer[i] == 0xf5) if (buffer[i] == 0xf5)
...@@ -671,6 +674,10 @@ static void snd_usbmidi_emagic_output(snd_usb_midi_out_endpoint_t* ep) ...@@ -671,6 +674,10 @@ static void snd_usbmidi_emagic_output(snd_usb_midi_out_endpoint_t* ep)
break; break;
} }
} }
if (buf_free < ep->max_transfer && buf_free > 0) {
*buf = 0xff;
--buf_free;
}
ep->urb->transfer_buffer_length = ep->max_transfer - buf_free; ep->urb->transfer_buffer_length = ep->max_transfer - buf_free;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment