21 #include "JackError.h"    22 #include "JackPortType.h"    23 #include "JackMidiPort.h"    30 SERVER_EXPORT 
void JackMidiBuffer::Reset(jack_nframes_t nframes)
    33     this->nframes = nframes;
    39 SERVER_EXPORT jack_shmsize_t JackMidiBuffer::MaxEventSize()
 const    41     assert (((jack_shmsize_t) - 1) < 0); 
    42     jack_shmsize_t left = buffer_size - (
sizeof(JackMidiBuffer) + 
sizeof(JackMidiEvent) * (event_count + 1) + 
write_pos);
    46     if (left <= JackMidiEvent::INLINE_SIZE_MAX) {
    47         return JackMidiEvent::INLINE_SIZE_MAX;
    52 SERVER_EXPORT jack_midi_data_t* JackMidiBuffer::ReserveEvent(jack_nframes_t time, jack_shmsize_t size)
    54     jack_shmsize_t space = MaxEventSize();
    55     if (space == 0 || size > space) {
    56         jack_error(
"JackMidiBuffer::ReserveEvent - the buffer does not have "    57                    "enough room to enqueue a %lu byte event", size);
    61     JackMidiEvent* 
event = &events[event_count++];
    65     if (size <= JackMidiEvent::INLINE_SIZE_MAX) {
    71     return (jack_midi_data_t*)
this + 
event->offset;
    74 void MidiBufferInit(
void* buffer, 
size_t buffer_size, jack_nframes_t nframes)
    76     JackMidiBuffer* midi = (JackMidiBuffer*)buffer;
    77     midi->magic = JackMidiBuffer::MAGIC;
    79     midi->buffer_size = BUFFER_SIZE_MAX * 
sizeof(jack_default_audio_sample_t);
    93 static void MidiBufferMixdown(
void* mixbuffer, 
void** src_buffers, 
int src_count, jack_nframes_t nframes)
    95     JackMidiBuffer* mix = static_cast<JackMidiBuffer*>(mixbuffer);
    96     if (!mix->IsValid()) {
    97         jack_error(
"Jack::MidiBufferMixdown - invalid mix buffer");
   102     uint32_t mix_index[src_count];
   104     for (
int i = 0; i < src_count; ++i) {
   105         JackMidiBuffer* buf = static_cast<JackMidiBuffer*>(src_buffers[i]);
   106         if (!buf->IsValid()) {
   107             jack_error(
"Jack::MidiBufferMixdown - invalid source buffer");
   111         event_count += buf->event_count;
   112         mix->lost_events += buf->lost_events;
   116     for (events_done = 0; events_done < event_count; ++events_done) {
   117         JackMidiBuffer* next_buf = 0;
   118         JackMidiEvent* next_event = 0;
   119         uint32_t next_buf_index = 0;
   122         for (
int i = 0; i < src_count; ++i) {
   123             JackMidiBuffer* buf = static_cast<JackMidiBuffer*>(src_buffers[i]);
   124             if (mix_index[i] >= buf->event_count)
   126             JackMidiEvent* e = &buf->events[mix_index[i]];
   127             if (!next_event || e->time < next_event->time) {
   133         assert(next_event != 0);
   136         jack_midi_data_t* dest = mix->ReserveEvent(next_event->time, next_event->size);
   139         memcpy(dest, next_event->GetData(next_buf), next_event->size);
   140         mix_index[next_buf_index]++;
   142     mix->lost_events += event_count - events_done;
   145 static size_t MidiBufferSize()
   147     return BUFFER_SIZE_MAX * 
sizeof(jack_default_audio_sample_t);
   150 const JackPortType gMidiPortType =
   152     JACK_DEFAULT_MIDI_TYPE,
 SERVER_EXPORT void jack_error(const char *fmt,...)
jack_shmsize_t write_pos
data write position from the end of the buffer.