permit different sizes for audio playback & capture buffers
[ardour.git] / libs / ardour / session_state.cc
index 82b5d3a249dd4c72dc2b97b07fd4872ab89cc887..92be2da9abaf9b2e6ef03cee20b28adcd3f32b31 100644 (file)
@@ -92,6 +92,7 @@
 #include "ardour/midi_track.h"
 #include "ardour/named_selection.h"
 #include "ardour/processor.h"
+#include "ardour/port.h"
 #include "ardour/region_factory.h"
 #include "ardour/route_group.h"
 #include "ardour/send.h"
@@ -170,6 +171,7 @@ Session::first_stage_init (string fullpath, string snapshot_name)
 
        _non_soloed_outs_muted = false;
        _listen_cnt = 0;
+       _solo_isolated_cnt = 0;
        g_atomic_int_set (&processing_prohibited, 0);
        _transport_speed = 0;
        _last_transport_speed = 0;
@@ -178,12 +180,13 @@ Session::first_stage_init (string fullpath, string snapshot_name)
        transport_sub_state = 0;
        _transport_frame = 0;
        _requested_return_frame = -1;
-       _session_range_location = new Location (0, 0, _("session"), Location::IsSessionRange);
+       _session_range_location = 0;
        g_atomic_int_set (&_record_status, Disabled);
        loop_changing = false;
        play_loop = false;
        have_looped = false;
        _last_roll_location = 0;
+       _last_roll_or_reversal_location = 0;
        _last_record_location = 0;
        pending_locate_frame = 0;
        pending_locate_roll = false;
@@ -205,8 +208,6 @@ Session::first_stage_init (string fullpath, string snapshot_name)
        session_send_mtc = false;
        g_atomic_int_set (&_playback_load, 100);
        g_atomic_int_set (&_capture_load, 100);
-       g_atomic_int_set (&_playback_load_min, 100);
-       g_atomic_int_set (&_capture_load_min, 100);
        _play_range = false;
        _exporting = false;
        pending_abort = false;
@@ -363,10 +364,10 @@ Session::second_stage_init ()
 
        ControlProtocolManager::instance().set_session (this);
 
-       config.set_end_marker_is_free (_is_new);
-
        _state_of_the_state = Clean;
 
+       Port::set_connecting_blocked (false);
+
        DirtyChanged (); /* EMIT SIGNAL */
 
        if (state_was_pending) {
@@ -489,7 +490,7 @@ Session::ensure_subdirs ()
 }
 
 int
-Session::create (const string& mix_template, nframes_t initial_length, BusProfile* bus_profile)
+Session::create (const string& mix_template, BusProfile* bus_profile)
 {
 
        if (g_mkdir_with_parents (_path.c_str(), 0755) < 0) {
@@ -538,9 +539,6 @@ Session::create (const string& mix_template, nframes_t initial_length, BusProfil
 
        /* set initial start + end point */
 
-       _session_range_location->set (0, initial_length);
-       _locations.add (_session_range_location);
-
        _state_of_the_state = Clean;
         
         /* set up Master Out and Control Out if necessary */
@@ -689,20 +687,44 @@ Session::remove_state (string snapshot_name)
 void
 Session::jack_session_event (jack_session_event_t * event)
 {
-       if (save_state ("jacksession_snap")) {
-                event->flags = JackSessionSaveError; 
-       } else {
-                sys::path xml_path (_session_dir->root_path());
-                xml_path /= legalize_for_path ("jacksession_snap") + statefile_suffix;
-                
-                string cmd ("PROG_NAME -U ");
-                cmd += event->client_uuid;
-                cmd += " \"";
-                cmd += xml_path.to_string();
-                cmd += '\"';
-                
-                event->command_line = strdup (cmd.c_str());
-       }
+        char timebuf[128];
+        time_t n;
+        struct tm local_time;
+
+        time (&n);
+        localtime_r (&n, &local_time);
+        strftime (timebuf, sizeof(timebuf), "JS_%FT%T", &local_time);
+
+        if (event->type == JackSessionSaveTemplate)
+        {
+                if (save_template( timebuf )) {
+                        event->flags = JackSessionSaveError; 
+                } else {
+                        string cmd ("ardour3 -P -U ");
+                        cmd += event->client_uuid;
+                        cmd += " -T ";
+                        cmd += timebuf;
+
+                        event->command_line = strdup (cmd.c_str());
+                }
+        }
+        else
+        {
+                if (save_state (timebuf)) {
+                        event->flags = JackSessionSaveError; 
+                } else {
+                        sys::path xml_path (_session_dir->root_path());
+                        xml_path /= legalize_for_path (timebuf) + statefile_suffix;
+
+                        string cmd ("ardour3 -P -U ");
+                        cmd += event->client_uuid;
+                        cmd += " \"";
+                        cmd += xml_path.to_string();
+                        cmd += '\"';
+
+                        event->command_line = strdup (cmd.c_str());
+                }
+        }
 
        jack_session_reply (_engine.jack(), event);
 
@@ -733,8 +755,9 @@ Session::save_state (string snapshot_name, bool pending, bool switch_to_snapshot
 
        /* tell sources we're saving first, in case they write out to a new file
         * which should be saved with the state rather than the old one */
-       for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i)
+       for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
                i->second->session_saved();
+        }
 
        tree.set_root (&get_state());
 
@@ -836,13 +859,17 @@ Session::load_state (string snapshot_name)
 
        if (!state_was_pending) {
                xmlpath = _session_dir->root_path();
-               xmlpath /= legalize_for_path (snapshot_name) + statefile_suffix;
+               xmlpath /= snapshot_name;
        }
 
-       if (!sys::exists (xmlpath)) {
-               error << string_compose(_("%1: session state information file \"%2\" doesn't exist!"), _name, xmlpath.to_string()) << endmsg;
-               return 1;
-       }
+        if (!sys::exists (xmlpath)) {
+                xmlpath = _session_dir->root_path();
+                xmlpath /= legalize_for_path (snapshot_name) + statefile_suffix;
+                if (!sys::exists (xmlpath)) {
+                        error << string_compose(_("%1: session state information file \"%2\" doesn't exist!"), _name, xmlpath.to_string()) << endmsg;
+                        return 1;
+                }
+        }
 
        state_tree = new XMLTree;
 
@@ -1049,7 +1076,7 @@ Session::state(bool full_state)
                // with the default start and end, and get the state for that.
                Locations loc;
                Location* range = new Location (0, 0, _("session"), Location::IsSessionRange);
-               range->set (0, compute_initial_length ());
+               range->set (max_frames, 0);
                loc.add (range);
                node->add_child_nocopy (loc.get_state());
        }
@@ -1240,14 +1267,14 @@ Session::set_state (const XMLNode& node, int version)
                set_auto_punch_location (location);
        }
 
-       if ((location = _locations.session_range_location()) == 0) {
-               _locations.add (_session_range_location);
-       } else {
+       if ((location = _locations.session_range_location()) != 0) {
                delete _session_range_location;
                _session_range_location = location;
        }
 
-       AudioFileSource::set_header_position_offset (_session_range_location->start());
+       if (_session_range_location) {
+               AudioFileSource::set_header_position_offset (_session_range_location->start());
+       }
 
        if ((child = find_named_node (node, "Sources")) == 0) {
                error << _("Session: XML state has no sources section") << endmsg;