ensure that each and every audioengine-related thread has a unique name
[ardour.git] / libs / ardour / session_state.cc
index 48bacdfe079f31211ae476e0f71fe8e3f4c9145f..bde7208867ee9401dba352cefc6136e454a90268 100644 (file)
@@ -73,6 +73,7 @@
 #include "pbd/stacktrace.h"
 #include "pbd/convert.h"
 #include "pbd/localtime_r.h"
+#include "pbd/unwind.h"
 
 #include "ardour/amp.h"
 #include "ardour/async_midi_port.h"
@@ -217,11 +218,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<MidiPort>(scene_input_port()));
+       msc->set_output_port (boost::dynamic_pointer_cast<MidiPort>(scene_output_port()));
 
        boost::function<framecnt_t(void)> timer_func (boost::bind (&Session::audible_frame, this));
-       boost::dynamic_pointer_cast<AsyncMIDIPort>(scene_in())->set_timer (timer_func);
+       boost::dynamic_pointer_cast<AsyncMIDIPort>(scene_input_port())->set_timer (timer_func);
 
        setup_midi_machine_control ();
 
@@ -2161,25 +2162,16 @@ Session::save_template (string template_name, bool replace_existing)
 
        XMLTree tree;
 
-       tree.set_root (&get_template());
+       {
+               PBD::Unwinder<std::string> uw (_template_state_dir, template_dir_path);
+               tree.set_root (&get_template());
+       }
+
        if (!tree.write (template_file_path)) {
                error << _("template not saved") << endmsg;
                return -1;
        }
 
-       if (!ARDOUR::Profile->get_trx()) {
-               /* copy plugin state directory */
-
-               std::string template_plugin_state_path (Glib::build_filename (template_dir_path, X_("plugins")));
-
-               if (g_mkdir_with_parents (template_plugin_state_path.c_str(), 0755) != 0) {
-                       error << string_compose(_("Could not create directory for Session template plugin state\"%1\" (%2)"),
-                                                                       template_plugin_state_path, g_strerror (errno)) << endmsg;
-                       return -1;
-               }
-               copy_files (plugins_dir(), template_plugin_state_path);
-       }
-
        store_recent_templates (template_file_path);
 
        return 0;
@@ -3875,7 +3867,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<AsyncMIDIPort> async_in = boost::dynamic_pointer_cast<AsyncMIDIPort> (_midi_ports->mmc_input_port());
+       boost::shared_ptr<AsyncMIDIPort> async_out = boost::dynamic_pointer_cast<AsyncMIDIPort> (_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));