summaryrefslogtreecommitdiff
path: root/libs/ardour/midi_port.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2016-06-20 15:00:58 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2016-09-27 14:59:30 -0500
commitd1c024f4f9ef5b5d273d3fb86e066a53e28965cd (patch)
tree4f5f996f4d8e9189c24f00eaa57917fd759a58de /libs/ardour/midi_port.cc
parent67620c353ff94dcaf8ee0f8cf003110535071a90 (diff)
move shadow port stuff from AsyncMIDIPort to MidiPort, where it belongs
Diffstat (limited to 'libs/ardour/midi_port.cc')
-rw-r--r--libs/ardour/midi_port.cc41
1 files changed, 41 insertions, 0 deletions
diff --git a/libs/ardour/midi_port.cc b/libs/ardour/midi_port.cc
index 53e25fee19..02a86bfb8f 100644
--- a/libs/ardour/midi_port.cc
+++ b/libs/ardour/midi_port.cc
@@ -81,6 +81,19 @@ MidiPort::cycle_start (pframes_t nframes)
}
}
}
+
+ if (inbound_midi_filter) {
+ MidiBuffer& mb (get_midi_buffer (nframes));
+ inbound_midi_filter (mb, mb);
+ }
+
+ if (_shadow_port) {
+ MidiBuffer& mb (get_midi_buffer (nframes));
+ if (shadow_midi_filter (mb, _shadow_port->get_midi_buffer (nframes))) {
+ _shadow_port->flush_buffers (nframes);
+ }
+ }
+
}
Buffer&
@@ -318,3 +331,31 @@ MidiPort::set_trace_on (bool yn)
{
_trace_on = yn;
}
+
+int
+MidiPort::add_shadow_port (string const & name, MidiFilter mf)
+{
+ if (!ARDOUR::Port::receives_input()) {
+ return -1;
+ }
+
+ if (_shadow_port) {
+ return -2;
+ }
+
+ shadow_midi_filter = mf;
+
+ if (!(_shadow_port = boost::dynamic_pointer_cast<MidiPort> (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;
+}