summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/add_route_dialog.cc16
-rw-r--r--gtk2_ardour/add_route_dialog.h13
-rw-r--r--gtk2_ardour/ardour_ui.cc30
-rw-r--r--gtk2_ardour/ardour_ui.h13
-rw-r--r--libs/ardour/ardour/session.h2
-rw-r--r--libs/ardour/session.cc86
6 files changed, 145 insertions, 15 deletions
diff --git a/gtk2_ardour/add_route_dialog.cc b/gtk2_ardour/add_route_dialog.cc
index 1127ab2da7..14dda03d08 100644
--- a/gtk2_ardour/add_route_dialog.cc
+++ b/gtk2_ardour/add_route_dialog.cc
@@ -77,7 +77,8 @@ AddRouteDialog::AddRouteDialog ()
track_bus_combo.append_text (_("Audio Tracks"));
track_bus_combo.append_text (_("MIDI Tracks"));
track_bus_combo.append_text (_("Audio+MIDI Tracks"));
- track_bus_combo.append_text (_("Busses"));
+ track_bus_combo.append_text (_("Audio Busses"));
+ track_bus_combo.append_text (_("MIDI Busses"));
track_bus_combo.set_active (0);
insert_at_combo.append_text (_("First"));
@@ -198,8 +199,10 @@ AddRouteDialog::TypeWanted
AddRouteDialog::type_wanted() const
{
std::string str = track_bus_combo.get_active_text();
- if (str == _("Busses")) {
+ if (str == _("Audio Busses")) {
return AudioBus;
+ } else if (str == _("MIDI Busses")){
+ return MidiBus;
} else if (str == _("MIDI Tracks")){
return MidiTrack;
} else if (str == _("Audio+MIDI Tracks")) {
@@ -232,6 +235,7 @@ AddRouteDialog::maybe_update_name_template_entry ()
name_template_entry.set_text (_("Audio+MIDI"));
break;
case AudioBus:
+ case MidiBus:
name_template_entry.set_text (_("Bus"));
break;
}
@@ -280,6 +284,14 @@ AddRouteDialog::track_type_chosen ()
mode_label.set_sensitive (true);
instrument_label.set_sensitive (false);
break;
+ case MidiBus:
+ mode_combo.set_sensitive (false);
+ channel_combo.set_sensitive (false);
+ instrument_combo.set_sensitive (true);
+ configuration_label.set_sensitive (false);
+ mode_label.set_sensitive (true);
+ instrument_label.set_sensitive (true);
+ break;
}
maybe_update_name_template_entry ();
diff --git a/gtk2_ardour/add_route_dialog.h b/gtk2_ardour/add_route_dialog.h
index eb38338f1f..08359c2000 100644
--- a/gtk2_ardour/add_route_dialog.h
+++ b/gtk2_ardour/add_route_dialog.h
@@ -49,19 +49,20 @@ class AddRouteDialog : public ArdourDialog
AddRouteDialog ();
~AddRouteDialog ();
- enum TypeWanted {
+ enum TypeWanted {
AudioTrack,
MidiTrack,
MixedTrack,
- AudioBus
+ AudioBus,
+ MidiBus
};
- TypeWanted type_wanted() const;
+ TypeWanted type_wanted() const;
- ARDOUR::ChanCount channels ();
+ ARDOUR::ChanCount channels ();
int count ();
- std::string name_template () const;
- bool name_template_is_default () const;
+ std::string name_template () const;
+ bool name_template_is_default () const;
std::string track_template ();
ARDOUR::PluginInfoPtr requested_instrument ();
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc
index a01f2edaed..e1bcd06b7c 100644
--- a/gtk2_ardour/ardour_ui.cc
+++ b/gtk2_ardour/ardour_ui.cc
@@ -1806,6 +1806,31 @@ restart with more ports."), PROGRAM_NAME));
}
}
+void
+ARDOUR_UI::session_add_midi_bus (RouteGroup* route_group, uint32_t how_many, const string& name_template, PluginInfoPtr instrument)
+{
+
+ if (_session == 0) {
+ warning << _("You cannot add a track without a session already loaded.") << endmsg;
+ return;
+ }
+
+ try {
+ RouteList routes = _session->new_midi_route (route_group, how_many, name_template, instrument);
+ if (routes.size() != how_many) {
+ error << string_compose(P_("could not create %1 new Midi Bus", "could not create %1 new Midi Busses", how_many), how_many) << endmsg;
+ }
+
+ }
+ catch (...) {
+ MessageDialog msg (_main_window,
+ string_compose (_("There are insufficient ports available\n\
+to create a new track or bus.\n\
+You should save %1, exit and\n\
+restart with more ports."), PROGRAM_NAME));
+ msg.run ();
+ }
+}
void
ARDOUR_UI::session_add_midi_route (bool disk, RouteGroup* route_group, uint32_t how_many, const string& name_template, PluginInfoPtr instrument)
@@ -1815,6 +1840,8 @@ ARDOUR_UI::session_add_midi_route (bool disk, RouteGroup* route_group, uint32_t
if (disk) {
session_add_mixed_track (one_midi_channel, one_midi_channel, route_group, how_many, name_template, instrument);
+ } else {
+ session_add_midi_bus (route_group, how_many, name_template, instrument);
}
}
@@ -3939,6 +3966,9 @@ ARDOUR_UI::add_route (Gtk::Window* /* ignored */)
case AddRouteDialog::AudioBus:
session_add_audio_bus (input_chan.n_audio(), output_chan.n_audio(), route_group, count, name_template);
break;
+ case AddRouteDialog::MidiBus:
+ session_add_midi_bus (route_group, count, name_template, instrument);
+ break;
}
}
diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h
index bc58341ec7..09baa2c9ee 100644
--- a/gtk2_ardour/ardour_ui.h
+++ b/gtk2_ardour/ardour_ui.h
@@ -289,19 +289,18 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
session_add_audio_route (false, input_channels, output_channels, ARDOUR::Normal, route_group, how_many, name_template);
}
+
void session_add_midi_track (ARDOUR::RouteGroup* route_group, uint32_t how_many, std::string const & name_template,
- ARDOUR::PluginInfoPtr instrument) {
+ ARDOUR::PluginInfoPtr instrument) {
session_add_midi_route (true, route_group, how_many, name_template, instrument);
}
- void session_add_mixed_track (const ARDOUR::ChanCount& input, const ARDOUR::ChanCount& output, ARDOUR::RouteGroup* route_group, uint32_t how_many, std::string const & name_template,
- ARDOUR::PluginInfoPtr instrument);
+ void session_add_mixed_track (const ARDOUR::ChanCount& input, const ARDOUR::ChanCount& output, ARDOUR::RouteGroup* route_group, uint32_t how_many, std::string const & name_template,
+ ARDOUR::PluginInfoPtr instrument);
- /*void session_add_midi_bus () {
- session_add_midi_route (false);
- }*/
+ void session_add_midi_bus (ARDOUR::RouteGroup* route_group, uint32_t how_many, std::string const & name_template, ARDOUR::PluginInfoPtr instrument);
- void attach_to_engine ();
+ void attach_to_engine ();
void post_engine ();
gint exit_on_main_window_close (GdkEventAny *);
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)
{