From 41b2de41d69c2ecc381867e502e4760267275425 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 7 Dec 2015 12:02:42 -0500 Subject: change API for accessing session MIDI ports so that (1) boost::shared_ptr<> is used all the time (2) we avoid using multiple functions to return different subclass versions of some ports --- libs/ardour/ardour/midi_scene_changer.h | 4 +-- libs/ardour/ardour/midi_ui.h | 2 +- libs/ardour/ardour/midiport_manager.h | 27 +++++------------ libs/ardour/ardour/session.h | 27 +++++++++-------- libs/ardour/midi_scene_changer.cc | 19 +++++++----- libs/ardour/midi_ui.cc | 24 +++++++-------- libs/ardour/midiport_manager.cc | 41 ++++++++------------------ libs/ardour/session_midi.cc | 52 ++++++++++++++------------------- libs/ardour/session_state.cc | 21 ++++++++++--- 9 files changed, 95 insertions(+), 122 deletions(-) diff --git a/libs/ardour/ardour/midi_scene_changer.h b/libs/ardour/ardour/midi_scene_changer.h index 6eff899b8e..792f4fb74f 100644 --- a/libs/ardour/ardour/midi_scene_changer.h +++ b/libs/ardour/ardour/midi_scene_changer.h @@ -36,7 +36,7 @@ class MIDISceneChanger : public SceneChanger ~MIDISceneChanger (); void run (framepos_t start, framepos_t end); - void set_input_port (MIDI::Port*); + void set_input_port (boost::shared_ptr); void set_output_port (boost::shared_ptr); uint8_t bank_at (framepos_t, uint8_t channel); @@ -56,7 +56,7 @@ class MIDISceneChanger : public SceneChanger private: typedef std::multimap > Scenes; - MIDI::Port* input_port; + boost::shared_ptr input_port; boost::shared_ptr output_port; Glib::Threads::RWLock scene_lock; Scenes scenes; diff --git a/libs/ardour/ardour/midi_ui.h b/libs/ardour/ardour/midi_ui.h index 2df5ea020d..7f57f22e24 100644 --- a/libs/ardour/ardour/midi_ui.h +++ b/libs/ardour/ardour/midi_ui.h @@ -61,7 +61,7 @@ class LIBARDOUR_API MidiControlUI : public AbstractUI private: ARDOUR::Session& _session; - bool midi_input_handler (Glib::IOCondition, AsyncMIDIPort*); + bool midi_input_handler (Glib::IOCondition, boost::shared_ptr); void reset_ports (); void clear_ports (); diff --git a/libs/ardour/ardour/midiport_manager.h b/libs/ardour/ardour/midiport_manager.h index 4e0f98cb3c..2fb5d5a57a 100644 --- a/libs/ardour/ardour/midiport_manager.h +++ b/libs/ardour/ardour/midiport_manager.h @@ -53,18 +53,14 @@ class LIBARDOUR_API MidiPortManager { * callback. */ - MIDI::Port* midi_input_port () const { return _midi_input_port; } - MIDI::Port* midi_output_port () const { return _midi_output_port; } - MIDI::Port* mmc_input_port () const { return _mmc_input_port; } - MIDI::Port* mmc_output_port () const { return _mmc_output_port; } - MIDI::Port* scene_input_port () const { return _scene_input_port; } - MIDI::Port* scene_output_port () const { return _scene_output_port; } + boost::shared_ptr midi_input_port () const { return _midi_in; } + boost::shared_ptr midi_output_port () const { return _midi_out; } - boost::shared_ptr mmc_in() const { return boost::dynamic_pointer_cast(_mmc_in); } - boost::shared_ptr mmc_out() const { return boost::dynamic_pointer_cast(_mmc_out); } + boost::shared_ptr mmc_input_port() const { return boost::dynamic_pointer_cast(_mmc_in); } + boost::shared_ptr mmc_output_port() const { return boost::dynamic_pointer_cast(_mmc_out); } - boost::shared_ptr scene_in() const { return boost::dynamic_pointer_cast(_scene_in); } - boost::shared_ptr scene_out() const { return boost::dynamic_pointer_cast(_scene_out); } + boost::shared_ptr scene_input_port() const { return boost::dynamic_pointer_cast(_scene_in); } + boost::shared_ptr scene_output_port() const { return boost::dynamic_pointer_cast(_scene_out); } /* Ports used for synchronization. These have their I/O handled inside the * process callback. @@ -81,16 +77,7 @@ class LIBARDOUR_API MidiPortManager { PBD::Signal0 PortsChanged; protected: - /* asynchronously handled ports: MIDI::Port */ - MIDI::Port* _midi_input_port; - MIDI::Port* _midi_output_port; - MIDI::Port* _mmc_input_port; - MIDI::Port* _mmc_output_port; - MIDI::Port* _scene_input_port; - MIDI::Port* _scene_output_port; - /* these point to the same objects as the members above, - but cast to their ARDOUR::Port base class - */ + /* asynchronously handled ports: ARDOUR::AsyncMIDIPort */ boost::shared_ptr _midi_in; boost::shared_ptr _midi_out; boost::shared_ptr _mmc_in; diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 60fa9e5761..3d6f05758e 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -1009,27 +1009,26 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop SceneChanger* scene_changer() const { return _scene_changer; } - boost::shared_ptr ltc_input_port() const; - boost::shared_ptr ltc_output_port() const; - - boost::shared_ptr ltc_input_io() { return _ltc_input; } - boost::shared_ptr ltc_output_io() { return _ltc_output; } - - MIDI::Port* midi_input_port () const; - MIDI::Port* midi_output_port () const; - MIDI::Port* mmc_output_port () const; - MIDI::Port* mmc_input_port () const; + /* asynchronous MIDI control ports */ - MIDI::Port* scene_input_port () const; - MIDI::Port* scene_output_port () const; + boost::shared_ptr midi_input_port () const; + boost::shared_ptr midi_output_port () const; + boost::shared_ptr mmc_output_port () const; + boost::shared_ptr mmc_input_port () const; + boost::shared_ptr scene_input_port () const; + boost::shared_ptr scene_output_port () const; - boost::shared_ptr scene_in () const; - boost::shared_ptr scene_out () const; + /* synchronous MIDI ports used for synchronization */ boost::shared_ptr midi_clock_output_port () const; boost::shared_ptr midi_clock_input_port () const; boost::shared_ptr mtc_output_port () const; boost::shared_ptr mtc_input_port () const; + boost::shared_ptr ltc_input_port() const; + boost::shared_ptr ltc_output_port() const; + + boost::shared_ptr ltc_input_io() { return _ltc_input; } + boost::shared_ptr ltc_output_io() { return _ltc_output; } MIDI::MachineControl& mmc() { return *_mmc; } diff --git a/libs/ardour/midi_scene_changer.cc b/libs/ardour/midi_scene_changer.cc index f586206ba7..7f6c865922 100644 --- a/libs/ardour/midi_scene_changer.cc +++ b/libs/ardour/midi_scene_changer.cc @@ -226,13 +226,16 @@ MIDISceneChanger::locate (framepos_t pos) } void -MIDISceneChanger::set_input_port (MIDI::Port* mp) +MIDISceneChanger::set_input_port (boost::shared_ptr mp) { - input_port = mp; - incoming_connections.drop_connections(); + input_port.reset (); + + boost::shared_ptr async = boost::dynamic_pointer_cast (mp); + + if (async) { - if (input_port) { + input_port = mp; /* midi port is asynchronous. MIDI parsing will be carried out * by the MIDI UI thread which will emit the relevant signals @@ -240,8 +243,8 @@ MIDISceneChanger::set_input_port (MIDI::Port* mp) */ for (int channel = 0; channel < 16; ++channel) { - input_port->parser()->channel_bank_change[channel].connect_same_thread (incoming_connections, boost::bind (&MIDISceneChanger::bank_change_input, this, _1, _2, channel)); - input_port->parser()->channel_program_change[channel].connect_same_thread (incoming_connections, boost::bind (&MIDISceneChanger::program_change_input, this, _1, _2, channel)); + async->parser()->channel_bank_change[channel].connect_same_thread (incoming_connections, boost::bind (&MIDISceneChanger::bank_change_input, this, _1, _2, channel)); + async->parser()->channel_program_change[channel].connect_same_thread (incoming_connections, boost::bind (&MIDISceneChanger::program_change_input, this, _1, _2, channel)); } } } @@ -286,7 +289,7 @@ MIDISceneChanger::program_change_input (MIDI::Parser& parser, MIDI::byte program int bank = -1; if (have_seen_bank_changes) { - bank = input_port->channel (channel)->bank(); + bank = boost::dynamic_pointer_cast(input_port)->channel (channel)->bank(); } jump_to (bank, program); @@ -317,7 +320,7 @@ MIDISceneChanger::program_change_input (MIDI::Parser& parser, MIDI::byte program int bank = -1; if (have_seen_bank_changes) { - bank = input_port->channel (channel)->bank(); + bank = boost::dynamic_pointer_cast(input_port)->channel (channel)->bank(); } MIDISceneChange* msc =new MIDISceneChange (channel, bank, program & 0x7f); diff --git a/libs/ardour/midi_ui.cc b/libs/ardour/midi_ui.cc index 59c718ad2b..eb6a372d86 100644 --- a/libs/ardour/midi_ui.cc +++ b/libs/ardour/midi_ui.cc @@ -71,9 +71,9 @@ MidiControlUI::do_request (MidiUIRequest* req) } bool -MidiControlUI::midi_input_handler (IOCondition ioc, AsyncMIDIPort* port) +MidiControlUI::midi_input_handler (IOCondition ioc, boost::shared_ptr port) { - DEBUG_TRACE (DEBUG::MidiIO, string_compose ("something happend on %1\n", ((ARDOUR::Port*)port)->name())); + DEBUG_TRACE (DEBUG::MidiIO, string_compose ("something happend on %1\n", boost::shared_ptr (port)->name())); if (ioc & ~IO_IN) { return false; @@ -81,12 +81,8 @@ MidiControlUI::midi_input_handler (IOCondition ioc, AsyncMIDIPort* port) if (ioc & IO_IN) { - AsyncMIDIPort* asp = dynamic_cast (port); - if (asp) { - asp->clear (); - } - - DEBUG_TRACE (DEBUG::MidiIO, string_compose ("data available on %1\n", ((ARDOUR::Port*)port)->name())); + port->clear (); + DEBUG_TRACE (DEBUG::MidiIO, string_compose ("data available on %1\n", boost::shared_ptr(port)->name())); framepos_t now = _session.engine().sample_time(); port->parse (now); } @@ -102,19 +98,19 @@ MidiControlUI::clear_ports () void MidiControlUI::reset_ports () { - vector ports; - AsyncMIDIPort* p; + vector > ports; + boost::shared_ptr p; - if ((p = dynamic_cast (_session.midi_input_port()))) { + if ((p = boost::dynamic_pointer_cast (_session.midi_input_port()))) { ports.push_back (p); } - if ((p = dynamic_cast (_session.mmc_input_port()))) { + if ((p = boost::dynamic_pointer_cast (_session.mmc_input_port()))) { ports.push_back (p); } - if ((p = dynamic_cast (_session.scene_input_port()))) { + if ((p = boost::dynamic_pointer_cast (_session.scene_input_port()))) { ports.push_back (p); } @@ -122,7 +118,7 @@ MidiControlUI::reset_ports () return; } - for (vector::const_iterator pi = ports.begin(); pi != ports.end(); ++pi) { + for (vector >::const_iterator pi = ports.begin(); pi != ports.end(); ++pi) { (*pi)->xthread().set_receive_handler (sigc::bind (sigc::mem_fun (this, &MidiControlUI::midi_input_handler), *pi)); (*pi)->xthread().attach (_main_loop->get_context()); } diff --git a/libs/ardour/midiport_manager.cc b/libs/ardour/midiport_manager.cc index 5460df3824..7f3f05a7db 100644 --- a/libs/ardour/midiport_manager.cc +++ b/libs/ardour/midiport_manager.cc @@ -83,23 +83,6 @@ MidiPortManager::create_ports () _scene_in = AudioEngine::instance()->register_input_port (DataType::MIDI, X_("Scene in"), true); _scene_out = AudioEngine::instance()->register_output_port (DataType::MIDI, X_("Scene out"), true); - /* XXX nasty type conversion needed because of the mixed inheritance - * required to integrate MIDI::IPMidiPort and ARDOUR::AsyncMIDIPort. - * - * At some point, we'll move IPMidiPort into Ardour and make it - * inherit from ARDOUR::MidiPort not MIDI::Port, and then this - * mess can go away - */ - - _midi_input_port = boost::dynamic_pointer_cast(_midi_in).get(); - _midi_output_port = boost::dynamic_pointer_cast(_midi_out).get(); - - _mmc_input_port = boost::dynamic_pointer_cast(_mmc_in).get(); - _mmc_output_port = boost::dynamic_pointer_cast(_mmc_out).get(); - - _scene_input_port = boost::dynamic_pointer_cast(_scene_in).get(); - _scene_output_port = boost::dynamic_pointer_cast(_scene_out).get(); - /* Now register ports used for sync (MTC and MIDI Clock) */ @@ -137,12 +120,12 @@ MidiPortManager::set_midi_port_states (const XMLNodeList&nodes) ports.insert (make_pair (_mtc_output_port->name(), _mtc_output_port)); ports.insert (make_pair (_midi_clock_input_port->name(), _midi_clock_input_port)); ports.insert (make_pair (_midi_clock_output_port->name(), _midi_clock_output_port)); - ports.insert (make_pair (_midi_input_port->name(), _midi_in)); - ports.insert (make_pair (_midi_output_port->name(), _midi_out)); - ports.insert (make_pair (_mmc_input_port->name(), _mmc_in)); - ports.insert (make_pair (_mmc_output_port->name(), _mmc_out)); - ports.insert (make_pair (_scene_output_port->name(), _scene_out)); - ports.insert (make_pair (_scene_input_port->name(), _scene_in)); + ports.insert (make_pair (_midi_in->name(), _midi_in)); + ports.insert (make_pair (_midi_out->name(), _midi_out)); + ports.insert (make_pair (_mmc_in->name(), _mmc_in)); + ports.insert (make_pair (_mmc_out->name(), _mmc_out)); + ports.insert (make_pair (_scene_out->name(), _scene_out)); + ports.insert (make_pair (_scene_in->name(), _scene_in)); for (XMLNodeList::const_iterator n = nodes.begin(); n != nodes.end(); ++n) { if ((prop = (*n)->property (X_("name"))) == 0) { @@ -169,12 +152,12 @@ MidiPortManager::get_midi_port_states () const ports.insert (make_pair (_mtc_output_port->name(), _mtc_output_port)); ports.insert (make_pair (_midi_clock_input_port->name(), _midi_clock_input_port)); ports.insert (make_pair (_midi_clock_output_port->name(), _midi_clock_output_port)); - ports.insert (make_pair (_midi_input_port->name(), _midi_in)); - ports.insert (make_pair (_midi_output_port->name(), _midi_out)); - ports.insert (make_pair (_mmc_input_port->name(), _mmc_in)); - ports.insert (make_pair (_mmc_output_port->name(), _mmc_out)); - ports.insert (make_pair (_scene_output_port->name(), _scene_out)); - ports.insert (make_pair (_scene_input_port->name(), _scene_in)); + ports.insert (make_pair (_midi_in->name(), _midi_in)); + ports.insert (make_pair (_midi_out->name(), _midi_out)); + ports.insert (make_pair (_mmc_in->name(), _mmc_in)); + ports.insert (make_pair (_mmc_out->name(), _mmc_out)); + ports.insert (make_pair (_scene_out->name(), _scene_out)); + ports.insert (make_pair (_scene_in->name(), _scene_in)); for (PortMap::const_iterator p = ports.begin(); p != ports.end(); ++p) { s.push_back (&p->second->get_state()); diff --git a/libs/ardour/session_midi.cc b/libs/ardour/session_midi.cc index f1faf5e8e1..c7bced8346 100644 --- a/libs/ardour/session_midi.cc +++ b/libs/ardour/session_midi.cc @@ -630,69 +630,61 @@ Session::start_midi_thread () return 0; } -MIDI::Port* +boost::shared_ptr Session::midi_input_port () const { return _midi_ports->midi_input_port (); } -MIDI::Port* + +boost::shared_ptr Session::midi_output_port () const { return _midi_ports->midi_output_port (); } -boost::shared_ptr -Session::midi_clock_output_port () const -{ - return _midi_ports->midi_clock_output_port (); -} -boost::shared_ptr -Session::midi_clock_input_port () const -{ - return _midi_ports->midi_clock_input_port (); -} -boost::shared_ptr -Session::mtc_output_port () const -{ - return _midi_ports->mtc_output_port (); -} -boost::shared_ptr -Session::mtc_input_port () const -{ - return _midi_ports->mtc_input_port (); -} -MIDI::Port* +boost::shared_ptr Session::mmc_output_port () const { return _midi_ports->mmc_output_port (); } -MIDI::Port* +boost::shared_ptr Session::mmc_input_port () const { return _midi_ports->mmc_input_port (); } -MIDI::Port* +boost::shared_ptr Session::scene_output_port () const { return _midi_ports->scene_output_port (); } -MIDI::Port* +boost::shared_ptr Session::scene_input_port () const { return _midi_ports->scene_input_port (); } boost::shared_ptr -Session::scene_in () const +Session::midi_clock_output_port () const { - return _midi_ports->scene_in (); + return _midi_ports->midi_clock_output_port (); } boost::shared_ptr -Session::scene_out () const +Session::midi_clock_input_port () const +{ + return _midi_ports->midi_clock_input_port (); +} +boost::shared_ptr +Session::mtc_output_port () const { - return _midi_ports->scene_out (); + return _midi_ports->mtc_output_port (); } +boost::shared_ptr +Session::mtc_input_port () const +{ + return _midi_ports->mtc_input_port (); +} + diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 48bacdfe07..c440b77895 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -217,11 +217,11 @@ Session::post_engine_init () MIDISceneChanger* msc; _scene_changer = msc = new MIDISceneChanger (*this); - msc->set_input_port (scene_input_port()); - msc->set_output_port (scene_out()); + msc->set_input_port (boost::dynamic_pointer_cast(scene_input_port())); + msc->set_output_port (boost::dynamic_pointer_cast(scene_output_port())); boost::function timer_func (boost::bind (&Session::audible_frame, this)); - boost::dynamic_pointer_cast(scene_in())->set_timer (timer_func); + boost::dynamic_pointer_cast(scene_input_port())->set_timer (timer_func); setup_midi_machine_control (); @@ -3875,7 +3875,20 @@ void Session::setup_midi_machine_control () { _mmc = new MIDI::MachineControl; - _mmc->set_ports (_midi_ports->mmc_input_port(), _midi_ports->mmc_output_port()); + + boost::shared_ptr async_in = boost::dynamic_pointer_cast (_midi_ports->mmc_input_port()); + boost::shared_ptr async_out = boost::dynamic_pointer_cast (_midi_ports->mmc_output_port()); + + if (!async_out || !async_out) { + return; + } + + /* XXXX argh, passing raw pointers back into libmidi++ */ + + MIDI::Port* mmc_in = async_in.get(); + MIDI::Port* mmc_out = async_out.get(); + + _mmc->set_ports (mmc_in, mmc_out); _mmc->Play.connect_same_thread (*this, boost::bind (&Session::mmc_deferred_play, this, _1)); _mmc->DeferredPlay.connect_same_thread (*this, boost::bind (&Session::mmc_deferred_play, this, _1)); -- cgit v1.2.3