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>
91 using namespace ARDOUR;
95 Session::first_stage_init (string fullpath, string snapshot_name)
97 if (fullpath.length() == 0) {
98 throw failed_constructor();
101 char buf[PATH_MAX+1];
102 if (!realpath (fullpath.c_str(), buf) && (errno != ENOENT)) {
103 error << string_compose(_("Could not use path %1 (%s)"), buf, strerror(errno)) << endmsg;
104 throw failed_constructor();
109 if (_path[_path.length()-1] != '/') {
113 /* these two are just provisional settings. set_state()
114 will likely override them.
117 _name = _current_snapshot_name = snapshot_name;
119 _current_frame_rate = _engine.frame_rate ();
120 _tempo_map = new TempoMap (_current_frame_rate);
121 _tempo_map->StateChanged.connect (mem_fun (*this, &Session::tempo_map_changed));
123 g_atomic_int_set (&processing_prohibited, 0);
126 _transport_speed = 0;
127 _last_transport_speed = 0;
128 transport_sub_state = 0;
129 _transport_frame = 0;
131 end_location = new Location (0, 0, _("end"), Location::Flags ((Location::IsMark|Location::IsEnd)));
132 start_location = new Location (0, 0, _("start"), Location::Flags ((Location::IsMark|Location::IsStart)));
133 _end_location_is_free = true;
134 g_atomic_int_set (&_record_status, Disabled);
135 loop_changing = false;
137 _last_roll_location = 0;
138 _last_record_location = 0;
139 pending_locate_frame = 0;
140 pending_locate_roll = false;
141 pending_locate_flush = false;
142 dstream_buffer_size = 0;
144 state_was_pending = false;
146 outbound_mtc_smpte_frame = 0;
147 next_quarter_frame_to_send = -1;
148 current_block_size = 0;
149 solo_update_disabled = false;
150 currently_soloing = false;
151 _have_captured = false;
152 _worst_output_latency = 0;
153 _worst_input_latency = 0;
154 _worst_track_latency = 0;
155 _state_of_the_state = StateOfTheState(CannotSave|InitialConnecting|Loading);
157 butler_mixdown_buffer = 0;
158 butler_gain_buffer = 0;
160 session_send_mmc = false;
161 session_send_mtc = false;
162 session_midi_feedback = false;
163 post_transport_work = PostTransportWork (0);
164 g_atomic_int_set (&butler_should_do_transport_work, 0);
165 g_atomic_int_set (&butler_active, 0);
166 g_atomic_int_set (&_playback_load, 100);
167 g_atomic_int_set (&_capture_load, 100);
168 g_atomic_int_set (&_playback_load_min, 100);
169 g_atomic_int_set (&_capture_load_min, 100);
170 pending_edit_mode = Config->get_edit_mode ();
172 waiting_to_start = false;
174 _gain_automation_buffer = 0;
175 _pan_automation_buffer = 0;
177 pending_abort = false;
178 destructive_index = 0;
181 AudioDiskstream::allocate_working_buffers();
183 /* default short fade = 15ms */
185 Crossfade::set_short_xfade_length ((jack_nframes_t) floor (Config->get_short_xfade_seconds() * frame_rate()));
186 DestructiveFileSource::setup_standard_crossfades (frame_rate());
188 last_mmc_step.tv_sec = 0;
189 last_mmc_step.tv_usec = 0;
192 /* click sounds are unset by default, which causes us to internal
193 waveforms for clicks.
197 click_emphasis_data = 0;
199 click_emphasis_length = 0;
202 process_function = &Session::process_with_events;
204 if (Config->get_use_video_sync()) {
205 waiting_for_sync_offset = true;
207 waiting_for_sync_offset = false;
210 _current_frame_rate = 48000;
211 _base_frame_rate = 48000;
215 _smpte_offset_negative = true;
216 last_smpte_valid = false;
220 last_rr_session_dir = session_dirs.begin();
221 refresh_disk_space ();
223 // set_default_fade (0.2, 5.0); /* steepness, millisecs */
227 average_slave_delta = 1800;
228 have_first_delta_accumulator = false;
229 delta_accumulator_cnt = 0;
230 slave_state = Stopped;
232 _engine.GraphReordered.connect (mem_fun (*this, &Session::graph_reordered));
234 /* These are all static "per-class" signals */
236 RegionFactory::CheckNewRegion.connect (mem_fun (*this, &Session::add_region));
237 SourceFactory::SourceCreated.connect (mem_fun (*this, &Session::add_source));
238 Playlist::PlaylistCreated.connect (mem_fun (*this, &Session::add_playlist));
239 Redirect::RedirectCreated.connect (mem_fun (*this, &Session::add_redirect));
240 NamedSelection::NamedSelectionCreated.connect (mem_fun (*this, &Session::add_named_selection));
241 Curve::CurveCreated.connect (mem_fun (*this, &Session::add_curve));
242 AutomationList::AutomationListCreated.connect (mem_fun (*this, &Session::add_automation_list));
244 Controllable::Created.connect (mem_fun (*this, &Session::add_controllable));
245 Controllable::GoingAway.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, jack_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 /* we cannot set edit mode if we are loading a session,
721 because it might destroy the playlist's positioning
724 if ((child = find_named_node (node, "edit-mode")) != 0) {
725 if ((prop = child->property ("val")) != 0) {
726 if (prop->value() == "slide") {
727 pending_edit_mode = Slide;
728 } else if (prop->value() == "splice") {
729 pending_edit_mode = Splice;
734 if ((child = find_named_node (node, "end-marker-is-free")) != 0) {
735 if ((prop = child->property ("val")) != 0) {
736 _end_location_is_free = (prop->value() == "yes");
744 Session::get_options () const
747 LocaleGuard lg (X_("POSIX"));
749 XMLNode& option_root = Config->get_partial_state (ConfigVariableBase::Interface);
751 child = option_root.add_child ("end-marker-is-free");
752 child->add_property ("val", _end_location_is_free ? "yes" : "no");
754 child = option_root.add_child ("full-xfades-unmuted");
766 Session::get_template()
768 /* if we don't disable rec-enable, diskstreams
769 will believe they need to store their capture
770 sources in their state node.
773 disable_record (false);
779 Session::state(bool full_state)
781 XMLNode* node = new XMLNode("Session");
784 // store libardour version, just in case
786 snprintf(buf, sizeof(buf)-1, "%d.%d.%d",
787 libardour_major_version, libardour_minor_version, libardour_micro_version);
788 node->add_property("version", string(buf));
790 /* store configuration settings */
795 node->add_property ("name", _name);
797 if (session_dirs.size() > 1) {
801 vector<space_and_path>::iterator i = session_dirs.begin();
802 vector<space_and_path>::iterator next;
804 ++i; /* skip the first one */
808 while (i != session_dirs.end()) {
812 if (next != session_dirs.end()) {
822 child = node->add_child ("Path");
823 child->add_content (p);
827 /* save the ID counter */
829 snprintf (buf, sizeof (buf), "%" PRIu64, ID::counter());
830 node->add_property ("id-counter", buf);
832 /* various options */
834 node->add_child_nocopy (get_options());
836 child = node->add_child ("Sources");
839 Glib::Mutex::Lock sl (audio_source_lock);
841 for (AudioSourceList::iterator siter = audio_sources.begin(); siter != audio_sources.end(); ++siter) {
843 /* Don't save information about AudioFileSources that are empty */
845 boost::shared_ptr<AudioFileSource> fs;
847 if ((fs = boost::dynamic_pointer_cast<AudioFileSource> (siter->second)) != 0) {
848 boost::shared_ptr<DestructiveFileSource> dfs = boost::dynamic_pointer_cast<DestructiveFileSource> (fs);
850 /* destructive file sources are OK if they are empty, because
851 we will re-use them every time.
855 if (fs->length() == 0) {
861 child->add_child_nocopy (siter->second->get_state());
865 child = node->add_child ("Regions");
868 Glib::Mutex::Lock rl (region_lock);
870 for (AudioRegionList::const_iterator i = audio_regions.begin(); i != audio_regions.end(); ++i) {
872 /* only store regions not attached to playlists */
874 if (i->second->playlist() == 0) {
875 child->add_child_nocopy (i->second->state (true));
880 child = node->add_child ("DiskStreams");
883 boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
884 for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
885 if (!(*i)->hidden()) {
886 child->add_child_nocopy ((*i)->get_state());
891 node->add_child_nocopy (_locations.get_state());
893 child = node->add_child ("Connections");
895 Glib::Mutex::Lock lm (connection_lock);
896 for (ConnectionList::iterator i = _connections.begin(); i != _connections.end(); ++i) {
897 if (!(*i)->system_dependent()) {
898 child->add_child_nocopy ((*i)->get_state());
903 child = node->add_child ("Routes");
905 boost::shared_ptr<RouteList> r = routes.reader ();
907 RoutePublicOrderSorter cmp;
908 RouteList public_order (*r);
909 public_order.sort (cmp);
911 for (RouteList::iterator i = public_order.begin(); i != public_order.end(); ++i) {
912 if (!(*i)->hidden()) {
914 child->add_child_nocopy ((*i)->get_state());
916 child->add_child_nocopy ((*i)->get_template());
923 child = node->add_child ("EditGroups");
924 for (list<RouteGroup *>::iterator i = edit_groups.begin(); i != edit_groups.end(); ++i) {
925 child->add_child_nocopy ((*i)->get_state());
928 child = node->add_child ("MixGroups");
929 for (list<RouteGroup *>::iterator i = mix_groups.begin(); i != mix_groups.end(); ++i) {
930 child->add_child_nocopy ((*i)->get_state());
933 child = node->add_child ("Playlists");
934 for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); ++i) {
935 if (!(*i)->hidden()) {
936 if (!(*i)->empty()) {
938 child->add_child_nocopy ((*i)->get_state());
940 child->add_child_nocopy ((*i)->get_template());
946 child = node->add_child ("UnusedPlaylists");
947 for (PlaylistList::iterator i = unused_playlists.begin(); i != unused_playlists.end(); ++i) {
948 if (!(*i)->hidden()) {
949 if (!(*i)->empty()) {
951 child->add_child_nocopy ((*i)->get_state());
953 child->add_child_nocopy ((*i)->get_template());
961 child = node->add_child ("Click");
962 child->add_child_nocopy (_click_io->state (full_state));
966 child = node->add_child ("NamedSelections");
967 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
969 child->add_child_nocopy ((*i)->get_state());
974 node->add_child_nocopy (_tempo_map->get_state());
977 node->add_child_copy (*_extra_xml);
984 Session::set_state (const XMLNode& node)
988 const XMLProperty* prop;
991 _state_of_the_state = StateOfTheState (_state_of_the_state|CannotSave);
993 if (node.name() != X_("Session")){
994 fatal << _("programming error: Session: incorrect XML node sent to set_state()") << endmsg;
998 StateManager::prohibit_save ();
1000 if ((prop = node.property ("name")) != 0) {
1001 _name = prop->value ();
1004 setup_raid_path(_path);
1006 if ((prop = node.property (X_("id-counter"))) != 0) {
1008 sscanf (prop->value().c_str(), "%" PRIu64, &x);
1009 ID::init_counter (x);
1011 /* old sessions used a timebased counter, so fake
1012 the startup ID counter based on a standard
1017 ID::init_counter (now);
1021 IO::disable_ports ();
1022 IO::disable_connecting ();
1024 /* Object loading order:
1041 if (use_config_midi_ports ()) {
1044 if ((child = find_named_node (node, "extra")) != 0) {
1045 _extra_xml = new XMLNode (*child);
1048 if (((child = find_named_node (node, "Options")) != 0)) { /* old style */
1049 load_options (*child);
1050 } else if ((child = find_named_node (node, "Config")) != 0) { /* new style */
1051 load_options (*child);
1053 error << _("Session: XML state has no options section") << endmsg;
1056 if ((child = find_named_node (node, "Sources")) == 0) {
1057 error << _("Session: XML state has no sources section") << endmsg;
1059 } else if (load_sources (*child)) {
1063 if ((child = find_named_node (node, "Regions")) == 0) {
1064 error << _("Session: XML state has no Regions section") << endmsg;
1066 } else if (load_regions (*child)) {
1070 if ((child = find_named_node (node, "Playlists")) == 0) {
1071 error << _("Session: XML state has no playlists section") << endmsg;
1073 } else if (load_playlists (*child)) {
1077 if ((child = find_named_node (node, "UnusedPlaylists")) == 0) {
1079 } else if (load_unused_playlists (*child)) {
1083 if ((child = find_named_node (node, "NamedSelections")) != 0) {
1084 if (load_named_selections (*child)) {
1089 if ((child = find_named_node (node, "DiskStreams")) == 0) {
1090 error << _("Session: XML state has no diskstreams section") << endmsg;
1092 } else if (load_diskstreams (*child)) {
1096 if ((child = find_named_node (node, "Connections")) == 0) {
1097 error << _("Session: XML state has no connections section") << endmsg;
1099 } else if (load_connections (*child)) {
1103 if ((child = find_named_node (node, "Locations")) == 0) {
1104 error << _("Session: XML state has no locations section") << endmsg;
1106 } else if (_locations.set_state (*child)) {
1112 if ((location = _locations.auto_loop_location()) != 0) {
1113 set_auto_loop_location (location);
1116 if ((location = _locations.auto_punch_location()) != 0) {
1117 set_auto_punch_location (location);
1120 if ((location = _locations.end_location()) == 0) {
1121 _locations.add (end_location);
1123 delete end_location;
1124 end_location = location;
1127 if ((location = _locations.start_location()) == 0) {
1128 _locations.add (start_location);
1130 delete start_location;
1131 start_location = location;
1134 _locations.save_state (_("initial state"));
1136 if ((child = find_named_node (node, "EditGroups")) == 0) {
1137 error << _("Session: XML state has no edit groups section") << endmsg;
1139 } else if (load_edit_groups (*child)) {
1143 if ((child = find_named_node (node, "MixGroups")) == 0) {
1144 error << _("Session: XML state has no mix groups section") << endmsg;
1146 } else if (load_mix_groups (*child)) {
1150 if ((child = find_named_node (node, "TempoMap")) == 0) {
1151 error << _("Session: XML state has no Tempo Map section") << endmsg;
1153 } else if (_tempo_map->set_state (*child)) {
1157 if ((child = find_named_node (node, "Routes")) == 0) {
1158 error << _("Session: XML state has no routes section") << endmsg;
1160 } else if (load_routes (*child)) {
1164 if ((child = find_named_node (node, "Click")) == 0) {
1165 warning << _("Session: XML state has no click section") << endmsg;
1166 } else if (_click_io) {
1167 _click_io->set_state (*child);
1170 /* OK, now we can set edit mode */
1172 Config->set_edit_mode (pending_edit_mode);
1174 /* here beginneth the second phase ... */
1176 StateReady (); /* EMIT SIGNAL */
1178 _state_of_the_state = Clean;
1180 StateManager::allow_save (_("initial state"), true);
1182 if (state_was_pending) {
1183 save_state (_current_snapshot_name);
1184 remove_pending_capture_state ();
1185 state_was_pending = false;
1191 /* we failed, re-enable state saving but don't actually save internal state */
1192 StateManager::allow_save (X_("ignored"), false);
1197 Session::load_routes (const XMLNode& node)
1200 XMLNodeConstIterator niter;
1201 RouteList new_routes;
1203 nlist = node.children();
1207 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1209 boost::shared_ptr<Route> route (XMLRouteFactory (**niter));
1212 error << _("Session: cannot create Route from XML description.") << endmsg;
1216 new_routes.push_back (route);
1219 add_routes (new_routes);
1224 boost::shared_ptr<Route>
1225 Session::XMLRouteFactory (const XMLNode& node)
1227 if (node.name() != "Route") {
1228 return boost::shared_ptr<Route> ((Route*) 0);
1231 if (node.property ("diskstream") != 0 || node.property ("diskstream-id") != 0) {
1232 boost::shared_ptr<Route> x (new AudioTrack (*this, node));
1235 boost::shared_ptr<Route> x (new Route (*this, node));
1241 Session::load_regions (const XMLNode& node)
1244 XMLNodeConstIterator niter;
1245 boost::shared_ptr<AudioRegion> region;
1247 nlist = node.children();
1251 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1252 if ((region = XMLRegionFactory (**niter, false)) == 0) {
1253 error << _("Session: cannot create Region from XML description.") << endmsg;
1260 boost::shared_ptr<AudioRegion>
1261 Session::XMLRegionFactory (const XMLNode& node, bool full)
1263 const XMLProperty* prop;
1264 boost::shared_ptr<Source> source;
1265 boost::shared_ptr<AudioSource> as;
1267 uint32_t nchans = 1;
1270 if (node.name() != X_("Region")) {
1271 return boost::shared_ptr<AudioRegion>();
1274 if ((prop = node.property (X_("channels"))) != 0) {
1275 nchans = atoi (prop->value().c_str());
1279 if ((prop = node.property (X_("source-0"))) == 0) {
1280 if ((prop = node.property ("source")) == 0) {
1281 error << _("Session: XMLNode describing a AudioRegion is incomplete (no source)") << endmsg;
1282 return boost::shared_ptr<AudioRegion>();
1286 PBD::ID s_id (prop->value());
1288 if ((source = source_by_id (s_id)) == 0) {
1289 error << string_compose(_("Session: XMLNode describing a AudioRegion references an unknown source id =%1"), s_id) << endmsg;
1290 return boost::shared_ptr<AudioRegion>();
1293 as = boost::dynamic_pointer_cast<AudioSource>(source);
1295 error << string_compose(_("Session: XMLNode describing a AudioRegion references a non-audio source id =%1"), s_id) << endmsg;
1296 return boost::shared_ptr<AudioRegion>();
1299 sources.push_back (as);
1301 /* pickup other channels */
1303 for (uint32_t n=1; n < nchans; ++n) {
1304 snprintf (buf, sizeof(buf), X_("source-%d"), n);
1305 if ((prop = node.property (buf)) != 0) {
1307 PBD::ID id2 (prop->value());
1309 if ((source = source_by_id (id2)) == 0) {
1310 error << string_compose(_("Session: XMLNode describing a AudioRegion references an unknown source id =%1"), id2) << endmsg;
1311 return boost::shared_ptr<AudioRegion>();
1314 as = boost::dynamic_pointer_cast<AudioSource>(source);
1316 error << string_compose(_("Session: XMLNode describing a AudioRegion references a non-audio source id =%1"), id2) << endmsg;
1317 return boost::shared_ptr<AudioRegion>();
1319 sources.push_back (as);
1324 boost::shared_ptr<AudioRegion> region (boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (sources, node)));
1329 catch (failed_constructor& err) {
1330 return boost::shared_ptr<AudioRegion>();
1335 Session::get_sources_as_xml ()
1338 XMLNode* node = new XMLNode (X_("Sources"));
1339 Glib::Mutex::Lock lm (audio_source_lock);
1341 for (AudioSourceList::iterator i = audio_sources.begin(); i != audio_sources.end(); ++i) {
1342 node->add_child_nocopy (i->second->get_state());
1345 /* XXX get MIDI and other sources here */
1351 Session::path_from_region_name (string name, string identifier)
1353 char buf[PATH_MAX+1];
1355 string dir = discover_best_sound_dir ();
1357 for (n = 0; n < 999999; ++n) {
1358 if (identifier.length()) {
1359 snprintf (buf, sizeof(buf), "%s/%s%s%" PRIu32 ".wav", dir.c_str(), name.c_str(),
1360 identifier.c_str(), n);
1362 snprintf (buf, sizeof(buf), "%s/%s-%" PRIu32 ".wav", dir.c_str(), name.c_str(), n);
1364 if (access (buf, F_OK) != 0) {
1374 Session::load_sources (const XMLNode& node)
1377 XMLNodeConstIterator niter;
1378 boost::shared_ptr<Source> source;
1380 nlist = node.children();
1384 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1386 if ((source = XMLSourceFactory (**niter)) == 0) {
1387 error << _("Session: cannot create Source from XML description.") << endmsg;
1394 boost::shared_ptr<Source>
1395 Session::XMLSourceFactory (const XMLNode& node)
1397 if (node.name() != "Source") {
1398 return boost::shared_ptr<Source>();
1402 return SourceFactory::create (*this, node);
1405 catch (failed_constructor& err) {
1406 error << _("Found a sound file that cannot be used by Ardour. Talk to the progammers.") << endmsg;
1407 return boost::shared_ptr<Source>();
1412 Session::save_template (string template_name)
1415 string xml_path, bak_path, template_path;
1417 if (_state_of_the_state & CannotSave) {
1422 string dir = template_dir();
1424 if ((dp = opendir (dir.c_str()))) {
1427 if (g_mkdir_with_parents (dir.c_str(), S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
1428 error << string_compose(_("Could not create mix templates directory \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
1433 tree.set_root (&get_template());
1436 xml_path += template_name;
1437 xml_path += _template_suffix;
1439 ifstream in(xml_path.c_str());
1442 warning << string_compose(_("Template \"%1\" already exists - new version not created"), template_name) << endmsg;
1448 if (!tree.write (xml_path)) {
1449 error << _("mix template not saved") << endmsg;
1457 Session::rename_template (string old_name, string new_name)
1459 string old_path = template_dir() + old_name + _template_suffix;
1460 string new_path = template_dir() + new_name + _template_suffix;
1462 return rename (old_path.c_str(), new_path.c_str());
1466 Session::delete_template (string name)
1468 string template_path = template_dir();
1469 template_path += name;
1470 template_path += _template_suffix;
1472 return remove (template_path.c_str());
1476 Session::refresh_disk_space ()
1479 struct statfs statfsbuf;
1480 vector<space_and_path>::iterator i;
1481 Glib::Mutex::Lock lm (space_lock);
1484 /* get freespace on every FS that is part of the session path */
1486 _total_free_4k_blocks = 0;
1488 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
1489 statfs ((*i).path.c_str(), &statfsbuf);
1491 scale = statfsbuf.f_bsize/4096.0;
1493 (*i).blocks = (uint32_t) floor (statfsbuf.f_bavail * scale);
1494 _total_free_4k_blocks += (*i).blocks;
1500 Session::ensure_sound_dir (string path, string& result)
1505 /* Ensure that the parent directory exists */
1507 if (g_mkdir_with_parents (path.c_str(), 0775)) {
1508 error << string_compose(_("cannot create session directory \"%1\"; ignored"), path) << endmsg;
1512 /* Ensure that the sounds directory exists */
1516 result += sound_dir_name;
1518 if (g_mkdir_with_parents (result.c_str(), 0775)) {
1519 error << string_compose(_("cannot create sounds directory \"%1\"; ignored"), result) << endmsg;
1525 dead += dead_sound_dir_name;
1527 if (g_mkdir_with_parents (dead.c_str(), 0775)) {
1528 error << string_compose(_("cannot create dead sounds directory \"%1\"; ignored"), dead) << endmsg;
1534 peak += peak_dir_name;
1536 if (g_mkdir_with_parents (peak.c_str(), 0775)) {
1537 error << string_compose(_("cannot create peak file directory \"%1\"; ignored"), peak) << endmsg;
1541 /* callers expect this to be terminated ... */
1548 Session::discover_best_sound_dir (bool destructive)
1550 vector<space_and_path>::iterator i;
1553 /* handle common case without system calls */
1555 if (session_dirs.size() == 1) {
1559 /* OK, here's the algorithm we're following here:
1561 We want to select which directory to use for
1562 the next file source to be created. Ideally,
1563 we'd like to use a round-robin process so as to
1564 get maximum performance benefits from splitting
1565 the files across multiple disks.
1567 However, in situations without much diskspace, an
1568 RR approach may end up filling up a filesystem
1569 with new files while others still have space.
1570 Its therefore important to pay some attention to
1571 the freespace in the filesystem holding each
1572 directory as well. However, if we did that by
1573 itself, we'd keep creating new files in the file
1574 system with the most space until it was as full
1575 as all others, thus negating any performance
1576 benefits of this RAID-1 like approach.
1578 So, we use a user-configurable space threshold. If
1579 there are at least 2 filesystems with more than this
1580 much space available, we use RR selection between them.
1581 If not, then we pick the filesystem with the most space.
1583 This gets a good balance between the two
1587 refresh_disk_space ();
1589 int free_enough = 0;
1591 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
1592 if ((*i).blocks * 4096 >= Config->get_disk_choice_space_threshold()) {
1597 if (free_enough >= 2) {
1599 bool found_it = false;
1601 /* use RR selection process, ensuring that the one
1605 i = last_rr_session_dir;
1608 if (++i == session_dirs.end()) {
1609 i = session_dirs.begin();
1612 if ((*i).blocks * 4096 >= Config->get_disk_choice_space_threshold()) {
1613 if (ensure_sound_dir ((*i).path, result) == 0) {
1614 last_rr_session_dir = i;
1620 } while (i != last_rr_session_dir);
1623 result = sound_dir();
1628 /* pick FS with the most freespace (and that
1629 seems to actually work ...)
1632 vector<space_and_path> sorted;
1633 space_and_path_ascending_cmp cmp;
1635 sorted = session_dirs;
1636 sort (sorted.begin(), sorted.end(), cmp);
1638 for (i = sorted.begin(); i != sorted.end(); ++i) {
1639 if (ensure_sound_dir ((*i).path, result) == 0) {
1640 last_rr_session_dir = i;
1645 /* if the above fails, fall back to the most simplistic solution */
1647 if (i == sorted.end()) {
1656 Session::load_playlists (const XMLNode& node)
1659 XMLNodeConstIterator niter;
1662 nlist = node.children();
1666 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1668 if ((playlist = XMLPlaylistFactory (**niter)) == 0) {
1669 error << _("Session: cannot create Playlist from XML description.") << endmsg;
1677 Session::load_unused_playlists (const XMLNode& node)
1680 XMLNodeConstIterator niter;
1683 nlist = node.children();
1687 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1689 if ((playlist = XMLPlaylistFactory (**niter)) == 0) {
1690 error << _("Session: cannot create Playlist from XML description.") << endmsg;
1694 // now manually untrack it
1696 track_playlist (playlist, false);
1704 Session::XMLPlaylistFactory (const XMLNode& node)
1707 return new AudioPlaylist (*this, node);
1710 catch (failed_constructor& err) {
1716 Session::load_named_selections (const XMLNode& node)
1719 XMLNodeConstIterator niter;
1722 nlist = node.children();
1726 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1728 if ((ns = XMLNamedSelectionFactory (**niter)) == 0) {
1729 error << _("Session: cannot create Named Selection from XML description.") << endmsg;
1737 Session::XMLNamedSelectionFactory (const XMLNode& node)
1740 return new NamedSelection (*this, node);
1743 catch (failed_constructor& err) {
1749 Session::dead_sound_dir () const
1752 res += dead_sound_dir_name;
1758 Session::sound_dir (bool with_path) const
1760 /* support old session structure */
1762 struct stat statbuf;
1764 string old_withpath;
1766 old_nopath += old_sound_dir_name;
1769 old_withpath = _path;
1770 old_withpath += old_sound_dir_name;
1771 old_withpath += '/';
1773 if (stat (old_withpath.c_str(), &statbuf) == 0) {
1775 return old_withpath;
1786 res += interchange_dir_name;
1788 res += legalize_for_path (_name);
1790 res += sound_dir_name;
1797 Session::peak_dir () const
1800 res += peak_dir_name;
1806 Session::automation_dir () const
1809 res += "automation/";
1814 Session::template_dir ()
1816 string path = get_user_ardour_path();
1817 path += "templates/";
1823 Session::suffixed_search_path (string suffix, bool data)
1827 path += get_user_ardour_path();
1828 if (path[path.length()-1] != ':') {
1833 path += get_system_data_path();
1835 path += get_system_module_path();
1838 vector<string> split_path;
1840 split (path, split_path, ':');
1843 for (vector<string>::iterator i = split_path.begin(); i != split_path.end(); ++i) {
1848 if (distance (i, split_path.end()) != 1) {
1857 Session::template_path ()
1859 return suffixed_search_path (X_("templates"), true);
1863 Session::control_protocol_path ()
1865 return suffixed_search_path (X_("surfaces"), false);
1869 Session::load_connections (const XMLNode& node)
1871 XMLNodeList nlist = node.children();
1872 XMLNodeConstIterator niter;
1876 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1877 if ((*niter)->name() == "InputConnection") {
1878 add_connection (new ARDOUR::InputConnection (**niter));
1879 } else if ((*niter)->name() == "OutputConnection") {
1880 add_connection (new ARDOUR::OutputConnection (**niter));
1882 error << string_compose(_("Unknown node \"%1\" found in Connections list from state file"), (*niter)->name()) << endmsg;
1891 Session::load_edit_groups (const XMLNode& node)
1893 return load_route_groups (node, true);
1897 Session::load_mix_groups (const XMLNode& node)
1899 return load_route_groups (node, false);
1903 Session::load_route_groups (const XMLNode& node, bool edit)
1905 XMLNodeList nlist = node.children();
1906 XMLNodeConstIterator niter;
1911 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1912 if ((*niter)->name() == "RouteGroup") {
1914 rg = add_edit_group ("");
1915 rg->set_state (**niter);
1917 rg = add_mix_group ("");
1918 rg->set_state (**niter);
1927 state_file_filter (const string &str, void *arg)
1929 return (str.length() > strlen(Session::statefile_suffix()) &&
1930 str.find (Session::statefile_suffix()) == (str.length() - strlen (Session::statefile_suffix())));
1934 bool operator()(const string* a, const string* b) {
1940 remove_end(string* state)
1942 string statename(*state);
1944 string::size_type start,end;
1945 if ((start = statename.find_last_of ('/')) != string::npos) {
1946 statename = statename.substr (start+1);
1949 if ((end = statename.rfind(".ardour")) == string::npos) {
1950 end = statename.length();
1953 return new string(statename.substr (0, end));
1957 Session::possible_states (string path)
1959 PathScanner scanner;
1960 vector<string*>* states = scanner (path, state_file_filter, 0, false, false);
1962 transform(states->begin(), states->end(), states->begin(), remove_end);
1965 sort (states->begin(), states->end(), cmp);
1971 Session::possible_states () const
1973 return possible_states(_path);
1977 Session::auto_save()
1979 save_state (_current_snapshot_name);
1983 Session::add_edit_group (string name)
1985 RouteGroup* rg = new RouteGroup (*this, name);
1986 edit_groups.push_back (rg);
1987 edit_group_added (rg); /* EMIT SIGNAL */
1993 Session::add_mix_group (string name)
1995 RouteGroup* rg = new RouteGroup (*this, name, RouteGroup::Relative);
1996 mix_groups.push_back (rg);
1997 mix_group_added (rg); /* EMIT SIGNAL */
2003 Session::remove_edit_group (RouteGroup& rg)
2005 list<RouteGroup*>::iterator i;
2007 if ((i = find (edit_groups.begin(), edit_groups.end(), &rg)) != edit_groups.end()) {
2008 (*i)->apply (&Route::drop_edit_group, this);
2009 edit_groups.erase (i);
2010 edit_group_removed (); /* EMIT SIGNAL */
2017 Session::remove_mix_group (RouteGroup& rg)
2019 list<RouteGroup*>::iterator i;
2021 if ((i = find (mix_groups.begin(), mix_groups.end(), &rg)) != mix_groups.end()) {
2022 (*i)->apply (&Route::drop_mix_group, this);
2023 mix_groups.erase (i);
2024 mix_group_removed (); /* EMIT SIGNAL */
2031 Session::mix_group_by_name (string name)
2033 list<RouteGroup *>::iterator i;
2035 for (i = mix_groups.begin(); i != mix_groups.end(); ++i) {
2036 if ((*i)->name() == name) {
2044 Session::edit_group_by_name (string name)
2046 list<RouteGroup *>::iterator i;
2048 for (i = edit_groups.begin(); i != edit_groups.end(); ++i) {
2049 if ((*i)->name() == name) {
2057 Session::begin_reversible_command (string name)
2059 current_trans = new UndoTransaction;
2060 current_trans->set_name (name);
2064 Session::commit_reversible_command (Command *cmd)
2069 current_trans->add_command (cmd);
2072 gettimeofday (&now, 0);
2073 current_trans->set_timestamp (now);
2075 history.add (current_trans);
2078 Session::GlobalRouteBooleanState
2079 Session::get_global_route_boolean (bool (Route::*method)(void) const)
2081 GlobalRouteBooleanState s;
2082 boost::shared_ptr<RouteList> r = routes.reader ();
2084 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2085 if (!(*i)->hidden()) {
2086 RouteBooleanState v;
2089 Route* r = (*i).get();
2090 v.second = (r->*method)();
2099 Session::GlobalRouteMeterState
2100 Session::get_global_route_metering ()
2102 GlobalRouteMeterState s;
2103 boost::shared_ptr<RouteList> r = routes.reader ();
2105 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2106 if (!(*i)->hidden()) {
2110 v.second = (*i)->meter_point();
2120 Session::set_global_route_metering (GlobalRouteMeterState s, void* arg)
2122 for (GlobalRouteMeterState::iterator i = s.begin(); i != s.end(); ++i) {
2123 i->first->set_meter_point (i->second, arg);
2128 Session::set_global_route_boolean (GlobalRouteBooleanState s, void (Route::*method)(bool, void*), void* arg)
2130 for (GlobalRouteBooleanState::iterator i = s.begin(); i != s.end(); ++i) {
2131 Route* r = i->first.get();
2132 (r->*method) (i->second, arg);
2137 Session::set_global_mute (GlobalRouteBooleanState s, void* src)
2139 set_global_route_boolean (s, &Route::set_mute, src);
2143 Session::set_global_solo (GlobalRouteBooleanState s, void* src)
2145 set_global_route_boolean (s, &Route::set_solo, src);
2149 Session::set_global_record_enable (GlobalRouteBooleanState s, void* src)
2151 set_global_route_boolean (s, &Route::set_record_enable, src);
2156 Session::global_mute_memento (void* src)
2158 return sigc::bind (mem_fun (*this, &Session::set_global_mute), get_global_route_boolean (&Route::muted), src);
2162 Session::global_metering_memento (void* src)
2164 return sigc::bind (mem_fun (*this, &Session::set_global_route_metering), get_global_route_metering (), src);
2168 Session::global_solo_memento (void* src)
2170 return sigc::bind (mem_fun (*this, &Session::set_global_solo), get_global_route_boolean (&Route::soloed), src);
2174 Session::global_record_enable_memento (void* src)
2176 return sigc::bind (mem_fun (*this, &Session::set_global_record_enable), get_global_route_boolean (&Route::record_enabled), src);
2181 template_filter (const string &str, void *arg)
2183 return (str.length() > strlen(Session::template_suffix()) &&
2184 str.find (Session::template_suffix()) == (str.length() - strlen (Session::template_suffix())));
2188 Session::get_template_list (list<string> &template_names)
2190 vector<string *> *templates;
2191 PathScanner scanner;
2194 path = template_path ();
2196 templates = scanner (path, template_filter, 0, false, true);
2198 vector<string*>::iterator i;
2199 for (i = templates->begin(); i != templates->end(); ++i) {
2200 string fullpath = *(*i);
2203 start = fullpath.find_last_of ('/') + 1;
2204 if ((end = fullpath.find_last_of ('.')) <0) {
2205 end = fullpath.length();
2208 template_names.push_back(fullpath.substr(start, (end-start)));
2213 Session::read_favorite_dirs (FavoriteDirs & favs)
2215 string path = get_user_ardour_path();
2216 path += "/favorite_dirs";
2218 ifstream fav (path.c_str());
2223 if (errno != ENOENT) {
2224 //error << string_compose (_("cannot open favorite file %1 (%2)"), path, strerror (errno)) << endmsg;
2235 getline(fav, newfav);
2241 favs.push_back (newfav);
2248 Session::write_favorite_dirs (FavoriteDirs & favs)
2250 string path = get_user_ardour_path();
2251 path += "/favorite_dirs";
2253 ofstream fav (path.c_str());
2259 for (FavoriteDirs::iterator i = favs.begin(); i != favs.end(); ++i) {
2260 fav << (*i) << endl;
2267 accept_all_non_peak_files (const string& path, void *arg)
2269 return (path.length() > 5 && path.find (".peak") != (path.length() - 5));
2273 accept_all_state_files (const string& path, void *arg)
2275 return (path.length() > 7 && path.find (".ardour") == (path.length() - 7));
2279 Session::find_all_sources (string path, set<string>& result)
2284 if (!tree.read (path)) {
2288 if ((node = find_named_node (*tree.root(), "Sources")) == 0) {
2293 XMLNodeConstIterator niter;
2295 nlist = node->children();
2299 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2303 if ((prop = (*niter)->property (X_("name"))) == 0) {
2307 if (prop->value()[0] == '/') {
2308 /* external file, ignore */
2312 string path = _path; /* /-terminated */
2313 path += sound_dir_name;
2315 path += prop->value();
2317 result.insert (path);
2324 Session::find_all_sources_across_snapshots (set<string>& result, bool exclude_this_snapshot)
2326 PathScanner scanner;
2327 vector<string*>* state_files;
2329 string this_snapshot_path;
2335 if (ripped[ripped.length()-1] == '/') {
2336 ripped = ripped.substr (0, ripped.length() - 1);
2339 state_files = scanner (ripped, accept_all_state_files, (void *) 0, false, true);
2341 if (state_files == 0) {
2346 this_snapshot_path = _path;
2347 this_snapshot_path += _current_snapshot_name;
2348 this_snapshot_path += _statefile_suffix;
2350 for (vector<string*>::iterator i = state_files->begin(); i != state_files->end(); ++i) {
2352 if (exclude_this_snapshot && **i == this_snapshot_path) {
2356 if (find_all_sources (**i, result) < 0) {
2365 Session::cleanup_sources (Session::cleanup_report& rep)
2367 vector<boost::shared_ptr<Source> > dead_sources;
2368 vector<Playlist*> playlists_tbd;
2369 PathScanner scanner;
2371 vector<space_and_path>::iterator i;
2372 vector<space_and_path>::iterator nexti;
2373 vector<string*>* soundfiles;
2374 vector<string> unused;
2375 set<string> all_sources;
2380 _state_of_the_state = (StateOfTheState) (_state_of_the_state | InCleanup);
2382 /* step 1: consider deleting all unused playlists */
2384 for (PlaylistList::iterator x = unused_playlists.begin(); x != unused_playlists.end(); ++x) {
2387 status = AskAboutPlaylistDeletion (*x);
2396 playlists_tbd.push_back (*x);
2400 /* leave it alone */
2405 /* now delete any that were marked for deletion */
2407 for (vector<Playlist*>::iterator x = playlists_tbd.begin(); x != playlists_tbd.end(); ++x) {
2408 PlaylistList::iterator foo;
2410 if ((foo = unused_playlists.find (*x)) != unused_playlists.end()) {
2411 unused_playlists.erase (foo);
2416 /* step 2: clear the undo/redo history for all playlists */
2418 for (PlaylistList::iterator x = playlists.begin(); x != playlists.end(); ++x) {
2419 (*x)->drop_all_states ();
2422 /* step 3: find all un-referenced sources */
2427 for (AudioSourceList::iterator i = audio_sources.begin(); i != audio_sources.end(); ) {
2429 AudioSourceList::iterator tmp;
2434 /* only remove files that are not in use and have some size
2435 to them. otherwise we remove the current "nascent"
2439 if (i->second.use_count() == 1 && i->second->length() > 0) {
2440 dead_sources.push_back (i->second);
2442 /* remove this source from our own list to avoid us
2443 adding it to the list of all sources below
2446 audio_sources.erase (i);
2452 /* Step 4: get rid of all regions in the region list that use any dead sources
2453 in case the sources themselves don't go away (they might be referenced in
2457 for (vector<boost::shared_ptr<Source> >::iterator i = dead_sources.begin(); i != dead_sources.end();++i) {
2459 for (AudioRegionList::iterator r = audio_regions.begin(); r != audio_regions.end(); ) {
2460 AudioRegionList::iterator tmp;
2461 boost::shared_ptr<AudioRegion> ar;
2468 for (uint32_t n = 0; n < ar->n_channels(); ++n) {
2469 if (ar->source (n) == (*i)) {
2470 /* this region is dead */
2479 /* build a list of all the possible sound directories for the session */
2481 for (i = session_dirs.begin(); i != session_dirs.end(); ) {
2486 sound_path += (*i).path;
2487 sound_path += sound_dir_name;
2489 if (nexti != session_dirs.end()) {
2496 /* now do the same thing for the files that ended up in the sounds dir(s)
2497 but are not referenced as sources in any snapshot.
2500 soundfiles = scanner (sound_path, accept_all_non_peak_files, (void *) 0, false, true);
2502 if (soundfiles == 0) {
2506 /* find all sources, but don't use this snapshot because the
2507 state file on disk still references sources we may have already
2511 find_all_sources_across_snapshots (all_sources, true);
2513 /* add our current source list
2516 for (AudioSourceList::iterator i = audio_sources.begin(); i != audio_sources.end(); ++i) {
2517 boost::shared_ptr<AudioFileSource> fs;
2519 if ((fs = boost::dynamic_pointer_cast<AudioFileSource> (i->second)) != 0) {
2520 all_sources.insert (fs->path());
2524 for (vector<string*>::iterator x = soundfiles->begin(); x != soundfiles->end(); ++x) {
2529 for (set<string>::iterator i = all_sources.begin(); i != all_sources.end(); ++i) {
2539 unused.push_back (spath);
2543 /* now try to move all unused files into the "dead_sounds" directory(ies) */
2545 for (vector<string>::iterator x = unused.begin(); x != unused.end(); ++x) {
2546 struct stat statbuf;
2548 rep.paths.push_back (*x);
2549 if (stat ((*x).c_str(), &statbuf) == 0) {
2550 rep.space += statbuf.st_size;
2555 /* don't move the file across filesystems, just
2556 stick it in the `dead_sound_dir_name' directory
2557 on whichever filesystem it was already on.
2560 newpath = Glib::path_get_dirname (*x);
2561 newpath = Glib::path_get_dirname (newpath);
2564 newpath += dead_sound_dir_name;
2566 newpath += Glib::path_get_basename ((*x));
2568 if (access (newpath.c_str(), F_OK) == 0) {
2570 /* the new path already exists, try versioning */
2572 char buf[PATH_MAX+1];
2576 snprintf (buf, sizeof (buf), "%s.%d", newpath.c_str(), version);
2579 while (access (newpath_v.c_str(), F_OK) == 0 && version < 999) {
2580 snprintf (buf, sizeof (buf), "%s.%d", newpath.c_str(), ++version);
2584 if (version == 999) {
2585 error << string_compose (_("there are already 1000 files with names like %1; versioning discontinued"),
2589 newpath = newpath_v;
2594 /* it doesn't exist, or we can't read it or something */
2598 if (::rename ((*x).c_str(), newpath.c_str()) != 0) {
2599 error << string_compose (_("cannot rename audio file source from %1 to %2 (%3)"),
2600 (*x), newpath, strerror (errno))
2606 /* see if there an easy to find peakfile for this file, and remove it.
2609 string peakpath = (*x).substr (0, (*x).find_last_of ('.'));
2610 peakpath += ".peak";
2612 if (access (peakpath.c_str(), W_OK) == 0) {
2613 if (::unlink (peakpath.c_str()) != 0) {
2614 error << string_compose (_("cannot remove peakfile %1 for %2 (%3)"),
2615 peakpath, _path, strerror (errno))
2617 /* try to back out */
2618 rename (newpath.c_str(), _path.c_str());
2627 /* dump the history list */
2631 /* save state so we don't end up a session file
2632 referring to non-existent sources.
2638 _state_of_the_state = (StateOfTheState) (_state_of_the_state & ~InCleanup);
2643 Session::cleanup_trash_sources (Session::cleanup_report& rep)
2645 vector<space_and_path>::iterator i;
2646 string dead_sound_dir;
2647 struct dirent* dentry;
2648 struct stat statbuf;
2654 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2656 dead_sound_dir = (*i).path;
2657 dead_sound_dir += dead_sound_dir_name;
2659 if ((dead = opendir (dead_sound_dir.c_str())) == 0) {
2663 while ((dentry = readdir (dead)) != 0) {
2665 /* avoid '.' and '..' */
2667 if ((dentry->d_name[0] == '.' && dentry->d_name[1] == '\0') ||
2668 (dentry->d_name[2] == '\0' && dentry->d_name[0] == '.' && dentry->d_name[1] == '.')) {
2674 fullpath = dead_sound_dir;
2676 fullpath += dentry->d_name;
2678 if (stat (fullpath.c_str(), &statbuf)) {
2682 if (!S_ISREG (statbuf.st_mode)) {
2686 if (unlink (fullpath.c_str())) {
2687 error << string_compose (_("cannot remove dead sound file %1 (%2)"),
2688 fullpath, strerror (errno))
2692 rep.paths.push_back (dentry->d_name);
2693 rep.space += statbuf.st_size;
2704 Session::set_dirty ()
2706 bool was_dirty = dirty();
2708 _state_of_the_state = StateOfTheState (_state_of_the_state | Dirty);
2711 DirtyChanged(); /* EMIT SIGNAL */
2717 Session::set_clean ()
2719 bool was_dirty = dirty();
2721 _state_of_the_state = Clean;
2724 DirtyChanged(); /* EMIT SIGNAL */
2729 Session::add_controllable (Controllable* c)
2731 Glib::Mutex::Lock lm (controllables_lock);
2732 controllables.push_back (c);
2736 Session::remove_controllable (Controllable* c)
2738 if (_state_of_the_state | Deletion) {
2742 Glib::Mutex::Lock lm (controllables_lock);
2743 controllables.remove (c);
2747 Session::controllable_by_id (const PBD::ID& id)
2749 Glib::Mutex::Lock lm (controllables_lock);
2751 for (Controllables::iterator i = controllables.begin(); i != controllables.end(); ++i) {
2752 if ((*i)->id() == id) {
2761 Session::add_instant_xml (XMLNode& node, const std::string& dir)
2763 Stateful::add_instant_xml (node, dir);
2764 Config->add_instant_xml (node, get_user_ardour_path());
2769 Session::save_history (string snapshot_name)
2775 tree.set_root (&history.get_state());
2777 if (snapshot_name.empty()) {
2778 snapshot_name = _current_snapshot_name;
2781 xml_path = _path + snapshot_name + ".history";
2783 bak_path = xml_path + ".bak";
2785 if ((access (xml_path.c_str(), F_OK) == 0) &&
2786 (rename (xml_path.c_str(), bak_path.c_str())))
2788 error << _("could not backup old history file, current history not saved.") << endmsg;
2792 cerr << "actually writing history\n";
2794 if (!tree.write (xml_path))
2796 error << string_compose (_("history could not be saved to %1"), xml_path) << endmsg;
2798 /* don't leave a corrupt file lying around if it is
2802 if (unlink (xml_path.c_str()))
2804 error << string_compose (_("could not remove corrupt history file %1"), xml_path) << endmsg;
2806 if (rename (bak_path.c_str(), xml_path.c_str()))
2808 error << string_compose (_("could not restore history file from backup %1"), bak_path) << endmsg;
2819 Session::restore_history (string snapshot_name)
2825 xmlpath = _path + snapshot_name + ".history";
2826 cerr << string_compose(_("Loading history from '%1'."), xmlpath) << endmsg;
2828 if (access (xmlpath.c_str(), F_OK)) {
2829 error << string_compose(_("%1: session history file \"%2\" doesn't exist!"), _name, xmlpath) << endmsg;
2833 if (!tree.read (xmlpath)) {
2834 error << string_compose(_("Could not understand ardour file %1"), xmlpath) << endmsg;
2838 /* replace history */
2840 for (XMLNodeConstIterator it = tree.root()->children().begin();
2841 it != tree.root()->children().end();
2845 UndoTransaction* ut = new UndoTransaction ();
2848 ut->set_name(t->property("name")->value());
2849 stringstream ss(t->property("tv_sec")->value());
2851 ss.str(t->property("tv_usec")->value());
2853 ut->set_timestamp(tv);
2855 for (XMLNodeConstIterator child_it = t->children().begin();
2856 child_it != t->children().end();
2859 XMLNode *n = *child_it;
2861 if (n->name() == "MementoCommand" ||
2862 n->name() == "MementoUndoCommand" ||
2863 n->name() == "MementoRedoCommand")
2865 c = memento_command_factory(n);
2871 error << string_compose(_("Couldn't figure out how to make a Command out of a %1 XMLNode."), n->name()) << endmsg;
2881 Session::config_changed (const char* parameter_name)
2883 #define PARAM_IS(x) (!strcmp (parameter_name, (x)))
2885 if (PARAM_IS ("seamless-loop")) {
2887 } else if (PARAM_IS ("rf-speed")) {
2889 } else if (PARAM_IS ("auto-loop")) {
2891 } else if (PARAM_IS ("auto-input")) {
2893 if (Config->get_use_hardware_monitoring() && transport_rolling()) {
2894 /* auto-input only makes a difference if we're rolling */
2896 boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
2898 for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
2899 if ((*i)->record_enabled ()) {
2900 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
2901 (*i)->monitor_input (!Config->get_auto_input());
2906 } else if (PARAM_IS ("punch-in")) {
2910 if ((location = _locations.auto_punch_location()) != 0) {
2912 if (Config->get_punch_in ()) {
2913 replace_event (Event::PunchIn, location->start());
2915 remove_event (location->start(), Event::PunchIn);
2919 } else if (PARAM_IS ("punch-out")) {
2923 if ((location = _locations.auto_punch_location()) != 0) {
2925 if (Config->get_punch_out()) {
2926 replace_event (Event::PunchOut, location->end());
2928 clear_events (Event::PunchOut);
2932 } else if (PARAM_IS ("edit-mode")) {
2934 Glib::Mutex::Lock lm (playlist_lock);
2936 for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); ++i) {
2937 (*i)->set_edit_mode (Config->get_edit_mode ());
2940 } else if (PARAM_IS ("use-video-sync")) {
2942 if (transport_stopped()) {
2943 if (Config->get_use_video_sync()) {
2944 waiting_for_sync_offset = true;
2948 } else if (PARAM_IS ("mmc-control")) {
2950 poke_midi_thread ();
2952 } else if (PARAM_IS ("midi-control")) {
2954 poke_midi_thread ();
2956 } else if (PARAM_IS ("raid-path")) {
2958 setup_raid_path (Config->get_raid_path());
2960 } else if (PARAM_IS ("smpte-frames-per-second") || PARAM_IS ("smpte-drop-frames")) {
2964 } else if (PARAM_IS ("video-pullup")) {
2968 } else if (PARAM_IS ("seamless-loop")) {
2970 if (play_loop && transport_rolling()) {
2971 // to reset diskstreams etc
2972 request_play_loop (true);
2975 } else if (PARAM_IS ("rf-speed")) {
2977 cumulative_rf_motion = 0;
2980 } else if (PARAM_IS ("click-sound")) {
2982 setup_click_sounds (1);
2984 } else if (PARAM_IS ("click-emphasis-sound")) {
2986 setup_click_sounds (-1);
2988 } else if (PARAM_IS ("clicking")) {
2990 if (Config->get_clicking()) {
2991 if (_click_io && click_data) { // don't require emphasis data
2998 } else if (PARAM_IS ("send-mtc")) {
3000 /* only set the internal flag if we have
3004 if (_mtc_port != 0) {
3005 session_send_mtc = Config->get_send_mtc();
3008 } else if (PARAM_IS ("send-mmc")) {
3010 /* only set the internal flag if we have
3014 if (_mmc_port != 0) {
3015 session_send_mmc = Config->get_send_mmc();
3018 } else if (PARAM_IS ("midi-feedback")) {
3020 /* only set the internal flag if we have
3024 if (_mtc_port != 0) {
3025 session_midi_feedback = Config->get_midi_feedback();