--- a/src/JackHandler.h Wed Sep 30 21:37:01 2020 +0200
+++ b/src/JackHandler.h Thu Oct 01 00:15:50 2020 +0200
@@ -19,6 +19,7 @@
#include <memory>
#include <atomic>
#include <string>
+#include <cstring>
#include <vector>
#include <iostream>
#include <sstream>
@@ -54,8 +55,6 @@
jack_client_t* jackClient = nullptr;
jack_port_t* jackPort = nullptr;
jack_ringbuffer_t* ringBuffer = nullptr;
- pthread_mutex_t messageThreadLock = PTHREAD_MUTEX_INITIALIZER;
- pthread_cond_t dataReady = PTHREAD_COND_INITIALIZER;
std::atomic<bool> continueProcessing{true};
@@ -116,6 +115,14 @@
// memcpy(currentMidiMessage.buffer, ….buffer, ….size);
// currentMidiMessage.size = …;
// currentMidiMessage.time = …;
+
+ // TODO: correct timing?
+ // TODO: real data
+ 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)) {
@@ -124,11 +131,6 @@
fwprintf(stderr, L"Error: ring buffer is full → skipping event.\n");
}
- if (pthread_mutex_trylock(&messageThreadLock) == 0) {
- pthread_cond_signal(&dataReady);
- pthread_mutex_unlock(&messageThreadLock);
- }
-
currentMidiMessage = MidiMessage();
currentAttributeIndex = 0;
}
@@ -143,25 +145,15 @@
}
int dequeueMessages(jack_nframes_t frames) {
-
- std::cout << "dequeueMessages(" << frames << ")" << std::endl; // TODO: remove debug message
-
- // Process messages from the ring buffer queue:
- pthread_mutex_lock(&messageThreadLock);
- while (continueProcessing) { // TODO: is continueProcessing needed?
- const size_t queuedMessages = jack_ringbuffer_read_space(ringBuffer) / sizeof (MidiMessage);
- for (size_t i = 0; i < queuedMessages; ++i) {
- MidiMessage m;
- jack_ringbuffer_read(ringBuffer, (char*) &m, sizeof (MidiMessage));
- // TODO: send events from the ring buffer to JACK + correct timing
- // FIXME: do not block here in the while loop; check frames
- std::cout << "will process MidiMessage: " << &m << "" << std::endl; // TODO: remove debug message
- }
- pthread_cond_wait(&dataReady, &messageThreadLock);
+ const size_t queuedMessages = jack_ringbuffer_read_space(ringBuffer) / sizeof (MidiMessage);
+ 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);
}
- pthread_mutex_unlock(&messageThreadLock);
-
-
return 0;
}