From 442371f042763f623198cc0c38a636227e5492ea Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 20 May 2026 16:05:12 +0200 Subject: [PATCH] midifile: correctly write SysEx events We need to place the sysex length in the message as well. --- src/tools/midifile.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/tools/midifile.c b/src/tools/midifile.c index 364063aa4..e6c59bc65 100644 --- a/src/tools/midifile.c +++ b/src/tools/midifile.c @@ -502,10 +502,10 @@ int midi_file_write_event(struct midi_file *mf, const struct midi_event *event) { struct midi_track *tr; uint32_t tick; - void *data, *ev_data; + void *data; size_t size; int res, ev_size; - uint8_t ev[32]; + uint8_t ev[32], *ev_data; uint64_t state = 0; spa_return_val_if_fail(event != NULL, -EINVAL); @@ -539,6 +539,17 @@ int midi_file_write_event(struct midi_file *mf, const struct midi_event *event) CHECK_RES(write_varlen(mf, tr, tick - tr->tick)); tr->tick = tick; + if (ev_size > 0 && + (ev_data[0] == 0xf0 || ev_data[0] == 0xf7)) { + CHECK_RES(write_n(mf->file, ev_data, 1)); + ev_size -= 1; + ev_data += 1; + + CHECK_RES(write_varlen(mf, tr, ev_size)); + + tr->size += 1; + } + CHECK_RES(write_n(mf->file, ev_data, ev_size)); tr->size += ev_size; }