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 SndFileSource::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 AutomationList::AutomationListCreated.connect (mem_fun (*this, &Session::add_automation_list));
245 Controllable::Destroyed.connect (mem_fun (*this, &Session::remove_controllable));
247 IO::MoreOutputs.connect (mem_fun (*this, &Session::ensure_passthru_buffers));
249 /* stop IO objects from doing stuff until we're ready for them */
251 IO::disable_panners ();
252 IO::disable_ports ();
253 IO::disable_connecting ();
257 Session::second_stage_init (bool new_session)
259 AudioFileSource::set_peak_dir (peak_dir());
262 if (load_state (_current_snapshot_name)) {
265 remove_empty_sounds ();
268 if (start_butler_thread()) {
272 if (start_midi_thread ()) {
276 // set_state() will call setup_raid_path(), but if it's a new session we need
277 // to call setup_raid_path() here.
279 if (set_state (*state_tree->root())) {
283 setup_raid_path(_path);
286 /* we can't save till after ::when_engine_running() is called,
287 because otherwise we save state with no connections made.
288 therefore, we reset _state_of_the_state because ::set_state()
289 will have cleared it.
291 we also have to include Loading so that any events that get
292 generated between here and the end of ::when_engine_running()
293 will be processed directly rather than queued.
296 _state_of_the_state = StateOfTheState (_state_of_the_state|CannotSave|Loading);
298 // set_auto_input (true);
299 _locations.changed.connect (mem_fun (this, &Session::locations_changed));
300 _locations.added.connect (mem_fun (this, &Session::locations_added));
301 setup_click_sounds (0);
302 setup_midi_control ();
304 /* Pay attention ... */
306 _engine.Halted.connect (mem_fun (*this, &Session::engine_halted));
307 _engine.Xrun.connect (mem_fun (*this, &Session::xrun_recovery));
309 if (_engine.running()) {
310 when_engine_running();
312 first_time_running = _engine.Running.connect (mem_fun (*this, &Session::when_engine_running));
315 send_full_time_code ();
316 _engine.transport_locate (0);
317 deliver_mmc (MIDI::MachineControl::cmdMmcReset, 0);
318 deliver_mmc (MIDI::MachineControl::cmdLocate, 0);
320 ControlProtocolManager::instance().set_session (*this);
323 _end_location_is_free = true;
325 _end_location_is_free = false;
332 Session::raid_path () const
336 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
341 return path.substr (0, path.length() - 1); // drop final colon
345 Session::setup_raid_path (string path)
347 string::size_type colon;
351 string::size_type len = path.length();
356 if (path.length() == 0) {
360 session_dirs.clear ();
362 for (string::size_type n = 0; n < len; ++n) {
363 if (path[n] == ':') {
370 /* no multiple search path, just one location (common case) */
374 session_dirs.push_back (sp);
381 if (fspath[fspath.length()-1] != '/') {
384 fspath += sound_dir (false);
386 AudioFileSource::set_search_path (fspath);
393 while ((colon = remaining.find_first_of (':')) != string::npos) {
396 sp.path = remaining.substr (0, colon);
397 session_dirs.push_back (sp);
399 /* add sounds to file search path */
402 if (fspath[fspath.length()-1] != '/') {
405 fspath += sound_dir (false);
408 remaining = remaining.substr (colon+1);
411 if (remaining.length()) {
418 if (fspath[fspath.length()-1] != '/') {
421 fspath += sound_dir (false);
424 session_dirs.push_back (sp);
427 /* set the AudioFileSource search path */
429 AudioFileSource::set_search_path (fspath);
431 /* reset the round-robin soundfile path thingie */
433 last_rr_session_dir = session_dirs.begin();
437 Session::create (bool& new_session, string* mix_template, nframes_t initial_length)
441 if (g_mkdir_with_parents (_path.c_str(), 0755) < 0) {
442 error << string_compose(_("Session: cannot create session dir \"%1\" (%2)"), _path, strerror (errno)) << endmsg;
448 if (g_mkdir_with_parents (dir.c_str(), 0755) < 0) {
449 error << string_compose(_("Session: cannot create session peakfile dir \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
455 if (g_mkdir_with_parents (dir.c_str(), 0755) < 0) {
456 error << string_compose(_("Session: cannot create session sounds dir \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
460 dir = dead_sound_dir ();
462 if (g_mkdir_with_parents (dir.c_str(), 0755) < 0) {
463 error << string_compose(_("Session: cannot create session dead sounds dir \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
467 dir = automation_dir ();
469 if (g_mkdir_with_parents (dir.c_str(), 0755) < 0) {
470 error << string_compose(_("Session: cannot create session automation dir \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
475 /* check new_session so we don't overwrite an existing one */
478 std::string in_path = *mix_template;
480 ifstream in(in_path.c_str());
483 string out_path = _path;
485 out_path += _statefile_suffix;
487 ofstream out(out_path.c_str());
492 // okay, session is set up. Treat like normal saved
493 // session from now on.
499 error << string_compose (_("Could not open %1 for writing mix template"), out_path)
505 error << string_compose (_("Could not open mix template %1 for reading"), in_path)
512 /* set initial start + end point */
514 start_location->set_end (0);
515 _locations.add (start_location);
517 end_location->set_end (initial_length);
518 _locations.add (end_location);
520 _state_of_the_state = Clean;
522 if (save_state (_current_snapshot_name)) {
523 save_history (_current_snapshot_name);
531 Session::load_diskstreams (const XMLNode& node)
534 XMLNodeConstIterator citer;
536 clist = node.children();
538 for (citer = clist.begin(); citer != clist.end(); ++citer) {
542 boost::shared_ptr<AudioDiskstream> dstream (new AudioDiskstream (*this, **citer));
543 add_diskstream (dstream);
546 catch (failed_constructor& err) {
547 error << _("Session: could not load diskstream via XML state") << endmsg;
556 Session::remove_pending_capture_state ()
561 xml_path += _current_snapshot_name;
562 xml_path += _pending_suffix;
564 unlink (xml_path.c_str());
568 Session::save_state (string snapshot_name, bool pending)
574 if (_state_of_the_state & CannotSave) {
578 tree.set_root (&get_state());
580 if (snapshot_name.empty()) {
581 snapshot_name = _current_snapshot_name;
587 xml_path += snapshot_name;
588 xml_path += _statefile_suffix;
592 // Make backup of state file
594 if ((access (xml_path.c_str(), F_OK) == 0) &&
595 (rename(xml_path.c_str(), bak_path.c_str()))) {
596 error << _("could not backup old state file, current state not saved.") << endmsg;
603 xml_path += snapshot_name;
604 xml_path += _pending_suffix;
608 cerr << "actually writing state\n";
610 if (!tree.write (xml_path)) {
611 error << string_compose (_("state could not be saved to %1"), xml_path) << endmsg;
613 /* don't leave a corrupt file lying around if it is
617 if (unlink (xml_path.c_str())) {
618 error << string_compose (_("could not remove corrupt state file %1"), xml_path) << endmsg;
621 if (rename (bak_path.c_str(), xml_path.c_str())) {
622 error << string_compose (_("could not restore state file from backup %1"), bak_path) << endmsg;
631 save_history(snapshot_name);
633 bool was_dirty = dirty();
635 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
638 DirtyChanged (); /* EMIT SIGNAL */
641 StateSaved (snapshot_name); /* EMIT SIGNAL */
648 Session::restore_state (string snapshot_name)
650 if (load_state (snapshot_name) == 0) {
651 set_state (*state_tree->root());
658 Session::load_state (string snapshot_name)
667 state_was_pending = false;
669 /* check for leftover pending state from a crashed capture attempt */
672 xmlpath += snapshot_name;
673 xmlpath += _pending_suffix;
675 if (!access (xmlpath.c_str(), F_OK)) {
677 /* there is pending state from a crashed capture attempt */
679 if (AskAboutPendingState()) {
680 state_was_pending = true;
684 if (!state_was_pending) {
687 xmlpath += snapshot_name;
688 xmlpath += _statefile_suffix;
691 if (access (xmlpath.c_str(), F_OK)) {
692 error << string_compose(_("%1: session state information file \"%2\" doesn't exist!"), _name, xmlpath) << endmsg;
696 state_tree = new XMLTree;
700 if (state_tree->read (xmlpath)) {
703 error << string_compose(_("Could not understand ardour file %1"), xmlpath) << endmsg;
712 Session::load_options (const XMLNode& node)
716 LocaleGuard lg (X_("POSIX"));
718 Config->set_variables (node, ConfigVariableBase::Session);
720 if ((child = find_named_node (node, "end-marker-is-free")) != 0) {
721 if ((prop = child->property ("val")) != 0) {
722 _end_location_is_free = (prop->value() == "yes");
730 Session::save_config_options_predicate (ConfigVariableBase::Owner owner) const
732 const ConfigVariableBase::Owner modified_by_session_or_user = (ConfigVariableBase::Owner)
733 (ConfigVariableBase::Session|ConfigVariableBase::Interface);
735 return owner & modified_by_session_or_user;
739 Session::get_options () const
742 LocaleGuard lg (X_("POSIX"));
744 XMLNode& option_root = Config->get_variables (mem_fun (*this, &Session::save_config_options_predicate));
746 child = option_root.add_child ("end-marker-is-free");
747 child->add_property ("val", _end_location_is_free ? "yes" : "no");
759 Session::get_template()
761 /* if we don't disable rec-enable, diskstreams
762 will believe they need to store their capture
763 sources in their state node.
766 disable_record (false);
772 Session::state(bool full_state)
774 XMLNode* node = new XMLNode("Session");
777 // store libardour version, just in case
779 snprintf(buf, sizeof(buf)-1, "%d.%d.%d",
780 libardour_major_version, libardour_minor_version, libardour_micro_version);
781 node->add_property("version", string(buf));
783 /* store configuration settings */
788 node->add_property ("name", _name);
790 if (session_dirs.size() > 1) {
794 vector<space_and_path>::iterator i = session_dirs.begin();
795 vector<space_and_path>::iterator next;
797 ++i; /* skip the first one */
801 while (i != session_dirs.end()) {
805 if (next != session_dirs.end()) {
815 child = node->add_child ("Path");
816 child->add_content (p);
820 /* save the ID counter */
822 snprintf (buf, sizeof (buf), "%" PRIu64, ID::counter());
823 node->add_property ("id-counter", buf);
825 /* various options */
827 node->add_child_nocopy (get_options());
829 child = node->add_child ("Sources");
832 Glib::Mutex::Lock sl (audio_source_lock);
834 for (AudioSourceList::iterator siter = audio_sources.begin(); siter != audio_sources.end(); ++siter) {
836 /* Don't save information about AudioFileSources that are empty */
838 boost::shared_ptr<AudioFileSource> fs;
840 if ((fs = boost::dynamic_pointer_cast<AudioFileSource> (siter->second)) != 0) {
842 /* destructive file sources are OK if they are empty, because
843 we will re-use them every time.
846 if (!fs->destructive()) {
847 if (fs->length() == 0) {
853 child->add_child_nocopy (siter->second->get_state());
857 child = node->add_child ("Regions");
860 Glib::Mutex::Lock rl (region_lock);
862 for (AudioRegionList::const_iterator i = audio_regions.begin(); i != audio_regions.end(); ++i) {
864 /* only store regions not attached to playlists */
866 if (i->second->playlist() == 0) {
867 child->add_child_nocopy (i->second->state (true));
872 child = node->add_child ("DiskStreams");
875 boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
876 for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
877 if (!(*i)->hidden()) {
878 child->add_child_nocopy ((*i)->get_state());
883 node->add_child_nocopy (_locations.get_state());
885 child = node->add_child ("Connections");
887 Glib::Mutex::Lock lm (connection_lock);
888 for (ConnectionList::iterator i = _connections.begin(); i != _connections.end(); ++i) {
889 if (!(*i)->system_dependent()) {
890 child->add_child_nocopy ((*i)->get_state());
895 child = node->add_child ("Routes");
897 boost::shared_ptr<RouteList> r = routes.reader ();
899 RoutePublicOrderSorter cmp;
900 RouteList public_order (*r);
901 public_order.sort (cmp);
903 for (RouteList::iterator i = public_order.begin(); i != public_order.end(); ++i) {
904 if (!(*i)->hidden()) {
906 child->add_child_nocopy ((*i)->get_state());
908 child->add_child_nocopy ((*i)->get_template());
915 child = node->add_child ("EditGroups");
916 for (list<RouteGroup *>::iterator i = edit_groups.begin(); i != edit_groups.end(); ++i) {
917 child->add_child_nocopy ((*i)->get_state());
920 child = node->add_child ("MixGroups");
921 for (list<RouteGroup *>::iterator i = mix_groups.begin(); i != mix_groups.end(); ++i) {
922 child->add_child_nocopy ((*i)->get_state());
925 child = node->add_child ("Playlists");
926 for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); ++i) {
927 if (!(*i)->hidden()) {
928 if (!(*i)->empty()) {
930 child->add_child_nocopy ((*i)->get_state());
932 child->add_child_nocopy ((*i)->get_template());
938 child = node->add_child ("UnusedPlaylists");
939 for (PlaylistList::iterator i = unused_playlists.begin(); i != unused_playlists.end(); ++i) {
940 if (!(*i)->hidden()) {
941 if (!(*i)->empty()) {
943 child->add_child_nocopy ((*i)->get_state());
945 child->add_child_nocopy ((*i)->get_template());
953 child = node->add_child ("Click");
954 child->add_child_nocopy (_click_io->state (full_state));
958 child = node->add_child ("NamedSelections");
959 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
961 child->add_child_nocopy ((*i)->get_state());
966 node->add_child_nocopy (_tempo_map->get_state());
968 node->add_child_nocopy (get_control_protocol_state());
971 node->add_child_copy (*_extra_xml);
978 Session::get_control_protocol_state ()
980 ControlProtocolManager& cpm (ControlProtocolManager::instance());
981 XMLNode* node = new XMLNode (X_("ControlProtocols"));
983 cpm.foreach_known_protocol (bind (mem_fun (*this, &Session::add_control_protocol), node));
989 Session::add_control_protocol (const ControlProtocolInfo* const cpi, XMLNode* node)
992 node->add_child_nocopy (cpi->protocol->get_state());
997 Session::set_state (const XMLNode& node)
1001 const XMLProperty* prop;
1004 _state_of_the_state = StateOfTheState (_state_of_the_state|CannotSave);
1006 if (node.name() != X_("Session")){
1007 fatal << _("programming error: Session: incorrect XML node sent to set_state()") << endmsg;
1011 if ((prop = node.property ("name")) != 0) {
1012 _name = prop->value ();
1015 setup_raid_path(_path);
1017 if ((prop = node.property (X_("id-counter"))) != 0) {
1019 sscanf (prop->value().c_str(), "%" PRIu64, &x);
1020 ID::init_counter (x);
1022 /* old sessions used a timebased counter, so fake
1023 the startup ID counter based on a standard
1028 ID::init_counter (now);
1032 IO::disable_ports ();
1033 IO::disable_connecting ();
1035 /* Object loading order:
1053 if (use_config_midi_ports ()) {
1056 if ((child = find_named_node (node, "extra")) != 0) {
1057 _extra_xml = new XMLNode (*child);
1060 if (((child = find_named_node (node, "Options")) != 0)) { /* old style */
1061 load_options (*child);
1062 } else if ((child = find_named_node (node, "Config")) != 0) { /* new style */
1063 load_options (*child);
1065 error << _("Session: XML state has no options section") << endmsg;
1068 if ((child = find_named_node (node, "Locations")) == 0) {
1069 error << _("Session: XML state has no locations section") << endmsg;
1071 } else if (_locations.set_state (*child)) {
1077 if ((location = _locations.auto_loop_location()) != 0) {
1078 set_auto_loop_location (location);
1081 if ((location = _locations.auto_punch_location()) != 0) {
1082 set_auto_punch_location (location);
1085 if ((location = _locations.end_location()) == 0) {
1086 _locations.add (end_location);
1088 delete end_location;
1089 end_location = location;
1092 if ((location = _locations.start_location()) == 0) {
1093 _locations.add (start_location);
1095 delete start_location;
1096 start_location = location;
1099 AudioFileSource::set_header_position_offset (start_location->start());
1101 if ((child = find_named_node (node, "Sources")) == 0) {
1102 error << _("Session: XML state has no sources section") << endmsg;
1104 } else if (load_sources (*child)) {
1108 if ((child = find_named_node (node, "Regions")) == 0) {
1109 error << _("Session: XML state has no Regions section") << endmsg;
1111 } else if (load_regions (*child)) {
1115 if ((child = find_named_node (node, "Playlists")) == 0) {
1116 error << _("Session: XML state has no playlists section") << endmsg;
1118 } else if (load_playlists (*child)) {
1122 if ((child = find_named_node (node, "UnusedPlaylists")) == 0) {
1124 } else if (load_unused_playlists (*child)) {
1128 if ((child = find_named_node (node, "NamedSelections")) != 0) {
1129 if (load_named_selections (*child)) {
1134 if ((child = find_named_node (node, "DiskStreams")) == 0) {
1135 error << _("Session: XML state has no diskstreams section") << endmsg;
1137 } else if (load_diskstreams (*child)) {
1141 if ((child = find_named_node (node, "Connections")) == 0) {
1142 error << _("Session: XML state has no connections section") << endmsg;
1144 } else if (load_connections (*child)) {
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;