BUG: ALSA snd-virmidi: snd-virmidi is not MIDI 1.0 specification compliant

Takashi Iwai tiwai at suse.de
Mon Mar 16 10:00:32 CET 2020


On Sun, 15 Mar 2020 12:57:13 +0100,
Andreas Steinmetz wrote:
> 
> snd-virmidi, as of kernel 5.4.23, does not adhere to the MIDI
> specification:
> 
> >From MIDI 1.0 Detailed Specification, Document Version 4.2, Appendix A-
> 1 (RUNNING STATUS), Page A-2:
> 
> "3. Buffer is cleared when a System Exclusive or Common status message
> is received."
> 
> snd-virmidi does not clear the running status in case of a SysEx
> message.
> 
> How to test:
> 
> Load snd-virmidi module and get the card number of the module.
> In the following 5 is assumed as the card number and device 1 is used.
> 
> You need two shells, in shell 1 do:
> 
> aconnect 'Virtual Raw MIDI 5-1':0 'Virtual Raw MIDI 5-1':0
> amidi -p hw:VirMIDI,1 -d
> 
> Now, in shell 2 do:
> 
> amidi -p hw:VirMIDI,1 -S '80 01 02 F0 01 F7 80 02 03'
> 
> This sends a note off, followed by a SysEx, followed by another note
> off. The result in shell 1 is:
> 
> 80 01 02
> F0 01 F7
> 02
> 03
> 
> So snd-virmidi did not clear the running status. The correct result
> would be:
> 
> 80 01 02
> F0 01 F7
> 80 02 03

Thanks for the report.  Indeed it's a very old bug.
The fix is simple as below.

Since there is a similar bug in OSS emulation layer, too, I'm going to
submit a proper patch set including this.


Takashi

--- a/sound/core/seq/seq_virmidi.c
+++ b/sound/core/seq/seq_virmidi.c
@@ -81,6 +81,7 @@ static int snd_virmidi_dev_receive_event(struct snd_virmidi_dev *rdev,
 			if ((ev->flags & SNDRV_SEQ_EVENT_LENGTH_MASK) != SNDRV_SEQ_EVENT_LENGTH_VARIABLE)
 				continue;
 			snd_seq_dump_var_event(ev, (snd_seq_dump_func_t)snd_rawmidi_receive, vmidi->substream);
+			snd_midi_event_reset_decode(vmidi->parser);
 		} else {
 			len = snd_midi_event_decode(vmidi->parser, msg, sizeof(msg), ev);
 			if (len > 0)


More information about the Alsa-devel mailing list