|
|
|
@@ -34,7 +34,6 @@ SERVER_EXPORT void JackMidiBuffer::Reset(jack_nframes_t nframes) |
|
|
|
write_pos = 0; |
|
|
|
event_count = 0; |
|
|
|
lost_events = 0; |
|
|
|
mix_index = 0; |
|
|
|
} |
|
|
|
|
|
|
|
SERVER_EXPORT jack_shmsize_t JackMidiBuffer::MaxEventSize() const |
|
|
|
@@ -100,6 +99,7 @@ static void MidiBufferMixdown(void* mixbuffer, void** src_buffers, int src_count |
|
|
|
} |
|
|
|
mix->Reset(nframes); |
|
|
|
|
|
|
|
uint32_t mix_index[src_count]; |
|
|
|
int event_count = 0; |
|
|
|
for (int i = 0; i < src_count; ++i) { |
|
|
|
JackMidiBuffer* buf = static_cast<JackMidiBuffer*>(src_buffers[i]); |
|
|
|
@@ -107,7 +107,7 @@ static void MidiBufferMixdown(void* mixbuffer, void** src_buffers, int src_count |
|
|
|
jack_error("Jack::MidiBufferMixdown - invalid source buffer"); |
|
|
|
return; |
|
|
|
} |
|
|
|
buf->mix_index = 0; |
|
|
|
mix_index[i] = 0; |
|
|
|
event_count += buf->event_count; |
|
|
|
mix->lost_events += buf->lost_events; |
|
|
|
} |
|
|
|
@@ -116,27 +116,28 @@ static void MidiBufferMixdown(void* mixbuffer, void** src_buffers, int src_count |
|
|
|
for (events_done = 0; events_done < event_count; ++events_done) { |
|
|
|
JackMidiBuffer* next_buf = 0; |
|
|
|
JackMidiEvent* next_event = 0; |
|
|
|
uint32_t next_buf_index = 0; |
|
|
|
|
|
|
|
// find the earliest event |
|
|
|
for (int i = 0; i < src_count; ++i) { |
|
|
|
JackMidiBuffer* buf = static_cast<JackMidiBuffer*>(src_buffers[i]); |
|
|
|
if (buf->mix_index >= buf->event_count) |
|
|
|
if (mix_index[i] >= buf->event_count) |
|
|
|
continue; |
|
|
|
JackMidiEvent* e = &buf->events[buf->mix_index]; |
|
|
|
JackMidiEvent* e = &buf->events[mix_index[i]]; |
|
|
|
if (!next_event || e->time < next_event->time) { |
|
|
|
next_event = e; |
|
|
|
next_buf = buf; |
|
|
|
next_buf_index = i; |
|
|
|
} |
|
|
|
} |
|
|
|
assert(next_event != 0); |
|
|
|
|
|
|
|
// write the event |
|
|
|
jack_midi_data_t* dest = mix->ReserveEvent(next_event->time, next_event->size); |
|
|
|
if (!dest) { |
|
|
|
break; |
|
|
|
} |
|
|
|
if (!dest) break; |
|
|
|
|
|
|
|
memcpy(dest, next_event->GetData(next_buf), next_event->size); |
|
|
|
next_buf->mix_index++; |
|
|
|
mix_index[next_buf_index]++; |
|
|
|
} |
|
|
|
mix->lost_events += event_count - events_done; |
|
|
|
} |
|
|
|
|