send some (constant, dummy) MIDI message to JACK v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Thu, 01 Oct 2020 00:15:50 +0200
branchv_0
changeset 6 4174fc0c2e7c
parent 5 6be3464ccb2b
child 7 b2fc99295546
send some (constant, dummy) MIDI message to JACK
src/CMakeLists.txt
src/JackHandler.h
--- 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)
--- 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;
 	}