send correct number of messages to JACK + wait in order to be sure that all events were sent
--- a/src/JackHandler.h Thu Oct 01 00:15:50 2020 +0200
+++ b/src/JackHandler.h Thu Oct 01 19:35:49 2020 +0200
@@ -115,18 +115,20 @@
// memcpy(currentMidiMessage.buffer, ….buffer, ….size);
// currentMidiMessage.size = …;
// currentMidiMessage.time = …;
-
+
// TODO: correct timing?
// TODO: real data
+ currentMidiMessage.time = 0;
currentMidiMessage.size = 3;
currentMidiMessage.buffer[0] = 0x80;
currentMidiMessage.buffer[1] = 0x34;
currentMidiMessage.buffer[2] = 0x40;
-
+
currentAttributeIndex++;
} else {
if (jack_ringbuffer_write_space(ringBuffer) >= sizeof (MidiMessage)) {
jack_ringbuffer_write(ringBuffer, (const char *) ¤tMidiMessage, sizeof (MidiMessage));
+ std::cout << "jack_ringbuffer_write" << std::endl;
} else {
fwprintf(stderr, L"Error: ring buffer is full → skipping event.\n");
}
@@ -142,17 +144,21 @@
// Wait until the ring buffer is empty
while (continueProcessing && jack_ringbuffer_read_space(ringBuffer)) usleep(1000);
+ usleep(1000000);
+ // TODO: better waiting (ringBuffer might be empty, but events have not been sent to JACK yet)
}
int dequeueMessages(jack_nframes_t frames) {
const size_t queuedMessages = jack_ringbuffer_read_space(ringBuffer) / sizeof (MidiMessage);
+ void* jackPortBuffer = jack_port_get_buffer(jackPort, frames); // jack_port_get_buffer() must be called outside the loop, otherwise it will multiply the MIDI events
+ jack_midi_clear_buffer(jackPortBuffer); // TODO: clean buffer?
for (size_t i = 0; i < queuedMessages && i < frames; i++) {
// TODO: correct timing?
MidiMessage m;
jack_ringbuffer_read(ringBuffer, (char*) &m, sizeof (MidiMessage));
- void* jackPortBuffer = jack_port_get_buffer(jackPort, frames);
jack_midi_data_t* midiData = jack_midi_event_reserve(jackPortBuffer, m.time, m.size);
memcpy(midiData, m.buffer, m.size);
+ std::cout << "jack_midi_event_reserve" << std::endl;
}
return 0;
}