BusProfile bus_profile;
if (nsm) {
-
bus_profile.master_out_channels = 2;
- bus_profile.input_ac = AutoConnectPhysical;
- bus_profile.output_ac = AutoConnectMaster;
- bus_profile.requested_physical_in = 0; // use all available
- bus_profile.requested_physical_out = 0; // use all available
-
} else {
-
/* get settings from advanced section of NSD */
-
- if (sd.create_master_bus()) {
- bus_profile.master_out_channels = (uint32_t) sd.master_channel_count();
- } else {
- bus_profile.master_out_channels = 0;
- }
-
- if (sd.connect_inputs()) {
- bus_profile.input_ac = AutoConnectPhysical;
- } else {
- bus_profile.input_ac = AutoConnectOption (0);
- }
-
- bus_profile.output_ac = AutoConnectOption (0);
-
- if (sd.connect_outputs ()) {
- if (sd.connect_outs_to_master()) {
- bus_profile.output_ac = AutoConnectMaster;
- } else if (sd.connect_outs_to_physical()) {
- bus_profile.output_ac = AutoConnectPhysical;
- }
- }
-
- bus_profile.requested_physical_in = (uint32_t) sd.input_limit_count();
- bus_profile.requested_physical_out = (uint32_t) sd.output_limit_count();
+ bus_profile.master_out_channels = (uint32_t) sd.master_channel_count();
}
- if (build_session (session_path, session_name, bus_profile)) {
+ // NULL profile: no master, no monitor
+ if (build_session (session_path, session_name, bus_profile.master_out_channels > 0 ? &bus_profile : NULL)) {
return -1;
}
break;
default:
if (quit_on_cancel) {
- // JE - Currently (July 2014) this section can only get reached if the
- // user quits from the main 'Session Setup' dialog (i.e. reaching this
- // point does NOT indicate an abnormal termination). Therefore, let's
- // behave gracefully (i.e. let's do some cleanup) before we call exit()
- assert (!_session);
+ ARDOUR_UI::finish ();
+ Gtkmm2ext::Application::instance()->cleanup();
ARDOUR::cleanup ();
pthread_cancel_all ();
-
- exit (1);
+ return -1; // caller is responsible to call exit()
} else {
return ret;
}
_session_is_new = true;
}
- if (likely_new && template_name.empty()) {
+ if (!template_name.empty() && template_name.substr (0, 11) == "urn:ardour:") {
+
+ ret = build_session_from_dialog (session_dialog, session_path, session_name);
+ meta_session_setup (template_name.substr (11));
+
+ } else if (likely_new && template_name.empty()) {
ret = build_session_from_dialog (session_dialog, session_path, session_name);
}
catch (SessionException e) {
MessageDialog msg (string_compose(
- _("Session \"%1 (snapshot %2)\" did not load successfully: %3"),
+ _("Session \"%1 (snapshot %2)\" did not load successfully:\n%3"),
path, snap_name, e.what()),
true,
Gtk::MESSAGE_INFO,
catch (...) {
MessageDialog msg (string_compose(
- _("Session \"%1 (snapshot %2)\" did not load successfully"),
+ _("Session \"%1 (snapshot %2)\" did not load successfully."),
path, snap_name),
true,
Gtk::MESSAGE_INFO,
#endif
retval = 0;
+ if (!mix_template.empty ()) {
+ /* if mix_template is given, assume this is a new session */
+ string metascript = Glib::build_filename (mix_template, "template.lua");
+ meta_session_setup (metascript);
+ }
+
+
out:
/* For successful session load the splash is hidden by ARDOUR_UI::first_idle,
* which is queued by set_session().
}
int
-ARDOUR_UI::build_session (const std::string& path, const std::string& snap_name, BusProfile& bus_profile)
+ARDOUR_UI::build_session (const std::string& path, const std::string& snap_name, BusProfile* bus_profile)
{
Session *new_session;
int x;
_session_is_new = true;
try {
- new_session = new Session (*AudioEngine::instance(), path, snap_name, &bus_profile);
+ new_session = new Session (*AudioEngine::instance(), path, snap_name, bus_profile);
}
catch (SessionException e) {
return 0;
}
+
+static void _lua_print (std::string s) {
+#ifndef NDEBUG
+ std::cout << "LuaInstance: " << s << "\n";
+#endif
+ PBD::info << "LuaInstance: " << s << endmsg;
+}
+
+void
+ARDOUR_UI::meta_session_setup (const std::string& script_path)
+{
+ if (!Glib::file_test (script_path, Glib::FILE_TEST_EXISTS | Glib::FILE_TEST_IS_REGULAR)) {
+ return;
+ }
+
+ LuaState lua;
+ lua.Print.connect (&_lua_print);
+ lua.sandbox (true);
+
+ lua_State* L = lua.getState();
+ LuaInstance::register_classes (L);
+ LuaBindings::set_session (L, _session);
+ luabridge::push <PublicEditor *> (L, &PublicEditor::instance());
+ lua_setglobal (L, "Editor");
+
+ lua.do_command ("function ardour () end");
+ lua.do_file (script_path);
+
+ try {
+ luabridge::LuaRef fn = luabridge::getGlobal (L, "session_setup");
+ if (fn.isFunction()) {
+ fn ();
+ }
+ } catch (luabridge::LuaException const& e) {
+ cerr << "LuaException:" << e.what () << endl;
+ }
+}
+
void
ARDOUR_UI::launch_chat ()
{
return;
}
+ std::string template_name = add_route_dialog->get_template_path();
+ if ( !template_name.empty() ) {
+
+ if (!template_name.empty() && template_name.substr (0, 11) == "urn:ardour:") {
+
+ //ret = build_session_from_dialog (session_dialog, session_path, session_name);
+ meta_session_setup (template_name.substr (11));
+
+ } else {
+
+ //could be a user's track template (from file). ToDo
+ }
+
+ return;
+ }
+
if ((count = add_route_dialog->count()) <= 0) {
return;
}