send correct number of messages to JACK + wait in order to be sure that all events were sent v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Thu, 01 Oct 2020 19:35:49 +0200
branchv_0
changeset 7 b2fc99295546
parent 6 4174fc0c2e7c
child 8 27579c5cdc51
send correct number of messages to JACK + wait in order to be sure that all events were sent
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 *) &currentMidiMessage, 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;
 	}