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.
20 #define __STDC_FORMAT_MACROS 1
28 #include <sigc++/bind.h>
30 #include <cstdio> /* snprintf(3) ... grrr */
45 #include <sys/param.h>
46 #include <sys/mount.h>
51 #include <midi++/mmc.h>
52 #include <midi++/port.h>
53 #include <pbd/error.h>
55 #include <glibmm/thread.h>
56 #include <pbd/pathscanner.h>
57 #include <pbd/pthread_utils.h>
58 #include <pbd/search_path.h>
59 #include <pbd/stacktrace.h>
60 #include <pbd/copyfile.h>
62 #include <ardour/audioengine.h>
63 #include <ardour/configuration.h>
64 #include <ardour/session.h>
65 #include <ardour/session_directory.h>
66 #include <ardour/session_utils.h>
67 #include <ardour/buffer.h>
68 #include <ardour/audio_diskstream.h>
69 #include <ardour/midi_diskstream.h>
70 #include <ardour/utils.h>
71 #include <ardour/audioplaylist.h>
72 #include <ardour/midi_playlist.h>
73 #include <ardour/smf_source.h>
74 #include <ardour/audiofilesource.h>
75 #include <ardour/silentfilesource.h>
76 #include <ardour/sndfilesource.h>
77 #include <ardour/midi_source.h>
78 #include <ardour/sndfile_helpers.h>
79 #include <ardour/auditioner.h>
80 #include <ardour/export.h>
81 #include <ardour/io_processor.h>
82 #include <ardour/send.h>
83 #include <ardour/processor.h>
84 #include <ardour/bundle.h>
85 #include <ardour/slave.h>
86 #include <ardour/tempo.h>
87 #include <ardour/audio_track.h>
88 #include <ardour/midi_track.h>
89 #include <ardour/cycle_timer.h>
90 #include <ardour/utils.h>
91 #include <ardour/named_selection.h>
92 #include <ardour/version.h>
93 #include <ardour/location.h>
94 #include <ardour/audioregion.h>
95 #include <ardour/midi_region.h>
96 #include <ardour/crossfade.h>
97 #include <ardour/control_protocol_manager.h>
98 #include <ardour/region_factory.h>
99 #include <ardour/source_factory.h>
100 #include <ardour/playlist_factory.h>
101 #include <ardour/filename_extensions.h>
102 #include <ardour/directory_names.h>
103 #include <ardour/template_utils.h>
105 #include <control_protocol/control_protocol.h>
111 using namespace ARDOUR;
115 Session::first_stage_init (string fullpath, string snapshot_name)
117 if (fullpath.length() == 0) {
119 throw failed_constructor();
122 char buf[PATH_MAX+1];
123 if (!realpath (fullpath.c_str(), buf) && (errno != ENOENT)) {
124 error << string_compose(_("Could not use path %1 (%s)"), buf, strerror(errno)) << endmsg;
126 throw failed_constructor();
131 if (_path[_path.length()-1] != '/') {
135 /* these two are just provisional settings. set_state()
136 will likely override them.
139 _name = _current_snapshot_name = snapshot_name;
141 _current_frame_rate = _engine.frame_rate ();
142 _tempo_map = new TempoMap (_current_frame_rate);
143 _tempo_map->StateChanged.connect (mem_fun (*this, &Session::tempo_map_changed));
145 g_atomic_int_set (&processing_prohibited, 0);
147 _transport_speed = 0;
148 _last_transport_speed = 0;
149 auto_play_legal = false;
150 transport_sub_state = 0;
151 _transport_frame = 0;
153 end_location = new Location (0, 0, _("end"), Location::Flags ((Location::IsMark|Location::IsEnd)));
154 start_location = new Location (0, 0, _("start"), Location::Flags ((Location::IsMark|Location::IsStart)));
155 _end_location_is_free = true;
156 g_atomic_int_set (&_record_status, Disabled);
157 loop_changing = false;
159 _last_roll_location = 0;
160 _last_record_location = 0;
161 pending_locate_frame = 0;
162 pending_locate_roll = false;
163 pending_locate_flush = false;
164 dstream_buffer_size = 0;
166 state_was_pending = false;
168 outbound_mtc_smpte_frame = 0;
169 next_quarter_frame_to_send = -1;
170 current_block_size = 0;
171 solo_update_disabled = false;
172 currently_soloing = false;
173 _have_captured = false;
174 _worst_output_latency = 0;
175 _worst_input_latency = 0;
176 _worst_track_latency = 0;
177 _state_of_the_state = StateOfTheState(CannotSave|InitialConnecting|Loading|Deletion);
179 butler_mixdown_buffer = 0;
180 butler_gain_buffer = 0;
182 session_send_mmc = false;
183 session_send_mtc = false;
184 post_transport_work = PostTransportWork (0);
185 g_atomic_int_set (&butler_should_do_transport_work, 0);
186 g_atomic_int_set (&butler_active, 0);
187 g_atomic_int_set (&_playback_load, 100);
188 g_atomic_int_set (&_capture_load, 100);
189 g_atomic_int_set (&_playback_load_min, 100);
190 g_atomic_int_set (&_capture_load_min, 100);
192 waiting_to_start = false;
194 _gain_automation_buffer = 0;
195 _pan_automation_buffer = 0;
197 pending_abort = false;
198 destructive_index = 0;
200 first_file_data_format_reset = true;
201 first_file_header_format_reset = true;
202 butler_thread = (pthread_t) 0;
203 //midi_thread = (pthread_t) 0;
205 AudioDiskstream::allocate_working_buffers();
207 /* default short fade = 15ms */
209 Crossfade::set_short_xfade_length ((nframes_t) floor (Config->get_short_xfade_seconds() * frame_rate()));
210 SndFileSource::setup_standard_crossfades (frame_rate());
212 last_mmc_step.tv_sec = 0;
213 last_mmc_step.tv_usec = 0;
216 /* click sounds are unset by default, which causes us to internal
217 waveforms for clicks.
221 click_emphasis_data = 0;
223 click_emphasis_length = 0;
226 process_function = &Session::process_with_events;
228 if (Config->get_use_video_sync()) {
229 waiting_for_sync_offset = true;
231 waiting_for_sync_offset = false;
234 _current_frame_rate = 48000;
235 _base_frame_rate = 48000;
239 _smpte_offset_negative = true;
240 last_smpte_valid = false;
244 last_rr_session_dir = session_dirs.begin();
245 refresh_disk_space ();
247 // set_default_fade (0.2, 5.0); /* steepness, millisecs */
251 average_slave_delta = 1800;
252 have_first_delta_accumulator = false;
253 delta_accumulator_cnt = 0;
254 slave_state = Stopped;
256 _engine.GraphReordered.connect (mem_fun (*this, &Session::graph_reordered));
258 /* These are all static "per-class" signals */
260 RegionFactory::CheckNewRegion.connect (mem_fun (*this, &Session::add_region));
261 SourceFactory::SourceCreated.connect (mem_fun (*this, &Session::add_source));
262 PlaylistFactory::PlaylistCreated.connect (mem_fun (*this, &Session::add_playlist));
263 Processor::ProcessorCreated.connect (mem_fun (*this, &Session::add_processor));
264 NamedSelection::NamedSelectionCreated.connect (mem_fun (*this, &Session::add_named_selection));
265 AutomationList::AutomationListCreated.connect (mem_fun (*this, &Session::add_automation_list));
267 Controllable::Destroyed.connect (mem_fun (*this, &Session::remove_controllable));
269 IO::MoreChannels.connect (mem_fun (*this, &Session::ensure_buffers));
271 /* stop IO objects from doing stuff until we're ready for them */
273 IO::disable_panners ();
274 IO::disable_ports ();
275 IO::disable_connecting ();
279 Session::second_stage_init (bool new_session)
281 AudioFileSource::set_peak_dir (_session_dir->peak_path().to_string());
284 if (load_state (_current_snapshot_name)) {
287 remove_empty_sounds ();
290 if (start_butler_thread()) {
294 /*if (start_midi_thread ()) {
298 // set_state() will call setup_raid_path(), but if it's a new session we need
299 // to call setup_raid_path() here.
301 if (set_state (*state_tree->root())) {
305 setup_raid_path(_path);
308 /* we can't save till after ::when_engine_running() is called,
309 because otherwise we save state with no connections made.
310 therefore, we reset _state_of_the_state because ::set_state()
311 will have cleared it.
313 we also have to include Loading so that any events that get
314 generated between here and the end of ::when_engine_running()
315 will be processed directly rather than queued.
318 _state_of_the_state = StateOfTheState (_state_of_the_state|CannotSave|Loading);
320 // set_auto_input (true);
321 _locations.changed.connect (mem_fun (this, &Session::locations_changed));
322 _locations.added.connect (mem_fun (this, &Session::locations_added));
323 setup_click_sounds (0);
324 setup_midi_control ();
326 /* Pay attention ... */
328 _engine.Halted.connect (mem_fun (*this, &Session::engine_halted));
329 _engine.Xrun.connect (mem_fun (*this, &Session::xrun_recovery));
332 when_engine_running();
335 /* handle this one in a different way than all others, so that its clear what happened */
337 catch (AudioEngine::PortRegistrationFailure& err) {
338 error << _("Unable to create all required ports")
347 //send_full_time_code ();
348 _engine.transport_locate (0);
349 deliver_mmc (MIDI::MachineControl::cmdMmcReset, 0);
350 deliver_mmc (MIDI::MachineControl::cmdLocate, 0);
352 ControlProtocolManager::instance().set_session (*this);
355 _end_location_is_free = true;
357 _end_location_is_free = false;
364 Session::raid_path () const
366 SearchPath raid_search_path;
368 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
369 raid_search_path += sys::path((*i).path);
372 return raid_search_path.to_string ();
376 Session::setup_raid_path (string path)
385 session_dirs.clear ();
387 SearchPath search_path(path);
388 SearchPath sound_search_path;
389 SearchPath midi_search_path;
392 SearchPath::const_iterator i = search_path.begin();
393 i != search_path.end();
397 sp.path = (*i).to_string ();
398 sp.blocks = 0; // not needed
399 session_dirs.push_back (sp);
401 SessionDirectory sdir(sp.path);
403 sound_search_path += sdir.sound_path ();
404 midi_search_path += sdir.midi_path ();
407 // set the AudioFileSource and SMFSource search path
409 AudioFileSource::set_search_path (sound_search_path.to_string ());
410 SMFSource::set_search_path (midi_search_path.to_string ());
412 // reset the round-robin soundfile path thingie
414 last_rr_session_dir = session_dirs.begin();
418 Session::initialize_start_and_end_locations (nframes_t start, nframes_t end)
420 start_location->set_end (start);
421 _locations.add (start_location);
423 end_location->set_end (end);
424 _locations.add (end_location);
428 Session::create_session_file ()
430 _state_of_the_state = Clean;
432 if (save_state (_current_snapshot_name)) {
433 error << "Could not create new session file" << endmsg;
440 Session::create_session_file_from_template (const string& template_path)
442 sys::path session_file_path(_session_dir->root_path());
444 session_file_path /= _name + statefile_suffix;
448 sys::copy_file (template_path, session_file_path);
450 catch(sys::filesystem_error& ex)
452 error << string_compose (_("Could not use session template %1 to create new session (%2)."),
453 template_path, ex.what())
461 Session::load_diskstreams (const XMLNode& node)
464 XMLNodeConstIterator citer;
466 clist = node.children();
468 for (citer = clist.begin(); citer != clist.end(); ++citer) {
471 /* diskstreams added automatically by DiskstreamCreated handler */
472 if ((*citer)->name() == "AudioDiskstream" || (*citer)->name() == "DiskStream") {
473 boost::shared_ptr<AudioDiskstream> dstream (new AudioDiskstream (*this, **citer));
474 add_diskstream (dstream);
475 } else if ((*citer)->name() == "MidiDiskstream") {
476 boost::shared_ptr<MidiDiskstream> dstream (new MidiDiskstream (*this, **citer));
477 add_diskstream (dstream);
479 error << _("Session: unknown diskstream type in XML") << endmsg;
483 catch (failed_constructor& err) {
484 error << _("Session: could not load diskstream via XML state") << endmsg;
493 Session::maybe_write_autosave()
495 if (dirty() && record_status() != Recording) {
496 save_state("", true);
501 Session::remove_pending_capture_state ()
503 sys::path pending_state_file_path(_session_dir->root_path());
505 pending_state_file_path /= _current_snapshot_name + pending_suffix;
509 sys::remove (pending_state_file_path);
511 catch(sys::filesystem_error& ex)
513 error << string_compose(_("Could remove pending capture state at path \"%1\" (%2)"),
514 pending_state_file_path.to_string(), ex.what()) << endmsg;
518 /** Rename a state file.
519 * @param snapshot_name Snapshot name.
522 Session::rename_state (string old_name, string new_name)
524 if (old_name == _current_snapshot_name || old_name == _name) {
525 /* refuse to rename the current snapshot or the "main" one */
529 const string old_xml_path = _path + old_name + statefile_suffix;
530 const string new_xml_path = _path + new_name + statefile_suffix;
532 if (rename (old_xml_path.c_str(), new_xml_path.c_str()) != 0) {
533 error << string_compose(_("could not rename snapshot %1 to %2"), old_name, new_name) << endmsg;
537 /** Remove a state file.
538 * @param snapshot_name Snapshot name.
541 Session::remove_state (string snapshot_name)
543 if (snapshot_name == _current_snapshot_name || snapshot_name == _name) {
544 /* refuse to remove the current snapshot or the "main" one */
548 sys::path xml_path(_session_dir->root_path());
550 xml_path /= snapshot_name + statefile_suffix;
552 sys::path backup_path(xml_path.to_string() + backup_suffix);
554 /* make a backup copy of the state file */
555 if (sys::exists (xml_path)) {
556 copy_file (xml_path.to_string(), backup_path.to_string());
560 sys::remove (xml_path);
564 Session::save_state (string snapshot_name, bool pending)
567 sys::path xml_path(_session_dir->root_path());
568 sys::path bak_path(xml_path);
570 if (_state_of_the_state & CannotSave) {
574 if (!_engine.connected ()) {
575 error << _("Ardour's audio engine is not connected and state saving would lose all I/O connections. Session not saved")
580 /* tell sources we're saving first, in case they write out to a new file
581 * which should be saved with the state rather than the old one */
582 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i)
583 i->second->session_saved();
585 tree.set_root (&get_state());
587 if (snapshot_name.empty()) {
588 snapshot_name = _current_snapshot_name;
593 /* proper save: use statefile_suffix (.ardour in English) */
595 xml_path /= snapshot_name + statefile_suffix;
597 /* make a backup copy of the old file */
598 bak_path /= snapshot_name + statefile_suffix + backup_suffix;
600 if (sys::exists (xml_path)) {
601 copy_file (xml_path.to_string(), bak_path.to_string());
606 /* pending save: use pending_suffix (.pending in English) */
607 xml_path /= snapshot_name + pending_suffix;
610 sys::path tmp_path(_session_dir->root_path());
612 tmp_path /= snapshot_name + temp_suffix;
614 // cerr << "actually writing state to " << xml_path.to_string() << endl;
616 if (!tree.write (tmp_path.to_string())) {
617 error << string_compose (_("state could not be saved to %1"), tmp_path.to_string()) << endmsg;
618 sys::remove (tmp_path);
623 if (rename (tmp_path.to_string().c_str(), xml_path.to_string().c_str()) != 0) {
624 error << string_compose (_("could not rename temporary session file %1 to %2"),
625 tmp_path.to_string(), xml_path.to_string()) << endmsg;
626 sys::remove (tmp_path);
633 save_history (snapshot_name);
635 bool was_dirty = dirty();
637 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
640 DirtyChanged (); /* EMIT SIGNAL */
643 StateSaved (snapshot_name); /* EMIT SIGNAL */
650 Session::restore_state (string snapshot_name)
652 if (load_state (snapshot_name) == 0) {
653 set_state (*state_tree->root());
660 Session::load_state (string snapshot_name)
667 state_was_pending = false;
669 /* check for leftover pending state from a crashed capture attempt */
671 sys::path xmlpath(_session_dir->root_path());
672 xmlpath /= snapshot_name + pending_suffix;
674 if (sys::exists (xmlpath)) {
676 /* there is pending state from a crashed capture attempt */
678 if (AskAboutPendingState()) {
679 state_was_pending = true;
683 if (!state_was_pending) {
684 xmlpath = _session_dir->root_path();
685 xmlpath /= snapshot_name + statefile_suffix;
688 if (!sys::exists (xmlpath)) {
689 error << string_compose(_("%1: session state information file \"%2\" doesn't exist!"), _name, xmlpath.to_string()) << endmsg;
693 state_tree = new XMLTree;
697 if (!state_tree->read (xmlpath.to_string())) {
698 error << string_compose(_("Could not understand ardour file %1"), xmlpath.to_string()) << endmsg;
704 XMLNode& root (*state_tree->root());
706 if (root.name() != X_("Session")) {
707 error << string_compose (_("Session file %1 is not an Ardour session"), xmlpath.to_string()) << endmsg;
713 const XMLProperty* prop;
716 if ((prop = root.property ("version")) == 0) {
717 /* no version implies very old version of Ardour */
721 major_version = atoi (prop->value().c_str()); // grab just the first number before the period
722 if (major_version < 2) {
729 sys::path backup_path(_session_dir->root_path());
731 backup_path /= snapshot_name + "-1" + statefile_suffix;
733 info << string_compose (_("Copying old session file %1 to %2\nUse %2 with Ardour versions before 2.0 from now on"),
734 xmlpath.to_string(), backup_path.to_string())
737 copy_file (xmlpath.to_string(), backup_path.to_string());
739 /* if it fails, don't worry. right? */
746 Session::load_options (const XMLNode& node)
750 LocaleGuard lg (X_("POSIX"));
752 Config->set_variables (node, ConfigVariableBase::Session);
754 if ((child = find_named_node (node, "end-marker-is-free")) != 0) {
755 if ((prop = child->property ("val")) != 0) {
756 _end_location_is_free = (prop->value() == "yes");
764 Session::save_config_options_predicate (ConfigVariableBase::Owner owner) const
766 const ConfigVariableBase::Owner modified_by_session_or_user = (ConfigVariableBase::Owner)
767 (ConfigVariableBase::Session|ConfigVariableBase::Interface);
769 return owner & modified_by_session_or_user;
773 Session::get_options () const
776 LocaleGuard lg (X_("POSIX"));
778 XMLNode& option_root = Config->get_variables (mem_fun (*this, &Session::save_config_options_predicate));
780 child = option_root.add_child ("end-marker-is-free");
781 child->add_property ("val", _end_location_is_free ? "yes" : "no");
793 Session::get_template()
795 /* if we don't disable rec-enable, diskstreams
796 will believe they need to store their capture
797 sources in their state node.
800 disable_record (false);
806 Session::state(bool full_state)
808 XMLNode* node = new XMLNode("Session");
811 // store libardour version, just in case
813 snprintf(buf, sizeof(buf)-1, "%d.%d.%d",
814 libardour_major_version, libardour_minor_version, libardour_micro_version);
815 node->add_property("version", string(buf));
817 /* store configuration settings */
822 node->add_property ("name", _name);
824 if (session_dirs.size() > 1) {
828 vector<space_and_path>::iterator i = session_dirs.begin();
829 vector<space_and_path>::iterator next;
831 ++i; /* skip the first one */
835 while (i != session_dirs.end()) {
839 if (next != session_dirs.end()) {
849 child = node->add_child ("Path");
850 child->add_content (p);
854 /* save the ID counter */
856 snprintf (buf, sizeof (buf), "%" PRIu64, ID::counter());
857 node->add_property ("id-counter", buf);
859 /* various options */
861 node->add_child_nocopy (get_options());
863 child = node->add_child ("Sources");
866 Glib::Mutex::Lock sl (source_lock);
868 for (SourceMap::iterator siter = sources.begin(); siter != sources.end(); ++siter) {
870 /* Don't save information about AudioFileSources that are empty */
872 boost::shared_ptr<AudioFileSource> fs;
874 if ((fs = boost::dynamic_pointer_cast<AudioFileSource> (siter->second)) != 0) {
876 /* Don't save sources that are empty, unless they're destructive (which are OK
877 if they are empty, because we will re-use them every time.)
880 if (!fs->destructive()) {
881 if (fs->length() == 0) {
887 child->add_child_nocopy (siter->second->get_state());
891 child = node->add_child ("Regions");
894 Glib::Mutex::Lock rl (region_lock);
896 for (RegionList::const_iterator i = regions.begin(); i != regions.end(); ++i) {
898 /* only store regions not attached to playlists */
900 if (i->second->playlist() == 0) {
901 child->add_child_nocopy (i->second->state (true));
906 child = node->add_child ("DiskStreams");
909 boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
910 for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
911 if (!(*i)->hidden()) {
912 child->add_child_nocopy ((*i)->get_state());
918 node->add_child_nocopy (_locations.get_state());
920 // for a template, just create a new Locations, populate it
921 // with the default start and end, and get the state for that.
923 Location* start = new Location(0, 0, _("start"), Location::Flags ((Location::IsMark|Location::IsStart)));
924 Location* end = new Location(0, 0, _("end"), Location::Flags ((Location::IsMark|Location::IsEnd)));
927 end->set_end(compute_initial_length());
929 node->add_child_nocopy (loc.get_state());
932 child = node->add_child ("Connections");
934 Glib::Mutex::Lock lm (bundle_lock);
935 for (BundleList::iterator i = _bundles.begin(); i != _bundles.end(); ++i) {
936 if (!(*i)->dynamic()) {
937 child->add_child_nocopy ((*i)->get_state());
942 child = node->add_child ("Routes");
944 boost::shared_ptr<RouteList> r = routes.reader ();
946 RoutePublicOrderSorter cmp;
947 RouteList public_order (*r);
948 public_order.sort (cmp);
950 for (RouteList::iterator i = public_order.begin(); i != public_order.end(); ++i) {
951 if (!(*i)->is_hidden()) {
953 child->add_child_nocopy ((*i)->get_state());
955 child->add_child_nocopy ((*i)->get_template());
962 child = node->add_child ("EditGroups");
963 for (list<RouteGroup *>::iterator i = edit_groups.begin(); i != edit_groups.end(); ++i) {
964 child->add_child_nocopy ((*i)->get_state());
967 child = node->add_child ("MixGroups");
968 for (list<RouteGroup *>::iterator i = mix_groups.begin(); i != mix_groups.end(); ++i) {
969 child->add_child_nocopy ((*i)->get_state());
972 child = node->add_child ("Playlists");
973 for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); ++i) {
974 if (!(*i)->hidden()) {
975 if (!(*i)->empty()) {
977 child->add_child_nocopy ((*i)->get_state());
979 child->add_child_nocopy ((*i)->get_template());
985 child = node->add_child ("UnusedPlaylists");
986 for (PlaylistList::iterator i = unused_playlists.begin(); i != unused_playlists.end(); ++i) {
987 if (!(*i)->hidden()) {
988 if (!(*i)->empty()) {
990 child->add_child_nocopy ((*i)->get_state());
992 child->add_child_nocopy ((*i)->get_template());
1000 child = node->add_child ("Click");
1001 child->add_child_nocopy (_click_io->state (full_state));
1005 child = node->add_child ("NamedSelections");
1006 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
1008 child->add_child_nocopy ((*i)->get_state());
1013 node->add_child_nocopy (_tempo_map->get_state());
1015 node->add_child_nocopy (get_control_protocol_state());
1018 node->add_child_copy (*_extra_xml);
1025 Session::get_control_protocol_state ()
1027 ControlProtocolManager& cpm (ControlProtocolManager::instance());
1028 return cpm.get_state();
1032 Session::set_state (const XMLNode& node)
1036 const XMLProperty* prop;
1039 _state_of_the_state = StateOfTheState (_state_of_the_state|CannotSave);
1041 if (node.name() != X_("Session")){
1042 fatal << _("programming error: Session: incorrect XML node sent to set_state()") << endmsg;
1046 if ((prop = node.property ("name")) != 0) {
1047 _name = prop->value ();
1050 setup_raid_path(_path);
1052 if ((prop = node.property (X_("id-counter"))) != 0) {
1054 sscanf (prop->value().c_str(), "%" PRIu64, &x);
1055 ID::init_counter (x);
1057 /* old sessions used a timebased counter, so fake
1058 the startup ID counter based on a standard
1063 ID::init_counter (now);
1067 IO::disable_ports ();
1068 IO::disable_connecting ();
1070 /* Object loading order:
1088 if (use_config_midi_ports ()) {
1091 if ((child = find_named_node (node, "extra")) != 0) {
1092 _extra_xml = new XMLNode (*child);
1095 if (((child = find_named_node (node, "Options")) != 0)) { /* old style */
1096 load_options (*child);
1097 } else if ((child = find_named_node (node, "Config")) != 0) { /* new style */
1098 load_options (*child);
1100 error << _("Session: XML state has no options section") << endmsg;
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 AudioFileSource::set_header_position_offset (start_location->start());
1136 if ((child = find_named_node (node, "Sources")) == 0) {
1137 error << _("Session: XML state has no sources section") << endmsg;
1139 } else if (load_sources (*child)) {
1143 if ((child = find_named_node (node, "Regions")) == 0) {
1144 error << _("Session: XML state has no Regions section") << endmsg;
1146 } else if (load_regions (*child)) {
1150 if ((child = find_named_node (node, "Playlists")) == 0) {
1151 error << _("Session: XML state has no playlists section") << endmsg;
1153 } else if (load_playlists (*child)) {
1157 if ((child = find_named_node (node, "UnusedPlaylists")) == 0) {
1159 } else if (load_unused_playlists (*child)) {
1163 if ((child = find_named_node (node, "NamedSelections")) != 0) {
1164 if (load_named_selections (*child)) {
1169 if ((child = find_named_node (node, "DiskStreams")) == 0) {
1170 error << _("Session: XML state has no diskstreams section") << endmsg;
1172 } else if (load_diskstreams (*child)) {
1176 if ((child = find_named_node (node, "Connections")) == 0) {
1177 error << _("Session: XML state has no connections section") << endmsg;
1179 } else if (load_bundles (*child)) {
1183 if ((child = find_named_node (node, "EditGroups")) == 0) {
1184 error << _("Session: XML state has no edit groups section") << endmsg;
1186 } else if (load_edit_groups (*child)) {
1190 if ((child = find_named_node (node, "MixGroups")) == 0) {
1191 error << _("Session: XML state has no mix groups section") << endmsg;
1193 } else if (load_mix_groups (*child)) {
1197 if ((child = find_named_node (node, "TempoMap")) == 0) {
1198 error << _("Session: XML state has no Tempo Map section") << endmsg;
1200 } else if (_tempo_map->set_state (*child)) {
1204 if ((child = find_named_node (node, "Routes")) == 0) {
1205 error << _("Session: XML state has no routes section") << endmsg;
1207 } else if (load_routes (*child)) {
1211 if ((child = find_named_node (node, "Click")) == 0) {
1212 warning << _("Session: XML state has no click section") << endmsg;
1213 } else if (_click_io) {
1214 _click_io->set_state (*child);
1217 if ((child = find_named_node (node, "ControlProtocols")) != 0) {
1218 ControlProtocolManager::instance().set_protocol_states (*child);
1221 /* here beginneth the second phase ... */
1223 StateReady (); /* EMIT SIGNAL */
1225 _state_of_the_state = Clean;
1227 if (state_was_pending) {
1228 save_state (_current_snapshot_name);
1229 remove_pending_capture_state ();
1230 state_was_pending = false;
1240 Session::load_routes (const XMLNode& node)
1243 XMLNodeConstIterator niter;
1244 RouteList new_routes;
1246 nlist = node.children();
1250 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1252 boost::shared_ptr<Route> route (XMLRouteFactory (**niter));
1255 error << _("Session: cannot create Route from XML description.") << endmsg;
1259 new_routes.push_back (route);
1262 add_routes (new_routes);
1267 boost::shared_ptr<Route>
1268 Session::XMLRouteFactory (const XMLNode& node)
1270 if (node.name() != "Route") {
1271 return boost::shared_ptr<Route> ((Route*) 0);
1274 bool has_diskstream = (node.property ("diskstream") != 0 || node.property ("diskstream-id") != 0);
1276 DataType type = DataType::AUDIO;
1277 const XMLProperty* prop = node.property("default-type");
1279 type = DataType(prop->value());
1281 assert(type != DataType::NIL);
1283 if (has_diskstream) {
1284 if (type == DataType::AUDIO) {
1285 boost::shared_ptr<Route> ret (new AudioTrack (*this, node));
1288 boost::shared_ptr<Route> ret (new MidiTrack (*this, node));
1292 boost::shared_ptr<Route> ret (new Route (*this, node));
1298 Session::load_regions (const XMLNode& node)
1301 XMLNodeConstIterator niter;
1302 boost::shared_ptr<Region> region;
1304 nlist = node.children();
1308 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1309 if ((region = XMLRegionFactory (**niter, false)) == 0) {
1310 error << _("Session: cannot create Region from XML description.") << endmsg;
1317 boost::shared_ptr<Region>
1318 Session::XMLRegionFactory (const XMLNode& node, bool full)
1320 const XMLProperty* type = node.property("type");
1324 if ( !type || type->value() == "audio" ) {
1326 return boost::shared_ptr<Region>(XMLAudioRegionFactory (node, full));
1328 } else if (type->value() == "midi") {
1330 return boost::shared_ptr<Region>(XMLMidiRegionFactory (node, full));
1334 } catch (failed_constructor& err) {
1335 return boost::shared_ptr<Region> ();
1338 return boost::shared_ptr<Region> ();
1341 boost::shared_ptr<AudioRegion>
1342 Session::XMLAudioRegionFactory (const XMLNode& node, bool full)
1344 const XMLProperty* prop;
1345 boost::shared_ptr<Source> source;
1346 boost::shared_ptr<AudioSource> as;
1348 uint32_t nchans = 1;
1351 if (node.name() != X_("Region")) {
1352 return boost::shared_ptr<AudioRegion>();
1355 if ((prop = node.property (X_("channels"))) != 0) {
1356 nchans = atoi (prop->value().c_str());
1359 if ((prop = node.property ("name")) == 0) {
1360 cerr << "no name for this region\n";
1364 if ((prop = node.property (X_("source-0"))) == 0) {
1365 if ((prop = node.property ("source")) == 0) {
1366 error << _("Session: XMLNode describing a AudioRegion is incomplete (no source)") << endmsg;
1367 return boost::shared_ptr<AudioRegion>();
1371 PBD::ID s_id (prop->value());
1373 if ((source = source_by_id (s_id)) == 0) {
1374 error << string_compose(_("Session: XMLNode describing a AudioRegion references an unknown source id =%1"), s_id) << endmsg;
1375 return boost::shared_ptr<AudioRegion>();
1378 as = boost::dynamic_pointer_cast<AudioSource>(source);
1380 error << string_compose(_("Session: XMLNode describing a AudioRegion references a non-audio source id =%1"), s_id) << endmsg;
1381 return boost::shared_ptr<AudioRegion>();
1384 sources.push_back (as);
1386 /* pickup other channels */
1388 for (uint32_t n=1; n < nchans; ++n) {
1389 snprintf (buf, sizeof(buf), X_("source-%d"), n);
1390 if ((prop = node.property (buf)) != 0) {
1392 PBD::ID id2 (prop->value());
1394 if ((source = source_by_id (id2)) == 0) {
1395 error << string_compose(_("Session: XMLNode describing a AudioRegion references an unknown source id =%1"), id2) << endmsg;
1396 return boost::shared_ptr<AudioRegion>();
1399 as = boost::dynamic_pointer_cast<AudioSource>(source);
1401 error << string_compose(_("Session: XMLNode describing a AudioRegion references a non-audio source id =%1"), id2) << endmsg;
1402 return boost::shared_ptr<AudioRegion>();
1404 sources.push_back (as);
1409 boost::shared_ptr<AudioRegion> region (boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (sources, node)));
1411 /* a final detail: this is the one and only place that we know how long missing files are */
1413 if (region->whole_file()) {
1414 for (SourceList::iterator sx = sources.begin(); sx != sources.end(); ++sx) {
1415 boost::shared_ptr<SilentFileSource> sfp = boost::dynamic_pointer_cast<SilentFileSource> (*sx);
1417 sfp->set_length (region->length());
1426 catch (failed_constructor& err) {
1427 return boost::shared_ptr<AudioRegion>();
1431 boost::shared_ptr<MidiRegion>
1432 Session::XMLMidiRegionFactory (const XMLNode& node, bool full)
1434 const XMLProperty* prop;
1435 boost::shared_ptr<Source> source;
1436 boost::shared_ptr<MidiSource> ms;
1438 uint32_t nchans = 1;
1440 if (node.name() != X_("Region")) {
1441 return boost::shared_ptr<MidiRegion>();
1444 if ((prop = node.property (X_("channels"))) != 0) {
1445 nchans = atoi (prop->value().c_str());
1448 if ((prop = node.property ("name")) == 0) {
1449 cerr << "no name for this region\n";
1453 // Multiple midi channels? that's just crazy talk
1454 assert(nchans == 1);
1456 if ((prop = node.property (X_("source-0"))) == 0) {
1457 if ((prop = node.property ("source")) == 0) {
1458 error << _("Session: XMLNode describing a MidiRegion is incomplete (no source)") << endmsg;
1459 return boost::shared_ptr<MidiRegion>();
1463 PBD::ID s_id (prop->value());
1465 if ((source = source_by_id (s_id)) == 0) {
1466 error << string_compose(_("Session: XMLNode describing a MidiRegion references an unknown source id =%1"), s_id) << endmsg;
1467 return boost::shared_ptr<MidiRegion>();
1470 ms = boost::dynamic_pointer_cast<MidiSource>(source);
1472 error << string_compose(_("Session: XMLNode describing a MidiRegion references a non-midi source id =%1"), s_id) << endmsg;
1473 return boost::shared_ptr<MidiRegion>();
1476 sources.push_back (ms);
1479 boost::shared_ptr<MidiRegion> region (boost::dynamic_pointer_cast<MidiRegion> (RegionFactory::create (sources, node)));
1480 /* a final detail: this is the one and only place that we know how long missing files are */
1482 if (region->whole_file()) {
1483 for (SourceList::iterator sx = sources.begin(); sx != sources.end(); ++sx) {
1484 boost::shared_ptr<SilentFileSource> sfp = boost::dynamic_pointer_cast<SilentFileSource> (*sx);
1486 sfp->set_length (region->length());
1494 catch (failed_constructor& err) {
1495 return boost::shared_ptr<MidiRegion>();
1500 Session::get_sources_as_xml ()
1503 XMLNode* node = new XMLNode (X_("Sources"));
1504 Glib::Mutex::Lock lm (source_lock);
1506 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
1507 node->add_child_nocopy (i->second->get_state());
1514 Session::path_from_region_name (DataType type, string name, string identifier)
1516 char buf[PATH_MAX+1];
1518 SessionDirectory sdir(get_best_session_directory_for_new_source());
1519 string sound_dir = ((type == DataType::AUDIO)
1520 ? sdir.sound_path().to_string()
1521 : sdir.midi_path().to_string());
1523 string ext = ((type == DataType::AUDIO) ? ".wav" : ".mid");
1525 for (n = 0; n < 999999; ++n) {
1526 if (identifier.length()) {
1527 snprintf (buf, sizeof(buf), "%s/%s%s%" PRIu32 "%s", sound_dir.c_str(), name.c_str(),
1528 identifier.c_str(), n, ext.c_str());
1530 snprintf (buf, sizeof(buf), "%s/%s-%" PRIu32 "%s", sound_dir.c_str(), name.c_str(),
1534 if (!Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
1539 error << string_compose (_("cannot create new file from region name \"%1\" with ident = \"%2\": too many existing files with similar names"),
1548 Session::load_sources (const XMLNode& node)
1551 XMLNodeConstIterator niter;
1552 boost::shared_ptr<Source> source;
1554 nlist = node.children();
1558 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1561 if ((source = XMLSourceFactory (**niter)) == 0) {
1562 error << _("Session: cannot create Source from XML description.") << endmsg;
1566 catch (non_existent_source& err) {
1567 warning << _("A sound file is missing. It will be replaced by silence.") << endmsg;
1568 source = SourceFactory::createSilent (*this, **niter, max_frames, _current_frame_rate);
1575 boost::shared_ptr<Source>
1576 Session::XMLSourceFactory (const XMLNode& node)
1578 if (node.name() != "Source") {
1579 return boost::shared_ptr<Source>();
1583 return SourceFactory::create (*this, node);
1586 catch (failed_constructor& err) {
1587 error << _("Found a sound file that cannot be used by Ardour. Talk to the progammers.") << endmsg;
1588 return boost::shared_ptr<Source>();
1593 Session::save_template (string template_name)
1596 string xml_path, bak_path, template_path;
1598 if (_state_of_the_state & CannotSave) {
1602 sys::path user_template_dir(user_template_directory());
1606 sys::create_directories (user_template_dir);
1608 catch(sys::filesystem_error& ex)
1610 error << string_compose(_("Could not create mix templates directory \"%1\" (%2)"),
1611 user_template_dir.to_string(), ex.what()) << endmsg;
1615 tree.set_root (&get_template());
1617 sys::path template_file_path(user_template_dir);
1618 template_file_path /= template_name + template_suffix;
1620 if (sys::exists (template_file_path))
1622 warning << string_compose(_("Template \"%1\" already exists - new version not created"),
1623 template_file_path.to_string()) << endmsg;
1627 if (!tree.write (template_file_path.to_string())) {
1628 error << _("mix template not saved") << endmsg;
1636 Session::refresh_disk_space ()
1639 struct statfs statfsbuf;
1640 vector<space_and_path>::iterator i;
1641 Glib::Mutex::Lock lm (space_lock);
1644 /* get freespace on every FS that is part of the session path */
1646 _total_free_4k_blocks = 0;
1648 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
1649 statfs ((*i).path.c_str(), &statfsbuf);
1651 scale = statfsbuf.f_bsize/4096.0;
1653 (*i).blocks = (uint32_t) floor (statfsbuf.f_bavail * scale);
1654 _total_free_4k_blocks += (*i).blocks;
1660 Session::get_best_session_directory_for_new_source ()
1662 vector<space_and_path>::iterator i;
1663 string result = _session_dir->root_path().to_string();
1665 /* handle common case without system calls */
1667 if (session_dirs.size() == 1) {
1671 /* OK, here's the algorithm we're following here:
1673 We want to select which directory to use for
1674 the next file source to be created. Ideally,
1675 we'd like to use a round-robin process so as to
1676 get maximum performance benefits from splitting
1677 the files across multiple disks.
1679 However, in situations without much diskspace, an
1680 RR approach may end up filling up a filesystem
1681 with new files while others still have space.
1682 Its therefore important to pay some attention to
1683 the freespace in the filesystem holding each
1684 directory as well. However, if we did that by
1685 itself, we'd keep creating new files in the file
1686 system with the most space until it was as full
1687 as all others, thus negating any performance
1688 benefits of this RAID-1 like approach.
1690 So, we use a user-configurable space threshold. If
1691 there are at least 2 filesystems with more than this
1692 much space available, we use RR selection between them.
1693 If not, then we pick the filesystem with the most space.
1695 This gets a good balance between the two
1699 refresh_disk_space ();
1701 int free_enough = 0;
1703 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
1704 if ((*i).blocks * 4096 >= Config->get_disk_choice_space_threshold()) {
1709 if (free_enough >= 2) {
1710 /* use RR selection process, ensuring that the one
1714 i = last_rr_session_dir;
1717 if (++i == session_dirs.end()) {
1718 i = session_dirs.begin();
1721 if ((*i).blocks * 4096 >= Config->get_disk_choice_space_threshold()) {
1722 if (create_session_directory ((*i).path)) {
1724 last_rr_session_dir = i;
1729 } while (i != last_rr_session_dir);
1733 /* pick FS with the most freespace (and that
1734 seems to actually work ...)
1737 vector<space_and_path> sorted;
1738 space_and_path_ascending_cmp cmp;
1740 sorted = session_dirs;
1741 sort (sorted.begin(), sorted.end(), cmp);
1743 for (i = sorted.begin(); i != sorted.end(); ++i) {
1744 if (create_session_directory ((*i).path)) {
1746 last_rr_session_dir = i;
1756 Session::load_playlists (const XMLNode& node)
1759 XMLNodeConstIterator niter;
1760 boost::shared_ptr<Playlist> playlist;
1762 nlist = node.children();
1766 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1768 if ((playlist = XMLPlaylistFactory (**niter)) == 0) {
1769 error << _("Session: cannot create Playlist from XML description.") << endmsg;
1777 Session::load_unused_playlists (const XMLNode& node)
1780 XMLNodeConstIterator niter;
1781 boost::shared_ptr<Playlist> playlist;
1783 nlist = node.children();
1787 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1789 if ((playlist = XMLPlaylistFactory (**niter)) == 0) {
1790 error << _("Session: cannot create Playlist from XML description.") << endmsg;
1794 // now manually untrack it
1796 track_playlist (false, boost::weak_ptr<Playlist> (playlist));
1802 boost::shared_ptr<Playlist>
1803 Session::XMLPlaylistFactory (const XMLNode& node)
1806 return PlaylistFactory::create (*this, node);
1809 catch (failed_constructor& err) {
1810 return boost::shared_ptr<Playlist>();
1815 Session::load_named_selections (const XMLNode& node)
1818 XMLNodeConstIterator niter;
1821 nlist = node.children();
1825 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1827 if ((ns = XMLNamedSelectionFactory (**niter)) == 0) {
1828 error << _("Session: cannot create Named Selection from XML description.") << endmsg;
1836 Session::XMLNamedSelectionFactory (const XMLNode& node)
1839 return new NamedSelection (*this, node);
1842 catch (failed_constructor& err) {
1848 Session::automation_dir () const
1851 res += "automation/";
1856 Session::load_bundles (const XMLNode& node)
1858 XMLNodeList nlist = node.children();
1859 XMLNodeConstIterator niter;
1863 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1864 if ((*niter)->name() == "InputConnection") {
1865 add_bundle (new ARDOUR::InputBundle (**niter));
1866 } else if ((*niter)->name() == "OutputConnection") {
1867 add_bundle (new ARDOUR::OutputBundle (**niter));
1869 error << string_compose(_("Unknown node \"%1\" found in Connections list from state file"), (*niter)->name()) << endmsg;
1878 Session::load_edit_groups (const XMLNode& node)
1880 return load_route_groups (node, true);
1884 Session::load_mix_groups (const XMLNode& node)
1886 return load_route_groups (node, false);
1890 Session::load_route_groups (const XMLNode& node, bool edit)
1892 XMLNodeList nlist = node.children();
1893 XMLNodeConstIterator niter;
1898 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1899 if ((*niter)->name() == "RouteGroup") {
1901 rg = add_edit_group ("");
1902 rg->set_state (**niter);
1904 rg = add_mix_group ("");
1905 rg->set_state (**niter);
1914 state_file_filter (const string &str, void *arg)
1916 return (str.length() > strlen(statefile_suffix) &&
1917 str.find (statefile_suffix) == (str.length() - strlen (statefile_suffix)));
1921 bool operator()(const string* a, const string* b) {
1927 remove_end(string* state)
1929 string statename(*state);
1931 string::size_type start,end;
1932 if ((start = statename.find_last_of ('/')) != string::npos) {
1933 statename = statename.substr (start+1);
1936 if ((end = statename.rfind(".ardour")) == string::npos) {
1937 end = statename.length();
1940 return new string(statename.substr (0, end));
1944 Session::possible_states (string path)
1946 PathScanner scanner;
1947 vector<string*>* states = scanner (path, state_file_filter, 0, false, false);
1949 transform(states->begin(), states->end(), states->begin(), remove_end);
1952 sort (states->begin(), states->end(), cmp);
1958 Session::possible_states () const
1960 return possible_states(_path);
1964 Session::auto_save()
1966 save_state (_current_snapshot_name);
1970 Session::add_edit_group (string name)
1972 RouteGroup* rg = new RouteGroup (*this, name);
1973 edit_groups.push_back (rg);
1974 edit_group_added (rg); /* EMIT SIGNAL */
1980 Session::add_mix_group (string name)
1982 RouteGroup* rg = new RouteGroup (*this, name, RouteGroup::Relative);
1983 mix_groups.push_back (rg);
1984 mix_group_added (rg); /* EMIT SIGNAL */
1990 Session::remove_edit_group (RouteGroup& rg)
1992 list<RouteGroup*>::iterator i;
1994 if ((i = find (edit_groups.begin(), edit_groups.end(), &rg)) != edit_groups.end()) {
1995 (*i)->apply (&Route::drop_edit_group, this);
1996 edit_groups.erase (i);
1997 edit_group_removed (); /* EMIT SIGNAL */
2004 Session::remove_mix_group (RouteGroup& rg)
2006 list<RouteGroup*>::iterator i;
2008 if ((i = find (mix_groups.begin(), mix_groups.end(), &rg)) != mix_groups.end()) {
2009 (*i)->apply (&Route::drop_mix_group, this);
2010 mix_groups.erase (i);
2011 mix_group_removed (); /* EMIT SIGNAL */
2018 Session::mix_group_by_name (string name)
2020 list<RouteGroup *>::iterator i;
2022 for (i = mix_groups.begin(); i != mix_groups.end(); ++i) {
2023 if ((*i)->name() == name) {
2031 Session::edit_group_by_name (string name)
2033 list<RouteGroup *>::iterator i;
2035 for (i = edit_groups.begin(); i != edit_groups.end(); ++i) {
2036 if ((*i)->name() == name) {
2044 Session::begin_reversible_command (const string& name)
2046 current_trans = new UndoTransaction;
2047 current_trans->set_name (name);
2051 Session::commit_reversible_command (Command *cmd)
2056 current_trans->add_command (cmd);
2059 gettimeofday (&now, 0);
2060 current_trans->set_timestamp (now);
2062 _history.add (current_trans);
2065 Session::GlobalRouteBooleanState
2066 Session::get_global_route_boolean (bool (Route::*method)(void) const)
2068 GlobalRouteBooleanState s;
2069 boost::shared_ptr<RouteList> r = routes.reader ();
2071 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2072 if (!(*i)->is_hidden()) {
2073 RouteBooleanState v;
2076 Route* r = (*i).get();
2077 v.second = (r->*method)();
2086 Session::GlobalRouteMeterState
2087 Session::get_global_route_metering ()
2089 GlobalRouteMeterState s;
2090 boost::shared_ptr<RouteList> r = routes.reader ();
2092 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2093 if (!(*i)->is_hidden()) {
2097 v.second = (*i)->meter_point();
2107 Session::set_global_route_metering (GlobalRouteMeterState s, void* arg)
2109 for (GlobalRouteMeterState::iterator i = s.begin(); i != s.end(); ++i) {
2111 boost::shared_ptr<Route> r = (i->first.lock());
2114 r->set_meter_point (i->second, arg);
2120 Session::set_global_route_boolean (GlobalRouteBooleanState s, void (Route::*method)(bool, void*), void* arg)
2122 for (GlobalRouteBooleanState::iterator i = s.begin(); i != s.end(); ++i) {
2124 boost::shared_ptr<Route> r = (i->first.lock());
2127 Route* rp = r.get();
2128 (rp->*method) (i->second, arg);
2134 Session::set_global_mute (GlobalRouteBooleanState s, void* src)
2136 set_global_route_boolean (s, &Route::set_mute, src);
2140 Session::set_global_solo (GlobalRouteBooleanState s, void* src)
2142 set_global_route_boolean (s, &Route::set_solo, src);
2146 Session::set_global_record_enable (GlobalRouteBooleanState s, void* src)
2148 set_global_route_boolean (s, &Route::set_record_enable, src);
2153 Session::global_mute_memento (void* src)
2155 return sigc::bind (mem_fun (*this, &Session::set_global_mute), get_global_route_boolean (&Route::muted), src);
2159 Session::global_metering_memento (void* src)
2161 return sigc::bind (mem_fun (*this, &Session::set_global_route_metering), get_global_route_metering (), src);
2165 Session::global_solo_memento (void* src)
2167 return sigc::bind (mem_fun (*this, &Session::set_global_solo), get_global_route_boolean (&Route::soloed), src);
2171 Session::global_record_enable_memento (void* src)
2173 return sigc::bind (mem_fun (*this, &Session::set_global_record_enable), get_global_route_boolean (&Route::record_enabled), src);
2178 accept_all_non_peak_files (const string& path, void *arg)
2180 return (path.length() > 5 && path.find (peakfile_suffix) != (path.length() - 5));
2184 accept_all_state_files (const string& path, void *arg)
2186 return (path.length() > 7 && path.find (".ardour") == (path.length() - 7));
2190 Session::find_all_sources (string path, set<string>& result)
2195 if (!tree.read (path)) {
2199 if ((node = find_named_node (*tree.root(), "Sources")) == 0) {
2204 XMLNodeConstIterator niter;
2206 nlist = node->children();
2210 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2214 if ((prop = (*niter)->property (X_("name"))) == 0) {
2218 if (prop->value()[0] == '/') {
2219 /* external file, ignore */
2223 sys::path source_path = _session_dir->sound_path ();
2225 source_path /= prop->value ();
2227 result.insert (source_path.to_string ());
2234 Session::find_all_sources_across_snapshots (set<string>& result, bool exclude_this_snapshot)
2236 PathScanner scanner;
2237 vector<string*>* state_files;
2239 string this_snapshot_path;
2245 if (ripped[ripped.length()-1] == '/') {
2246 ripped = ripped.substr (0, ripped.length() - 1);
2249 state_files = scanner (ripped, accept_all_state_files, (void *) 0, false, true);
2251 if (state_files == 0) {
2256 this_snapshot_path = _path;
2257 this_snapshot_path += _current_snapshot_name;
2258 this_snapshot_path += statefile_suffix;
2260 for (vector<string*>::iterator i = state_files->begin(); i != state_files->end(); ++i) {
2262 if (exclude_this_snapshot && **i == this_snapshot_path) {
2266 if (find_all_sources (**i, result) < 0) {
2274 struct RegionCounter {
2275 typedef std::map<PBD::ID,boost::shared_ptr<AudioSource> > AudioSourceList;
2276 AudioSourceList::iterator iter;
2277 boost::shared_ptr<Region> region;
2280 RegionCounter() : count (0) {}
2284 Session::cleanup_sources (Session::cleanup_report& rep)
2286 // FIXME: needs adaptation to midi
2288 vector<boost::shared_ptr<Source> > dead_sources;
2289 vector<boost::shared_ptr<Playlist> > playlists_tbd;
2290 PathScanner scanner;
2292 vector<space_and_path>::iterator i;
2293 vector<space_and_path>::iterator nexti;
2294 vector<string*>* soundfiles;
2295 vector<string> unused;
2296 set<string> all_sources;
2301 _state_of_the_state = (StateOfTheState) (_state_of_the_state | InCleanup);
2303 /* step 1: consider deleting all unused playlists */
2305 for (PlaylistList::iterator x = unused_playlists.begin(); x != unused_playlists.end(); ++x) {
2308 status = AskAboutPlaylistDeletion (*x);
2317 playlists_tbd.push_back (*x);
2321 /* leave it alone */
2326 /* now delete any that were marked for deletion */
2328 for (vector<boost::shared_ptr<Playlist> >::iterator x = playlists_tbd.begin(); x != playlists_tbd.end(); ++x) {
2329 (*x)->drop_references ();
2332 playlists_tbd.clear ();
2334 /* step 2: find all un-used sources */
2339 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ) {
2341 SourceMap::iterator tmp;
2346 /* do not bother with files that are zero size, otherwise we remove the current "nascent"
2350 if (!i->second->used() && i->second->length() > 0) {
2351 dead_sources.push_back (i->second);
2352 i->second->GoingAway();
2358 /* build a list of all the possible sound directories for the session */
2360 for (i = session_dirs.begin(); i != session_dirs.end(); ) {
2365 SessionDirectory sdir ((*i).path);
2366 sound_path += sdir.sound_path().to_string();
2368 if (nexti != session_dirs.end()) {
2375 /* now do the same thing for the files that ended up in the sounds dir(s)
2376 but are not referenced as sources in any snapshot.
2379 soundfiles = scanner (sound_path, accept_all_non_peak_files, (void *) 0, false, true);
2381 if (soundfiles == 0) {
2385 /* find all sources, but don't use this snapshot because the
2386 state file on disk still references sources we may have already
2390 find_all_sources_across_snapshots (all_sources, true);
2392 /* add our current source list
2395 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2396 boost::shared_ptr<AudioFileSource> fs;
2398 if ((fs = boost::dynamic_pointer_cast<AudioFileSource> (i->second)) != 0) {
2399 all_sources.insert (fs->path());
2403 char tmppath1[PATH_MAX+1];
2404 char tmppath2[PATH_MAX+1];
2406 for (vector<string*>::iterator x = soundfiles->begin(); x != soundfiles->end(); ++x) {
2411 for (set<string>::iterator i = all_sources.begin(); i != all_sources.end(); ++i) {
2413 realpath(spath.c_str(), tmppath1);
2414 realpath((*i).c_str(), tmppath2);
2416 if (strcmp(tmppath1, tmppath2) == 0) {
2423 unused.push_back (spath);
2427 /* now try to move all unused files into the "dead_sounds" directory(ies) */
2429 for (vector<string>::iterator x = unused.begin(); x != unused.end(); ++x) {
2430 struct stat statbuf;
2432 rep.paths.push_back (*x);
2433 if (stat ((*x).c_str(), &statbuf) == 0) {
2434 rep.space += statbuf.st_size;
2439 /* don't move the file across filesystems, just
2440 stick it in the `dead_sound_dir_name' directory
2441 on whichever filesystem it was already on.
2444 if ((*x).find ("/sounds/") != string::npos) {
2446 /* old school, go up 1 level */
2448 newpath = Glib::path_get_dirname (*x); // "sounds"
2449 newpath = Glib::path_get_dirname (newpath); // "session-name"
2453 /* new school, go up 4 levels */
2455 newpath = Glib::path_get_dirname (*x); // "audiofiles"
2456 newpath = Glib::path_get_dirname (newpath); // "session-name"
2457 newpath = Glib::path_get_dirname (newpath); // "interchange"
2458 newpath = Glib::path_get_dirname (newpath); // "session-dir"
2462 newpath += dead_sound_dir_name;
2464 if (g_mkdir_with_parents (newpath.c_str(), 0755) < 0) {
2465 error << string_compose(_("Session: cannot create session peakfile dir \"%1\" (%2)"), newpath, strerror (errno)) << endmsg;
2470 newpath += Glib::path_get_basename ((*x));
2472 if (access (newpath.c_str(), F_OK) == 0) {
2474 /* the new path already exists, try versioning */
2476 char buf[PATH_MAX+1];
2480 snprintf (buf, sizeof (buf), "%s.%d", newpath.c_str(), version);
2483 while (access (newpath_v.c_str(), F_OK) == 0 && version < 999) {
2484 snprintf (buf, sizeof (buf), "%s.%d", newpath.c_str(), ++version);
2488 if (version == 999) {
2489 error << string_compose (_("there are already 1000 files with names like %1; versioning discontinued"),
2493 newpath = newpath_v;
2498 /* it doesn't exist, or we can't read it or something */
2502 if (::rename ((*x).c_str(), newpath.c_str()) != 0) {
2503 error << string_compose (_("cannot rename audio file source from %1 to %2 (%3)"),
2504 (*x), newpath, strerror (errno))
2509 /* see if there an easy to find peakfile for this file, and remove it.
2512 string peakpath = (*x).substr (0, (*x).find_last_of ('.'));
2513 peakpath += peakfile_suffix;
2515 if (access (peakpath.c_str(), W_OK) == 0) {
2516 if (::unlink (peakpath.c_str()) != 0) {
2517 error << string_compose (_("cannot remove peakfile %1 for %2 (%3)"),
2518 peakpath, _path, strerror (errno))
2520 /* try to back out */
2521 rename (newpath.c_str(), _path.c_str());
2529 /* dump the history list */
2533 /* save state so we don't end up a session file
2534 referring to non-existent sources.
2540 _state_of_the_state = (StateOfTheState) (_state_of_the_state & ~InCleanup);
2545 Session::cleanup_trash_sources (Session::cleanup_report& rep)
2547 // FIXME: needs adaptation for MIDI
2549 vector<space_and_path>::iterator i;
2550 string dead_sound_dir;
2551 struct dirent* dentry;
2552 struct stat statbuf;
2558 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2560 dead_sound_dir = (*i).path;
2561 dead_sound_dir += dead_sound_dir_name;
2563 if ((dead = opendir (dead_sound_dir.c_str())) == 0) {
2567 while ((dentry = readdir (dead)) != 0) {
2569 /* avoid '.' and '..' */
2571 if ((dentry->d_name[0] == '.' && dentry->d_name[1] == '\0') ||
2572 (dentry->d_name[2] == '\0' && dentry->d_name[0] == '.' && dentry->d_name[1] == '.')) {
2578 fullpath = dead_sound_dir;
2580 fullpath += dentry->d_name;
2582 if (stat (fullpath.c_str(), &statbuf)) {
2586 if (!S_ISREG (statbuf.st_mode)) {
2590 if (unlink (fullpath.c_str())) {
2591 error << string_compose (_("cannot remove dead sound file %1 (%2)"),
2592 fullpath, strerror (errno))
2596 rep.paths.push_back (dentry->d_name);
2597 rep.space += statbuf.st_size;
2608 Session::set_dirty ()
2610 bool was_dirty = dirty();
2612 _state_of_the_state = StateOfTheState (_state_of_the_state | Dirty);
2615 DirtyChanged(); /* EMIT SIGNAL */
2621 Session::set_clean ()
2623 bool was_dirty = dirty();
2625 _state_of_the_state = Clean;
2628 DirtyChanged(); /* EMIT SIGNAL */
2633 Session::set_deletion_in_progress ()
2635 _state_of_the_state = StateOfTheState (_state_of_the_state | Deletion);
2639 Session::add_controllable (boost::shared_ptr<Controllable> c)
2641 /* this adds a controllable to the list managed by the Session.
2642 this is a subset of those managed by the Controllable class
2643 itself, and represents the only ones whose state will be saved
2644 as part of the session.
2647 Glib::Mutex::Lock lm (controllables_lock);
2648 controllables.insert (c);
2651 struct null_deleter { void operator()(void const *) const {} };
2654 Session::remove_controllable (Controllable* c)
2656 if (_state_of_the_state | Deletion) {
2660 Glib::Mutex::Lock lm (controllables_lock);
2662 Controllables::iterator x = controllables.find(
2663 boost::shared_ptr<Controllable>(c, null_deleter()));
2665 if (x != controllables.end()) {
2666 controllables.erase (x);
2670 boost::shared_ptr<Controllable>
2671 Session::controllable_by_id (const PBD::ID& id)
2673 Glib::Mutex::Lock lm (controllables_lock);
2675 for (Controllables::iterator i = controllables.begin(); i != controllables.end(); ++i) {
2676 if ((*i)->id() == id) {
2681 return boost::shared_ptr<Controllable>();
2685 Session::add_instant_xml (XMLNode& node)
2687 Stateful::add_instant_xml (node, _path);
2688 Config->add_instant_xml (node);
2692 Session::instant_xml (const string& node_name)
2694 return Stateful::instant_xml (node_name, _path);
2698 Session::save_history (string snapshot_name)
2704 tree.set_root (&_history.get_state (Config->get_saved_history_depth()));
2706 if (snapshot_name.empty()) {
2707 snapshot_name = _current_snapshot_name;
2710 xml_path = _path + snapshot_name + ".history";
2712 bak_path = xml_path + ".bak";
2714 if ((access (xml_path.c_str(), F_OK) == 0) &&
2715 (rename (xml_path.c_str(), bak_path.c_str())))
2717 error << _("could not backup old history file, current history not saved.") << endmsg;
2721 if (!tree.write (xml_path))
2723 error << string_compose (_("history could not be saved to %1"), xml_path) << endmsg;
2725 /* don't leave a corrupt file lying around if it is
2729 if (unlink (xml_path.c_str())) {
2730 error << string_compose (_("could not remove corrupt history file %1"), xml_path) << endmsg;
2732 if (rename (bak_path.c_str(), xml_path.c_str()))
2734 error << string_compose (_("could not restore history file from backup %1"), bak_path) << endmsg;
2745 Session::restore_history (string snapshot_name)
2750 if (snapshot_name.empty()) {
2751 snapshot_name = _current_snapshot_name;
2755 xmlpath = _path + snapshot_name + ".history";
2756 cerr << string_compose(_("Loading history from '%1'."), xmlpath) << endmsg;
2758 if (access (xmlpath.c_str(), F_OK)) {
2759 info << string_compose (_("%1: no history file \"%2\" for this session."), _name, xmlpath) << endmsg;
2763 if (!tree.read (xmlpath)) {
2764 error << string_compose (_("Could not understand session history file \"%1\""), xmlpath) << endmsg;
2768 /* replace history */
2771 for (XMLNodeConstIterator it = tree.root()->children().begin(); it != tree.root()->children().end(); it++) {
2774 UndoTransaction* ut = new UndoTransaction ();
2777 ut->set_name(t->property("name")->value());
2778 stringstream ss(t->property("tv_sec")->value());
2780 ss.str(t->property("tv_usec")->value());
2782 ut->set_timestamp(tv);
2784 for (XMLNodeConstIterator child_it = t->children().begin();
2785 child_it != t->children().end();
2788 XMLNode *n = *child_it;
2791 if (n->name() == "MementoCommand" ||
2792 n->name() == "MementoUndoCommand" ||
2793 n->name() == "MementoRedoCommand") {
2795 if ((c = memento_command_factory(n))) {
2799 } else if (n->name() == X_("GlobalRouteStateCommand")) {
2801 if ((c = global_state_command_factory (*n))) {
2802 ut->add_command (c);
2807 error << string_compose(_("Couldn't figure out how to make a Command out of a %1 XMLNode."), n->name()) << endmsg;
2818 Session::config_changed (const char* parameter_name)
2820 #define PARAM_IS(x) (!strcmp (parameter_name, (x)))
2822 if (PARAM_IS ("seamless-loop")) {
2824 } else if (PARAM_IS ("rf-speed")) {
2826 } else if (PARAM_IS ("auto-loop")) {
2828 } else if (PARAM_IS ("auto-input")) {
2830 if (Config->get_monitoring_model() == HardwareMonitoring && transport_rolling()) {
2831 /* auto-input only makes a difference if we're rolling */
2833 boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
2835 for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
2836 if ((*i)->record_enabled ()) {
2837 (*i)->monitor_input (!Config->get_auto_input());
2842 } else if (PARAM_IS ("punch-in")) {
2846 if ((location = _locations.auto_punch_location()) != 0) {
2848 if (Config->get_punch_in ()) {
2849 replace_event (Event::PunchIn, location->start());
2851 remove_event (location->start(), Event::PunchIn);
2855 } else if (PARAM_IS ("punch-out")) {
2859 if ((location = _locations.auto_punch_location()) != 0) {
2861 if (Config->get_punch_out()) {
2862 replace_event (Event::PunchOut, location->end());
2864 clear_events (Event::PunchOut);
2868 } else if (PARAM_IS ("edit-mode")) {
2870 Glib::Mutex::Lock lm (playlist_lock);
2872 for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); ++i) {
2873 (*i)->set_edit_mode (Config->get_edit_mode ());
2876 } else if (PARAM_IS ("use-video-sync")) {
2878 waiting_for_sync_offset = Config->get_use_video_sync();
2880 } else if (PARAM_IS ("mmc-control")) {
2882 //poke_midi_thread ();
2884 } else if (PARAM_IS ("mmc-device-id") || PARAM_IS ("mmc-receive-id")) {
2887 mmc->set_receive_device_id (Config->get_mmc_receive_device_id());
2890 } else if (PARAM_IS ("mmc-send-id")) {
2893 mmc->set_send_device_id (Config->get_mmc_send_device_id());
2896 } else if (PARAM_IS ("midi-control")) {
2898 //poke_midi_thread ();
2900 } else if (PARAM_IS ("raid-path")) {
2902 setup_raid_path (Config->get_raid_path());
2904 } else if (PARAM_IS ("smpte-format")) {
2908 } else if (PARAM_IS ("video-pullup")) {
2912 } else if (PARAM_IS ("seamless-loop")) {
2914 if (play_loop && transport_rolling()) {
2915 // to reset diskstreams etc
2916 request_play_loop (true);
2919 } else if (PARAM_IS ("rf-speed")) {
2921 cumulative_rf_motion = 0;
2924 } else if (PARAM_IS ("click-sound")) {
2926 setup_click_sounds (1);
2928 } else if (PARAM_IS ("click-emphasis-sound")) {
2930 setup_click_sounds (-1);
2932 } else if (PARAM_IS ("clicking")) {
2934 if (Config->get_clicking()) {
2935 if (_click_io && click_data) { // don't require emphasis data
2942 } else if (PARAM_IS ("send-mtc")) {
2944 /* only set the internal flag if we have
2948 if (_mtc_port != 0) {
2949 session_send_mtc = Config->get_send_mtc();
2950 if (session_send_mtc) {
2951 /* mark us ready to send */
2952 next_quarter_frame_to_send = 0;
2955 session_send_mtc = false;
2958 } else if (PARAM_IS ("send-mmc")) {
2960 /* only set the internal flag if we have
2964 if (_mmc_port != 0) {
2965 session_send_mmc = Config->get_send_mmc();
2968 session_send_mmc = false;
2971 } else if (PARAM_IS ("midi-feedback")) {
2973 /* only set the internal flag if we have
2977 if (_mtc_port != 0) {
2978 session_midi_feedback = Config->get_midi_feedback();
2981 } else if (PARAM_IS ("jack-time-master")) {
2983 engine().reset_timebase ();
2985 } else if (PARAM_IS ("native-file-header-format")) {
2987 if (!first_file_header_format_reset) {
2988 reset_native_file_format ();
2991 first_file_header_format_reset = false;
2993 } else if (PARAM_IS ("native-file-data-format")) {
2995 if (!first_file_data_format_reset) {
2996 reset_native_file_format ();
2999 first_file_data_format_reset = false;
3001 } else if (PARAM_IS ("slave-source")) {
3002 set_slave_source (Config->get_slave_source());
3003 } else if (PARAM_IS ("remote-model")) {
3004 set_remote_control_ids ();
3005 } else if (PARAM_IS ("denormal-model")) {