Merge branch 'cairocanvas' of git.ardour.org:ardour/ardour into cairocanvas
[ardour.git] / libs / ardour / session_state.cc
index 5c3ffae3cc087c58031b3384bb5e01e2511ec89d..6a06863e9e16b1ca347cd261df2fe3e374d861ff 100644 (file)
@@ -77,6 +77,7 @@
 #include "pbd/localtime_r.h"
 
 #include "ardour/amp.h"
+#include "ardour/async_midi_port.h"
 #include "ardour/audio_diskstream.h"
 #include "ardour/audio_track.h"
 #include "ardour/audioengine.h"
@@ -92,6 +93,7 @@
 #include "ardour/midi_model.h"
 #include "ardour/midi_patch_manager.h"
 #include "ardour/midi_region.h"
+#include "ardour/midi_scene_changer.h"
 #include "ardour/midi_source.h"
 #include "ardour/midi_track.h"
 #include "ardour/pannable.h"
@@ -137,7 +139,7 @@ Session::pre_engine_init (string fullpath)
        /* discover canonical fullpath */
 
        _path = canonical_path(fullpath);
-       
+
        /* we require _path to end with a dir separator */
 
        if (_path[_path.length()-1] != G_DIR_SEPARATOR) {
@@ -207,6 +209,16 @@ Session::post_engine_init ()
        BootMessage (_("Using configuration"));
 
        _midi_ports = new MidiPortManager;
+       
+       MIDISceneChanger* msc;
+
+       _scene_changer = msc = new MIDISceneChanger (*this);
+       msc->set_input_port (scene_input_port());
+       msc->set_output_port (scene_out());
+
+       boost::function<framecnt_t(void)> timer_func (boost::bind (&Session::audible_frame, this));
+       boost::dynamic_pointer_cast<AsyncMIDIPort>(scene_in())->set_timer (timer_func);
+
        setup_midi_machine_control ();
        
        if (_butler->start_thread()) {
@@ -798,7 +810,7 @@ Session::load_state (string snapshot_name)
 
        set_dirty();
 
-       _writable = exists_and_writable (xmlpath);
+       _writable = exists_and_writable (xmlpath) && exists_and_writable(Glib::path_get_dirname(xmlpath));
 
        if (!state_tree->read (xmlpath)) {
                error << string_compose(_("Could not understand session file %1"), xmlpath) << endmsg;
@@ -916,7 +928,7 @@ Session::state (bool full_state)
                                p += (*i).path;
 
                                if (next != session_dirs.end()) {
-                                       p += ':';
+                                       p += G_SEARCHPATH_SEPARATOR;
                                } else {
                                        break;
                                }
@@ -2680,7 +2692,7 @@ Session::cleanup_sources (CleanupReport& rep)
                audio_path += sdir.sound_path();
 
                if (nexti != session_dirs.end()) {
-                       audio_path += ':';
+                       audio_path += G_SEARCHPATH_SEPARATOR;
                }
 
                i = nexti;
@@ -2698,7 +2710,7 @@ Session::cleanup_sources (CleanupReport& rep)
                midi_path += sdir.midi_path();
 
                if (nexti != session_dirs.end()) {
-                       midi_path += ':';
+                       midi_path += G_SEARCHPATH_SEPARATOR;
                }
 
                i = nexti;
@@ -2736,19 +2748,23 @@ Session::cleanup_sources (CleanupReport& rep)
                 ++tmp;
 
                if ((fs = boost::dynamic_pointer_cast<FileSource> (i->second)) != 0) {
-                        if (playlists->source_use_count (fs) != 0) {
-                                all_sources.insert (fs->path());
-                        } else {
 
-                                /* we might not remove this source from disk, because it may be used
-                                   by other snapshots, but its not being used in this version
-                                   so lets get rid of it now, along with any representative regions
-                                   in the region list.
-                                */
+                       if (!fs->is_stub()) {
 
-                                RegionFactory::remove_regions_using_source (i->second);
-                                sources.erase (i);
-                        }
+                               if (playlists->source_use_count (fs) != 0) {
+                                       all_sources.insert (fs->path());
+                               } else {
+                                       
+                                       /* we might not remove this source from disk, because it may be used
+                                          by other snapshots, but its not being used in this version
+                                          so lets get rid of it now, along with any representative regions
+                                          in the region list.
+                                       */
+                                       
+                                       RegionFactory::remove_regions_using_source (i->second);
+                                       sources.erase (i);
+                               }
+                       }
                }
 
                 i = tmp;
@@ -3598,8 +3614,6 @@ Session::rename (const std::string& new_name)
 
        string const old_sources_root = _session_dir->sources_root();
 
-#define RENAME ::rename
-
        /* Rename:
 
         * session directory
@@ -3661,7 +3675,8 @@ Session::rename (const std::string& new_name)
 
                cerr << "Rename " << oldstr << " => " << newstr << endl;                
 
-               if (RENAME (oldstr.c_str(), newstr.c_str()) != 0) {
+               if (::g_rename (oldstr.c_str(), newstr.c_str()) != 0) {
+                       error << string_compose (_("renaming %s as %2 failed (%3)"), oldstr, newstr, g_strerror (errno)) << endmsg;
                        return 1;
                }
 
@@ -3688,7 +3703,8 @@ Session::rename (const std::string& new_name)
                
                cerr << "Rename " << oldstr << " => " << newstr << endl;
                
-               if (RENAME (oldstr.c_str(), newstr.c_str()) != 0) {
+               if (::g_rename (oldstr.c_str(), newstr.c_str()) != 0) {
+                       error << string_compose (_("renaming %s as %2 failed (%3)"), oldstr, newstr, g_strerror (errno)) << endmsg;
                        return 1;
                }
        }
@@ -3700,7 +3716,8 @@ Session::rename (const std::string& new_name)
        
        cerr << "Rename " << oldstr << " => " << newstr << endl;                
 
-       if (RENAME (oldstr.c_str(), newstr.c_str()) != 0) {
+       if (::g_rename (oldstr.c_str(), newstr.c_str()) != 0) {
+               error << string_compose (_("renaming %s as %2 failed (%3)"), oldstr, newstr, g_strerror (errno)) << endmsg;
                return 1;
        }
 
@@ -3714,7 +3731,8 @@ Session::rename (const std::string& new_name)
                
                cerr << "Rename " << oldstr << " => " << newstr << endl;                
                
-               if (RENAME (oldstr.c_str(), newstr.c_str()) != 0) {
+               if (::g_rename (oldstr.c_str(), newstr.c_str()) != 0) {
+                       error << string_compose (_("renaming %s as %2 failed (%3)"), oldstr, newstr, g_strerror (errno)) << endmsg;
                        return 1;
                }
        }
@@ -3738,6 +3756,11 @@ Session::rename (const std::string& new_name)
        _current_snapshot_name = new_name;
        _name = new_name;
 
+       /* re-add directory separator - reverse hack to oldstr above */
+       if (_path[_path.length()-1] != G_DIR_SEPARATOR) {
+               _path += G_DIR_SEPARATOR;
+       }
+
        set_dirty ();
 
        /* save state again to get everything just right */
@@ -3750,8 +3773,6 @@ Session::rename (const std::string& new_name)
        store_recent_sessions (new_name, _path);
 
        return 0;
-
-#undef RENAME
 }
 
 int