Takashi Sakamoto wrote:
On Dec 08 2015 20:29, Clemens Ladisch wrote:
Takashi Sakamoto wrote:
On Dec 08 2015 19:22, Clemens Ladisch wrote:
Takashi Sakamoto wrote:
/* Calculate consume bytes. */
consume = calculate_message_bytes(status);
if (consume <= 0)
return;
As far as I can see, sending one of the "undefined" bytes can stop the stream permanently. Invalid bytes need to be acked to ignore/remove them.
Exactly. We should find better way to handle such messages. Do you have any good ideas?
Call snd_rawmidi_transmit_ack(, 1) and continue.
$ git diff diff --git a/sound/firewire/fireface/fireface-transaction.c b/sound/firewire/fireface/fireface-transaction.c index 07a2b9c..6b8c7a8 100644 --- a/sound/firewire/fireface/fireface-transaction.c +++ b/sound/firewire/fireface/fireface-transaction.c @@ -148,8 +148,10 @@ static void transmit_midi_msg(struct snd_ff *ff, unsigned int port)
/* Calculate consume bytes. */ consume = calculate_message_bytes(status);
if (consume <= 0)
if (consume <= 0) {
snd_rawmidi_transmit_ack(substream, 1); return;
} /* On running-status. */ if ((*buf & 0x80) != 0x80) {
Hm. This looks simple and works better, while I suspect that this is appropriate to device driver, because this idea drops the message from userspace. This is against a principle that device drivers just pass data from a side to another side without censoring and modification.
I think it better to transfer the message to the device, even if it's invalid in MIDI spec. It's what the userspace wants.
The code takes care to send entire MIDI messages. Is that actually required by the FF? (Windows does not have a raw MIDI interface, so this problem could not happen there.)
Regards, Clemens