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/midi_diskstream.h>
63 #include <ardour/utils.h>
64 #include <ardour/audioplaylist.h>
65 #include <ardour/audiofilesource.h>
66 #include <ardour/destructive_filesource.h>
67 #include <ardour/sndfile_helpers.h>
68 #include <ardour/auditioner.h>
69 #include <ardour/export.h>
70 #include <ardour/redirect.h>
71 #include <ardour/send.h>
72 #include <ardour/insert.h>
73 #include <ardour/connection.h>
74 #include <ardour/slave.h>
75 #include <ardour/tempo.h>
76 #include <ardour/audio_track.h>
77 #include <ardour/midi_track.h>
78 #include <ardour/cycle_timer.h>
79 #include <ardour/utils.h>
80 #include <ardour/named_selection.h>
81 #include <ardour/version.h>
82 #include <ardour/location.h>
83 #include <ardour/audioregion.h>
84 #include <ardour/crossfade.h>
85 #include <ardour/control_protocol_manager.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();
108 if (_path[_path.length()-1] != '/') {
112 /* these two are just provisional settings. set_state()
113 will likely override them.
116 _name = _current_snapshot_name = snapshot_name;
117 setup_raid_path (_path);
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);
139 seamless_loop = false;
140 loop_changing = false;
142 crossfades_active = false;
145 _last_roll_location = 0;
146 _last_record_location = 0;
147 pending_locate_frame = 0;
148 pending_locate_roll = false;
149 pending_locate_flush = false;
150 dstream_buffer_size = 0;
152 state_was_pending = false;
154 outbound_mtc_smpte_frame = 0;
155 next_quarter_frame_to_send = -1;
156 current_block_size = 0;
157 _solo_latched = true;
158 _solo_model = InverseMute;
159 solo_update_disabled = false;
160 currently_soloing = false;
161 _have_captured = false;
162 _worst_output_latency = 0;
163 _worst_input_latency = 0;
164 _worst_track_latency = 0;
165 _state_of_the_state = StateOfTheState(CannotSave|InitialConnecting|Loading);
168 butler_mixdown_buffer = 0;
169 butler_gain_buffer = 0;
173 post_transport_work = PostTransportWork (0);
174 g_atomic_int_set (&butler_should_do_transport_work, 0);
175 g_atomic_int_set (&butler_active, 0);
176 g_atomic_int_set (&_playback_load, 100);
177 g_atomic_int_set (&_capture_load, 100);
178 g_atomic_int_set (&_playback_load_min, 100);
179 g_atomic_int_set (&_capture_load_min, 100);
180 pending_audition_region = 0;
182 pending_edit_mode = _edit_mode;
184 input_auto_connect = AutoConnectOption (0);
185 output_auto_connect = AutoConnectOption (0);
186 waiting_to_start = false;
188 _gain_automation_buffer = 0;
189 _pan_automation_buffer = 0;
191 pending_abort = false;
192 layer_model = MoveAddHigher;
193 xfade_model = ShortCrossfade;
194 destructive_index = 0;
196 /* allocate conversion buffers */
197 _conversion_buffers[ButlerContext] = new char[AudioDiskstream::disk_io_frames() * 4];
198 _conversion_buffers[TransportContext] = new char[AudioDiskstream::disk_io_frames() * 4];
200 /* default short fade = 15ms */
202 Crossfade::set_short_xfade_length ((jack_nframes_t) floor ((15.0 * frame_rate()) / 1000.0));
203 DestructiveFileSource::setup_standard_crossfades (frame_rate());
205 last_mmc_step.tv_sec = 0;
206 last_mmc_step.tv_usec = 0;
209 preroll.type = AnyTime::Frames;
211 postroll.type = AnyTime::Frames;
214 /* click sounds are unset by default, which causes us to internal
215 waveforms for clicks.
219 click_requested = false;
221 click_emphasis_data = 0;
223 click_emphasis_length = 0;
225 process_function = &Session::process_with_events;
229 _smpte_offset_negative = true;
230 last_smpte_valid = false;
232 last_rr_session_dir = session_dirs.begin();
233 refresh_disk_space ();
235 // set_default_fade (0.2, 5.0); /* steepness, millisecs */
237 /* default configuration */
239 do_not_record_plugins = false;
240 over_length_short = 2;
241 over_length_long = 10;
242 send_midi_timecode = false;
243 send_midi_machine_control = false;
244 shuttle_speed_factor = 1.0;
245 shuttle_speed_threshold = 5;
247 _meter_hold = 100; // XXX unknown units: number of calls to meter::set()
248 _meter_falloff = 1.5f; // XXX unknown units: refresh_rate
254 average_slave_delta = 1800;
255 have_first_delta_accumulator = false;
256 delta_accumulator_cnt = 0;
257 slave_state = Stopped;
259 /* default SMPTE type is 30 FPS, non-drop */
261 set_smpte_type (30.0, false);
263 _engine.GraphReordered.connect (mem_fun (*this, &Session::graph_reordered));
265 /* These are all static "per-class" signals */
267 Region::CheckNewRegion.connect (mem_fun (*this, &Session::add_region));
268 AudioSource::AudioSourceCreated.connect (mem_fun (*this, &Session::add_audio_source));
269 Playlist::PlaylistCreated.connect (mem_fun (*this, &Session::add_playlist));
270 Redirect::RedirectCreated.connect (mem_fun (*this, &Session::add_redirect));
271 Diskstream::DiskstreamCreated.connect (mem_fun (*this, &Session::add_diskstream));
272 NamedSelection::NamedSelectionCreated.connect (mem_fun (*this, &Session::add_named_selection));
274 Controllable::Created.connect (mem_fun (*this, &Session::add_controllable));
275 Controllable::GoingAway.connect (mem_fun (*this, &Session::remove_controllable));
277 IO::MoreOutputs.connect (mem_fun (*this, &Session::ensure_passthru_buffers));
279 /* stop IO objects from doing stuff until we're ready for them */
281 IO::disable_panners ();
282 IO::disable_ports ();
283 IO::disable_connecting ();
287 Session::second_stage_init (bool new_session)
289 AudioFileSource::set_peak_dir (peak_dir());
292 if (load_state (_current_snapshot_name)) {
295 remove_empty_sounds ();
298 if (start_butler_thread()) {
302 /*if (start_midi_thread ()) {
307 if (set_state (*state_tree->root())) {
312 /* we can't save till after ::when_engine_running() is called,
313 because otherwise we save state with no connections made.
314 therefore, we reset _state_of_the_state because ::set_state()
315 will have cleared it.
317 we also have to include Loading so that any events that get
318 generated between here and the end of ::when_engine_running()
319 will be processed directly rather than queued.
322 _state_of_the_state = StateOfTheState (_state_of_the_state|CannotSave|Loading);
324 // set_auto_input (true);
325 _locations.changed.connect (mem_fun (this, &Session::locations_changed));
326 _locations.added.connect (mem_fun (this, &Session::locations_added));
327 setup_click_sounds (0);
328 setup_midi_control ();
330 /* Pay attention ... */
332 _engine.Halted.connect (mem_fun (*this, &Session::engine_halted));
333 _engine.Xrun.connect (mem_fun (*this, &Session::xrun_recovery));
335 if (_engine.running()) {
336 when_engine_running();
338 first_time_running = _engine.Running.connect (mem_fun (*this, &Session::when_engine_running));
341 //send_full_time_code ();
342 _engine.transport_locate (0);
343 deliver_mmc (MIDI::MachineControl::cmdMmcReset, 0);
344 deliver_mmc (MIDI::MachineControl::cmdLocate, 0);
346 ControlProtocolManager::instance().set_session (*this);
349 _end_location_is_free = true;
351 _end_location_is_free = false;
358 Session::raid_path () const
362 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
367 return path.substr (0, path.length() - 1); // drop final colon
371 Session::set_raid_path (string path)
373 /* public-access to setup_raid_path() */
375 setup_raid_path (path);
379 Session::setup_raid_path (string path)
381 string::size_type colon;
385 string::size_type len = path.length();
390 if (path.length() == 0) {
394 session_dirs.clear ();
396 for (string::size_type n = 0; n < len; ++n) {
397 if (path[n] == ':') {
404 /* no multiple search path, just one location (common case) */
408 session_dirs.push_back (sp);
415 if (fspath[fspath.length()-1] != '/') {
418 fspath += sound_dir_name;
424 if (fspath[fspath.length()-1] != '/') {
427 fspath += tape_dir_name;
429 AudioFileSource::set_search_path (fspath);
436 while ((colon = remaining.find_first_of (':')) != string::npos) {
439 sp.path = remaining.substr (0, colon);
440 session_dirs.push_back (sp);
442 /* add sounds to file search path */
445 if (fspath[fspath.length()-1] != '/') {
448 fspath += sound_dir_name;
451 /* add tape dir to file search path */
454 if (fspath[fspath.length()-1] != '/') {
457 fspath += tape_dir_name;
460 remaining = remaining.substr (colon+1);
463 if (remaining.length()) {
470 if (fspath[fspath.length()-1] != '/') {
473 fspath += sound_dir_name;
477 if (fspath[fspath.length()-1] != '/') {
480 fspath += tape_dir_name;
482 session_dirs.push_back (sp);
485 /* set the AudioFileSource search path */
487 AudioFileSource::set_search_path (fspath);
489 /* reset the round-robin soundfile path thingie */
491 last_rr_session_dir = session_dirs.begin();
495 Session::create (bool& new_session, string* mix_template, jack_nframes_t initial_length)
499 if (mkdir (_path.c_str(), 0755) < 0) {
500 if (errno == EEXIST) {
503 error << string_compose(_("Session: cannot create session dir \"%1\" (%2)"), _path, strerror (errno)) << endmsg;
512 if (mkdir (dir.c_str(), 0755) < 0) {
513 if (errno != EEXIST) {
514 error << string_compose(_("Session: cannot create session peakfile dir \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
521 if (mkdir (dir.c_str(), 0755) < 0) {
522 if (errno != EEXIST) {
523 error << string_compose(_("Session: cannot create session sounds dir \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
530 if (mkdir (dir.c_str(), 0755) < 0) {
531 if (errno != EEXIST) {
532 error << string_compose(_("Session: cannot create session tape dir \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
537 dir = dead_sound_dir ();
539 if (mkdir (dir.c_str(), 0755) < 0) {
540 if (errno != EEXIST) {
541 error << string_compose(_("Session: cannot create session dead sounds dir \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
546 dir = automation_dir ();
548 if (mkdir (dir.c_str(), 0755) < 0) {
549 if (errno != EEXIST) {
550 error << string_compose(_("Session: cannot create session automation dir \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
556 /* check new_session so we don't overwrite an existing one */
560 std::string in_path = *mix_template;
562 ifstream in(in_path.c_str());
565 string out_path = _path;
567 out_path += _statefile_suffix;
569 ofstream out(out_path.c_str());
574 // okay, session is set up. Treat like normal saved
575 // session from now on.
581 error << string_compose (_("Could not open %1 for writing mix template"), out_path)
587 error << string_compose (_("Could not open mix template %1 for reading"), in_path)
594 warning << _("Session already exists. Not overwriting") << endmsg;
601 /* set initial start + end point */
603 start_location->set_end (0);
604 _locations.add (start_location);
606 end_location->set_end (initial_length);
607 _locations.add (end_location);
609 _state_of_the_state = Clean;
611 if (save_state (_current_snapshot_name)) {
620 Session::load_diskstreams (const XMLNode& node)
623 XMLNodeConstIterator citer;
625 clist = node.children();
627 for (citer = clist.begin(); citer != clist.end(); ++citer) {
628 Diskstream* dstream = NULL;
631 if ((*citer)->name() == "AudioDiskstream") {
632 dstream = new AudioDiskstream (*this, **citer);
633 /* added automatically by DiskstreamCreated handler */
635 assert((*citer)->name() == "MidiDiskstream");
636 dstream = new MidiDiskstream (*this, **citer);
640 catch (failed_constructor& err) {
641 error << _("Session: could not load diskstream via XML state") << endmsg;
650 Session::remove_pending_capture_state ()
655 xml_path += _current_snapshot_name;
656 xml_path += _pending_suffix;
658 unlink (xml_path.c_str());
662 Session::save_state (string snapshot_name, bool pending)
668 if (_state_of_the_state & CannotSave) {
672 tree.set_root (&get_state());
674 if (snapshot_name.empty()) {
675 snapshot_name = _current_snapshot_name;
681 xml_path += snapshot_name;
682 xml_path += _statefile_suffix;
686 // Make backup of state file
688 if ((access (xml_path.c_str(), F_OK) == 0) &&
689 (rename(xml_path.c_str(), bak_path.c_str()))) {
690 error << _("could not backup old state file, current state not saved.") << endmsg;
697 xml_path += snapshot_name;
698 xml_path += _pending_suffix;
702 if (!tree.write (xml_path)) {
703 error << string_compose (_("state could not be saved to %1"), xml_path) << endmsg;
705 /* don't leave a corrupt file lying around if it is
709 if (unlink (xml_path.c_str())) {
710 error << string_compose (_("could not remove corrupt state file %1"), xml_path) << endmsg;
713 if (rename (bak_path.c_str(), xml_path.c_str())) {
714 error << string_compose (_("could not restore state file from backup %1"), bak_path) << endmsg;
724 bool was_dirty = dirty();
726 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
729 DirtyChanged (); /* EMIT SIGNAL */
732 StateSaved (snapshot_name); /* EMIT SIGNAL */
739 Session::restore_state (string snapshot_name)
741 if (load_state (snapshot_name) == 0) {
742 set_state (*state_tree->root());
749 Session::load_state (string snapshot_name)
758 state_was_pending = false;
760 /* check for leftover pending state from a crashed capture attempt */
763 xmlpath += snapshot_name;
764 xmlpath += _pending_suffix;
766 if (!access (xmlpath.c_str(), F_OK)) {
768 /* there is pending state from a crashed capture attempt */
770 if (AskAboutPendingState()) {
771 state_was_pending = true;
775 if (!state_was_pending) {
778 xmlpath += snapshot_name;
779 xmlpath += _statefile_suffix;
782 if (access (xmlpath.c_str(), F_OK)) {
783 error << string_compose(_("%1: session state information file \"%2\" doesn't exist!"), _name, xmlpath) << endmsg;
787 state_tree = new XMLTree;
791 if (state_tree->read (xmlpath)) {
794 error << string_compose(_("Could not understand ardour file %1"), xmlpath) << endmsg;
803 Session::load_options (const XMLNode& node)
807 bool have_fade_msecs = false;
808 bool have_fade_steepness = false;
809 float fade_msecs = 0;
810 float fade_steepness = 0;
811 SlaveSource slave_src = None;
813 LocaleGuard lg (X_("POSIX"));
815 if ((child = find_named_node (node, "input-auto-connect")) != 0) {
816 if ((prop = child->property ("val")) != 0) {
817 sscanf (prop->value().c_str(), "%x", &x);
818 input_auto_connect = AutoConnectOption (x);
822 if ((child = find_named_node (node, "output-auto-connect")) != 0) {
823 if ((prop = child->property ("val")) != 0) {
824 sscanf (prop->value().c_str(), "%x", &x);
825 output_auto_connect = AutoConnectOption (x);
829 if ((child = find_named_node (node, "slave")) != 0) {
830 if ((prop = child->property ("type")) != 0) {
831 if (prop->value() == "none") {
833 } else if (prop->value() == "mtc") {
835 } else if (prop->value() == "jack") {
838 set_slave_source (slave_src, 0);
842 /* we cannot set edit mode if we are loading a session,
843 because it might destroy the playlist's positioning
846 if ((child = find_named_node (node, "edit-mode")) != 0) {
847 if ((prop = child->property ("val")) != 0) {
848 if (prop->value() == "slide") {
849 pending_edit_mode = Slide;
850 } else if (prop->value() == "splice") {
851 pending_edit_mode = Splice;
856 if ((child = find_named_node (node, "send-midi-timecode")) != 0) {
857 if ((prop = child->property ("val")) != 0) {
858 bool x = (prop->value() == "yes");
859 send_mtc = !x; /* force change in value */
863 if ((child = find_named_node (node, "send-midi-machine-control")) != 0) {
864 if ((prop = child->property ("val")) != 0) {
865 bool x = (prop->value() == "yes");
866 send_mmc = !x; /* force change in value */
867 set_send_mmc (prop->value() == "yes");
870 if ((child = find_named_node (node, "max-level")) != 0) {
871 if ((prop = child->property ("val")) != 0) {
872 max_level = atoi (prop->value().c_str());
875 if ((child = find_named_node (node, "min-level")) != 0) {
876 if ((prop = child->property ("val")) != 0) {
877 min_level = atoi (prop->value().c_str());
880 if ((child = find_named_node (node, "meter-hold")) != 0) {
881 if ((prop = child->property ("val")) != 0) {
882 _meter_hold = atof (prop->value().c_str());
885 if ((child = find_named_node (node, "meter-falloff")) != 0) {
886 if ((prop = child->property ("val")) != 0) {
887 _meter_falloff = atof (prop->value().c_str());
890 if ((child = find_named_node (node, "long-over-length")) != 0) {
891 if ((prop = child->property ("val")) != 0) {
892 over_length_long = atoi (prop->value().c_str());
895 if ((child = find_named_node (node, "short-over-length")) != 0) {
896 if ((prop = child->property ("val")) != 0) {
897 over_length_short = atoi (prop->value().c_str());
900 if ((child = find_named_node (node, "shuttle-speed-factor")) != 0) {
901 if ((prop = child->property ("val")) != 0) {
902 shuttle_speed_factor = atof (prop->value().c_str());
905 if ((child = find_named_node (node, "shuttle-speed-threshold")) != 0) {
906 if ((prop = child->property ("val")) != 0) {
907 shuttle_speed_threshold = atof (prop->value().c_str());
910 if ((child = find_named_node (node, "rf-speed")) != 0) {
911 if ((prop = child->property ("val")) != 0) {
912 rf_speed = atof (prop->value().c_str());
915 if ((child = find_named_node (node, "smpte-frames-per-second")) != 0) {
916 if ((prop = child->property ("val")) != 0) {
917 set_smpte_type( atof (prop->value().c_str()), smpte_drop_frames );
920 if ((child = find_named_node (node, "smpte-drop-frames")) != 0) {
921 if ((prop = child->property ("val")) != 0) {
922 set_smpte_type( smpte_frames_per_second, (prop->value() == "yes") );
925 if ((child = find_named_node (node, "smpte-offset")) != 0) {
926 if ((prop = child->property ("val")) != 0) {
927 set_smpte_offset( atoi (prop->value().c_str()) );
930 if ((child = find_named_node (node, "smpte-offset-negative")) != 0) {
931 if ((prop = child->property ("val")) != 0) {
932 set_smpte_offset_negative( (prop->value() == "yes") );
935 if ((child = find_named_node (node, "click-sound")) != 0) {
936 if ((prop = child->property ("val")) != 0) {
937 click_sound = prop->value();
940 if ((child = find_named_node (node, "click-emphasis-sound")) != 0) {
941 if ((prop = child->property ("val")) != 0) {
942 click_emphasis_sound = prop->value();
946 if ((child = find_named_node (node, "solo-model")) != 0) {
947 if ((prop = child->property ("val")) != 0) {
948 if (prop->value() == "SoloBus")
949 _solo_model = SoloBus;
951 _solo_model = InverseMute;
955 /* BOOLEAN OPTIONS */
957 if ((child = find_named_node (node, "auto-play")) != 0) {
958 if ((prop = child->property ("val")) != 0) {
959 set_auto_play (prop->value() == "yes");
962 if ((child = find_named_node (node, "auto-input")) != 0) {
963 if ((prop = child->property ("val")) != 0) {
964 set_auto_input (prop->value() == "yes");
967 if ((child = find_named_node (node, "seamless-loop")) != 0) {
968 if ((prop = child->property ("val")) != 0) {
969 set_seamless_loop (prop->value() == "yes");
972 if ((child = find_named_node (node, "punch-in")) != 0) {
973 if ((prop = child->property ("val")) != 0) {
974 set_punch_in (prop->value() == "yes");
977 if ((child = find_named_node (node, "punch-out")) != 0) {
978 if ((prop = child->property ("val")) != 0) {
979 set_punch_out (prop->value() == "yes");
982 if ((child = find_named_node (node, "auto-return")) != 0) {
983 if ((prop = child->property ("val")) != 0) {
984 set_auto_return (prop->value() == "yes");
987 if ((child = find_named_node (node, "send-mtc")) != 0) {
988 if ((prop = child->property ("val")) != 0) {
989 set_send_mtc (prop->value() == "yes");
992 if ((child = find_named_node (node, "mmc-control")) != 0) {
993 if ((prop = child->property ("val")) != 0) {
994 set_mmc_control (prop->value() == "yes");
997 if ((child = find_named_node (node, "midi-control")) != 0) {
998 if ((prop = child->property ("val")) != 0) {
999 set_midi_control (prop->value() == "yes");
1002 if ((child = find_named_node (node, "midi-feedback")) != 0) {
1003 if ((prop = child->property ("val")) != 0) {
1004 set_midi_feedback (prop->value() == "yes");
1007 // Legacy support for <recording-plugins>
1008 if ((child = find_named_node (node, "recording-plugins")) != 0) {
1009 if ((prop = child->property ("val")) != 0) {
1010 set_do_not_record_plugins (prop->value() == "no");
1013 if ((child = find_named_node (node, "do-not-record-plugins")) != 0) {
1014 if ((prop = child->property ("val")) != 0) {
1015 set_do_not_record_plugins (prop->value() == "yes");
1018 if ((child = find_named_node (node, "crossfades-active")) != 0) {
1019 if ((prop = child->property ("val")) != 0) {
1020 set_crossfades_active (prop->value() == "yes");
1023 if ((child = find_named_node (node, "audible-click")) != 0) {
1024 if ((prop = child->property ("val")) != 0) {
1025 set_clicking (prop->value() == "yes");
1029 if ((child = find_named_node (node, "end-marker-is-free")) != 0) {
1030 if ((prop = child->property ("val")) != 0) {
1031 _end_location_is_free = (prop->value() == "yes");
1035 if ((child = find_named_node (node, "layer-model")) != 0) {
1036 if ((prop = child->property ("val")) != 0) {
1037 if (prop->value() == X_("LaterHigher")) {
1038 set_layer_model (LaterHigher);
1039 } else if (prop->value() == X_("AddHigher")) {
1040 set_layer_model (AddHigher);
1042 set_layer_model (MoveAddHigher);
1047 if ((child = find_named_node (node, "xfade-model")) != 0) {
1048 if ((prop = child->property ("val")) != 0) {
1049 if (prop->value() == X_("Short")) {
1050 set_xfade_model (ShortCrossfade);
1052 set_xfade_model (FullCrossfade);
1057 if ((child = find_named_node (node, "short-xfade-length")) != 0) {
1058 if ((prop = child->property ("val")) != 0) {
1059 /* value is stored as a fractional seconds */
1060 float secs = atof (prop->value().c_str());
1061 Crossfade::set_short_xfade_length ((jack_nframes_t) floor (secs * frame_rate()));
1065 if ((child = find_named_node (node, "full-xfades-unmuted")) != 0) {
1066 if ((prop = child->property ("val")) != 0) {
1067 crossfades_active = (prop->value() == "yes");
1073 if ((child = find_named_node (node, "default-fade-steepness")) != 0) {
1074 if ((prop = child->property ("val")) != 0) {
1075 fade_steepness = atof (prop->value().c_str());
1076 have_fade_steepness = true;
1079 if ((child = find_named_node (node, "default-fade-msec")) != 0) {
1080 if ((prop = child->property ("val")) != 0) {
1081 fade_msecs = atof (prop->value().c_str());
1082 have_fade_msecs = true;
1086 if (have_fade_steepness || have_fade_msecs) {
1087 // set_default_fade (fade_steepness, fade_msecs);
1094 Session::get_options () const
1099 LocaleGuard lg (X_("POSIX"));
1101 opthead = new XMLNode ("Options");
1103 SlaveSource src = slave_source ();
1107 src_string = "none";
1113 src_string = "jack";
1116 child = opthead->add_child ("slave");
1117 child->add_property ("type", src_string);
1119 child = opthead->add_child ("send-midi-timecode");
1120 child->add_property ("val", send_midi_timecode?"yes":"no");
1122 child = opthead->add_child ("send-midi-machine-control");
1123 child->add_property ("val", send_midi_machine_control?"yes":"no");
1125 snprintf (buf, sizeof(buf)-1, "%x", (int) input_auto_connect);
1126 child = opthead->add_child ("input-auto-connect");
1127 child->add_property ("val", buf);
1129 snprintf (buf, sizeof(buf)-1, "%x", (int) output_auto_connect);
1130 child = opthead->add_child ("output-auto-connect");
1131 child->add_property ("val", buf);
1133 snprintf (buf, sizeof(buf)-1, "%d", max_level);
1134 child = opthead->add_child ("max-level");
1135 child->add_property ("val", buf);
1137 snprintf (buf, sizeof(buf)-1, "%d", min_level);
1138 child = opthead->add_child ("min-level");
1139 child->add_property ("val", buf);
1141 snprintf (buf, sizeof(buf)-1, "%f", _meter_hold);
1142 child = opthead->add_child ("meter-hold");
1143 child->add_property ("val", buf);
1145 snprintf (buf, sizeof(buf)-1, "%f", _meter_falloff);
1146 child = opthead->add_child ("meter-falloff");
1147 child->add_property ("val", buf);
1149 snprintf (buf, sizeof(buf)-1, "%u", over_length_long);
1150 child = opthead->add_child ("long-over-length");
1151 child->add_property ("val", buf);
1153 snprintf (buf, sizeof(buf)-1, "%u", over_length_short);
1154 child = opthead->add_child ("short-over-length");
1155 child->add_property ("val", buf);
1157 snprintf (buf, sizeof(buf)-1, "%f", shuttle_speed_factor);
1158 child = opthead->add_child ("shuttle-speed-factor");
1159 child->add_property ("val", buf);
1161 snprintf (buf, sizeof(buf)-1, "%f", shuttle_speed_threshold);
1162 child = opthead->add_child ("shuttle-speed-threshold");
1163 child->add_property ("val", buf);
1165 snprintf (buf, sizeof(buf)-1, "%f", rf_speed);
1166 child = opthead->add_child ("rf-speed");
1167 child->add_property ("val", buf);
1169 snprintf (buf, sizeof(buf)-1, "%.2f", smpte_frames_per_second);
1170 child = opthead->add_child ("smpte-frames-per-second");
1171 child->add_property ("val", buf);
1173 child = opthead->add_child ("smpte-drop-frames");
1174 child->add_property ("val", smpte_drop_frames ? "yes" : "no");
1176 snprintf (buf, sizeof(buf)-1, "%u", smpte_offset ());
1177 child = opthead->add_child ("smpte-offset");
1178 child->add_property ("val", buf);
1180 child = opthead->add_child ("smpte-offset-negative");
1181 child->add_property ("val", smpte_offset_negative () ? "yes" : "no");
1183 child = opthead->add_child ("edit-mode");
1184 switch (_edit_mode) {
1186 child->add_property ("val", "splice");
1190 child->add_property ("val", "slide");
1194 child = opthead->add_child ("auto-play");
1195 child->add_property ("val", get_auto_play () ? "yes" : "no");
1196 child = opthead->add_child ("auto-input");
1197 child->add_property ("val", get_auto_input () ? "yes" : "no");
1198 child = opthead->add_child ("seamless-loop");
1199 child->add_property ("val", get_seamless_loop () ? "yes" : "no");
1200 child = opthead->add_child ("punch-in");
1201 child->add_property ("val", get_punch_in () ? "yes" : "no");
1202 child = opthead->add_child ("punch-out");
1203 child->add_property ("val", get_punch_out () ? "yes" : "no");
1204 child = opthead->add_child ("all-safe");
1205 child->add_property ("val", get_all_safe () ? "yes" : "no");
1206 child = opthead->add_child ("auto-return");
1207 child->add_property ("val", get_auto_return () ? "yes" : "no");
1208 child = opthead->add_child ("mmc-control");
1209 child->add_property ("val", get_mmc_control () ? "yes" : "no");
1210 child = opthead->add_child ("midi-control");
1211 child->add_property ("val", get_midi_control () ? "yes" : "no");
1212 child = opthead->add_child ("midi-feedback");
1213 child->add_property ("val", get_midi_feedback () ? "yes" : "no");
1214 child = opthead->add_child ("do-not-record-plugins");
1215 child->add_property ("val", get_do_not_record_plugins () ? "yes" : "no");
1216 child = opthead->add_child ("auto-crossfade");
1217 child->add_property ("val", get_crossfades_active () ? "yes" : "no");
1218 child = opthead->add_child ("audible-click");
1219 child->add_property ("val", get_clicking () ? "yes" : "no");
1220 child = opthead->add_child ("end-marker-is-free");
1221 child->add_property ("val", _end_location_is_free ? "yes" : "no");
1223 if (click_sound.length()) {
1224 child = opthead->add_child ("click-sound");
1225 child->add_property ("val", click_sound);
1228 if (click_emphasis_sound.length()) {
1229 child = opthead->add_child ("click-emphasis-sound");
1230 child->add_property ("val", click_emphasis_sound);
1233 child = opthead->add_child ("solo-model");
1234 child->add_property ("val", _solo_model == SoloBus ? "SoloBus" : "InverseMute");
1236 child = opthead->add_child ("layer-model");
1237 switch (layer_model) {
1239 child->add_property ("val", X_("LaterHigher"));
1242 child->add_property ("val", X_("MoveAddHigher"));
1245 child->add_property ("val", X_("AddHigher"));
1249 child = opthead->add_child ("xfade-model");
1250 switch (xfade_model) {
1252 child->add_property ("val", X_("Full"));
1254 case ShortCrossfade:
1255 child->add_property ("val", X_("Short"));
1258 child = opthead->add_child ("short-xfade-length");
1259 /* store as fractions of a second */
1260 snprintf (buf, sizeof(buf)-1, "%f",
1261 (float) Crossfade::short_xfade_length() / frame_rate());
1262 child->add_property ("val", buf);
1264 child = opthead->add_child ("full-xfades-unmuted");
1265 child->add_property ("val", crossfades_active ? "yes" : "no");
1271 Session::get_state()
1277 Session::get_template()
1279 /* if we don't disable rec-enable, diskstreams
1280 will believe they need to store their capture
1281 sources in their state node.
1284 disable_record (false);
1286 return state(false);
1290 Session::state(bool full_state)
1292 XMLNode* node = new XMLNode("Session");
1295 // store libardour version, just in case
1297 snprintf(buf, sizeof(buf)-1, "%d.%d.%d",
1298 libardour_major_version, libardour_minor_version, libardour_micro_version);
1299 node->add_property("version", string(buf));
1301 /* store configuration settings */
1305 /* store the name */
1306 node->add_property ("name", _name);
1308 if (session_dirs.size() > 1) {
1312 vector<space_and_path>::iterator i = session_dirs.begin();
1313 vector<space_and_path>::iterator next;
1315 ++i; /* skip the first one */
1319 while (i != session_dirs.end()) {
1323 if (next != session_dirs.end()) {
1333 child = node->add_child ("Path");
1334 child->add_content (p);
1338 /* save the ID counter */
1340 snprintf (buf, sizeof (buf), "%" PRIu64, ID::counter());
1341 node->add_property ("id-counter", buf);
1343 /* various options */
1345 node->add_child_nocopy (get_options());
1347 child = node->add_child ("Sources");
1350 Glib::Mutex::Lock sl (audio_source_lock);
1352 for (AudioSourceList::iterator siter = audio_sources.begin(); siter != audio_sources.end(); ++siter) {
1354 /* Don't save information about AudioFileSources that are empty */
1356 AudioFileSource* fs;
1358 if ((fs = dynamic_cast<AudioFileSource*> (siter->second)) != 0) {
1359 DestructiveFileSource* dfs = dynamic_cast<DestructiveFileSource*> (fs);
1361 /* destructive file sources are OK if they are empty, because
1362 we will re-use them every time.
1366 if (fs->length() == 0) {
1372 child->add_child_nocopy (siter->second->get_state());
1376 child = node->add_child ("Regions");
1379 Glib::Mutex::Lock rl (region_lock);
1381 for (AudioRegionList::const_iterator i = audio_regions.begin(); i != audio_regions.end(); ++i) {
1383 /* only store regions not attached to playlists */
1385 if (i->second->playlist() == 0) {
1386 child->add_child_nocopy (i->second->state (true));
1391 child = node->add_child ("DiskStreams");
1394 Glib::RWLock::ReaderLock dl (diskstream_lock);
1395 for (DiskstreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
1396 if (!(*i)->hidden()) {
1397 child->add_child_nocopy ((*i)->get_state());
1402 node->add_child_nocopy (_locations.get_state());
1404 child = node->add_child ("Connections");
1406 Glib::Mutex::Lock lm (connection_lock);
1407 for (ConnectionList::iterator i = _connections.begin(); i != _connections.end(); ++i) {
1408 if (!(*i)->system_dependent()) {
1409 child->add_child_nocopy ((*i)->get_state());
1414 child = node->add_child ("Routes");
1416 boost::shared_ptr<RouteList> r = routes.reader ();
1418 RoutePublicOrderSorter cmp;
1419 RouteList public_order (*r);
1420 public_order.sort (cmp);
1422 for (RouteList::iterator i = public_order.begin(); i != public_order.end(); ++i) {
1423 if (!(*i)->hidden()) {
1425 child->add_child_nocopy ((*i)->get_state());
1427 child->add_child_nocopy ((*i)->get_template());
1434 child = node->add_child ("EditGroups");
1435 for (list<RouteGroup *>::iterator i = edit_groups.begin(); i != edit_groups.end(); ++i) {
1436 child->add_child_nocopy ((*i)->get_state());
1439 child = node->add_child ("MixGroups");
1440 for (list<RouteGroup *>::iterator i = mix_groups.begin(); i != mix_groups.end(); ++i) {
1441 child->add_child_nocopy ((*i)->get_state());
1444 child = node->add_child ("Playlists");
1445 for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); ++i) {
1446 if (!(*i)->hidden()) {
1447 if (!(*i)->empty()) {
1449 child->add_child_nocopy ((*i)->get_state());
1451 child->add_child_nocopy ((*i)->get_template());
1457 child = node->add_child ("UnusedPlaylists");
1458 for (PlaylistList::iterator i = unused_playlists.begin(); i != unused_playlists.end(); ++i) {
1459 if (!(*i)->hidden()) {
1460 if (!(*i)->empty()) {
1462 child->add_child_nocopy ((*i)->get_state());
1464 child->add_child_nocopy ((*i)->get_template());
1472 child = node->add_child ("Click");
1473 child->add_child_nocopy (_click_io->state (full_state));
1477 child = node->add_child ("NamedSelections");
1478 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
1480 child->add_child_nocopy ((*i)->get_state());
1485 node->add_child_nocopy (_tempo_map->get_state());
1488 node->add_child_copy (*_extra_xml);
1495 Session::set_state (const XMLNode& node)
1499 const XMLProperty* prop;
1502 _state_of_the_state = StateOfTheState (_state_of_the_state|CannotSave);
1504 if (node.name() != X_("Session")){
1505 fatal << _("programming error: Session: incorrect XML node sent to set_state()") << endmsg;
1509 StateManager::prohibit_save ();
1511 if ((prop = node.property ("name")) != 0) {
1512 _name = prop->value ();
1515 if ((prop = node.property (X_("id-counter"))) != 0) {
1517 sscanf (prop->value().c_str(), "%" PRIu64, &x);
1518 ID::init_counter (x);
1520 /* old sessions used a timebased counter, so fake
1521 the startup ID counter based on a standard
1526 ID::init_counter (now);
1530 IO::disable_ports ();
1531 IO::disable_connecting ();
1533 /* Object loading order:
1550 if (use_config_midi_ports ()) {
1553 if ((child = find_named_node (node, "Path")) != 0) {
1554 /* XXX this XML content stuff horrible API design */
1555 string raid_path = _path + ':' + child->children().front()->content();
1556 setup_raid_path (raid_path);
1558 /* the path is already set */
1561 if ((child = find_named_node (node, "extra")) != 0) {
1562 _extra_xml = new XMLNode (*child);
1565 if ((child = find_named_node (node, "Options")) == 0) {
1566 error << _("Session: XML state has no options section") << endmsg;
1567 } else if (load_options (*child)) {
1570 if ((child = find_named_node (node, "Sources")) == 0) {
1571 error << _("Session: XML state has no sources section") << endmsg;
1573 } else if (load_sources (*child)) {
1577 if ((child = find_named_node (node, "Regions")) == 0) {
1578 error << _("Session: XML state has no Regions section") << endmsg;
1580 } else if (load_regions (*child)) {
1584 if ((child = find_named_node (node, "Playlists")) == 0) {
1585 error << _("Session: XML state has no playlists section") << endmsg;
1587 } else if (load_playlists (*child)) {
1591 if ((child = find_named_node (node, "UnusedPlaylists")) == 0) {
1593 } else if (load_unused_playlists (*child)) {
1597 if ((child = find_named_node (node, "NamedSelections")) != 0) {
1598 if (load_named_selections (*child)) {
1603 if ((child = find_named_node (node, "DiskStreams")) == 0) {
1604 error << _("Session: XML state has no diskstreams section") << endmsg;
1606 } else if (load_diskstreams (*child)) {
1610 if ((child = find_named_node (node, "Connections")) == 0) {
1611 error << _("Session: XML state has no connections section") << endmsg;
1613 } else if (load_connections (*child)) {
1617 if ((child = find_named_node (node, "Locations")) == 0) {
1618 error << _("Session: XML state has no locations section") << endmsg;
1620 } else if (_locations.set_state (*child)) {
1626 if ((location = _locations.auto_loop_location()) != 0) {
1627 set_auto_loop_location (location);
1630 if ((location = _locations.auto_punch_location()) != 0) {
1631 set_auto_punch_location (location);
1634 if ((location = _locations.end_location()) == 0) {
1635 _locations.add (end_location);
1637 delete end_location;
1638 end_location = location;
1641 if ((location = _locations.start_location()) == 0) {
1642 _locations.add (start_location);
1644 delete start_location;
1645 start_location = location;
1648 _locations.save_state (_("initial state"));
1650 if ((child = find_named_node (node, "EditGroups")) == 0) {
1651 error << _("Session: XML state has no edit groups section") << endmsg;
1653 } else if (load_edit_groups (*child)) {
1657 if ((child = find_named_node (node, "MixGroups")) == 0) {
1658 error << _("Session: XML state has no mix groups section") << endmsg;
1660 } else if (load_mix_groups (*child)) {
1664 if ((child = find_named_node (node, "TempoMap")) == 0) {
1665 error << _("Session: XML state has no Tempo Map section") << endmsg;
1667 } else if (_tempo_map->set_state (*child)) {
1671 if ((child = find_named_node (node, "Routes")) == 0) {
1672 error << _("Session: XML state has no routes section") << endmsg;
1674 } else if (load_routes (*child)) {
1678 if ((child = find_named_node (node, "Click")) == 0) {
1679 warning << _("Session: XML state has no click section") << endmsg;
1680 } else if (_click_io) {
1681 _click_io->set_state (*child);
1684 /* OK, now we can set edit mode */
1686 set_edit_mode (pending_edit_mode);
1688 /* here beginneth the second phase ... */
1690 StateReady (); /* EMIT SIGNAL */
1692 _state_of_the_state = Clean;
1694 StateManager::allow_save (_("initial state"), true);
1696 if (state_was_pending) {
1697 save_state (_current_snapshot_name);
1698 remove_pending_capture_state ();
1699 state_was_pending = false;
1705 /* we failed, re-enable state saving but don't actually save internal state */
1706 StateManager::allow_save (X_("ignored"), false);
1711 Session::load_routes (const XMLNode& node)
1714 XMLNodeConstIterator niter;
1716 nlist = node.children();
1720 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1722 boost::shared_ptr<Route> route (XMLRouteFactory (**niter));
1725 error << _("Session: cannot create Route from XML description.") << endmsg;
1735 boost::shared_ptr<Route>
1736 Session::XMLRouteFactory (const XMLNode& node)
1738 if (node.name() != "Route") {
1739 return boost::shared_ptr<Route> ((Route*) 0);
1742 bool has_diskstream = (node.property ("diskstream") != 0 || node.property ("diskstream-id") != 0);
1744 Buffer::Type type = Buffer::AUDIO;
1745 const XMLProperty* prop = node.property("default-type");
1747 type = Buffer::type_from_string(prop->value());
1749 assert(type != Buffer::NIL);
1751 if (has_diskstream) {
1752 if (type == Buffer::AUDIO) {
1753 boost::shared_ptr<Route> ret (new AudioTrack (*this, node));
1756 boost::shared_ptr<Route> ret (new MidiTrack (*this, node));
1760 boost::shared_ptr<Route> ret (new Route (*this, node));
1766 Session::load_regions (const XMLNode& node)
1769 XMLNodeConstIterator niter;
1770 AudioRegion* region;
1772 nlist = node.children();
1776 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1777 if ((region = XMLRegionFactory (**niter, false)) == 0) {
1778 error << _("Session: cannot create Region from XML description.") << endmsg;
1785 Session::XMLRegionFactory (const XMLNode& node, bool full)
1787 const XMLProperty* prop;
1790 AudioRegion::SourceList sources;
1791 uint32_t nchans = 1;
1794 if (node.name() != X_("Region")) {
1798 if ((prop = node.property (X_("channels"))) != 0) {
1799 nchans = atoi (prop->value().c_str());
1803 if ((prop = node.property (X_("source-0"))) == 0) {
1804 if ((prop = node.property ("source")) == 0) {
1805 error << _("Session: XMLNode describing a AudioRegion is incomplete (no source)") << endmsg;
1810 PBD::ID s_id (prop->value());
1812 if ((source = source_by_id (s_id)) == 0) {
1813 error << string_compose(_("Session: XMLNode describing a AudioRegion references an unknown source id =%1"), s_id) << endmsg;
1817 as = dynamic_cast<AudioSource*>(source);
1819 error << string_compose(_("Session: XMLNode describing a AudioRegion references a non-audio source id =%1"), s_id) << endmsg;
1823 sources.push_back (as);
1825 /* pickup other channels */
1827 for (uint32_t n=1; n < nchans; ++n) {
1828 snprintf (buf, sizeof(buf), X_("source-%d"), n);
1829 if ((prop = node.property (buf)) != 0) {
1831 PBD::ID id2 (prop->value());
1833 if ((source = source_by_id (id2)) == 0) {
1834 error << string_compose(_("Session: XMLNode describing a AudioRegion references an unknown source id =%1"), id2) << endmsg;
1838 as = dynamic_cast<AudioSource*>(source);
1840 error << string_compose(_("Session: XMLNode describing a AudioRegion references a non-audio source id =%1"), id2) << endmsg;
1843 sources.push_back (as);
1848 return new AudioRegion (sources, node);
1851 catch (failed_constructor& err) {
1857 Session::get_sources_as_xml ()
1860 XMLNode* node = new XMLNode (X_("Sources"));
1861 Glib::Mutex::Lock lm (audio_source_lock);
1863 for (AudioSourceList::iterator i = audio_sources.begin(); i != audio_sources.end(); ++i) {
1864 node->add_child_nocopy (i->second->get_state());
1867 /* XXX get MIDI and other sources here */
1873 Session::path_from_region_name (string name, string identifier)
1875 char buf[PATH_MAX+1];
1877 string dir = discover_best_sound_dir ();
1879 for (n = 0; n < 999999; ++n) {
1880 if (identifier.length()) {
1881 snprintf (buf, sizeof(buf), "%s/%s%s%" PRIu32 ".wav", dir.c_str(), name.c_str(),
1882 identifier.c_str(), n);
1884 snprintf (buf, sizeof(buf), "%s/%s-%" PRIu32 ".wav", dir.c_str(), name.c_str(), n);
1886 if (access (buf, F_OK) != 0) {
1896 Session::load_sources (const XMLNode& node)
1899 XMLNodeConstIterator niter;
1902 nlist = node.children();
1906 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1908 if ((source = XMLSourceFactory (**niter)) == 0) {
1909 error << _("Session: cannot create Source from XML description.") << endmsg;
1917 Session::XMLSourceFactory (const XMLNode& node)
1921 if (node.name() != "Source") {
1926 src = AudioFileSource::create (node);
1929 catch (failed_constructor& err) {
1930 error << _("Found a sound file that cannot be used by Ardour. Talk to the progammers.") << endmsg;
1938 Session::save_template (string template_name)
1941 string xml_path, bak_path, template_path;
1943 if (_state_of_the_state & CannotSave) {
1948 string dir = template_dir();
1950 if ((dp = opendir (dir.c_str()))) {
1953 if (mkdir (dir.c_str(), S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)<0) {
1954 error << string_compose(_("Could not create mix templates directory \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
1959 tree.set_root (&get_template());
1962 xml_path += template_name;
1963 xml_path += _template_suffix;
1965 ifstream in(xml_path.c_str());
1968 warning << string_compose(_("Template \"%1\" already exists - new version not created"), template_name) << endmsg;
1974 if (!tree.write (xml_path)) {
1975 error << _("mix template not saved") << endmsg;
1983 Session::rename_template (string old_name, string new_name)
1985 string old_path = template_dir() + old_name + _template_suffix;
1986 string new_path = template_dir() + new_name + _template_suffix;
1988 return rename (old_path.c_str(), new_path.c_str());
1992 Session::delete_template (string name)
1994 string template_path = template_dir();
1995 template_path += name;
1996 template_path += _template_suffix;
1998 return remove (template_path.c_str());
2002 Session::refresh_disk_space ()
2005 struct statfs statfsbuf;
2006 vector<space_and_path>::iterator i;
2007 Glib::Mutex::Lock lm (space_lock);
2010 /* get freespace on every FS that is part of the session path */
2012 _total_free_4k_blocks = 0;
2014 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2015 statfs ((*i).path.c_str(), &statfsbuf);
2017 scale = statfsbuf.f_bsize/4096.0;
2019 (*i).blocks = (uint32_t) floor (statfsbuf.f_bavail * scale);
2020 _total_free_4k_blocks += (*i).blocks;
2026 Session::ensure_sound_dir (string path, string& result)
2031 /* Ensure that the parent directory exists */
2033 if (mkdir (path.c_str(), 0775)) {
2034 if (errno != EEXIST) {
2035 error << string_compose(_("cannot create session directory \"%1\"; ignored"), path) << endmsg;
2040 /* Ensure that the sounds directory exists */
2044 result += sound_dir_name;
2046 if (mkdir (result.c_str(), 0775)) {
2047 if (errno != EEXIST) {
2048 error << string_compose(_("cannot create sounds directory \"%1\"; ignored"), result) << endmsg;
2055 dead += dead_sound_dir_name;
2057 if (mkdir (dead.c_str(), 0775)) {
2058 if (errno != EEXIST) {
2059 error << string_compose(_("cannot create dead sounds directory \"%1\"; ignored"), dead) << endmsg;
2066 peak += peak_dir_name;
2068 if (mkdir (peak.c_str(), 0775)) {
2069 if (errno != EEXIST) {
2070 error << string_compose(_("cannot create peak file directory \"%1\"; ignored"), peak) << endmsg;
2075 /* callers expect this to be terminated ... */
2082 Session::discover_best_sound_dir (bool destructive)
2084 vector<space_and_path>::iterator i;
2087 /* destructive files all go into the same place */
2093 /* handle common case without system calls */
2095 if (session_dirs.size() == 1) {
2099 /* OK, here's the algorithm we're following here:
2101 We want to select which directory to use for
2102 the next file source to be created. Ideally,
2103 we'd like to use a round-robin process so as to
2104 get maximum performance benefits from splitting
2105 the files across multiple disks.
2107 However, in situations without much diskspace, an
2108 RR approach may end up filling up a filesystem
2109 with new files while others still have space.
2110 Its therefore important to pay some attention to
2111 the freespace in the filesystem holding each
2112 directory as well. However, if we did that by
2113 itself, we'd keep creating new files in the file
2114 system with the most space until it was as full
2115 as all others, thus negating any performance
2116 benefits of this RAID-1 like approach.
2118 So, we use a user-configurable space threshold. If
2119 there are at least 2 filesystems with more than this
2120 much space available, we use RR selection between them.
2121 If not, then we pick the filesystem with the most space.
2123 This gets a good balance between the two
2127 refresh_disk_space ();
2129 int free_enough = 0;
2131 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2132 if ((*i).blocks * 4096 >= Config->get_disk_choice_space_threshold()) {
2137 if (free_enough >= 2) {
2139 bool found_it = false;
2141 /* use RR selection process, ensuring that the one
2145 i = last_rr_session_dir;
2148 if (++i == session_dirs.end()) {
2149 i = session_dirs.begin();
2152 if ((*i).blocks * 4096 >= Config->get_disk_choice_space_threshold()) {
2153 if (ensure_sound_dir ((*i).path, result) == 0) {
2154 last_rr_session_dir = i;
2160 } while (i != last_rr_session_dir);
2163 result = sound_dir();
2168 /* pick FS with the most freespace (and that
2169 seems to actually work ...)
2172 vector<space_and_path> sorted;
2173 space_and_path_ascending_cmp cmp;
2175 sorted = session_dirs;
2176 sort (sorted.begin(), sorted.end(), cmp);
2178 for (i = sorted.begin(); i != sorted.end(); ++i) {
2179 if (ensure_sound_dir ((*i).path, result) == 0) {
2180 last_rr_session_dir = i;
2185 /* if the above fails, fall back to the most simplistic solution */
2187 if (i == sorted.end()) {
2196 Session::load_playlists (const XMLNode& node)
2199 XMLNodeConstIterator niter;
2202 nlist = node.children();
2206 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2208 if ((playlist = XMLPlaylistFactory (**niter)) == 0) {
2209 error << _("Session: cannot create Playlist from XML description.") << endmsg;
2217 Session::load_unused_playlists (const XMLNode& node)
2220 XMLNodeConstIterator niter;
2223 nlist = node.children();
2227 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2229 if ((playlist = XMLPlaylistFactory (**niter)) == 0) {
2230 error << _("Session: cannot create Playlist from XML description.") << endmsg;
2234 // now manually untrack it
2236 track_playlist (playlist, false);
2244 Session::XMLPlaylistFactory (const XMLNode& node)
2247 return new AudioPlaylist (*this, node);
2250 catch (failed_constructor& err) {
2256 Session::load_named_selections (const XMLNode& node)
2259 XMLNodeConstIterator niter;
2262 nlist = node.children();
2266 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2268 if ((ns = XMLNamedSelectionFactory (**niter)) == 0) {
2269 error << _("Session: cannot create Named Selection from XML description.") << endmsg;
2277 Session::XMLNamedSelectionFactory (const XMLNode& node)
2280 return new NamedSelection (*this, node);
2283 catch (failed_constructor& err) {
2289 Session::dead_sound_dir () const
2292 res += dead_sound_dir_name;
2298 Session::sound_dir () const
2301 res += sound_dir_name;
2307 Session::tape_dir () const
2310 res += tape_dir_name;
2316 Session::peak_dir () const
2319 res += peak_dir_name;
2325 Session::automation_dir () const
2328 res += "automation/";
2333 Session::template_dir ()
2335 string path = get_user_ardour_path();
2336 path += "templates/";
2342 Session::suffixed_search_path (string suffix, bool data)
2346 path += get_user_ardour_path();
2347 if (path[path.length()-1] != ':') {
2352 path += get_system_data_path();
2354 path += get_system_module_path();
2357 vector<string> split_path;
2359 split (path, split_path, ':');
2362 for (vector<string>::iterator i = split_path.begin(); i != split_path.end(); ++i) {
2367 if (distance (i, split_path.end()) != 1) {
2376 Session::template_path ()
2378 return suffixed_search_path (X_("templates"), true);
2382 Session::control_protocol_path ()
2384 return suffixed_search_path (X_("surfaces"), false);
2388 Session::load_connections (const XMLNode& node)
2390 XMLNodeList nlist = node.children();
2391 XMLNodeConstIterator niter;
2395 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2396 if ((*niter)->name() == "InputConnection") {
2397 add_connection (new ARDOUR::InputConnection (**niter));
2398 } else if ((*niter)->name() == "OutputConnection") {
2399 add_connection (new ARDOUR::OutputConnection (**niter));
2401 error << string_compose(_("Unknown node \"%1\" found in Connections list from state file"), (*niter)->name()) << endmsg;
2410 Session::load_edit_groups (const XMLNode& node)
2412 return load_route_groups (node, true);
2416 Session::load_mix_groups (const XMLNode& node)
2418 return load_route_groups (node, false);
2422 Session::load_route_groups (const XMLNode& node, bool edit)
2424 XMLNodeList nlist = node.children();
2425 XMLNodeConstIterator niter;
2430 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2431 if ((*niter)->name() == "RouteGroup") {
2433 rg = add_edit_group ("");
2434 rg->set_state (**niter);
2436 rg = add_mix_group ("");
2437 rg->set_state (**niter);
2446 state_file_filter (const string &str, void *arg)
2448 return (str.length() > strlen(Session::statefile_suffix()) &&
2449 str.find (Session::statefile_suffix()) == (str.length() - strlen (Session::statefile_suffix())));
2453 bool operator()(const string* a, const string* b) {
2459 remove_end(string* state)
2461 string statename(*state);
2463 string::size_type start,end;
2464 if ((start = statename.find_last_of ('/')) != string::npos) {
2465 statename = statename.substr (start+1);
2468 if ((end = statename.rfind(".ardour")) == string::npos) {
2469 end = statename.length();
2472 return new string(statename.substr (0, end));
2476 Session::possible_states (string path)
2478 PathScanner scanner;
2479 vector<string*>* states = scanner (path, state_file_filter, 0, false, false);
2481 transform(states->begin(), states->end(), states->begin(), remove_end);
2484 sort (states->begin(), states->end(), cmp);
2490 Session::possible_states () const
2492 return possible_states(_path);
2496 Session::auto_save()
2498 save_state (_current_snapshot_name);
2502 Session::add_edit_group (string name)
2504 RouteGroup* rg = new RouteGroup (*this, name);
2505 edit_groups.push_back (rg);
2506 edit_group_added (rg); /* EMIT SIGNAL */
2512 Session::add_mix_group (string name)
2514 RouteGroup* rg = new RouteGroup (*this, name, RouteGroup::Relative);
2515 mix_groups.push_back (rg);
2516 mix_group_added (rg); /* EMIT SIGNAL */
2522 Session::remove_edit_group (RouteGroup& rg)
2524 list<RouteGroup*>::iterator i;
2526 if ((i = find (edit_groups.begin(), edit_groups.end(), &rg)) != edit_groups.end()) {
2527 (*i)->apply (&Route::drop_edit_group, this);
2528 edit_groups.erase (i);
2529 edit_group_removed (); /* EMIT SIGNAL */
2536 Session::remove_mix_group (RouteGroup& rg)
2538 list<RouteGroup*>::iterator i;
2540 if ((i = find (mix_groups.begin(), mix_groups.end(), &rg)) != mix_groups.end()) {
2541 (*i)->apply (&Route::drop_mix_group, this);
2542 mix_groups.erase (i);
2543 mix_group_removed (); /* EMIT SIGNAL */
2550 Session::mix_group_by_name (string name)
2552 list<RouteGroup *>::iterator i;
2554 for (i = mix_groups.begin(); i != mix_groups.end(); ++i) {
2555 if ((*i)->name() == name) {
2563 Session::edit_group_by_name (string name)
2565 list<RouteGroup *>::iterator i;
2567 for (i = edit_groups.begin(); i != edit_groups.end(); ++i) {
2568 if ((*i)->name() == name) {
2576 Session::set_meter_hold (float val)
2579 MeterHoldChanged(); // emit
2583 Session::set_meter_falloff (float val)
2585 _meter_falloff = val;
2586 MeterFalloffChanged(); // emit
2591 Session::begin_reversible_command (string name, UndoAction* private_undo)
2593 current_cmd.clear ();
2594 current_cmd.set_name (name);
2597 current_cmd.add_undo (*private_undo);
2602 Session::commit_reversible_command (UndoAction* private_redo)
2607 current_cmd.add_redo_no_execute (*private_redo);
2610 gettimeofday (&now, 0);
2611 current_cmd.set_timestamp (now);
2613 history.add (current_cmd);
2616 Session::GlobalRouteBooleanState
2617 Session::get_global_route_boolean (bool (Route::*method)(void) const)
2619 GlobalRouteBooleanState s;
2620 boost::shared_ptr<RouteList> r = routes.reader ();
2622 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2623 if (!(*i)->hidden()) {
2624 RouteBooleanState v;
2627 Route* r = (*i).get();
2628 v.second = (r->*method)();
2637 Session::GlobalRouteMeterState
2638 Session::get_global_route_metering ()
2640 GlobalRouteMeterState s;
2641 boost::shared_ptr<RouteList> r = routes.reader ();
2643 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2644 if (!(*i)->hidden()) {
2648 v.second = (*i)->meter_point();
2658 Session::set_global_route_metering (GlobalRouteMeterState s, void* arg)
2660 for (GlobalRouteMeterState::iterator i = s.begin(); i != s.end(); ++i) {
2661 i->first->set_meter_point (i->second, arg);
2666 Session::set_global_route_boolean (GlobalRouteBooleanState s, void (Route::*method)(bool, void*), void* arg)
2668 for (GlobalRouteBooleanState::iterator i = s.begin(); i != s.end(); ++i) {
2669 Route* r = i->first.get();
2670 (r->*method) (i->second, arg);
2675 Session::set_global_mute (GlobalRouteBooleanState s, void* src)
2677 set_global_route_boolean (s, &Route::set_mute, src);
2681 Session::set_global_solo (GlobalRouteBooleanState s, void* src)
2683 set_global_route_boolean (s, &Route::set_solo, src);
2687 Session::set_global_record_enable (GlobalRouteBooleanState s, void* src)
2689 set_global_route_boolean (s, &Route::set_record_enable, src);
2693 Session::global_mute_memento (void* src)
2695 return sigc::bind (mem_fun (*this, &Session::set_global_mute), get_global_route_boolean (&Route::muted), src);
2699 Session::global_metering_memento (void* src)
2701 return sigc::bind (mem_fun (*this, &Session::set_global_route_metering), get_global_route_metering (), src);
2705 Session::global_solo_memento (void* src)
2707 return sigc::bind (mem_fun (*this, &Session::set_global_solo), get_global_route_boolean (&Route::soloed), src);
2711 Session::global_record_enable_memento (void* src)
2713 return sigc::bind (mem_fun (*this, &Session::set_global_record_enable), get_global_route_boolean (&Route::record_enabled), src);
2717 template_filter (const string &str, void *arg)
2719 return (str.length() > strlen(Session::template_suffix()) &&
2720 str.find (Session::template_suffix()) == (str.length() - strlen (Session::template_suffix())));
2724 Session::get_template_list (list<string> &template_names)
2726 vector<string *> *templates;
2727 PathScanner scanner;
2730 path = template_path ();
2732 templates = scanner (path, template_filter, 0, false, true);
2734 vector<string*>::iterator i;
2735 for (i = templates->begin(); i != templates->end(); ++i) {
2736 string fullpath = *(*i);
2739 start = fullpath.find_last_of ('/') + 1;
2740 if ((end = fullpath.find_last_of ('.')) <0) {
2741 end = fullpath.length();
2744 template_names.push_back(fullpath.substr(start, (end-start)));
2749 Session::read_favorite_dirs (FavoriteDirs & favs)
2751 string path = get_user_ardour_path();
2752 path += "/favorite_dirs";
2754 ifstream fav (path.c_str());
2759 if (errno != ENOENT) {
2760 //error << string_compose (_("cannot open favorite file %1 (%2)"), path, strerror (errno)) << endmsg;
2771 getline(fav, newfav);
2777 favs.push_back (newfav);
2784 Session::write_favorite_dirs (FavoriteDirs & favs)
2786 string path = get_user_ardour_path();
2787 path += "/favorite_dirs";
2789 ofstream fav (path.c_str());
2795 for (FavoriteDirs::iterator i = favs.begin(); i != favs.end(); ++i) {
2796 fav << (*i) << endl;
2803 accept_all_non_peak_files (const string& path, void *arg)
2805 return (path.length() > 5 && path.find (".peak") != (path.length() - 5));
2809 accept_all_state_files (const string& path, void *arg)
2811 return (path.length() > 7 && path.find (".ardour") == (path.length() - 7));
2815 Session::find_all_sources (string path, set<string>& result)
2820 if (!tree.read (path)) {
2824 if ((node = find_named_node (*tree.root(), "Sources")) == 0) {
2829 XMLNodeConstIterator niter;
2831 nlist = node->children();
2835 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2839 if ((prop = (*niter)->property (X_("name"))) == 0) {
2843 if (prop->value()[0] == '/') {
2844 /* external file, ignore */
2848 string path = _path; /* /-terminated */
2849 path += sound_dir_name;
2851 path += prop->value();
2853 result.insert (path);
2860 Session::find_all_sources_across_snapshots (set<string>& result, bool exclude_this_snapshot)
2862 PathScanner scanner;
2863 vector<string*>* state_files;
2865 string this_snapshot_path;
2871 if (ripped[ripped.length()-1] == '/') {
2872 ripped = ripped.substr (0, ripped.length() - 1);
2875 state_files = scanner (ripped, accept_all_state_files, (void *) 0, false, true);
2877 if (state_files == 0) {
2882 this_snapshot_path = _path;
2883 this_snapshot_path += _current_snapshot_name;
2884 this_snapshot_path += _statefile_suffix;
2886 for (vector<string*>::iterator i = state_files->begin(); i != state_files->end(); ++i) {
2888 if (exclude_this_snapshot && **i == this_snapshot_path) {
2892 if (find_all_sources (**i, result) < 0) {
2901 Session::cleanup_sources (Session::cleanup_report& rep)
2903 vector<Source*> dead_sources;
2904 vector<Playlist*> playlists_tbd;
2905 PathScanner scanner;
2907 vector<space_and_path>::iterator i;
2908 vector<space_and_path>::iterator nexti;
2909 vector<string*>* soundfiles;
2910 vector<string> unused;
2911 set<string> all_sources;
2916 _state_of_the_state = (StateOfTheState) (_state_of_the_state | InCleanup);
2918 /* step 1: consider deleting all unused playlists */
2920 for (PlaylistList::iterator x = unused_playlists.begin(); x != unused_playlists.end(); ++x) {
2923 status = AskAboutPlaylistDeletion (*x);
2932 playlists_tbd.push_back (*x);
2936 /* leave it alone */
2941 /* now delete any that were marked for deletion */
2943 for (vector<Playlist*>::iterator x = playlists_tbd.begin(); x != playlists_tbd.end(); ++x) {
2944 PlaylistList::iterator foo;
2946 if ((foo = unused_playlists.find (*x)) != unused_playlists.end()) {
2947 unused_playlists.erase (foo);
2952 /* step 2: clear the undo/redo history for all playlists */
2954 for (PlaylistList::iterator x = playlists.begin(); x != playlists.end(); ++x) {
2955 (*x)->drop_all_states ();
2958 /* step 3: find all un-referenced sources */
2963 for (AudioSourceList::iterator i = audio_sources.begin(); i != audio_sources.end(); ) {
2965 AudioSourceList::iterator tmp;
2970 /* only remove files that are not in use and have some size
2971 to them. otherwise we remove the current "nascent"
2975 if (i->second->use_cnt() == 0 && i->second->length() > 0) {
2976 dead_sources.push_back (i->second);
2978 /* remove this source from our own list to avoid us
2979 adding it to the list of all sources below
2982 audio_sources.erase (i);
2988 /* Step 4: get rid of all regions in the region list that use any dead sources
2989 in case the sources themselves don't go away (they might be referenced in
2993 for (vector<Source*>::iterator i = dead_sources.begin(); i != dead_sources.end();++i) {
2995 for (AudioRegionList::iterator r = audio_regions.begin(); r != audio_regions.end(); ) {
2996 AudioRegionList::iterator tmp;
3004 for (uint32_t n = 0; n < ar->n_channels(); ++n) {
3005 if (&ar->source (n) == (*i)) {
3006 /* this region is dead */
3015 /* build a list of all the possible sound directories for the session */
3017 for (i = session_dirs.begin(); i != session_dirs.end(); ) {
3022 sound_path += (*i).path;
3023 sound_path += sound_dir_name;
3025 if (nexti != session_dirs.end()) {
3032 /* now do the same thing for the files that ended up in the sounds dir(s)
3033 but are not referenced as sources in any snapshot.
3036 soundfiles = scanner (sound_path, accept_all_non_peak_files, (void *) 0, false, true);
3038 if (soundfiles == 0) {
3042 /* find all sources, but don't use this snapshot because the
3043 state file on disk still references sources we may have already
3047 find_all_sources_across_snapshots (all_sources, true);
3049 /* add our current source list
3052 for (AudioSourceList::iterator i = audio_sources.begin(); i != audio_sources.end(); ++i) {
3053 AudioFileSource* fs;
3055 if ((fs = dynamic_cast<AudioFileSource*> (i->second)) != 0) {
3056 all_sources.insert (fs->path());
3060 for (vector<string*>::iterator x = soundfiles->begin(); x != soundfiles->end(); ++x) {
3065 for (set<string>::iterator i = all_sources.begin(); i != all_sources.end(); ++i) {
3075 unused.push_back (spath);
3079 /* now try to move all unused files into the "dead_sounds" directory(ies) */
3081 for (vector<string>::iterator x = unused.begin(); x != unused.end(); ++x) {
3082 struct stat statbuf;
3084 rep.paths.push_back (*x);
3085 if (stat ((*x).c_str(), &statbuf) == 0) {
3086 rep.space += statbuf.st_size;
3091 /* don't move the file across filesystems, just
3092 stick it in the `dead_sound_dir_name' directory
3093 on whichever filesystem it was already on.
3096 newpath = Glib::path_get_dirname (*x);
3097 newpath = Glib::path_get_dirname (newpath);
3100 newpath += dead_sound_dir_name;
3102 newpath += Glib::path_get_basename ((*x));
3104 if (access (newpath.c_str(), F_OK) == 0) {
3106 /* the new path already exists, try versioning */
3108 char buf[PATH_MAX+1];
3112 snprintf (buf, sizeof (buf), "%s.%d", newpath.c_str(), version);
3115 while (access (newpath_v.c_str(), F_OK) == 0 && version < 999) {
3116 snprintf (buf, sizeof (buf), "%s.%d", newpath.c_str(), ++version);
3120 if (version == 999) {
3121 error << string_compose (_("there are already 1000 files with names like %1; versioning discontinued"),
3125 newpath = newpath_v;
3130 /* it doesn't exist, or we can't read it or something */
3134 if (::rename ((*x).c_str(), newpath.c_str()) != 0) {
3135 error << string_compose (_("cannot rename audio file source from %1 to %2 (%3)"),
3136 (*x), newpath, strerror (errno))
3142 /* see if there an easy to find peakfile for this file, and remove it.
3145 string peakpath = (*x).substr (0, (*x).find_last_of ('.'));
3146 peakpath += ".peak";
3148 if (access (peakpath.c_str(), W_OK) == 0) {
3149 if (::unlink (peakpath.c_str()) != 0) {
3150 error << string_compose (_("cannot remove peakfile %1 for %2 (%3)"),
3151 peakpath, _path, strerror (errno))
3153 /* try to back out */
3154 rename (newpath.c_str(), _path.c_str());
3163 /* dump the history list */
3167 /* save state so we don't end up a session file
3168 referring to non-existent sources.
3174 _state_of_the_state = (StateOfTheState) (_state_of_the_state & ~InCleanup);
3179 Session::cleanup_trash_sources (Session::cleanup_report& rep)
3181 vector<space_and_path>::iterator i;
3182 string dead_sound_dir;
3183 struct dirent* dentry;
3184 struct stat statbuf;
3190 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3192 dead_sound_dir = (*i).path;
3193 dead_sound_dir += dead_sound_dir_name;
3195 if ((dead = opendir (dead_sound_dir.c_str())) == 0) {
3199 while ((dentry = readdir (dead)) != 0) {
3201 /* avoid '.' and '..' */
3203 if ((dentry->d_name[0] == '.' && dentry->d_name[1] == '\0') ||
3204 (dentry->d_name[2] == '\0' && dentry->d_name[0] == '.' && dentry->d_name[1] == '.')) {
3210 fullpath = dead_sound_dir;
3212 fullpath += dentry->d_name;
3214 if (stat (fullpath.c_str(), &statbuf)) {
3218 if (!S_ISREG (statbuf.st_mode)) {
3222 if (unlink (fullpath.c_str())) {
3223 error << string_compose (_("cannot remove dead sound file %1 (%2)"),
3224 fullpath, strerror (errno))
3228 rep.paths.push_back (dentry->d_name);
3229 rep.space += statbuf.st_size;
3240 Session::set_dirty ()
3242 bool was_dirty = dirty();
3244 _state_of_the_state = StateOfTheState (_state_of_the_state | Dirty);
3247 DirtyChanged(); /* EMIT SIGNAL */
3253 Session::set_clean ()
3255 bool was_dirty = dirty();
3257 _state_of_the_state = Clean;
3260 DirtyChanged(); /* EMIT SIGNAL */
3265 Session::add_controllable (Controllable* c)
3267 Glib::Mutex::Lock lm (controllables_lock);
3268 controllables.push_back (c);
3272 Session::remove_controllable (Controllable* c)
3274 if (_state_of_the_state | Deletion) {
3278 Glib::Mutex::Lock lm (controllables_lock);
3279 controllables.remove (c);
3283 Session::controllable_by_id (const PBD::ID& id)
3285 Glib::Mutex::Lock lm (controllables_lock);
3287 for (Controllables::iterator i = controllables.begin(); i != controllables.end(); ++i) {
3288 if ((*i)->id() == id) {
3297 Session::add_instant_xml (XMLNode& node, const std::string& dir)
3299 Stateful::add_instant_xml (node, dir);
3300 Config->add_instant_xml (node, get_user_ardour_path());