From 9daca346a710c0cc68aeb4de18d9f0b0a8d10d0f Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 27 Nov 2023 17:00:39 +0100 Subject: [PATCH] jack: allow OSC messages inside JACK MIDI Some JACK clients place OSC messages in MIDI buffers. Try to detect the OSC messages and mark the control as OSC. Also allow OSC control to be converted to JACK MIDI. This should make things work better with native PipeWire clients that handle MIDI and OSC. --- pipewire-jack/src/pipewire-jack.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pipewire-jack/src/pipewire-jack.c b/pipewire-jack/src/pipewire-jack.c index 34433fe1e..58d39924d 100644 --- a/pipewire-jack/src/pipewire-jack.c +++ b/pipewire-jack/src/pipewire-jack.c @@ -1341,6 +1341,10 @@ static inline struct buffer *dequeue_buffer(struct client *c, struct mix *mix) return b; } +static inline bool is_osc(jack_midi_event_t *ev) +{ + return ev->size >= 1 && (ev->buffer[0] == '#' || ev->buffer[0] == '/'); +} static size_t convert_from_midi(void *midi, void *buffer, size_t size) { @@ -1356,7 +1360,8 @@ static size_t convert_from_midi(void *midi, void *buffer, size_t size) for (i = 0; i < count; i++) { jack_midi_event_t ev; jack_midi_event_get(&ev, midi, i); - spa_pod_builder_control(&b, ev.time, SPA_CONTROL_Midi); + spa_pod_builder_control(&b, ev.time, + is_osc(&ev) ? SPA_CONTROL_OSC : SPA_CONTROL_Midi); spa_pod_builder_bytes(&b, ev.buffer, ev.size); } spa_pod_builder_pop(&b, &f); @@ -1445,6 +1450,7 @@ static void convert_to_midi(struct spa_pod_sequence **seq, uint32_t n_seq, void break; switch(next->type) { + case SPA_CONTROL_OSC: case SPA_CONTROL_Midi: { uint8_t *data = SPA_POD_BODY(&next->value);