X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fasync_midi_port.cc;h=c7117429fba9f5064649035ee16b7ee06f9b11be;hb=88c82aeb56c62d9d0c0acff51e360492ad9b8d23;hp=c27a91f0066f409c805758f5c1b8015788dd175e;hpb=3669096c0520df2452f9f67683204ebf02d8920d;p=ardour.git diff --git a/libs/ardour/async_midi_port.cc b/libs/ardour/async_midi_port.cc index c27a91f006..c7117429fb 100644 --- a/libs/ardour/async_midi_port.cc +++ b/libs/ardour/async_midi_port.cc @@ -46,6 +46,7 @@ AsyncMIDIPort::AsyncMIDIPort (string const & name, PortFlags flags) , MIDI::Port (name, MIDI::Port::Flags (0)) , _currently_in_cycle (false) , _last_write_timestamp (0) + , _flush_at_cycle_start (false) , have_timer (false) , output_fifo (2048) , input_fifo (1024) @@ -58,7 +59,7 @@ AsyncMIDIPort::~AsyncMIDIPort () } void -AsyncMIDIPort::set_timer (boost::function& f) +AsyncMIDIPort::set_timer (boost::function& f) { timer = f; have_timer = true; @@ -119,6 +120,9 @@ AsyncMIDIPort::cycle_start (MIDI::pframes_t nframes) if (ARDOUR::Port::sends_output()) { flush_output_fifo (nframes); + if (_flush_at_cycle_start) { + flush_buffers (nframes); + } } /* copy incoming data from the port buffer into the input FIFO @@ -127,7 +131,7 @@ AsyncMIDIPort::cycle_start (MIDI::pframes_t nframes) if (ARDOUR::Port::receives_input()) { MidiBuffer& mb (get_midi_buffer (nframes)); - framecnt_t when; + samplecnt_t when; if (have_timer) { when = timer (); @@ -139,29 +143,20 @@ AsyncMIDIPort::cycle_start (MIDI::pframes_t nframes) if (!have_timer) { when += (*b).time(); } - input_fifo.write (when, (Evoral::EventType) 0, (*b).size(), (*b).buffer()); + input_fifo.write (when, Evoral::NO_EVENT, (*b).size(), (*b).buffer()); } if (!mb.empty()) { _xthread.wakeup (); } - if (inbound_midi_filter) { - inbound_midi_filter (mb, mb); - } - - if (_shadow_port) { - if (shadow_midi_filter (mb, _shadow_port->get_midi_buffer (nframes))) { - _shadow_port->flush_buffers (nframes); - } - } } } void AsyncMIDIPort::cycle_end (MIDI::pframes_t nframes) { - if (ARDOUR::Port::sends_output()) { + if (ARDOUR::Port::sends_output() && !_flush_at_cycle_start) { /* move any additional data from output FIFO into the port buffer. */ @@ -246,14 +241,14 @@ AsyncMIDIPort::write (const MIDI::byte * msg, size_t msglen, MIDI::timestamp_t t necessary. */ if (!vec.buf[0]->owns_buffer()) { - vec.buf[0]->set_buffer (0, 0, true); - } + vec.buf[0]->set_buffer (0, 0, true); + } vec.buf[0]->set (msg, msglen, timestamp); } else { /* see comment in previous branch of if() statement */ if (!vec.buf[1]->owns_buffer()) { - vec.buf[1]->set_buffer (0, 0, true); - } + vec.buf[1]->set_buffer (0, 0, true); + } vec.buf[1]->set (msg, msglen, timestamp); } @@ -331,7 +326,7 @@ AsyncMIDIPort::read (MIDI::byte *, size_t) } void -AsyncMIDIPort::parse (MIDI::framecnt_t) +AsyncMIDIPort::parse (MIDI::samplecnt_t) { MIDI::byte buf[1]; @@ -351,32 +346,3 @@ AsyncMIDIPort::is_process_thread() return pthread_equal (pthread_self(), _process_thread); } -int -AsyncMIDIPort::add_shadow_port (string const & name, MidiFilter mf) -{ - if (!ARDOUR::Port::receives_input()) { - return -1; - } - - if (_shadow_port) { - return -2; - } - - shadow_midi_filter = mf; - - /* shadow port is not async. */ - - if (!(_shadow_port = boost::dynamic_pointer_cast (AudioEngine::instance()->register_output_port (DataType::MIDI, name, false, PortFlags (Shadow|IsTerminal))))) { - return -3; - } - - /* forward on our port latency to the shadow port. - - XXX: need to capture latency changes and forward them too. - */ - - LatencyRange latency = private_latency_range (false); - _shadow_port->set_private_latency_range (latency, false); - - return 0; -}