change API for shadow ports and filters
authorPaul Davis <paul@linuxaudiosystems.com>
Mon, 20 Jun 2016 12:30:21 +0000 (08:30 -0400)
committerPaul Davis <paul@linuxaudiosystems.com>
Tue, 27 Sep 2016 19:59:30 +0000 (14:59 -0500)
Filter functor needs to be set before registering port, so provide it when adding the port.

libs/ardour/ardour/async_midi_port.h
libs/ardour/async_midi_port.cc

index 931c40472787b41a8946bd516e7dc7eaf301d71a..b90c6b3255e3dc9cc4a8194987ab93bb901fe4ed 100644 (file)
@@ -73,8 +73,9 @@ class LIBARDOUR_API AsyncMIDIPort : public ARDOUR::MidiPort, public MIDI::Port {
        int selectable() const { return -1; }
        void set_timer (boost::function<framecnt_t (void)>&);
 
-       void set_inbound_filter (boost::function<bool(MidiBuffer&,MidiBuffer&)>);
-       int add_shadow_port (std::string const &);
+       typedef boost::function<bool(MidiBuffer&,MidiBuffer&)> MidiFilter;
+       void set_inbound_filter (MidiFilter);
+       int add_shadow_port (std::string const &, MidiFilter);
 
        static void set_process_thread (pthread_t);
        static pthread_t get_process_thread () { return _process_thread; }
@@ -104,8 +105,10 @@ class LIBARDOUR_API AsyncMIDIPort : public ARDOUR::MidiPort, public MIDI::Port {
 
        void flush_output_fifo (pframes_t);
 
+       MidiFilter inbound_midi_filter;
+
        boost::shared_ptr<MidiPort> shadow_port;
-       boost::function<bool(MidiBuffer&,MidiBuffer&)> inbound_midi_filter;
+       MidiFilter shadow_midi_filter;
 
        static pthread_t _process_thread;
 };
index ff9a920c69839b86f2d2f356a6f7a50fd57d1236..23465a238b2f96423c133761d4eb0a323d11bae0 100644 (file)
@@ -41,30 +41,6 @@ pthread_t AsyncMIDIPort::_process_thread;
 
 #define port_engine AudioEngine::instance()->port_engine()
 
-static bool
-filter_relax (MidiBuffer& in, MidiBuffer& out)
-{
-       return false;
-}
-
-static bool
-filter_copy (MidiBuffer& in, MidiBuffer& out)
-{
-       out.copy (in);
-       return false;
-}
-
-static bool
-filter_notes_only (MidiBuffer& in, MidiBuffer& out)
-{
-       for (MidiBuffer::iterator b = in.begin(); b != in.end(); ++b) {
-               if ((*b).is_note_on() || (*b).is_note_off()) {
-                       out.push_back (*b);
-               }
-       }
-       return false;
-}
-
 AsyncMIDIPort::AsyncMIDIPort (string const & name, PortFlags flags)
        : MidiPort (name, flags)
        , MIDI::Port (name, MIDI::Port::Flags (0))
@@ -74,7 +50,6 @@ AsyncMIDIPort::AsyncMIDIPort (string const & name, PortFlags flags)
        , output_fifo (2048)
        , input_fifo (1024)
        , _xthread (true)
-       , inbound_midi_filter (boost::bind (filter_notes_only, _1, _2))
 {
 }
 
@@ -171,11 +146,13 @@ AsyncMIDIPort::cycle_start (MIDI::pframes_t nframes)
                        _xthread.wakeup ();
                }
 
-               if (shadow_port) {
-                       inbound_midi_filter (mb, shadow_port->get_midi_buffer (nframes));
-               } else {
+               if (inbound_midi_filter) {
                        inbound_midi_filter (mb, mb);
                }
+
+               if (shadow_port) {
+                       shadow_midi_filter (mb, shadow_port->get_midi_buffer (nframes));
+               }
        }
 }
 
@@ -373,7 +350,7 @@ AsyncMIDIPort::is_process_thread()
 }
 
 int
-AsyncMIDIPort::add_shadow_port (string const & name)
+AsyncMIDIPort::add_shadow_port (string const & name, MidiFilter mf)
 {
        if (!ARDOUR::Port::receives_input()) {
                return -1;
@@ -383,6 +360,8 @@ AsyncMIDIPort::add_shadow_port (string const & name)
                return -2;
        }
 
+       shadow_midi_filter = mf;
+
        /* shadow port is not async. */
 
        if (!(shadow_port = boost::dynamic_pointer_cast<MidiPort> (AudioEngine::instance()->register_output_port (DataType::MIDI, name, false)))) {