2 Copyright (C) 1999-2002 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 #include <sigc++/bind.h>
28 #include <cstdio> /* snprintf(3) ... grrr */
43 #include <sys/mount.h>
44 #include <sys/param.h>
49 #include <midi++/mmc.h>
50 #include <midi++/port.h>
51 #include <pbd/error.h>
53 #include <glibmm/thread.h>
54 #include <pbd/pathscanner.h>
55 #include <pbd/pthread_utils.h>
56 #include <pbd/strsplit.h>
58 #include <ardour/audioengine.h>
59 #include <ardour/configuration.h>
60 #include <ardour/session.h>
61 #include <ardour/audio_diskstream.h>
62 #include <ardour/utils.h>
63 #include <ardour/audioplaylist.h>
64 #include <ardour/audiofilesource.h>
65 #include <ardour/destructive_filesource.h>
66 #include <ardour/sndfile_helpers.h>
67 #include <ardour/auditioner.h>
68 #include <ardour/export.h>
69 #include <ardour/redirect.h>
70 #include <ardour/send.h>
71 #include <ardour/insert.h>
72 #include <ardour/connection.h>
73 #include <ardour/slave.h>
74 #include <ardour/tempo.h>
75 #include <ardour/audio_track.h>
76 #include <ardour/cycle_timer.h>
77 #include <ardour/utils.h>
78 #include <ardour/named_selection.h>
79 #include <ardour/version.h>
80 #include <ardour/location.h>
81 #include <ardour/audioregion.h>
82 #include <ardour/crossfade.h>
83 #include <ardour/control_protocol_manager.h>
84 #include <ardour/region_factory.h>
85 #include <ardour/source_factory.h>
87 #include <control_protocol/control_protocol.h>
93 using namespace ARDOUR;
97 Session::first_stage_init (string fullpath, string snapshot_name)
99 if (fullpath.length() == 0) {
100 throw failed_constructor();
103 char buf[PATH_MAX+1];
104 if (!realpath (fullpath.c_str(), buf) && (errno != ENOENT)) {
105 error << string_compose(_("Could not use path %1 (%s)"), buf, strerror(errno)) << endmsg;
106 throw failed_constructor();
111 if (_path[_path.length()-1] != '/') {
115 /* these two are just provisional settings. set_state()
116 will likely override them.
119 _name = _current_snapshot_name = snapshot_name;
121 _current_frame_rate = _engine.frame_rate ();
122 _tempo_map = new TempoMap (_current_frame_rate);
123 _tempo_map->StateChanged.connect (mem_fun (*this, &Session::tempo_map_changed));
125 g_atomic_int_set (&processing_prohibited, 0);
128 _transport_speed = 0;
129 _last_transport_speed = 0;
130 transport_sub_state = 0;
131 _transport_frame = 0;
133 end_location = new Location (0, 0, _("end"), Location::Flags ((Location::IsMark|Location::IsEnd)));
134 start_location = new Location (0, 0, _("start"), Location::Flags ((Location::IsMark|Location::IsStart)));
135 _end_location_is_free = true;
136 g_atomic_int_set (&_record_status, Disabled);
137 loop_changing = false;
139 _last_roll_location = 0;
140 _last_record_location = 0;
141 pending_locate_frame = 0;
142 pending_locate_roll = false;
143 pending_locate_flush = false;
144 dstream_buffer_size = 0;
146 state_was_pending = false;
148 outbound_mtc_smpte_frame = 0;
149 next_quarter_frame_to_send = -1;
150 current_block_size = 0;
151 solo_update_disabled = false;
152 currently_soloing = false;
153 _have_captured = false;
154 _worst_output_latency = 0;
155 _worst_input_latency = 0;
156 _worst_track_latency = 0;
157 _state_of_the_state = StateOfTheState(CannotSave|InitialConnecting|Loading);
159 butler_mixdown_buffer = 0;
160 butler_gain_buffer = 0;
162 session_send_mmc = false;
163 session_send_mtc = false;
164 post_transport_work = PostTransportWork (0);
165 g_atomic_int_set (&butler_should_do_transport_work, 0);
166 g_atomic_int_set (&butler_active, 0);
167 g_atomic_int_set (&_playback_load, 100);
168 g_atomic_int_set (&_capture_load, 100);
169 g_atomic_int_set (&_playback_load_min, 100);
170 g_atomic_int_set (&_capture_load_min, 100);
172 waiting_to_start = false;
174 _gain_automation_buffer = 0;
175 _pan_automation_buffer = 0;
177 pending_abort = false;
178 destructive_index = 0;
180 first_file_data_format_reset = true;
181 first_file_header_format_reset = true;
183 AudioDiskstream::allocate_working_buffers();
185 /* default short fade = 15ms */
187 Crossfade::set_short_xfade_length ((nframes_t) floor (Config->get_short_xfade_seconds() * frame_rate()));
188 DestructiveFileSource::setup_standard_crossfades (frame_rate());
190 last_mmc_step.tv_sec = 0;
191 last_mmc_step.tv_usec = 0;
194 /* click sounds are unset by default, which causes us to internal
195 waveforms for clicks.
199 click_emphasis_data = 0;
201 click_emphasis_length = 0;
204 process_function = &Session::process_with_events;
206 if (Config->get_use_video_sync()) {
207 waiting_for_sync_offset = true;
209 waiting_for_sync_offset = false;
212 _current_frame_rate = 48000;
213 _base_frame_rate = 48000;
217 _smpte_offset_negative = true;
218 last_smpte_valid = false;
222 last_rr_session_dir = session_dirs.begin();
223 refresh_disk_space ();
225 // set_default_fade (0.2, 5.0); /* steepness, millisecs */
229 average_slave_delta = 1800;
230 have_first_delta_accumulator = false;
231 delta_accumulator_cnt = 0;
232 slave_state = Stopped;
234 _engine.GraphReordered.connect (mem_fun (*this, &Session::graph_reordered));
236 /* These are all static "per-class" signals */
238 RegionFactory::CheckNewRegion.connect (mem_fun (*this, &Session::add_region));
239 SourceFactory::SourceCreated.connect (mem_fun (*this, &Session::add_source));
240 Playlist::PlaylistCreated.connect (mem_fun (*this, &Session::add_playlist));
241 Redirect::RedirectCreated.connect (mem_fun (*this, &Session::add_redirect));
242 NamedSelection::NamedSelectionCreated.connect (mem_fun (*this, &Session::add_named_selection));
243 Curve::CurveCreated.connect (mem_fun (*this, &Session::add_curve));
244 AutomationList::AutomationListCreated.connect (mem_fun (*this, &Session::add_automation_list));
246 Controllable::Destroyed.connect (mem_fun (*this, &Session::remove_controllable));
248 IO::MoreOutputs.connect (mem_fun (*this, &Session::ensure_passthru_buffers));
250 /* stop IO objects from doing stuff until we're ready for them */
252 IO::disable_panners ();
253 IO::disable_ports ();
254 IO::disable_connecting ();
258 Session::second_stage_init (bool new_session)
260 AudioFileSource::set_peak_dir (peak_dir());
263 if (load_state (_current_snapshot_name)) {
266 remove_empty_sounds ();
269 if (start_butler_thread()) {
273 if (start_midi_thread ()) {
277 // set_state() will call setup_raid_path(), but if it's a new session we need
278 // to call setup_raid_path() here.
280 if (set_state (*state_tree->root())) {
284 setup_raid_path(_path);
287 /* we can't save till after ::when_engine_running() is called,
288 because otherwise we save state with no connections made.
289 therefore, we reset _state_of_the_state because ::set_state()
290 will have cleared it.
292 we also have to include Loading so that any events that get
293 generated between here and the end of ::when_engine_running()
294 will be processed directly rather than queued.
297 _state_of_the_state = StateOfTheState (_state_of_the_state|CannotSave|Loading);
299 // set_auto_input (true);
300 _locations.changed.connect (mem_fun (this, &Session::locations_changed));
301 _locations.added.connect (mem_fun (this, &Session::locations_added));
302 setup_click_sounds (0);
303 setup_midi_control ();
305 /* Pay attention ... */
307 _engine.Halted.connect (mem_fun (*this, &Session::engine_halted));
308 _engine.Xrun.connect (mem_fun (*this, &Session::xrun_recovery));
310 if (_engine.running()) {
311 when_engine_running();
313 first_time_running = _engine.Running.connect (mem_fun (*this, &Session::when_engine_running));
316 send_full_time_code ();
317 _engine.transport_locate (0);
318 deliver_mmc (MIDI::MachineControl::cmdMmcReset, 0);
319 deliver_mmc (MIDI::MachineControl::cmdLocate, 0);
321 ControlProtocolManager::instance().set_session (*this);
324 _end_location_is_free = true;
326 _end_location_is_free = false;
333 Session::raid_path () const
337 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
342 return path.substr (0, path.length() - 1); // drop final colon
346 Session::setup_raid_path (string path)
348 string::size_type colon;
352 string::size_type len = path.length();
357 if (path.length() == 0) {
361 session_dirs.clear ();
363 for (string::size_type n = 0; n < len; ++n) {
364 if (path[n] == ':') {
371 /* no multiple search path, just one location (common case) */
375 session_dirs.push_back (sp);
382 if (fspath[fspath.length()-1] != '/') {
385 fspath += sound_dir (false);
387 AudioFileSource::set_search_path (fspath);
394 while ((colon = remaining.find_first_of (':')) != string::npos) {
397 sp.path = remaining.substr (0, colon);
398 session_dirs.push_back (sp);
400 /* add sounds to file search path */
403 if (fspath[fspath.length()-1] != '/') {
406 fspath += sound_dir (false);
409 remaining = remaining.substr (colon+1);
412 if (remaining.length()) {
419 if (fspath[fspath.length()-1] != '/') {
422 fspath += sound_dir (false);
425 session_dirs.push_back (sp);
428 /* set the AudioFileSource search path */
430 AudioFileSource::set_search_path (fspath);
432 /* reset the round-robin soundfile path thingie */
434 last_rr_session_dir = session_dirs.begin();
438 Session::create (bool& new_session, string* mix_template, nframes_t initial_length)
442 if (g_mkdir_with_parents (_path.c_str(), 0755) < 0) {
443 error << string_compose(_("Session: cannot create session dir \"%1\" (%2)"), _path, strerror (errno)) << endmsg;
449 if (g_mkdir_with_parents (dir.c_str(), 0755) < 0) {
450 error << string_compose(_("Session: cannot create session peakfile dir \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
456 if (g_mkdir_with_parents (dir.c_str(), 0755) < 0) {
457 error << string_compose(_("Session: cannot create session sounds dir \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
461 dir = dead_sound_dir ();
463 if (g_mkdir_with_parents (dir.c_str(), 0755) < 0) {
464 error << string_compose(_("Session: cannot create session dead sounds dir \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
468 dir = automation_dir ();
470 if (g_mkdir_with_parents (dir.c_str(), 0755) < 0) {
471 error << string_compose(_("Session: cannot create session automation dir \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
476 /* check new_session so we don't overwrite an existing one */
479 std::string in_path = *mix_template;
481 ifstream in(in_path.c_str());
484 string out_path = _path;
486 out_path += _statefile_suffix;
488 ofstream out(out_path.c_str());
493 // okay, session is set up. Treat like normal saved
494 // session from now on.
500 error << string_compose (_("Could not open %1 for writing mix template"), out_path)
506 error << string_compose (_("Could not open mix template %1 for reading"), in_path)
513 /* set initial start + end point */
515 start_location->set_end (0);
516 _locations.add (start_location);
518 end_location->set_end (initial_length);
519 _locations.add (end_location);
521 _state_of_the_state = Clean;
523 if (save_state (_current_snapshot_name)) {
524 save_history (_current_snapshot_name);
532 Session::load_diskstreams (const XMLNode& node)
535 XMLNodeConstIterator citer;
537 clist = node.children();
539 for (citer = clist.begin(); citer != clist.end(); ++citer) {
543 boost::shared_ptr<AudioDiskstream> dstream (new AudioDiskstream (*this, **citer));
544 add_diskstream (dstream);
547 catch (failed_constructor& err) {
548 error << _("Session: could not load diskstream via XML state") << endmsg;
557 Session::remove_pending_capture_state ()
562 xml_path += _current_snapshot_name;
563 xml_path += _pending_suffix;
565 unlink (xml_path.c_str());
569 Session::save_state (string snapshot_name, bool pending)
575 if (_state_of_the_state & CannotSave) {
579 tree.set_root (&get_state());
581 if (snapshot_name.empty()) {
582 snapshot_name = _current_snapshot_name;
588 xml_path += snapshot_name;
589 xml_path += _statefile_suffix;
593 // Make backup of state file
595 if ((access (xml_path.c_str(), F_OK) == 0) &&
596 (rename(xml_path.c_str(), bak_path.c_str()))) {
597 error << _("could not backup old state file, current state not saved.") << endmsg;
604 xml_path += snapshot_name;
605 xml_path += _pending_suffix;
609 cerr << "actually writing state\n";
611 if (!tree.write (xml_path)) {
612 error << string_compose (_("state could not be saved to %1"), xml_path) << endmsg;
614 /* don't leave a corrupt file lying around if it is
618 if (unlink (xml_path.c_str())) {
619 error << string_compose (_("could not remove corrupt state file %1"), xml_path) << endmsg;
622 if (rename (bak_path.c_str(), xml_path.c_str())) {
623 error << string_compose (_("could not restore state file from backup %1"), bak_path) << endmsg;
632 save_history(snapshot_name);
634 bool was_dirty = dirty();
636 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
639 DirtyChanged (); /* EMIT SIGNAL */
642 StateSaved (snapshot_name); /* EMIT SIGNAL */
649 Session::restore_state (string snapshot_name)
651 if (load_state (snapshot_name) == 0) {
652 set_state (*state_tree->root());
659 Session::load_state (string snapshot_name)
668 state_was_pending = false;
670 /* check for leftover pending state from a crashed capture attempt */
673 xmlpath += snapshot_name;
674 xmlpath += _pending_suffix;
676 if (!access (xmlpath.c_str(), F_OK)) {
678 /* there is pending state from a crashed capture attempt */
680 if (AskAboutPendingState()) {
681 state_was_pending = true;
685 if (!state_was_pending) {
688 xmlpath += snapshot_name;
689 xmlpath += _statefile_suffix;
692 if (access (xmlpath.c_str(), F_OK)) {
693 error << string_compose(_("%1: session state information file \"%2\" doesn't exist!"), _name, xmlpath) << endmsg;
697 state_tree = new XMLTree;
701 if (state_tree->read (xmlpath)) {
704 error << string_compose(_("Could not understand ardour file %1"), xmlpath) << endmsg;
713 Session::load_options (const XMLNode& node)
717 LocaleGuard lg (X_("POSIX"));
719 Config->set_variables (node, ConfigVariableBase::Session);
721 if ((child = find_named_node (node, "end-marker-is-free")) != 0) {
722 if ((prop = child->property ("val")) != 0) {
723 _end_location_is_free = (prop->value() == "yes");
731 Session::save_config_options_predicate (ConfigVariableBase::Owner owner) const
733 const ConfigVariableBase::Owner modified_by_session_or_user = (ConfigVariableBase::Owner)
734 (ConfigVariableBase::Session|ConfigVariableBase::Interface);
736 return owner & modified_by_session_or_user;
740 Session::get_options () const
743 LocaleGuard lg (X_("POSIX"));
745 XMLNode& option_root = Config->get_variables (mem_fun (*this, &Session::save_config_options_predicate));
747 child = option_root.add_child ("end-marker-is-free");
748 child->add_property ("val", _end_location_is_free ? "yes" : "no");
760 Session::get_template()
762 /* if we don't disable rec-enable, diskstreams
763 will believe they need to store their capture
764 sources in their state node.
767 disable_record (false);
773 Session::state(bool full_state)
775 XMLNode* node = new XMLNode("Session");
778 // store libardour version, just in case
780 snprintf(buf, sizeof(buf)-1, "%d.%d.%d",
781 libardour_major_version, libardour_minor_version, libardour_micro_version);
782 node->add_property("version", string(buf));
784 /* store configuration settings */
789 node->add_property ("name", _name);
791 if (session_dirs.size() > 1) {
795 vector<space_and_path>::iterator i = session_dirs.begin();
796 vector<space_and_path>::iterator next;
798 ++i; /* skip the first one */
802 while (i != session_dirs.end()) {
806 if (next != session_dirs.end()) {
816 child = node->add_child ("Path");
817 child->add_content (p);
821 /* save the ID counter */
823 snprintf (buf, sizeof (buf), "%" PRIu64, ID::counter());
824 node->add_property ("id-counter", buf);
826 /* various options */
828 node->add_child_nocopy (get_options());
830 child = node->add_child ("Sources");
833 Glib::Mutex::Lock sl (audio_source_lock);
835 for (AudioSourceList::iterator siter = audio_sources.begin(); siter != audio_sources.end(); ++siter) {
837 /* Don't save information about AudioFileSources that are empty */
839 boost::shared_ptr<AudioFileSource> fs;
841 if ((fs = boost::dynamic_pointer_cast<AudioFileSource> (siter->second)) != 0) {
842 boost::shared_ptr<DestructiveFileSource> dfs = boost::dynamic_pointer_cast<DestructiveFileSource> (fs);
844 /* destructive file sources are OK if they are empty, because
845 we will re-use them every time.
849 if (fs->length() == 0) {
855 child->add_child_nocopy (siter->second->get_state());
859 child = node->add_child ("Regions");
862 Glib::Mutex::Lock rl (region_lock);
864 for (AudioRegionList::const_iterator i = audio_regions.begin(); i != audio_regions.end(); ++i) {
866 /* only store regions not attached to playlists */
868 if (i->second->playlist() == 0) {
869 child->add_child_nocopy (i->second->state (true));
874 child = node->add_child ("DiskStreams");
877 boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
878 for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
879 if (!(*i)->hidden()) {
880 child->add_child_nocopy ((*i)->get_state());
885 node->add_child_nocopy (_locations.get_state());
887 child = node->add_child ("Connections");
889 Glib::Mutex::Lock lm (connection_lock);
890 for (ConnectionList::iterator i = _connections.begin(); i != _connections.end(); ++i) {
891 if (!(*i)->system_dependent()) {
892 child->add_child_nocopy ((*i)->get_state());
897 child = node->add_child ("Routes");
899 boost::shared_ptr<RouteList> r = routes.reader ();
901 RoutePublicOrderSorter cmp;
902 RouteList public_order (*r);
903 public_order.sort (cmp);
905 for (RouteList::iterator i = public_order.begin(); i != public_order.end(); ++i) {
906 if (!(*i)->hidden()) {
908 child->add_child_nocopy ((*i)->get_state());
910 child->add_child_nocopy ((*i)->get_template());
917 child = node->add_child ("EditGroups");
918 for (list<RouteGroup *>::iterator i = edit_groups.begin(); i != edit_groups.end(); ++i) {
919 child->add_child_nocopy ((*i)->get_state());
922 child = node->add_child ("MixGroups");
923 for (list<RouteGroup *>::iterator i = mix_groups.begin(); i != mix_groups.end(); ++i) {
924 child->add_child_nocopy ((*i)->get_state());
927 child = node->add_child ("Playlists");
928 for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); ++i) {
929 if (!(*i)->hidden()) {
930 if (!(*i)->empty()) {
932 child->add_child_nocopy ((*i)->get_state());
934 child->add_child_nocopy ((*i)->get_template());
940 child = node->add_child ("UnusedPlaylists");
941 for (PlaylistList::iterator i = unused_playlists.begin(); i != unused_playlists.end(); ++i) {
942 if (!(*i)->hidden()) {
943 if (!(*i)->empty()) {
945 child->add_child_nocopy ((*i)->get_state());
947 child->add_child_nocopy ((*i)->get_template());
955 child = node->add_child ("Click");
956 child->add_child_nocopy (_click_io->state (full_state));
960 child = node->add_child ("NamedSelections");
961 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
963 child->add_child_nocopy ((*i)->get_state());
968 node->add_child_nocopy (_tempo_map->get_state());
970 node->add_child_nocopy (get_control_protocol_state());
973 node->add_child_copy (*_extra_xml);
980 Session::get_control_protocol_state ()
982 ControlProtocolManager& cpm (ControlProtocolManager::instance());
983 XMLNode* node = new XMLNode (X_("ControlProtocols"));
985 cpm.foreach_known_protocol (bind (mem_fun (*this, &Session::add_control_protocol), node));
991 Session::add_control_protocol (const ControlProtocolInfo* const cpi, XMLNode* node)
994 node->add_child_nocopy (cpi->protocol->get_state());
999 Session::set_state (const XMLNode& node)
1003 const XMLProperty* prop;
1006 _state_of_the_state = StateOfTheState (_state_of_the_state|CannotSave);
1008 if (node.name() != X_("Session")){
1009 fatal << _("programming error: Session: incorrect XML node sent to set_state()") << endmsg;
1013 if ((prop = node.property ("name")) != 0) {
1014 _name = prop->value ();
1017 setup_raid_path(_path);
1019 if ((prop = node.property (X_("id-counter"))) != 0) {
1021 sscanf (prop->value().c_str(), "%" PRIu64, &x);
1022 ID::init_counter (x);
1024 /* old sessions used a timebased counter, so fake
1025 the startup ID counter based on a standard
1030 ID::init_counter (now);
1034 IO::disable_ports ();
1035 IO::disable_connecting ();
1037 /* Object loading order:
1055 if (use_config_midi_ports ()) {
1058 if ((child = find_named_node (node, "extra")) != 0) {
1059 _extra_xml = new XMLNode (*child);
1062 if (((child = find_named_node (node, "Options")) != 0)) { /* old style */
1063 load_options (*child);
1064 } else if ((child = find_named_node (node, "Config")) != 0) { /* new style */
1065 load_options (*child);
1067 error << _("Session: XML state has no options section") << endmsg;
1070 if ((child = find_named_node (node, "Sources")) == 0) {
1071 error << _("Session: XML state has no sources section") << endmsg;
1073 } else if (load_sources (*child)) {
1077 if ((child = find_named_node (node, "Regions")) == 0) {
1078 error << _("Session: XML state has no Regions section") << endmsg;
1080 } else if (load_regions (*child)) {
1084 if ((child = find_named_node (node, "Playlists")) == 0) {
1085 error << _("Session: XML state has no playlists section") << endmsg;
1087 } else if (load_playlists (*child)) {
1091 if ((child = find_named_node (node, "UnusedPlaylists")) == 0) {
1093 } else if (load_unused_playlists (*child)) {
1097 if ((child = find_named_node (node, "NamedSelections")) != 0) {
1098 if (load_named_selections (*child)) {
1103 if ((child = find_named_node (node, "DiskStreams")) == 0) {
1104 error << _("Session: XML state has no diskstreams section") << endmsg;
1106 } else if (load_diskstreams (*child)) {
1110 if ((child = find_named_node (node, "Connections")) == 0) {
1111 error << _("Session: XML state has no connections section") << endmsg;
1113 } else if (load_connections (*child)) {
1117 if ((child = find_named_node (node, "Locations")) == 0) {
1118 error << _("Session: XML state has no locations section") << endmsg;
1120 } else if (_locations.set_state (*child)) {
1126 if ((location = _locations.auto_loop_location()) != 0) {
1127 set_auto_loop_location (location);
1130 if ((location = _locations.auto_punch_location()) != 0) {
1131 set_auto_punch_location (location);
1134 if ((location = _locations.end_location()) == 0) {
1135 _locations.add (end_location);
1137 delete end_location;
1138 end_location = location;
1141 if ((location = _locations.start_location()) == 0) {
1142 _locations.add (start_location);
1144 delete start_location;
1145 start_location = location;
1148 if ((child = find_named_node (node, "EditGroups")) == 0) {
1149 error << _("Session: XML state has no edit groups section") << endmsg;
1151 } else if (load_edit_groups (*child)) {
1155 if ((child = find_named_node (node, "MixGroups")) == 0) {
1156 error << _("Session: XML state has no mix groups section") << endmsg;
1158 } else if (load_mix_groups (*child)) {
1162 if ((child = find_named_node (node, "TempoMap")) == 0) {
1163 error << _("Session: XML state has no Tempo Map section") << endmsg;
1165 } else if (_tempo_map->set_state (*child)) {
1169 if ((child = find_named_node (node, "Routes")) == 0) {
1170 error << _("Session: XML state has no routes section") << endmsg;
1172 } else if (load_routes (*child)) {
1176 if ((child = find_named_node (node, "Click")) == 0) {
1177 warning << _("Session: XML state has no click section") << endmsg;
1178 } else if (_click_io) {
1179 _click_io->set_state (*child);
1182 if ((child = find_named_node (node, "ControlProtocols")) != 0) {
1183 ControlProtocolManager::instance().set_protocol_states (*child);
1186 /* here beginneth the second phase ... */
1188 StateReady (); /* EMIT SIGNAL */
1190 _state_of_the_state = Clean;
1192 if (state_was_pending) {
1193 save_state (_current_snapshot_name);
1194 remove_pending_capture_state ();
1195 state_was_pending = false;
1205 Session::load_routes (const XMLNode& node)
1208 XMLNodeConstIterator niter;
1209 RouteList new_routes;
1211 nlist = node.children();
1215 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1217 boost::shared_ptr<Route> route (XMLRouteFactory (**niter));
1220 error << _("Session: cannot create Route from XML description.") << endmsg;
1224 new_routes.push_back (route);
1227 add_routes (new_routes);
1232 boost::shared_ptr<Route>
1233 Session::XMLRouteFactory (const XMLNode& node)
1235 if (node.name() != "Route") {
1236 return boost::shared_ptr<Route> ((Route*) 0);
1239 if (node.property ("diskstream") != 0 || node.property ("diskstream-id") != 0) {
1240 boost::shared_ptr<Route> x (new AudioTrack (*this, node));
1243 boost::shared_ptr<Route> x (new Route (*this, node));
1249 Session::load_regions (const XMLNode& node)
1252 XMLNodeConstIterator niter;
1253 boost::shared_ptr<AudioRegion> region;
1255 nlist = node.children();
1259 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1260 if ((region = XMLRegionFactory (**niter, false)) == 0) {
1261 error << _("Session: cannot create Region from XML description.") << endmsg;
1268 boost::shared_ptr<AudioRegion>
1269 Session::XMLRegionFactory (const XMLNode& node, bool full)
1271 const XMLProperty* prop;
1272 boost::shared_ptr<Source> source;
1273 boost::shared_ptr<AudioSource> as;
1275 uint32_t nchans = 1;
1278 if (node.name() != X_("Region")) {
1279 return boost::shared_ptr<AudioRegion>();
1282 if ((prop = node.property (X_("channels"))) != 0) {
1283 nchans = atoi (prop->value().c_str());
1287 if ((prop = node.property ("name")) == 0) {
1288 cerr << "no name for this region\n";
1292 if ((prop = node.property (X_("source-0"))) == 0) {
1293 if ((prop = node.property ("source")) == 0) {
1294 error << _("Session: XMLNode describing a AudioRegion is incomplete (no source)") << endmsg;
1295 return boost::shared_ptr<AudioRegion>();
1299 PBD::ID s_id (prop->value());
1301 if ((source = source_by_id (s_id)) == 0) {
1302 error << string_compose(_("Session: XMLNode describing a AudioRegion references an unknown source id =%1"), s_id) << endmsg;
1303 return boost::shared_ptr<AudioRegion>();
1306 as = boost::dynamic_pointer_cast<AudioSource>(source);
1308 error << string_compose(_("Session: XMLNode describing a AudioRegion references a non-audio source id =%1"), s_id) << endmsg;
1309 return boost::shared_ptr<AudioRegion>();
1312 sources.push_back (as);
1314 /* pickup other channels */
1316 for (uint32_t n=1; n < nchans; ++n) {
1317 snprintf (buf, sizeof(buf), X_("source-%d"), n);
1318 if ((prop = node.property (buf)) != 0) {
1320 PBD::ID id2 (prop->value());
1322 if ((source = source_by_id (id2)) == 0) {
1323 error << string_compose(_("Session: XMLNode describing a AudioRegion references an unknown source id =%1"), id2) << endmsg;
1324 return boost::shared_ptr<AudioRegion>();
1327 as = boost::dynamic_pointer_cast<AudioSource>(source);
1329 error << string_compose(_("Session: XMLNode describing a AudioRegion references a non-audio source id =%1"), id2) << endmsg;
1330 return boost::shared_ptr<AudioRegion>();
1332 sources.push_back (as);
1337 boost::shared_ptr<AudioRegion> region (boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (sources, node)));
1342 catch (failed_constructor& err) {
1343 return boost::shared_ptr<AudioRegion>();
1348 Session::get_sources_as_xml ()
1351 XMLNode* node = new XMLNode (X_("Sources"));
1352 Glib::Mutex::Lock lm (audio_source_lock);
1354 for (AudioSourceList::iterator i = audio_sources.begin(); i != audio_sources.end(); ++i) {
1355 node->add_child_nocopy (i->second->get_state());
1358 /* XXX get MIDI and other sources here */
1364 Session::path_from_region_name (string name, string identifier)
1366 char buf[PATH_MAX+1];
1368 string dir = discover_best_sound_dir ();
1370 for (n = 0; n < 999999; ++n) {
1371 if (identifier.length()) {
1372 snprintf (buf, sizeof(buf), "%s/%s%s%" PRIu32 ".wav", dir.c_str(), name.c_str(),
1373 identifier.c_str(), n);
1375 snprintf (buf, sizeof(buf), "%s/%s-%" PRIu32 ".wav", dir.c_str(), name.c_str(), n);
1377 if (access (buf, F_OK) != 0) {
1387 Session::load_sources (const XMLNode& node)
1390 XMLNodeConstIterator niter;
1391 boost::shared_ptr<Source> source;
1393 nlist = node.children();
1397 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1399 if ((source = XMLSourceFactory (**niter)) == 0) {
1400 error << _("Session: cannot create Source from XML description.") << endmsg;
1407 boost::shared_ptr<Source>
1408 Session::XMLSourceFactory (const XMLNode& node)
1410 if (node.name() != "Source") {
1411 return boost::shared_ptr<Source>();
1415 return SourceFactory::create (*this, node);
1418 catch (failed_constructor& err) {
1419 error << _("Found a sound file that cannot be used by Ardour. Talk to the progammers.") << endmsg;
1420 return boost::shared_ptr<Source>();
1425 Session::save_template (string template_name)
1428 string xml_path, bak_path, template_path;
1430 if (_state_of_the_state & CannotSave) {
1435 string dir = template_dir();
1437 if ((dp = opendir (dir.c_str()))) {
1440 if (g_mkdir_with_parents (dir.c_str(), S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
1441 error << string_compose(_("Could not create mix templates directory \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
1446 tree.set_root (&get_template());
1449 xml_path += template_name;
1450 xml_path += _template_suffix;
1452 ifstream in(xml_path.c_str());
1455 warning << string_compose(_("Template \"%1\" already exists - new version not created"), template_name) << endmsg;
1461 if (!tree.write (xml_path)) {
1462 error << _("mix template not saved") << endmsg;
1470 Session::rename_template (string old_name, string new_name)
1472 string old_path = template_dir() + old_name + _template_suffix;
1473 string new_path = template_dir() + new_name + _template_suffix;
1475 return rename (old_path.c_str(), new_path.c_str());
1479 Session::delete_template (string name)
1481 string template_path = template_dir();
1482 template_path += name;
1483 template_path += _template_suffix;
1485 return remove (template_path.c_str());
1489 Session::refresh_disk_space ()
1492 struct statfs statfsbuf;
1493 vector<space_and_path>::iterator i;
1494 Glib::Mutex::Lock lm (space_lock);
1497 /* get freespace on every FS that is part of the session path */
1499 _total_free_4k_blocks = 0;
1501 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
1502 statfs ((*i).path.c_str(), &statfsbuf);
1504 scale = statfsbuf.f_bsize/4096.0;
1506 (*i).blocks = (uint32_t) floor (statfsbuf.f_bavail * scale);
1507 _total_free_4k_blocks += (*i).blocks;
1513 Session::ensure_sound_dir (string path, string& result)
1518 /* Ensure that the parent directory exists */
1520 if (g_mkdir_with_parents (path.c_str(), 0775)) {
1521 error << string_compose(_("cannot create session directory \"%1\"; ignored"), path) << endmsg;
1525 /* Ensure that the sounds directory exists */
1529 result += sound_dir_name;
1531 if (g_mkdir_with_parents (result.c_str(), 0775)) {
1532 error << string_compose(_("cannot create sounds directory \"%1\"; ignored"), result) << endmsg;
1538 dead += dead_sound_dir_name;
1540 if (g_mkdir_with_parents (dead.c_str(), 0775)) {
1541 error << string_compose(_("cannot create dead sounds directory \"%1\"; ignored"), dead) << endmsg;
1547 peak += peak_dir_name;
1549 if (g_mkdir_with_parents (peak.c_str(), 0775)) {
1550 error << string_compose(_("cannot create peak file directory \"%1\"; ignored"), peak) << endmsg;
1554 /* callers expect this to be terminated ... */
1561 Session::discover_best_sound_dir (bool destructive)
1563 vector<space_and_path>::iterator i;
1566 /* handle common case without system calls */
1568 if (session_dirs.size() == 1) {
1572 /* OK, here's the algorithm we're following here:
1574 We want to select which directory to use for
1575 the next file source to be created. Ideally,
1576 we'd like to use a round-robin process so as to
1577 get maximum performance benefits from splitting
1578 the files across multiple disks.
1580 However, in situations without much diskspace, an
1581 RR approach may end up filling up a filesystem
1582 with new files while others still have space.
1583 Its therefore important to pay some attention to
1584 the freespace in the filesystem holding each
1585 directory as well. However, if we did that by
1586 itself, we'd keep creating new files in the file
1587 system with the most space until it was as full
1588 as all others, thus negating any performance
1589 benefits of this RAID-1 like approach.
1591 So, we use a user-configurable space threshold. If
1592 there are at least 2 filesystems with more than this
1593 much space available, we use RR selection between them.
1594 If not, then we pick the filesystem with the most space.
1596 This gets a good balance between the two
1600 refresh_disk_space ();
1602 int free_enough = 0;
1604 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
1605 if ((*i).blocks * 4096 >= Config->get_disk_choice_space_threshold()) {
1610 if (free_enough >= 2) {
1612 bool found_it = false;
1614 /* use RR selection process, ensuring that the one
1618 i = last_rr_session_dir;
1621 if (++i == session_dirs.end()) {
1622 i = session_dirs.begin();
1625 if ((*i).blocks * 4096 >= Config->get_disk_choice_space_threshold()) {
1626 if (ensure_sound_dir ((*i).path, result) == 0) {
1627 last_rr_session_dir = i;
1633 } while (i != last_rr_session_dir);
1636 result = sound_dir();
1641 /* pick FS with the most freespace (and that
1642 seems to actually work ...)
1645 vector<space_and_path> sorted;
1646 space_and_path_ascending_cmp cmp;
1648 sorted = session_dirs;
1649 sort (sorted.begin(), sorted.end(), cmp);
1651 for (i = sorted.begin(); i != sorted.end(); ++i) {
1652 if (ensure_sound_dir ((*i).path, result) == 0) {
1653 last_rr_session_dir = i;
1658 /* if the above fails, fall back to the most simplistic solution */
1660 if (i == sorted.end()) {
1669 Session::load_playlists (const XMLNode& node)
1672 XMLNodeConstIterator niter;
1675 nlist = node.children();
1679 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1681 if ((playlist = XMLPlaylistFactory (**niter)) == 0) {
1682 error << _("Session: cannot create Playlist from XML description.") << endmsg;
1690 Session::load_unused_playlists (const XMLNode& node)
1693 XMLNodeConstIterator niter;
1696 nlist = node.children();
1700 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1702 if ((playlist = XMLPlaylistFactory (**niter)) == 0) {
1703 error << _("Session: cannot create Playlist from XML description.") << endmsg;
1707 // now manually untrack it
1709 track_playlist (playlist, false);
1717 Session::XMLPlaylistFactory (const XMLNode& node)
1720 return new AudioPlaylist (*this, node);
1723 catch (failed_constructor& err) {
1729 Session::load_named_selections (const XMLNode& node)
1732 XMLNodeConstIterator niter;
1735 nlist = node.children();
1739 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1741 if ((ns = XMLNamedSelectionFactory (**niter)) == 0) {
1742 error << _("Session: cannot create Named Selection from XML description.") << endmsg;
1750 Session::XMLNamedSelectionFactory (const XMLNode& node)
1753 return new NamedSelection (*this, node);
1756 catch (failed_constructor& err) {
1762 Session::dead_sound_dir () const
1765 res += dead_sound_dir_name;
1771 Session::sound_dir (bool with_path) const
1773 /* support old session structure */
1775 struct stat statbuf;
1777 string old_withpath;
1779 old_nopath += old_sound_dir_name;
1782 old_withpath = _path;
1783 old_withpath += old_sound_dir_name;
1784 old_withpath += '/';
1786 if (stat (old_withpath.c_str(), &statbuf) == 0) {
1788 return old_withpath;
1799 res += interchange_dir_name;
1801 res += legalize_for_path (_name);
1803 res += sound_dir_name;
1810 Session::peak_dir () const
1813 res += peak_dir_name;
1819 Session::automation_dir () const
1822 res += "automation/";
1827 Session::template_dir ()
1829 string path = get_user_ardour_path();
1830 path += "templates/";
1836 Session::suffixed_search_path (string suffix, bool data)
1840 path += get_user_ardour_path();
1841 if (path[path.length()-1] != ':') {
1846 path += get_system_data_path();
1848 path += get_system_module_path();
1851 vector<string> split_path;
1853 split (path, split_path, ':');
1856 for (vector<string>::iterator i = split_path.begin(); i != split_path.end(); ++i) {
1861 if (distance (i, split_path.end()) != 1) {
1870 Session::template_path ()
1872 return suffixed_search_path (X_("templates"), true);
1876 Session::control_protocol_path ()
1878 return suffixed_search_path (X_("surfaces"), false);
1882 Session::load_connections (const XMLNode& node)
1884 XMLNodeList nlist = node.children();
1885 XMLNodeConstIterator niter;
1889 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1890 if ((*niter)->name() == "InputConnection") {
1891 add_connection (new ARDOUR::InputConnection (**niter));
1892 } else if ((*niter)->name() == "OutputConnection") {
1893 add_connection (new ARDOUR::OutputConnection (**niter));
1895 error << string_compose(_("Unknown node \"%1\" found in Connections list from state file"), (*niter)->name()) << endmsg;
1904 Session::load_edit_groups (const XMLNode& node)
1906 return load_route_groups (node, true);
1910 Session::load_mix_groups (const XMLNode& node)
1912 return load_route_groups (node, false);
1916 Session::load_route_groups (const XMLNode& node, bool edit)
1918 XMLNodeList nlist = node.children();
1919 XMLNodeConstIterator niter;
1924 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1925 if ((*niter)->name() == "RouteGroup") {
1927 rg = add_edit_group ("");
1928 rg->set_state (**niter);
1930 rg = add_mix_group ("");
1931 rg->set_state (**niter);
1940 state_file_filter (const string &str, void *arg)
1942 return (str.length() > strlen(Session::statefile_suffix()) &&
1943 str.find (Session::statefile_suffix()) == (str.length() - strlen (Session::statefile_suffix())));
1947 bool operator()(const string* a, const string* b) {
1953 remove_end(string* state)
1955 string statename(*state);
1957 string::size_type start,end;
1958 if ((start = statename.find_last_of ('/')) != string::npos) {
1959 statename = statename.substr (start+1);
1962 if ((end = statename.rfind(".ardour")) == string::npos) {
1963 end = statename.length();
1966 return new string(statename.substr (0, end));
1970 Session::possible_states (string path)
1972 PathScanner scanner;
1973 vector<string*>* states = scanner (path, state_file_filter, 0, false, false);
1975 transform(states->begin(), states->end(), states->begin(), remove_end);
1978 sort (states->begin(), states->end(), cmp);
1984 Session::possible_states () const
1986 return possible_states(_path);
1990 Session::auto_save()
1992 save_state (_current_snapshot_name);
1996 Session::add_edit_group (string name)
1998 RouteGroup* rg = new RouteGroup (*this, name);
1999 edit_groups.push_back (rg);
2000 edit_group_added (rg); /* EMIT SIGNAL */
2006 Session::add_mix_group (string name)
2008 RouteGroup* rg = new RouteGroup (*this, name, RouteGroup::Relative);
2009 mix_groups.push_back (rg);
2010 mix_group_added (rg); /* EMIT SIGNAL */
2016 Session::remove_edit_group (RouteGroup& rg)
2018 list<RouteGroup*>::iterator i;
2020 if ((i = find (edit_groups.begin(), edit_groups.end(), &rg)) != edit_groups.end()) {
2021 (*i)->apply (&Route::drop_edit_group, this);
2022 edit_groups.erase (i);
2023 edit_group_removed (); /* EMIT SIGNAL */
2030 Session::remove_mix_group (RouteGroup& rg)
2032 list<RouteGroup*>::iterator i;
2034 if ((i = find (mix_groups.begin(), mix_groups.end(), &rg)) != mix_groups.end()) {
2035 (*i)->apply (&Route::drop_mix_group, this);
2036 mix_groups.erase (i);
2037 mix_group_removed (); /* EMIT SIGNAL */
2044 Session::mix_group_by_name (string name)
2046 list<RouteGroup *>::iterator i;
2048 for (i = mix_groups.begin(); i != mix_groups.end(); ++i) {
2049 if ((*i)->name() == name) {
2057 Session::edit_group_by_name (string name)
2059 list<RouteGroup *>::iterator i;
2061 for (i = edit_groups.begin(); i != edit_groups.end(); ++i) {
2062 if ((*i)->name() == name) {
2070 Session::begin_reversible_command (string name)
2072 current_trans = new UndoTransaction;
2073 current_trans->set_name (name);
2077 Session::commit_reversible_command (Command *cmd)
2082 current_trans->add_command (cmd);
2085 gettimeofday (&now, 0);
2086 current_trans->set_timestamp (now);
2088 history.add (current_trans);
2091 Session::GlobalRouteBooleanState
2092 Session::get_global_route_boolean (bool (Route::*method)(void) const)
2094 GlobalRouteBooleanState s;
2095 boost::shared_ptr<RouteList> r = routes.reader ();
2097 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2098 if (!(*i)->hidden()) {
2099 RouteBooleanState v;
2102 Route* r = (*i).get();
2103 v.second = (r->*method)();
2112 Session::GlobalRouteMeterState
2113 Session::get_global_route_metering ()
2115 GlobalRouteMeterState s;
2116 boost::shared_ptr<RouteList> r = routes.reader ();
2118 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2119 if (!(*i)->hidden()) {
2123 v.second = (*i)->meter_point();
2133 Session::set_global_route_metering (GlobalRouteMeterState s, void* arg)
2135 for (GlobalRouteMeterState::iterator i = s.begin(); i != s.end(); ++i) {
2136 i->first->set_meter_point (i->second, arg);
2141 Session::set_global_route_boolean (GlobalRouteBooleanState s, void (Route::*method)(bool, void*), void* arg)
2143 for (GlobalRouteBooleanState::iterator i = s.begin(); i != s.end(); ++i) {
2144 Route* r = i->first.get();
2145 (r->*method) (i->second, arg);
2150 Session::set_global_mute (GlobalRouteBooleanState s, void* src)
2152 set_global_route_boolean (s, &Route::set_mute, src);
2156 Session::set_global_solo (GlobalRouteBooleanState s, void* src)
2158 set_global_route_boolean (s, &Route::set_solo, src);
2162 Session::set_global_record_enable (GlobalRouteBooleanState s, void* src)
2164 set_global_route_boolean (s, &Route::set_record_enable, src);
2169 Session::global_mute_memento (void* src)
2171 return sigc::bind (mem_fun (*this, &Session::set_global_mute), get_global_route_boolean (&Route::muted), src);
2175 Session::global_metering_memento (void* src)
2177 return sigc::bind (mem_fun (*this, &Session::set_global_route_metering), get_global_route_metering (), src);
2181 Session::global_solo_memento (void* src)
2183 return sigc::bind (mem_fun (*this, &Session::set_global_solo), get_global_route_boolean (&Route::soloed), src);
2187 Session::global_record_enable_memento (void* src)
2189 return sigc::bind (mem_fun (*this, &Session::set_global_record_enable), get_global_route_boolean (&Route::record_enabled), src);
2194 template_filter (const string &str, void *arg)
2196 return (str.length() > strlen(Session::template_suffix()) &&
2197 str.find (Session::template_suffix()) == (str.length() - strlen (Session::template_suffix())));
2201 Session::get_template_list (list<string> &template_names)
2203 vector<string *> *templates;
2204 PathScanner scanner;
2207 path = template_path ();
2209 templates = scanner (path, template_filter, 0, false, true);
2211 vector<string*>::iterator i;
2212 for (i = templates->begin(); i != templates->end(); ++i) {
2213 string fullpath = *(*i);
2216 start = fullpath.find_last_of ('/') + 1;
2217 if ((end = fullpath.find_last_of ('.')) <0) {
2218 end = fullpath.length();
2221 template_names.push_back(fullpath.substr(start, (end-start)));
2226 Session::read_favorite_dirs (FavoriteDirs & favs)
2228 string path = get_user_ardour_path();
2229 path += "/favorite_dirs";
2231 ifstream fav (path.c_str());
2236 if (errno != ENOENT) {
2237 //error << string_compose (_("cannot open favorite file %1 (%2)"), path, strerror (errno)) << endmsg;
2248 getline(fav, newfav);
2254 favs.push_back (newfav);
2261 Session::write_favorite_dirs (FavoriteDirs & favs)
2263 string path = get_user_ardour_path();
2264 path += "/favorite_dirs";
2266 ofstream fav (path.c_str());
2272 for (FavoriteDirs::iterator i = favs.begin(); i != favs.end(); ++i) {
2273 fav << (*i) << endl;
2280 accept_all_non_peak_files (const string& path, void *arg)
2282 return (path.length() > 5 && path.find (".peak") != (path.length() - 5));
2286 accept_all_state_files (const string& path, void *arg)
2288 return (path.length() > 7 && path.find (".ardour") == (path.length() - 7));
2292 Session::find_all_sources (string path, set<string>& result)
2297 if (!tree.read (path)) {
2301 if ((node = find_named_node (*tree.root(), "Sources")) == 0) {
2306 XMLNodeConstIterator niter;
2308 nlist = node->children();
2312 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2316 if ((prop = (*niter)->property (X_("name"))) == 0) {
2320 if (prop->value()[0] == '/') {
2321 /* external file, ignore */
2325 string path = _path; /* /-terminated */
2326 path += sound_dir_name;
2328 path += prop->value();
2330 result.insert (path);
2337 Session::find_all_sources_across_snapshots (set<string>& result, bool exclude_this_snapshot)
2339 PathScanner scanner;
2340 vector<string*>* state_files;
2342 string this_snapshot_path;
2348 if (ripped[ripped.length()-1] == '/') {
2349 ripped = ripped.substr (0, ripped.length() - 1);
2352 state_files = scanner (ripped, accept_all_state_files, (void *) 0, false, true);
2354 if (state_files == 0) {
2359 this_snapshot_path = _path;
2360 this_snapshot_path += _current_snapshot_name;
2361 this_snapshot_path += _statefile_suffix;
2363 for (vector<string*>::iterator i = state_files->begin(); i != state_files->end(); ++i) {
2365 if (exclude_this_snapshot && **i == this_snapshot_path) {
2369 if (find_all_sources (**i, result) < 0) {
2378 Session::cleanup_sources (Session::cleanup_report& rep)
2380 vector<boost::shared_ptr<Source> > dead_sources;
2381 vector<Playlist*> playlists_tbd;
2382 PathScanner scanner;
2384 vector<space_and_path>::iterator i;
2385 vector<space_and_path>::iterator nexti;
2386 vector<string*>* soundfiles;
2387 vector<string> unused;
2388 set<string> all_sources;
2393 _state_of_the_state = (StateOfTheState) (_state_of_the_state | InCleanup);
2395 /* step 1: consider deleting all unused playlists */
2397 for (PlaylistList::iterator x = unused_playlists.begin(); x != unused_playlists.end(); ++x) {
2400 status = AskAboutPlaylistDeletion (*x);
2409 playlists_tbd.push_back (*x);
2413 /* leave it alone */
2418 /* now delete any that were marked for deletion */
2420 for (vector<Playlist*>::iterator x = playlists_tbd.begin(); x != playlists_tbd.end(); ++x) {
2421 PlaylistList::iterator foo;
2423 if ((foo = unused_playlists.find (*x)) != unused_playlists.end()) {
2424 unused_playlists.erase (foo);
2429 /* step 2: find all un-referenced sources */
2434 for (AudioSourceList::iterator i = audio_sources.begin(); i != audio_sources.end(); ) {
2436 AudioSourceList::iterator tmp;
2441 /* only remove files that are not in use and have some size
2442 to them. otherwise we remove the current "nascent"
2446 if (i->second.use_count() == 1 && i->second->length() > 0) {
2447 dead_sources.push_back (i->second);
2449 /* remove this source from our own list to avoid us
2450 adding it to the list of all sources below
2453 audio_sources.erase (i);
2459 /* Step 3: get rid of all regions in the region list that use any dead sources
2460 in case the sources themselves don't go away (they might be referenced in
2464 for (vector<boost::shared_ptr<Source> >::iterator i = dead_sources.begin(); i != dead_sources.end();++i) {
2466 for (AudioRegionList::iterator r = audio_regions.begin(); r != audio_regions.end(); ) {
2467 AudioRegionList::iterator tmp;
2468 boost::shared_ptr<AudioRegion> ar;
2475 for (uint32_t n = 0; n < ar->n_channels(); ++n) {
2476 if (ar->source (n) == (*i)) {
2477 /* this region is dead */
2486 /* build a list of all the possible sound directories for the session */
2488 for (i = session_dirs.begin(); i != session_dirs.end(); ) {
2493 sound_path += (*i).path;
2494 sound_path += sound_dir_name;
2496 if (nexti != session_dirs.end()) {
2503 /* now do the same thing for the files that ended up in the sounds dir(s)
2504 but are not referenced as sources in any snapshot.
2507 soundfiles = scanner (sound_path, accept_all_non_peak_files, (void *) 0, false, true);
2509 if (soundfiles == 0) {
2513 /* find all sources, but don't use this snapshot because the
2514 state file on disk still references sources we may have already
2518 find_all_sources_across_snapshots (all_sources, true);
2520 /* add our current source list
2523 for (AudioSourceList::iterator i = audio_sources.begin(); i != audio_sources.end(); ++i) {
2524 boost::shared_ptr<AudioFileSource> fs;
2526 if ((fs = boost::dynamic_pointer_cast<AudioFileSource> (i->second)) != 0) {
2527 all_sources.insert (fs->path());
2531 for (vector<string*>::iterator x = soundfiles->begin(); x != soundfiles->end(); ++x) {
2536 for (set<string>::iterator i = all_sources.begin(); i != all_sources.end(); ++i) {
2546 unused.push_back (spath);
2550 /* now try to move all unused files into the "dead_sounds" directory(ies) */
2552 for (vector<string>::iterator x = unused.begin(); x != unused.end(); ++x) {
2553 struct stat statbuf;
2555 rep.paths.push_back (*x);
2556 if (stat ((*x).c_str(), &statbuf) == 0) {
2557 rep.space += statbuf.st_size;
2562 /* don't move the file across filesystems, just
2563 stick it in the `dead_sound_dir_name' directory
2564 on whichever filesystem it was already on.
2567 newpath = Glib::path_get_dirname (*x);
2568 newpath = Glib::path_get_dirname (newpath);
2571 newpath += dead_sound_dir_name;
2573 newpath += Glib::path_get_basename ((*x));
2575 if (access (newpath.c_str(), F_OK) == 0) {
2577 /* the new path already exists, try versioning */
2579 char buf[PATH_MAX+1];
2583 snprintf (buf, sizeof (buf), "%s.%d", newpath.c_str(), version);
2586 while (access (newpath_v.c_str(), F_OK) == 0 && version < 999) {
2587 snprintf (buf, sizeof (buf), "%s.%d", newpath.c_str(), ++version);
2591 if (version == 999) {
2592 error << string_compose (_("there are already 1000 files with names like %1; versioning discontinued"),
2596 newpath = newpath_v;
2601 /* it doesn't exist, or we can't read it or something */
2605 if (::rename ((*x).c_str(), newpath.c_str()) != 0) {
2606 error << string_compose (_("cannot rename audio file source from %1 to %2 (%3)"),
2607 (*x), newpath, strerror (errno))
2613 /* see if there an easy to find peakfile for this file, and remove it.
2616 string peakpath = (*x).substr (0, (*x).find_last_of ('.'));
2617 peakpath += ".peak";
2619 if (access (peakpath.c_str(), W_OK) == 0) {
2620 if (::unlink (peakpath.c_str()) != 0) {
2621 error << string_compose (_("cannot remove peakfile %1 for %2 (%3)"),
2622 peakpath, _path, strerror (errno))
2624 /* try to back out */
2625 rename (newpath.c_str(), _path.c_str());
2634 /* dump the history list */
2638 /* save state so we don't end up a session file
2639 referring to non-existent sources.
2645 _state_of_the_state = (StateOfTheState) (_state_of_the_state & ~InCleanup);
2650 Session::cleanup_trash_sources (Session::cleanup_report& rep)
2652 vector<space_and_path>::iterator i;
2653 string dead_sound_dir;
2654 struct dirent* dentry;
2655 struct stat statbuf;
2661 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2663 dead_sound_dir = (*i).path;
2664 dead_sound_dir += dead_sound_dir_name;
2666 if ((dead = opendir (dead_sound_dir.c_str())) == 0) {
2670 while ((dentry = readdir (dead)) != 0) {
2672 /* avoid '.' and '..' */
2674 if ((dentry->d_name[0] == '.' && dentry->d_name[1] == '\0') ||
2675 (dentry->d_name[2] == '\0' && dentry->d_name[0] == '.' && dentry->d_name[1] == '.')) {
2681 fullpath = dead_sound_dir;
2683 fullpath += dentry->d_name;
2685 if (stat (fullpath.c_str(), &statbuf)) {
2689 if (!S_ISREG (statbuf.st_mode)) {
2693 if (unlink (fullpath.c_str())) {
2694 error << string_compose (_("cannot remove dead sound file %1 (%2)"),
2695 fullpath, strerror (errno))
2699 rep.paths.push_back (dentry->d_name);
2700 rep.space += statbuf.st_size;
2711 Session::set_dirty ()
2713 bool was_dirty = dirty();
2715 _state_of_the_state = StateOfTheState (_state_of_the_state | Dirty);
2718 DirtyChanged(); /* EMIT SIGNAL */
2724 Session::set_clean ()
2726 bool was_dirty = dirty();
2728 _state_of_the_state = Clean;
2731 DirtyChanged(); /* EMIT SIGNAL */
2736 Session::add_controllable (Controllable* c)
2738 Glib::Mutex::Lock lm (controllables_lock);
2739 controllables.insert (c);
2743 Session::remove_controllable (Controllable* c)
2745 if (_state_of_the_state | Deletion) {
2749 Glib::Mutex::Lock lm (controllables_lock);
2751 Controllables::iterator x = controllables.find (c);
2753 if (x != controllables.end()) {
2754 controllables.erase (x);
2759 Session::controllable_by_id (const PBD::ID& id)
2761 Glib::Mutex::Lock lm (controllables_lock);
2763 for (Controllables::iterator i = controllables.begin(); i != controllables.end(); ++i) {
2764 if ((*i)->id() == id) {
2773 Session::add_instant_xml (XMLNode& node, const std::string& dir)
2775 Stateful::add_instant_xml (node, dir);
2776 Config->add_instant_xml (node, get_user_ardour_path());
2781 Session::save_history (string snapshot_name)
2787 tree.set_root (&history.get_state());
2789 if (snapshot_name.empty()) {
2790 snapshot_name = _current_snapshot_name;
2793 xml_path = _path + snapshot_name + ".history";
2795 bak_path = xml_path + ".bak";
2797 if ((access (xml_path.c_str(), F_OK) == 0) &&
2798 (rename (xml_path.c_str(), bak_path.c_str())))
2800 error << _("could not backup old history file, current history not saved.") << endmsg;
2804 cerr << "actually writing history\n";
2806 if (!tree.write (xml_path))
2808 error << string_compose (_("history could not be saved to %1"), xml_path) << endmsg;
2810 /* don't leave a corrupt file lying around if it is
2814 if (unlink (xml_path.c_str()))
2816 error << string_compose (_("could not remove corrupt history file %1"), xml_path) << endmsg;
2818 if (rename (bak_path.c_str(), xml_path.c_str()))
2820 error << string_compose (_("could not restore history file from backup %1"), bak_path) << endmsg;
2831 Session::restore_history (string snapshot_name)
2837 xmlpath = _path + snapshot_name + ".history";
2838 cerr << string_compose(_("Loading history from '%1'."), xmlpath) << endmsg;
2840 if (access (xmlpath.c_str(), F_OK)) {
2841 error << string_compose(_("%1: session history file \"%2\" doesn't exist!"), _name, xmlpath) << endmsg;
2845 if (!tree.read (xmlpath)) {
2846 error << string_compose(_("Could not understand ardour file %1"), xmlpath) << endmsg;
2850 /* replace history */
2853 for (XMLNodeConstIterator it = tree.root()->children().begin(); it != tree.root()->children().end(); it++) {
2856 UndoTransaction* ut = new UndoTransaction ();
2859 ut->set_name(t->property("name")->value());
2860 stringstream ss(t->property("tv_sec")->value());
2862 ss.str(t->property("tv_usec")->value());
2864 ut->set_timestamp(tv);
2866 for (XMLNodeConstIterator child_it = t->children().begin();
2867 child_it != t->children().end();
2870 XMLNode *n = *child_it;
2873 if (n->name() == "MementoCommand" ||
2874 n->name() == "MementoUndoCommand" ||
2875 n->name() == "MementoRedoCommand") {
2876 if ((c = memento_command_factory(n))) {
2880 error << string_compose(_("Couldn't figure out how to make a Command out of a %1 XMLNode."), n->name()) << endmsg;
2891 Session::config_changed (const char* parameter_name)
2893 #define PARAM_IS(x) (!strcmp (parameter_name, (x)))
2895 if (PARAM_IS ("seamless-loop")) {
2897 } else if (PARAM_IS ("rf-speed")) {
2899 } else if (PARAM_IS ("auto-loop")) {
2901 } else if (PARAM_IS ("auto-input")) {
2903 if (Config->get_monitoring_model() == HardwareMonitoring && transport_rolling()) {
2904 /* auto-input only makes a difference if we're rolling */
2906 boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
2908 for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
2909 if ((*i)->record_enabled ()) {
2910 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
2911 (*i)->monitor_input (!Config->get_auto_input());
2916 } else if (PARAM_IS ("punch-in")) {
2920 if ((location = _locations.auto_punch_location()) != 0) {
2922 if (Config->get_punch_in ()) {
2923 replace_event (Event::PunchIn, location->start());
2925 remove_event (location->start(), Event::PunchIn);
2929 } else if (PARAM_IS ("punch-out")) {
2933 if ((location = _locations.auto_punch_location()) != 0) {
2935 if (Config->get_punch_out()) {
2936 replace_event (Event::PunchOut, location->end());
2938 clear_events (Event::PunchOut);
2942 } else if (PARAM_IS ("edit-mode")) {
2944 Glib::Mutex::Lock lm (playlist_lock);
2946 for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); ++i) {
2947 (*i)->set_edit_mode (Config->get_edit_mode ());
2950 } else if (PARAM_IS ("use-video-sync")) {
2952 if (transport_stopped()) {
2953 if (Config->get_use_video_sync()) {
2954 waiting_for_sync_offset = true;
2958 } else if (PARAM_IS ("mmc-control")) {
2960 poke_midi_thread ();
2962 } else if (PARAM_IS ("midi-control")) {
2964 poke_midi_thread ();
2966 } else if (PARAM_IS ("raid-path")) {
2968 setup_raid_path (Config->get_raid_path());
2970 } else if (PARAM_IS ("smpte-frames-per-second") || PARAM_IS ("smpte-drop-frames")) {
2974 } else if (PARAM_IS ("video-pullup")) {
2978 } else if (PARAM_IS ("seamless-loop")) {
2980 if (play_loop && transport_rolling()) {
2981 // to reset diskstreams etc
2982 request_play_loop (true);
2985 } else if (PARAM_IS ("rf-speed")) {
2987 cumulative_rf_motion = 0;
2990 } else if (PARAM_IS ("click-sound")) {
2992 setup_click_sounds (1);
2994 } else if (PARAM_IS ("click-emphasis-sound")) {
2996 setup_click_sounds (-1);
2998 } else if (PARAM_IS ("clicking")) {
3000 if (Config->get_clicking()) {
3001 if (_click_io && click_data) { // don't require emphasis data
3008 } else if (PARAM_IS ("send-mtc")) {
3010 /* only set the internal flag if we have
3014 if (_mtc_port != 0) {
3015 session_send_mtc = Config->get_send_mtc();
3018 } else if (PARAM_IS ("send-mmc")) {
3020 /* only set the internal flag if we have
3024 if (_mmc_port != 0) {
3025 session_send_mmc = Config->get_send_mmc();
3028 } else if (PARAM_IS ("midi-feedback")) {
3030 /* only set the internal flag if we have
3034 if (_mtc_port != 0) {
3035 session_midi_feedback = Config->get_midi_feedback();
3038 } else if (PARAM_IS ("jack-time-master")) {
3040 engine().reset_timebase ();
3042 } else if (PARAM_IS ("native-file-header-format")) {
3044 if (!first_file_header_format_reset) {
3045 reset_native_file_format ();
3048 first_file_header_format_reset = false;
3050 } else if (PARAM_IS ("native-file-data-format")) {
3052 if (!first_file_data_format_reset) {
3053 reset_native_file_format ();
3056 first_file_data_format_reset = false;