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; }
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;
};
#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))
, output_fifo (2048)
, input_fifo (1024)
, _xthread (true)
- , inbound_midi_filter (boost::bind (filter_notes_only, _1, _2))
{
}
_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));
+ }
}
}
}
int
-AsyncMIDIPort::add_shadow_port (string const & name)
+AsyncMIDIPort::add_shadow_port (string const & name, MidiFilter mf)
{
if (!ARDOUR::Port::receives_input()) {
return -1;
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)))) {