diff options
author | Robin Gareus <robin@gareus.org> | 2016-03-16 04:41:19 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2016-03-16 04:41:19 +0100 |
commit | e7181c0cc49094d56eb1b9c320a1dc3bb34e50cd (patch) | |
tree | 11b6105ea45b25349c1a40020e53fbc703ba6677 /libs | |
parent | c07bca3a628aa118f444e1a3d6cf1aec9eb81c76 (diff) |
Midi Busses? why yes!
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/ardour/session.h | 2 | ||||
-rw-r--r-- | libs/ardour/session.cc | 86 |
2 files changed, 88 insertions, 0 deletions
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 0651eb69bf..a650bfdb1a 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -585,6 +585,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop RouteGroup* route_group = 0, uint32_t how_many = 1, std::string name_template = "" ); + RouteList new_midi_route (RouteGroup* route_group, uint32_t how_many, std::string name_template = "", boost::shared_ptr<PluginInfo> instrument = boost::shared_ptr<PluginInfo>()); + void remove_routes (boost::shared_ptr<RouteList>); void remove_route (boost::shared_ptr<Route>); diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index f58994a0d3..d668fb46e7 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -2435,6 +2435,92 @@ Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost: return ret; } +RouteList +Session::new_midi_route (RouteGroup* route_group, uint32_t how_many, string name_template, boost::shared_ptr<PluginInfo> instrument) +{ + string bus_name; + uint32_t bus_id = 0; + string port; + RouteList ret; + + bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Midi Bus"); + + while (how_many) { + if (!find_route_name (name_template.empty () ? _("Midi Bus") : name_template, ++bus_id, bus_name, use_number)) { + error << "cannot find name for new midi bus" << endmsg; + goto failure; + } + + try { + boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO)); // XXX Editor::add_routes is not ready for ARDOUR::DataType::MIDI + + if (bus->init ()) { + goto failure; + } + +#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS + // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route"); +#endif + { + Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + + if (bus->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) { + error << _("cannot configure new midi bus input") << endmsg; + goto failure; + } + + + if (bus->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) { + error << _("cannot configure new midi bus output") << endmsg; + goto failure; + } + } + + if (route_group) { + route_group->add (bus); + } + if (Config->get_remote_model() == UserOrdered) { + bus->set_remote_control_id (next_control_id()); + } + + ret.push_back (bus); + RouteAddedOrRemoved (true); /* EMIT SIGNAL */ + ARDOUR::GUIIdle (); + } + + catch (failed_constructor &err) { + error << _("Session: could not create new audio route.") << endmsg; + goto failure; + } + + catch (AudioEngine::PortRegistrationFailure& pfe) { + error << pfe.what() << endmsg; + goto failure; + } + + + --how_many; + } + + failure: + if (!ret.empty()) { + StateProtector sp (this); + add_routes (ret, false, false, false); + + if (instrument) { + for (RouteList::iterator r = ret.begin(); r != ret.end(); ++r) { + PluginPtr plugin = instrument->load (*this); + boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin)); + (*r)->add_processor (p, PreFader); + } + } + } + + return ret; + +} + + void Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt) { |