X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fsession_state.cc;h=92be2da9abaf9b2e6ef03cee20b28adcd3f32b31;hb=2b9dc7b380bb4e40171067f42b4010970869a57d;hp=82b5d3a249dd4c72dc2b97b07fd4872ab89cc887;hpb=83b30a6d0609f1778f8ec8a25eac298714a0a4f2;p=ardour.git diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 82b5d3a249..92be2da9ab 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -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;