Commit f937b43d authored by Takashi Sakamoto's avatar Takashi Sakamoto Committed by Takashi Iwai

ALSA: firewire-tascam: clear extra MIDI bytes in an asynchronous transaction

When MIDI buffer stores two or more MIDI messages, TASCAM driver
transfers asynchronous transactions including one MIDI message and
extra bytes from second MIDI message.

This commit fixes this bug by clearing needless bytes in the buffer. The
consumed bytes are already calculated correctly, thus the sequence of
transactions is already correct.
Signed-off-by: default avatarTakashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 123990e9
......@@ -93,8 +93,10 @@ static int fill_message(struct snd_rawmidi_substream *substream, u8 *buf)
*label = (port << 4) | 0x04;
/* We need to fill whole 3 bytes. Go to next change. */
} else {
consume = 0;
return 0;
}
len = consume;
} else {
/* The beginning of exclusives. */
if (msg[0] == 0xf0) {
......@@ -115,24 +117,30 @@ static int fill_message(struct snd_rawmidi_substream *substream, u8 *buf)
/* On running-status. */
if ((msg[0] & 0x80) != 0x80) {
/* Enough MIDI bytes were not retrieved. */
if (consume < len - 1)
return 0;
consume = len - 1;
msg[2] = msg[1];
msg[1] = msg[0];
msg[0] = tscm->running_status[port];
consume--;
} else {
tscm->running_status[port] = msg[0];
}
/* Confirm length. */
/* Enough MIDI bytes were not retrieved. */
if (consume < len)
return 0;
if (consume > len)
consume = len;
tscm->running_status[port] = msg[0];
}
}
*label = (port << 4) | (msg[0] >> 4);
}
if (len > 0 && len < 3)
memset(msg + len, 0, 3 - len);
return consume;
}
......
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