mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-29 05:40:27 -04: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
1 changed files with 7 additions and 1 deletions
|
|
@ -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…
Add table
Add a link
Reference in a new issue