mirror of
https://gitlab.freedesktop.org/pipewire/pipewire
synced 2024-07-09 04:05:58 +00:00
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.
This commit is contained in:
parent
eca1f5685e
commit
9daca346a7
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue
Block a user