[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