equal
deleted
inserted
replaced
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 = …; |