diff options
Diffstat (limited to 'sound')
-rw-r--r-- | sound/firewire/tascam/tascam-transaction.c | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/sound/firewire/tascam/tascam-transaction.c b/sound/firewire/tascam/tascam-transaction.c index ea88655e7e08..99098aa2391e 100644 --- a/sound/firewire/tascam/tascam-transaction.c +++ b/sound/firewire/tascam/tascam-transaction.c @@ -63,17 +63,22 @@ static int fill_message(struct snd_rawmidi_substream *substream, u8 *buf) struct snd_tscm *tscm = substream->rmidi->private_data; unsigned int port = substream->number; int i, len, consume; + u8 *label, *msg; u8 status; - consume = snd_rawmidi_transmit_peek(substream, buf + 1, 3); + /* The first byte is used for label, the rest for MIDI bytes. */ + label = buf; + msg = buf + 1; + + consume = snd_rawmidi_transmit_peek(substream, msg, 3); if (consume == 0) return 0; /* On exclusive message. */ if (tscm->on_sysex[port]) { /* Seek the end of exclusives. */ - for (i = 1; i < 4 || i < consume; ++i) { - if (buf[i] == 0xf7) { + for (i = 0; i < consume; ++i) { + if (msg[i] == 0xf7) { tscm->on_sysex[port] = false; break; } @@ -81,27 +86,27 @@ static int fill_message(struct snd_rawmidi_substream *substream, u8 *buf) /* At the end of exclusive message, use label 0x07. */ if (!tscm->on_sysex[port]) { - consume = i; - buf[0] = (port << 4) | 0x07; + consume = i + 1; + *label = (port << 4) | 0x07; /* During exclusive message, use label 0x04. */ } else if (consume == 3) { - buf[0] = (port << 4) | 0x04; + *label = (port << 4) | 0x04; /* We need to fill whole 3 bytes. Go to next change. */ } else { consume = 0; } } else { /* The beginning of exclusives. */ - if (buf[1] == 0xf0) { + if (msg[0] == 0xf0) { /* Transfer it in next chance in another condition. */ tscm->on_sysex[port] = true; return 0; } else { /* On running-status. */ - if ((buf[1] & 0x80) != 0x80) + if ((msg[0] & 0x80) != 0x80) status = tscm->running_status[port]; else - status = buf[1]; + status = msg[0]; /* Calculate consume bytes. */ len = calculate_message_bytes(status); @@ -109,13 +114,13 @@ static int fill_message(struct snd_rawmidi_substream *substream, u8 *buf) return 0; /* On running-status. */ - if ((buf[1] & 0x80) != 0x80) { - buf[3] = buf[2]; - buf[2] = buf[1]; - buf[1] = tscm->running_status[port]; + if ((msg[0] & 0x80) != 0x80) { + msg[2] = msg[1]; + msg[1] = msg[0]; + msg[0] = tscm->running_status[port]; consume--; } else { - tscm->running_status[port] = buf[1]; + tscm->running_status[port] = msg[0]; } /* Confirm length. */ @@ -125,7 +130,7 @@ static int fill_message(struct snd_rawmidi_substream *substream, u8 *buf) consume = len; } - buf[0] = (port << 4) | (buf[1] >> 4); + *label = (port << 4) | (msg[0] >> 4); } return consume; |