# HG changeset patch # User František Kučera # Date 1601504150 -7200 # Node ID 4174fc0c2e7cc2abf076d8e6c151e55aa9ca0889 # Parent 6be3464ccb2bf228306b0fbc1cb565b312a5564b send some (constant, dummy) MIDI message to JACK diff -r 6be3464ccb2b -r 4174fc0c2e7c src/CMakeLists.txt --- a/src/CMakeLists.txt Wed Sep 30 21:37:01 2020 +0200 +++ b/src/CMakeLists.txt Thu Oct 01 00:15:50 2020 +0200 @@ -34,7 +34,7 @@ ) # Link libraries: -target_link_libraries(${EXECUTABLE_FILE} ${RELPIPE_LIBS_LIBRARIES} pthread) +target_link_libraries(${EXECUTABLE_FILE} ${RELPIPE_LIBS_LIBRARIES}) set_property(TARGET ${EXECUTABLE_FILE} PROPERTY INSTALL_RPATH_USE_LINK_PATH TRUE) install(TARGETS ${EXECUTABLE_FILE} DESTINATION bin) diff -r 6be3464ccb2b -r 4174fc0c2e7c src/JackHandler.h --- 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 #include #include +#include #include #include #include @@ -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 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; }