diff options
Diffstat (limited to 'libs/ardour/jack_midi_port.cc')
-rw-r--r-- | libs/ardour/jack_midi_port.cc | 52 |
1 files changed, 50 insertions, 2 deletions
diff --git a/libs/ardour/jack_midi_port.cc b/libs/ardour/jack_midi_port.cc index d831864ec9..3c3f50c9bb 100644 --- a/libs/ardour/jack_midi_port.cc +++ b/libs/ardour/jack_midi_port.cc @@ -24,6 +24,7 @@ JackMidiPort::JackMidiPort (const std::string& name, Flags flgs, MidiBuffer* buf : Port (name, flgs) , JackPort (name, DataType::MIDI, flgs) , BaseMidiPort (name, flgs) + , _has_been_mixed_down (false) { // MIDI ports always need a buffer since jack buffer format is different assert(buf); @@ -40,10 +41,27 @@ JackMidiPort::cycle_start (nframes_t nframes, nframes_t offset) _buffer->clear(); assert(_buffer->size() == 0); - if (_flags & IsOutput) { + if (_flags & IsInput) { return; } + // We're an output - delete the midi_events. + + void* jack_buffer = jack_port_get_buffer (_port, nframes); + + jack_midi_clear_buffer (jack_buffer); +} + +MidiBuffer & +JackMidiPort::get_midi_buffer( nframes_t nframes, nframes_t offset ) { + + if (_has_been_mixed_down) + return *_buffer; + + if (_flags & IsOutput) { + return *_buffer; + } + // We're an input - copy Jack events to internal buffer void* jack_buffer = jack_port_get_buffer(_port, nframes); @@ -57,13 +75,19 @@ JackMidiPort::cycle_start (nframes_t nframes, nframes_t offset) jack_midi_event_get (&ev, jack_buffer, i); - _buffer->push_back (ev); + // i guess this should do but i leave it off to test the rest first. + //if (ev.time > offset && ev.time < offset+nframes) + _buffer->push_back (ev); } assert(_buffer->size() == event_count); /*if (_buffer->size() > 0) cerr << "JackMIDIPort got " << event_count << " events (buf " << _buffer << ")" << endl;*/ + if (nframes) + _has_been_mixed_down = true; + + return *_buffer; } void @@ -71,6 +95,9 @@ JackMidiPort::cycle_end (nframes_t nframes, nframes_t offset) { /* FIXME: offset */ + _has_been_mixed_down = false; + +#if 0 if (_flags & IsInput) { return; } @@ -88,4 +115,25 @@ JackMidiPort::cycle_end (nframes_t nframes, nframes_t offset) assert(ev.time() < nframes); jack_midi_event_write (jack_buffer, (jack_nframes_t) ev.time(), ev.buffer(), ev.size()); } +#endif +} + +void +JackMidiPort::flush_buffers (nframes_t nframes, nframes_t offset) +{ + /* FIXME: offset */ + + if (_flags & IsInput) { + return; + } + + void* jack_buffer = jack_port_get_buffer (_port, nframes); + + for (MidiBuffer::iterator i = _buffer->begin(); i != _buffer->end(); ++i) { + const Evoral::Event& ev = *i; + // event times should be frames, relative to cycle start + assert(ev.time() >= 0); + assert(ev.time() < nframes); + jack_midi_event_write (jack_buffer, (jack_nframes_t) ev.time(), ev.buffer(), ev.size()); + } } |