[alsa-devel] [PATCH 2/3] fireface: add transaction support
Takashi Sakamoto
o-takashi at sakamocchi.jp
Tue Dec 8 13:20:49 CET 2015
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.
Thanks
Takashi Sakamoto
More information about the Alsa-devel
mailing list