src/JackHandler.h
branchv_0
changeset 13 a85c191709e6
parent 12 f56620b95180
child 14 9ad606c80d3b
equal deleted inserted replaced
12:f56620b95180 13:a85c191709e6
    98 	/**
    98 	/**
    99 	 * Temporary storage of values read from relational input.
    99 	 * Temporary storage of values read from relational input.
   100 	 */
   100 	 */
   101 	class RelationContext {
   101 	class RelationContext {
   102 	public:
   102 	public:
       
   103 		bool skip = false;
       
   104 
   103 		size_t indexOfEvent = -1;
   105 		size_t indexOfEvent = -1;
   104 		size_t indexOfChannel = -1;
   106 		size_t indexOfChannel = -1;
   105 		size_t indexOfNoteOn = -1;
   107 		size_t indexOfNoteOn = -1;
   106 		size_t indexOfNotePitch = -1;
   108 		size_t indexOfNotePitch = -1;
   107 		size_t indexOfNoteVelocity = -1;
   109 		size_t indexOfNoteVelocity = -1;
   153 
   155 
   154 		realTimeContext.ringBuffer = jack_ringbuffer_create(realTimeContext.RING_BUFFER_SIZE * sizeof (MidiMessage));
   156 		realTimeContext.ringBuffer = jack_ringbuffer_create(realTimeContext.RING_BUFFER_SIZE * sizeof (MidiMessage));
   155 
   157 
   156 		jack_set_process_callback(realTimeContext.jackClient, RealTimeContext::processCallback, &realTimeContext);
   158 		jack_set_process_callback(realTimeContext.jackClient, RealTimeContext::processCallback, &realTimeContext);
   157 		// TODO: report also other events (connections etc.)
   159 		// TODO: report also other events (connections etc.)
       
   160 		// TODO: jack_set_error_function() + avoid mixing char and wchar output
   158 
   161 
   159 		realTimeContext.jackPort = jack_port_register(realTimeContext.jackClient, "output", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0);
   162 		realTimeContext.jackPort = jack_port_register(realTimeContext.jackClient, "output", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0);
   160 		if (realTimeContext.jackPort == nullptr) throw JackException(L"Could not register port.");
   163 		if (realTimeContext.jackPort == nullptr) throw JackException(L"Could not register port.");
   161 
   164 
   162 		if (mlockall(MCL_CURRENT | MCL_FUTURE)) fwprintf(stderr, L"Warning: Can not lock memory.\n");
   165 		if (mlockall(MCL_CURRENT | MCL_FUTURE)) fwprintf(stderr, L"Warning: Can not lock memory.\n");
   188 			else if (attributeName == L"raw") relationContext.indexOfRaw = i;
   191 			else if (attributeName == L"raw") relationContext.indexOfRaw = i;
   189 		}
   192 		}
   190 
   193 
   191 		// TODO: check also data types and skipt relation if important attributes are missing
   194 		// TODO: check also data types and skipt relation if important attributes are missing
   192 		// TODO: configurable relation name
   195 		// TODO: configurable relation name
       
   196 
       
   197 		if (relationContext.indexOfEvent == -1 || relationContext.indexOfRaw == -1) {
       
   198 			relationContext.skip = true;
       
   199 			fwprintf(stderr, L"Relation „%ls“ will be ignored because mandatory attributes are missing.\n", name.c_str());
       
   200 		}
       
   201 
   193 	}
   202 	}
   194 
   203 
   195 	void attribute(const relpipe::common::type::StringX& value) override {
   204 	void attribute(const relpipe::common::type::StringX& value) override {
       
   205 		if (relationContext.skip) return;
   196 		// TODO: switch to RelationalReaderStringHandler
   206 		// TODO: switch to RelationalReaderStringHandler
   197 		// TODO: if (continueProcessing) {} ?
   207 		// TODO: if (continueProcessing) {} ?
   198 
   208 
   199 		// memcpy(currentMidiMessage.buffer, ….buffer, ….size);
   209 		// memcpy(currentMidiMessage.buffer, ….buffer, ….size);
   200 		// currentMidiMessage.size = …;
   210 		// currentMidiMessage.size = …;