X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fsession_state.cc;h=6dc5462d58814f4b2a4839df0e9e0224026f9490;hb=9e2048decf7c567;hp=30b4eaeb62da627f53062d46b4d15253293145f1;hpb=fba9bff5b0df73567017ec03dd59a009e1eb5463;p=ardour.git diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 30b4eaeb62..6dc5462d58 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -100,6 +100,7 @@ #include "ardour/playlist_source.h" #include "ardour/port.h" #include "ardour/processor.h" +#include "ardour/profile.h" #include "ardour/proxy_controllable.h" #include "ardour/recent_sessions.h" #include "ardour/region_factory.h" @@ -141,8 +142,18 @@ Session::pre_engine_init (string fullpath) _path = canonical_path(fullpath); /* is it new ? */ + if (Profile->get_trx() ) { + // Waves TracksLive has a usecase of session replacement with a new one. + // We should check session state file (.ardour) existance + // to determine if the session is new or not - _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)); + string full_session_name = Glib::build_filename( fullpath, _name ); + full_session_name += statefile_suffix; + + _is_new = !Glib::file_test (full_session_name, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)); + } else { + _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)); + } /* finish initialization that can't be done in a normal C++ constructor definition. @@ -270,6 +281,7 @@ Session::post_engine_init () Config->map_parameters (ff); config.map_parameters (ft); + _butler->map_parameters (); /* Reset all panners */ @@ -351,9 +363,44 @@ Session::post_engine_init () state_was_pending = false; } + /* Now, finally, we can fill the playback buffers */ + + BootMessage (_("Filling playback buffers")); + + boost::shared_ptr rl = routes.reader(); + for (RouteList::iterator r = rl->begin(); r != rl->end(); ++r) { + boost::shared_ptr trk = boost::dynamic_pointer_cast (*r); + if (trk && !trk->hidden()) { + trk->seek (_transport_frame, true); + } + } + return 0; } +void +Session::session_loaded () +{ + SessionLoaded(); + + _state_of_the_state = Clean; + + DirtyChanged (); /* EMIT SIGNAL */ + + if (_is_new) { + save_state (""); + } else if (state_was_pending) { + save_state (""); + remove_pending_capture_state (); + state_was_pending = false; + } + + /* Now, finally, we can fill the playback buffers */ + + BootMessage (_("Filling playback buffers")); + force_locate (_transport_frame, false); +} + string Session::raid_path () const { @@ -490,7 +537,7 @@ Session::create (const string& session_template, BusProfile* bus_profile) _writable = exists_and_writable (_path); if (!session_template.empty()) { - std::string in_path = session_template_dir_to_file (session_template); + std::string in_path = (ARDOUR::Profile->get_trx () ? session_template : session_template_dir_to_file (session_template)); ifstream in(in_path.c_str()); @@ -506,10 +553,12 @@ Session::create (const string& session_template, BusProfile* bus_profile) out << in.rdbuf(); _is_new = false; - /* Copy plugin state files from template to new session */ - std::string template_plugins = Glib::build_filename (session_template, X_("plugins")); - copy_recurse (template_plugins, plugins_dir ()); - + if (!ARDOUR::Profile->get_trx()) { + /* Copy plugin state files from template to new session */ + std::string template_plugins = Glib::build_filename (session_template, X_("plugins")); + copy_recurse (template_plugins, plugins_dir ()); + } + return 0; } else { @@ -526,7 +575,21 @@ Session::create (const string& session_template, BusProfile* bus_profile) } - /* set initial start + end point */ + if (Profile->get_trx()) { + + /* set initial start + end point : ARDOUR::Session::session_end_shift long. + Remember that this is a brand new session. Sessions + loaded from saved state will get this range from the saved state. + */ + + set_session_range_location (0, 0); + + /* Initial loop location, from absolute zero, length 10 seconds */ + + Location* loc = new Location (*this, 0, 10.0 * _engine.sample_rate(), _("Loop"), Location::IsAutoLoop); + _locations->add (loc, true); + set_auto_loop_location (loc); + } _state_of_the_state = Clean; @@ -537,8 +600,9 @@ Session::create (const string& session_template, BusProfile* bus_profile) RouteList rl; ChanCount count(DataType::AUDIO, bus_profile->master_out_channels); - if (bus_profile->master_out_channels) { - boost::shared_ptr r (new Route (*this, _("Master"), Route::MasterOut, DataType::AUDIO)); + // Waves Tracks: always create master bus for Tracks + if (ARDOUR::Profile->get_trx() || bus_profile->master_out_channels) { + boost::shared_ptr r (new Route (*this, _("Master"), Route::MasterOut, DataType::AUDIO)); if (r->init ()) { return -1; } @@ -562,16 +626,20 @@ Session::create (const string& session_template, BusProfile* bus_profile) add_routes (rl, false, false, false); } - /* this allows the user to override settings with an environment variable. - */ - - if (no_auto_connect()) { - bus_profile->input_ac = AutoConnectOption (0); - bus_profile->output_ac = AutoConnectOption (0); - } - - Config->set_input_auto_connect (bus_profile->input_ac); - Config->set_output_auto_connect (bus_profile->output_ac); + // Waves Tracks: Skip this. Always use autoconnection for Tracks + if (!ARDOUR::Profile->get_trx()) { + + /* this allows the user to override settings with an environment variable. + */ + + if (no_auto_connect()) { + bus_profile->input_ac = AutoConnectOption (0); + bus_profile->output_ac = AutoConnectOption (0); + } + + Config->set_input_auto_connect (bus_profile->input_ac); + Config->set_output_auto_connect (bus_profile->output_ac); + } } if (Config->get_use_monitor_bus() && bus_profile) { @@ -1045,17 +1113,32 @@ Session::state (bool full_state) } } } + + if (full_state) { - node->add_child_nocopy (_locations->get_state()); + + if (_locations) { + node->add_child_nocopy (_locations->get_state()); + } } else { + Locations loc (*this); // for a template, just create a new Locations, populate it // with the default start and end, and get the state for that. - Locations loc (*this); Location* range = new Location (*this, 0, 0, _("session"), Location::IsSessionRange); range->set (max_framepos, 0); loc.add (range); - node->add_child_nocopy (loc.get_state()); + XMLNode& locations_state = loc.get_state(); + + if (ARDOUR::Profile->get_trx() && _locations) { + // For tracks we need stored the Auto Loop Range and all MIDI markers. + for (Locations::LocationList::const_iterator i = _locations->list ().begin (); i != _locations->list ().end (); ++i) { + if ((*i)->is_mark () || (*i)->is_auto_loop ()) { + locations_state.add_child_nocopy ((*i)->get_state ()); + } + } + } + node->add_child_nocopy (locations_state); } child = node->add_child ("Bundles"); @@ -1076,12 +1159,12 @@ Session::state (bool full_state) RoutePublicOrderSorter cmp; RouteList public_order (*r); public_order.sort (cmp); - - /* the sort should have put control outs first */ - - if (_monitor_out) { - assert (_monitor_out == public_order.front()); - } + + /* the sort should have put control outs first */ + + if (_monitor_out) { + assert (_monitor_out == public_order.front()); + } for (RouteList::iterator i = public_order.begin(); i != public_order.end(); ++i) { if (!(*i)->is_auditioner()) { @@ -1335,7 +1418,7 @@ Session::set_state (const XMLNode& node, int version) ControlProtocolManager::instance().set_state (*child, version); } - update_have_rec_enabled_track (); + update_route_record_state (); /* here beginneth the second phase ... */ @@ -1856,17 +1939,15 @@ Session::get_sources_as_xml () void Session::reset_write_sources (bool mark_write_complete, bool force) { - boost::shared_ptr rl = routes.reader(); - for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) { - boost::shared_ptr tr = boost::dynamic_pointer_cast (*i); - if (tr) { - - // block state saving + boost::shared_ptr rl = routes.reader(); + for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) { + boost::shared_ptr tr = boost::dynamic_pointer_cast (*i); + if (tr) { _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup); tr->reset_write_sources(mark_write_complete, force); _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup); - } - } + } + } } int @@ -2008,26 +2089,35 @@ Session::save_template (string template_name) template_dir_path = template_name; } - if (Glib::file_test (template_dir_path, Glib::FILE_TEST_EXISTS)) { - warning << string_compose(_("Template \"%1\" already exists - new version not created"), - template_dir_path) << endmsg; - return -1; - } - - if (g_mkdir_with_parents (template_dir_path.c_str(), 0755) != 0) { - error << string_compose(_("Could not create directory for Session template\"%1\" (%2)"), - template_dir_path, g_strerror (errno)) << endmsg; - return -1; + if (!ARDOUR::Profile->get_trx()) { + if (Glib::file_test (template_dir_path, Glib::FILE_TEST_EXISTS)) { + warning << string_compose(_("Template \"%1\" already exists - new version not created"), + template_dir_path) << endmsg; + return -1; + } + + if (g_mkdir_with_parents (template_dir_path.c_str(), 0755) != 0) { + error << string_compose(_("Could not create directory for Session template\"%1\" (%2)"), + template_dir_path, g_strerror (errno)) << endmsg; + return -1; + } } /* file to write */ std::string template_file_path; - if (absolute_path) { - template_file_path = Glib::build_filename (template_dir_path, Glib::path_get_basename (template_dir_path) + template_suffix); + + if (ARDOUR::Profile->get_trx()) { + template_file_path = template_name; } else { - template_file_path = Glib::build_filename (template_dir_path, template_name + template_suffix); + if (absolute_path) { + template_file_path = Glib::build_filename (template_dir_path, Glib::path_get_basename (template_dir_path) + template_suffix); + } else { + template_file_path = Glib::build_filename (template_dir_path, template_name + template_suffix); + } } + SessionSaveUnderway (); /* EMIT SIGNAL */ + XMLTree tree; tree.set_root (&get_template()); @@ -2036,17 +2126,20 @@ Session::save_template (string template_name) return -1; } - /* copy plugin state directory */ + if (!ARDOUR::Profile->get_trx()) { + /* copy plugin state directory */ - std::string template_plugin_state_path (Glib::build_filename (template_dir_path, X_("plugins"))); + 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; + 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); } - copy_recurse (plugins_dir(), template_plugin_state_path); + store_recent_templates (template_file_path); return 0; } @@ -2249,25 +2342,25 @@ Session::get_best_session_directory_for_new_audio () string Session::automation_dir () const { - return Glib::build_filename (_path, "automation"); + return Glib::build_filename (_path, automation_dir_name); } string Session::analysis_dir () const { - return Glib::build_filename (_path, "analysis"); + return Glib::build_filename (_path, analysis_dir_name); } string Session::plugins_dir () const { - return Glib::build_filename (_path, "plugins"); + return Glib::build_filename (_path, plugins_dir_name); } string Session::externals_dir () const { - return Glib::build_filename (_path, "externals"); + return Glib::build_filename (_path, externals_dir_name); } int @@ -2795,6 +2888,8 @@ Session::cleanup_sources (CleanupReport& rep) in the region list. */ + std::string fpath = i->second->name (); + RegionFactory::remove_regions_using_source (i->second); sources.erase (i); @@ -2802,7 +2897,7 @@ Session::cleanup_sources (CleanupReport& rep) for (set::iterator j = all_sources.begin(); j != all_sources.end(); ++j) { spath = Glib::path_get_basename (*j); - if ( spath == i->second->name () ) { + if ( spath == fpath ) { all_sources.erase (j); break; } @@ -3569,6 +3664,8 @@ Session::config_changed (std::string p, bool ours) reconnect_ltc_output (); } else if (p == "timecode-generator-offset") { ltc_tx_parse_offset(); + } else if (p == "auto-return-target-list") { + follow_playhead_priority (); } set_dirty (); @@ -4160,7 +4257,15 @@ Session::save_as (SaveAs& saveas) std::string from = *i; - if ((*i).find (audiofile_dir_string) != string::npos) { +#ifdef __APPLE__ + string filename = Glib::path_get_basename (from); + std::transform (filename.begin(), filename.end(), filename.begin(), ::toupper); + if (filename == ".DS_STORE") { + continue; + } +#endif + + if (from.find (audiofile_dir_string) != string::npos) { /* audio file: only copy if asked */ @@ -4171,7 +4276,8 @@ Session::save_as (SaveAs& saveas) info << "media file copying from " << from << " to " << to << endmsg; if (!copy_file (from, to)) { - throw Glib::FileError (Glib::FileError::IO_ERROR, "copy failed"); + throw Glib::FileError (Glib::FileError::IO_ERROR, + string_compose(_("\ncopying \"%1\" failed !"), from)); } } @@ -4179,7 +4285,7 @@ Session::save_as (SaveAs& saveas) internal_file_cnt++; - } else if ((*i).find (midifile_dir_string) != string::npos) { + } else if (from.find (midifile_dir_string) != string::npos) { /* midi file: always copy unless * creating an empty new session @@ -4200,7 +4306,7 @@ Session::save_as (SaveAs& saveas) internal_file_cnt++; - } else if ((*i).find (analysis_dir_string) != string::npos) { + } else if (from.find (analysis_dir_string) != string::npos) { /* make sure analysis dir exists in * new session folder, but we're not @@ -4219,14 +4325,14 @@ Session::save_as (SaveAs& saveas) bool do_copy = true; for (vector::iterator v = do_not_copy_extensions.begin(); v != do_not_copy_extensions.end(); ++v) { - if (((*i).length() > (*v).length()) && ((*i).find (*v) == (*i).length() - (*v).length())) { + if ((from.length() > (*v).length()) && (from.find (*v) == from.length() - (*v).length())) { /* end of filename matches extension, do not copy file */ do_copy = false; break; } } - if (!saveas.copy_media && (*i).find (peakfile_suffix) != string::npos) { + if (!saveas.copy_media && from.find (peakfile_suffix) != string::npos) { /* don't copy peakfiles if * we're not copying media */ @@ -4234,7 +4340,7 @@ Session::save_as (SaveAs& saveas) } if (do_copy) { - string to = Glib::build_filename (to_dir, (*i).substr (prefix_len)); + string to = Glib::build_filename (to_dir, from.substr (prefix_len)); info << "attempting to make directory/folder " << to << endmsg; @@ -4245,7 +4351,8 @@ Session::save_as (SaveAs& saveas) info << "attempting to copy " << from << " to " << to << endmsg; if (!copy_file (from, to)) { - throw Glib::FileError (Glib::FileError::IO_ERROR, "copy failed"); + throw Glib::FileError (Glib::FileError::IO_ERROR, + string_compose(_("\ncopying \"%1\" failed !"), from)); } } } @@ -4256,7 +4363,7 @@ Session::save_as (SaveAs& saveas) */ GStatBuf gsb; - g_stat ((*i).c_str(), &gsb); + g_stat (from.c_str(), &gsb); copied += gsb.st_size; cnt++; @@ -4351,6 +4458,7 @@ Session::save_as (SaveAs& saveas) if (internal_file_cnt) { for (vector::iterator s = old_search_path[DataType::AUDIO].begin(); s != old_search_path[DataType::AUDIO].end(); ++s) { ensure_search_path_includes (*s, DataType::AUDIO); + cerr << "be sure to include " << *s << " for audio" << endl; } /* we do not do this for MIDI because we copy @@ -4372,6 +4480,8 @@ Session::save_as (SaveAs& saveas) } saveas.final_session_folder_name = _path; + + store_recent_sessions (_name, _path); if (!saveas.switch_to) {