# HG changeset patch # User František Kučera # Date 1601573749 -7200 # Node ID b2fc99295546ba3db4ab721ffd03c9ddd09d0d86 # Parent 4174fc0c2e7cc2abf076d8e6c151e55aa9ca0889 send correct number of messages to JACK + wait in order to be sure that all events were sent diff -r 4174fc0c2e7c -r b2fc99295546 src/JackHandler.h --- 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; }