From 4e389940e83a0d0e874131d23d6526e6b630d9e8 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 7a04ab8af..bc7e50978 100644 --- a/src/tools/midifile.c +++ b/src/tools/midifile.c @@ -513,10 +513,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); @@ -550,6 +550,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; }