Truncate MIDI SysEx messages after termination byte

Christian Costa titan.costa at
Mon Jan 14 06:51:24 CST 2013

> Still, I'm not persuaded that your patch is at the right place.
> I believe the midi* functions should be tiny wrappers around MODM_*
> messages, same for the wave* functions.  Every time I see somebody
> attempt to violate this 1:1 mapping, I'm suspicious.  Perhaps the
> logic that you're adding belongs to the individual wine*.drv/midi.c?

Maybe it worth compare visually between builtin and native by adding
sysex dump code to one driver if needed as 1st and last 3 bytes are
currently dump.

> Therefore, I'd be happy if you could invest some more time and check,
> based on your real MIDI HW, and perhaps native w* machines,
> whether MODM_LONGDATA and midiOutLongMsg are equivalent
> or whether midiOut* does some additional processing.

I don't know if Johannes uses alsa driver but I took a look at the
alsa code and this code simply does not do what it is supposed to.
I think that would be better to fix this code first as it might be the
cause of the bug.

984         if (lpData[0] != 0xF0) {
985             /* Send start of System Exclusive */
986             len_add = 1;
987             lpData[0] = 0xF0;
988             memcpy(lpNewData, lpData, lpMidiHdr->dwBufferLength);
989             WARN("Adding missing 0xF0 marker at the beginning of "
990                  "system exclusive byte stream\n");
991         }
992         if (lpData[lpMidiHdr->dwBufferLength-1] != 0xF7) {
993             /* Send end of System Exclusive */
994             memcpy(lpData + len_add, lpData, lpMidiHdr->dwBufferLength);
995             lpNewData[lpMidiHdr->dwBufferLength + len_add - 1] = 0xF0;
996             len_add++;
997             WARN("Adding missing 0xF7 marker at the end of "
998                  "system exclusive byte stream\n");

999 }

More information about the wine-devel mailing list