2 Copyright (C) 1999-2010 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.
27 #include <cstdio> /* sprintf(3) ... grrr */
33 #include <glibmm/thread.h>
34 #include <glibmm/miscutils.h>
35 #include <glibmm/fileutils.h>
37 #include <boost/algorithm/string/erase.hpp>
39 #include "pbd/error.h"
40 #include "pbd/boost_debug.h"
41 #include "pbd/pathscanner.h"
42 #include "pbd/stl_delete.h"
43 #include "pbd/basename.h"
44 #include "pbd/stacktrace.h"
45 #include "pbd/file_utils.h"
46 #include "pbd/convert.h"
47 #include "pbd/strsplit.h"
49 #include "ardour/amp.h"
50 #include "ardour/analyser.h"
51 #include "ardour/audio_buffer.h"
52 #include "ardour/audio_diskstream.h"
53 #include "ardour/audio_port.h"
54 #include "ardour/audio_track.h"
55 #include "ardour/audioengine.h"
56 #include "ardour/audiofilesource.h"
57 #include "ardour/audioplaylist.h"
58 #include "ardour/audioregion.h"
59 #include "ardour/auditioner.h"
60 #include "ardour/buffer_manager.h"
61 #include "ardour/buffer_set.h"
62 #include "ardour/bundle.h"
63 #include "ardour/butler.h"
64 #include "ardour/click.h"
65 #include "ardour/configuration.h"
66 #include "ardour/crossfade.h"
67 #include "ardour/cycle_timer.h"
68 #include "ardour/data_type.h"
69 #include "ardour/debug.h"
70 #include "ardour/filename_extensions.h"
71 #include "ardour/internal_send.h"
72 #include "ardour/io_processor.h"
73 #include "ardour/midi_diskstream.h"
74 #include "ardour/midi_playlist.h"
75 #include "ardour/midi_region.h"
76 #include "ardour/midi_track.h"
77 #include "ardour/midi_ui.h"
78 #include "ardour/named_selection.h"
79 #include "ardour/process_thread.h"
80 #include "ardour/playlist.h"
81 #include "ardour/plugin_insert.h"
82 #include "ardour/port_insert.h"
83 #include "ardour/processor.h"
84 #include "ardour/rc_configuration.h"
85 #include "ardour/recent_sessions.h"
86 #include "ardour/region_factory.h"
87 #include "ardour/return.h"
88 #include "ardour/route_group.h"
89 #include "ardour/send.h"
90 #include "ardour/session.h"
91 #include "ardour/session_directory.h"
92 #include "ardour/session_directory.h"
93 #include "ardour/session_metadata.h"
94 #include "ardour/session_playlists.h"
95 #include "ardour/slave.h"
96 #include "ardour/smf_source.h"
97 #include "ardour/source_factory.h"
98 #include "ardour/tape_file_matcher.h"
99 #include "ardour/tempo.h"
100 #include "ardour/utils.h"
101 #include "ardour/graph.h"
102 #include "ardour/vbap_speakers.h"
104 #include "midi++/port.h"
105 #include "midi++/mmc.h"
106 #include "midi++/manager.h"
111 using namespace ARDOUR;
114 bool Session::_disable_all_loaded_plugins = false;
116 PBD::Signal1<void,std::string> Session::Dialog;
117 PBD::Signal0<int> Session::AskAboutPendingState;
118 PBD::Signal2<int,nframes_t,nframes_t> Session::AskAboutSampleRateMismatch;
119 PBD::Signal0<void> Session::SendFeedback;
120 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
122 PBD::Signal0<void> Session::TimecodeOffsetChanged;
123 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
124 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
125 PBD::Signal0<void> Session::AutoBindingOn;
126 PBD::Signal0<void> Session::AutoBindingOff;
127 PBD::Signal2<void,std::string, std::string> Session::Exported;
128 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
129 PBD::Signal0<void> Session::Quit;
131 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
132 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
134 Session::Session (AudioEngine &eng,
135 const string& fullpath,
136 const string& snapshot_name,
137 BusProfile* bus_profile,
141 , _target_transport_speed (0.0)
142 , _requested_return_frame (-1)
143 , _session_dir (new SessionDirectory(fullpath))
145 , _state_of_the_state (Clean)
146 , _butler (new Butler (*this))
147 , _post_transport_work (0)
148 , _send_timecode_update (false)
149 , _all_route_group (new RouteGroup (*this, "all"))
150 , route_graph (new Graph(*this))
151 , routes (new RouteList)
152 , _total_free_4k_blocks (0)
153 , _bundles (new BundleList)
154 , _bundle_xml_node (0)
155 , _click_io ((IO*) 0)
157 , click_emphasis_data (0)
159 , _metadata (new SessionMetadata())
160 , _have_rec_enabled_track (false)
161 , _suspend_timecode_transmission (0)
163 _locations = new Locations (*this);
165 playlists.reset (new SessionPlaylists);
167 _all_route_group->set_active (true, this);
169 interpolation.add_channel_to (0, 0);
171 if (!eng.connected()) {
172 throw failed_constructor();
175 n_physical_outputs = _engine.n_physical_outputs ();
176 n_physical_inputs = _engine.n_physical_inputs ();
178 first_stage_init (fullpath, snapshot_name);
180 _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
183 if (create (mix_template, bus_profile)) {
185 throw failed_constructor ();
189 if (second_stage_init ()) {
191 throw failed_constructor ();
194 store_recent_sessions(_name, _path);
196 bool was_dirty = dirty();
198 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
200 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
201 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
204 DirtyChanged (); /* EMIT SIGNAL */
207 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
208 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
221 vector<void*> debug_pointers;
223 /* if we got to here, leaving pending capture state around
227 remove_pending_capture_state ();
229 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
231 _engine.remove_session ();
233 /* clear history so that no references to objects are held any more */
237 /* clear state tree so that no references to objects are held any more */
241 /* remove all stubfiles that might still be lurking */
243 cleanup_stubfiles ();
245 /* reset dynamic state version back to default */
247 Stateful::loading_state_version = 0;
249 _butler->drop_references ();
251 delete midi_control_ui;
252 delete _all_route_group;
254 if (click_data != default_click) {
255 delete [] click_data;
258 if (click_emphasis_data != default_click_emphasis) {
259 delete [] click_emphasis_data;
264 /* clear out any pending dead wood from RCU managed objects */
269 AudioDiskstream::free_working_buffers();
271 /* tell everyone who is still standing that we're about to die */
274 /* tell everyone to drop references and delete objects as we go */
276 DEBUG_TRACE (DEBUG::Destruction, "delete named selections\n");
277 named_selections.clear ();
279 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
280 RegionFactory::delete_all_regions ();
282 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
284 /* reset these three references to special routes before we do the usual route delete thing */
287 _master_out.reset ();
288 _monitor_out.reset ();
291 RCUWriter<RouteList> writer (routes);
292 boost::shared_ptr<RouteList> r = writer.get_copy ();
294 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
295 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
296 (*i)->drop_references ();
300 /* writer goes out of scope and updates master */
304 boost::shared_ptr<RouteList> r = routes.reader ();
306 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
307 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
308 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->path(), i->second.use_count()));
309 i->second->drop_references ();
314 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
315 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
320 Crossfade::set_buffer_size (0);
322 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
325 boost_debug_list_ptrs ();
330 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
334 Session::set_worst_io_latencies ()
336 _worst_output_latency = 0;
337 _worst_input_latency = 0;
339 if (!_engine.connected()) {
343 boost::shared_ptr<RouteList> r = routes.reader ();
345 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
346 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
347 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
352 Session::when_engine_running ()
354 string first_physical_output;
356 BootMessage (_("Set block size and sample rate"));
358 set_block_size (_engine.frames_per_cycle());
359 set_frame_rate (_engine.frame_rate());
361 BootMessage (_("Using configuration"));
363 boost::function<void (std::string)> ff (boost::bind (&Session::config_changed, this, _1, false));
364 boost::function<void (std::string)> ft (boost::bind (&Session::config_changed, this, _1, true));
366 Config->map_parameters (ff);
367 config.map_parameters (ft);
369 /* every time we reconnect, recompute worst case output latencies */
371 _engine.Running.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies, this));
373 if (synced_to_jack()) {
374 _engine.transport_stop ();
377 if (config.get_jack_time_master()) {
378 _engine.transport_locate (_transport_frame);
386 _click_io.reset (new ClickIO (*this, "click"));
388 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
390 /* existing state for Click */
393 if (Stateful::loading_state_version < 3000) {
394 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
396 c = _click_io->set_state (*child->children().front(), Stateful::loading_state_version);
401 _clicking = Config->get_clicking ();
405 error << _("could not setup Click I/O") << endmsg;
412 /* default state for Click: dual-mono to first 2 physical outputs */
415 _engine.get_physical_outputs (DataType::AUDIO, outs);
417 for (uint32_t physport = 0; physport < 2; ++physport) {
418 if (outs.size() > physport) {
419 if (_click_io->add_port (outs[physport], this)) {
420 // relax, even though its an error
425 if (_click_io->n_ports () > ChanCount::ZERO) {
426 _clicking = Config->get_clicking ();
431 catch (failed_constructor& err) {
432 error << _("cannot setup Click I/O") << endmsg;
435 BootMessage (_("Compute I/O Latencies"));
437 set_worst_io_latencies ();
440 // XXX HOW TO ALERT UI TO THIS ? DO WE NEED TO?
443 BootMessage (_("Set up standard connections"));
445 vector<string> inputs[DataType::num_types];
446 vector<string> outputs[DataType::num_types];
447 for (uint32_t i = 0; i < DataType::num_types; ++i) {
448 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
449 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
452 /* Create a set of Bundle objects that map
453 to the physical I/O currently available. We create both
454 mono and stereo bundles, so that the common cases of mono
455 and stereo tracks get bundles to put in their mixer strip
456 in / out menus. There may be a nicer way of achieving that;
457 it doesn't really scale that well to higher channel counts
460 /* mono output bundles */
462 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
464 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
466 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
467 c->add_channel (_("mono"), DataType::AUDIO);
468 c->set_port (0, outputs[DataType::AUDIO][np]);
473 /* stereo output bundles */
475 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
476 if (np + 1 < outputs[DataType::AUDIO].size()) {
478 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
479 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
480 c->add_channel (_("L"), DataType::AUDIO);
481 c->set_port (0, outputs[DataType::AUDIO][np]);
482 c->add_channel (_("R"), DataType::AUDIO);
483 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
489 /* mono input bundles */
491 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
493 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
495 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
496 c->add_channel (_("mono"), DataType::AUDIO);
497 c->set_port (0, inputs[DataType::AUDIO][np]);
502 /* stereo input bundles */
504 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
505 if (np + 1 < inputs[DataType::AUDIO].size()) {
507 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
509 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
510 c->add_channel (_("L"), DataType::AUDIO);
511 c->set_port (0, inputs[DataType::AUDIO][np]);
512 c->add_channel (_("R"), DataType::AUDIO);
513 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
519 /* MIDI input bundles */
521 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
522 string n = inputs[DataType::MIDI][np];
523 boost::erase_first (n, X_("alsa_pcm:"));
525 boost::shared_ptr<Bundle> c (new Bundle (n, false));
526 c->add_channel ("", DataType::MIDI);
527 c->set_port (0, inputs[DataType::MIDI][np]);
531 /* MIDI output bundles */
533 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
534 string n = outputs[DataType::MIDI][np];
535 boost::erase_first (n, X_("alsa_pcm:"));
537 boost::shared_ptr<Bundle> c (new Bundle (n, true));
538 c->add_channel ("", DataType::MIDI);
539 c->set_port (0, outputs[DataType::MIDI][np]);
543 BootMessage (_("Setup signal flow and plugins"));
547 if (_is_new && !no_auto_connect()) {
549 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock());
551 /* don't connect the master bus outputs if there is a monitor bus */
553 if (_master_out && Config->get_auto_connect_standard_busses() && !_monitor_out) {
555 /* if requested auto-connect the outputs to the first N physical ports.
558 uint32_t limit = _master_out->n_outputs().n_total();
560 for (uint32_t n = 0; n < limit; ++n) {
561 Port* p = _master_out->output()->nth (n);
563 if (outputs[p->type()].size() > n) {
564 connect_to = outputs[p->type()][n];
567 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
568 if (_master_out->output()->connect (p, connect_to, this)) {
569 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
579 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
580 are undefined, at best.
583 /* control out listens to master bus (but ignores it
584 under some conditions)
587 uint32_t limit = _monitor_out->n_inputs().n_audio();
590 for (uint32_t n = 0; n < limit; ++n) {
591 AudioPort* p = _monitor_out->input()->ports().nth_audio_port (n);
592 AudioPort* o = _master_out->output()->ports().nth_audio_port (n);
595 string connect_to = o->name();
596 if (_monitor_out->input()->connect (p, connect_to, this)) {
597 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
605 /* if control out is not connected, connect control out to physical outs
608 if (!_monitor_out->output()->connected ()) {
610 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
612 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
615 _monitor_out->output()->connect_ports_to_bundle (b, this);
617 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
618 Config->get_monitor_bus_preferred_bundle())
624 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
625 uint32_t mod = n_physical_outputs.get (*t);
626 uint32_t limit = _monitor_out->n_outputs().get(*t);
628 for (uint32_t n = 0; n < limit; ++n) {
630 Port* p = _monitor_out->output()->ports().port(*t, n);
632 if (outputs[*t].size() > (n % mod)) {
633 connect_to = outputs[*t][n % mod];
636 if (!connect_to.empty()) {
637 if (_monitor_out->output()->connect (p, connect_to, this)) {
638 error << string_compose (
639 _("cannot connect control output %1 to %2"),
652 /* catch up on send+insert cnts */
654 _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
656 /* hook us up to the engine */
658 BootMessage (_("Connect to engine"));
660 _engine.set_session (this);
664 Session::hookup_io ()
666 /* stop graph reordering notifications from
667 causing resorts, etc.
670 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
675 /* we delay creating the auditioner till now because
676 it makes its own connections to ports.
680 Auditioner* a = new Auditioner (*this);
683 throw failed_constructor();
685 a->use_new_diskstream ();
686 auditioner.reset (a);
689 catch (failed_constructor& err) {
690 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
694 /* load bundles, which we may have postponed earlier on */
695 if (_bundle_xml_node) {
696 load_bundles (*_bundle_xml_node);
697 delete _bundle_xml_node;
700 /* Tell all IO objects to connect themselves together */
702 IO::enable_connecting ();
703 MIDI::Port::MakeConnections ();
705 /* Now reset all panners */
707 Delivery::reset_panners ();
709 /* Connect tracks to monitor/listen bus if there is one.
710 Note that in an existing session, the internal sends will
711 already exist, but we want the routes to notice that
712 they connect to the control out specifically.
716 boost::shared_ptr<RouteList> r = routes.reader ();
717 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
719 if ((*x)->is_monitor()) {
723 } else if ((*x)->is_master()) {
729 (*x)->listen_via (_monitor_out,
730 (Config->get_listen_position() == AfterFaderListen ? PostFader : PreFader),
736 /* Anyone who cares about input state, wake up and do something */
738 IOConnectionsComplete (); /* EMIT SIGNAL */
740 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
742 /* now handle the whole enchilada as if it was one
748 /* update the full solo state, which can't be
749 correctly determined on a per-route basis, but
750 needs the global overview that only the session
754 update_route_solo_state ();
758 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
760 boost::shared_ptr<Track> track = wp.lock ();
765 boost::shared_ptr<Playlist> playlist;
767 if ((playlist = track->playlist()) != 0) {
768 playlist->LengthChanged.connect_same_thread (*this, boost::bind (&Session::update_session_range_location_marker, this));
769 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::update_session_range_location_marker, this));
772 update_session_range_location_marker ();
776 Session::record_enabling_legal () const
778 /* this used to be in here, but survey says.... we don't need to restrict it */
779 // if (record_status() == Recording) {
783 if (Config->get_all_safe()) {
790 Session::reset_input_monitor_state ()
792 if (transport_rolling()) {
794 boost::shared_ptr<RouteList> rl = routes.reader ();
795 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
796 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
797 if (tr && tr->record_enabled ()) {
798 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
799 tr->monitor_input (Config->get_monitoring_model() == HardwareMonitoring && !config.get_auto_input());
805 boost::shared_ptr<RouteList> rl = routes.reader ();
806 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
807 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
808 if (tr && tr->record_enabled ()) {
809 //cerr << "switching to input = " << !Config->get_auto_input() << __FILE__ << __LINE__ << endl << endl;
810 tr->monitor_input (Config->get_monitoring_model() == HardwareMonitoring);
817 Session::auto_punch_start_changed (Location* location)
819 replace_event (SessionEvent::PunchIn, location->start());
821 if (get_record_enabled() && config.get_punch_in()) {
822 /* capture start has been changed, so save new pending state */
823 save_state ("", true);
828 Session::auto_punch_end_changed (Location* location)
830 nframes_t when_to_stop = location->end();
831 // when_to_stop += _worst_output_latency + _worst_input_latency;
832 replace_event (SessionEvent::PunchOut, when_to_stop);
836 Session::auto_punch_changed (Location* location)
838 nframes_t when_to_stop = location->end();
840 replace_event (SessionEvent::PunchIn, location->start());
841 //when_to_stop += _worst_output_latency + _worst_input_latency;
842 replace_event (SessionEvent::PunchOut, when_to_stop);
846 Session::auto_loop_changed (Location* location)
848 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
850 if (transport_rolling() && play_loop) {
853 // if (_transport_frame > location->end()) {
855 if (_transport_frame < location->start() || _transport_frame > location->end()) {
856 // relocate to beginning of loop
857 clear_events (SessionEvent::LocateRoll);
859 request_locate (location->start(), true);
862 else if (Config->get_seamless_loop() && !loop_changing) {
864 // schedule a locate-roll to refill the diskstreams at the
866 loop_changing = true;
868 if (location->end() > last_loopend) {
869 clear_events (SessionEvent::LocateRoll);
870 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
877 last_loopend = location->end();
881 Session::set_auto_punch_location (Location* location)
885 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
886 punch_connections.drop_connections();
887 existing->set_auto_punch (false, this);
888 remove_event (existing->start(), SessionEvent::PunchIn);
889 clear_events (SessionEvent::PunchOut);
890 auto_punch_location_changed (0);
899 if (location->end() <= location->start()) {
900 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
904 punch_connections.drop_connections ();
906 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
907 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
908 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
910 location->set_auto_punch (true, this);
912 auto_punch_changed (location);
914 auto_punch_location_changed (location);
918 Session::set_auto_loop_location (Location* location)
922 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
923 loop_connections.drop_connections ();
924 existing->set_auto_loop (false, this);
925 remove_event (existing->end(), SessionEvent::AutoLoop);
926 auto_loop_location_changed (0);
935 if (location->end() <= location->start()) {
936 error << _("Session: you can't use a mark for auto loop") << endmsg;
940 last_loopend = location->end();
942 loop_connections.drop_connections ();
944 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
945 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
946 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
948 location->set_auto_loop (true, this);
950 /* take care of our stuff first */
952 auto_loop_changed (location);
954 /* now tell everyone else */
956 auto_loop_location_changed (location);
960 Session::locations_added (Location *)
966 Session::locations_changed ()
968 _locations->apply (*this, &Session::handle_locations_changed);
972 Session::handle_locations_changed (Locations::LocationList& locations)
974 Locations::LocationList::iterator i;
976 bool set_loop = false;
977 bool set_punch = false;
979 for (i = locations.begin(); i != locations.end(); ++i) {
983 if (location->is_auto_punch()) {
984 set_auto_punch_location (location);
987 if (location->is_auto_loop()) {
988 set_auto_loop_location (location);
992 if (location->is_session_range()) {
993 _session_range_location = location;
998 set_auto_loop_location (0);
1001 set_auto_punch_location (0);
1008 Session::enable_record ()
1011 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1013 if (rs == Recording) {
1017 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1019 _last_record_location = _transport_frame;
1020 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1022 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1024 boost::shared_ptr<RouteList> rl = routes.reader ();
1025 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1026 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1027 if (tr && tr->record_enabled ()) {
1028 tr->monitor_input (true);
1033 RecordStateChanged ();
1040 Session::disable_record (bool rt_context, bool force)
1044 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1046 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1047 g_atomic_int_set (&_record_status, Disabled);
1048 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1050 if (rs == Recording) {
1051 g_atomic_int_set (&_record_status, Enabled);
1055 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1057 boost::shared_ptr<RouteList> rl = routes.reader ();
1058 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1059 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1060 if (tr && tr->record_enabled ()) {
1061 tr->monitor_input (false);
1066 RecordStateChanged (); /* emit signal */
1069 remove_pending_capture_state ();
1075 Session::step_back_from_record ()
1077 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1079 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1080 boost::shared_ptr<RouteList> rl = routes.reader ();
1081 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1082 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1083 if (tr && tr->record_enabled ()) {
1084 //cerr << "switching from input" << __FILE__ << __LINE__ << endl << endl;
1085 tr->monitor_input (false);
1093 Session::maybe_enable_record ()
1095 if (_step_editors > 0) {
1099 g_atomic_int_set (&_record_status, Enabled);
1101 /* This function is currently called from somewhere other than an RT thread.
1102 This save_state() call therefore doesn't impact anything. Doing it here
1103 means that we save pending state of which sources the next record will use,
1104 which gives us some chance of recovering from a crash during the record.
1107 save_state ("", true);
1109 if (_transport_speed) {
1110 if (!config.get_punch_in()) {
1114 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1115 RecordStateChanged (); /* EMIT SIGNAL */
1122 Session::audible_frame () const
1128 /* the first of these two possible settings for "offset"
1129 mean that the audible frame is stationary until
1130 audio emerges from the latency compensation
1133 the second means that the audible frame is stationary
1134 until audio would emerge from a physical port
1135 in the absence of any plugin latency compensation
1138 offset = _worst_output_latency;
1140 if (offset > current_block_size) {
1141 offset -= current_block_size;
1143 /* XXX is this correct? if we have no external
1144 physical connections and everything is internal
1145 then surely this is zero? still, how
1146 likely is that anyway?
1148 offset = current_block_size;
1151 if (synced_to_jack()) {
1152 tf = _engine.transport_frame();
1154 tf = _transport_frame;
1159 if (!non_realtime_work_pending()) {
1163 /* Check to see if we have passed the first guaranteed
1164 audible frame past our last start position. if not,
1165 return that last start point because in terms
1166 of audible frames, we have not moved yet.
1168 `Start position' in this context means the time we last
1169 either started or changed transport direction.
1172 if (_transport_speed > 0.0f) {
1174 if (!play_loop || !have_looped) {
1175 if (tf < _last_roll_or_reversal_location + offset) {
1176 return _last_roll_or_reversal_location;
1184 } else if (_transport_speed < 0.0f) {
1186 /* XXX wot? no backward looping? */
1188 if (tf > _last_roll_or_reversal_location - offset) {
1189 return _last_roll_or_reversal_location;
1201 Session::set_frame_rate (nframes_t frames_per_second)
1203 /** \fn void Session::set_frame_size(nframes_t)
1204 the AudioEngine object that calls this guarantees
1205 that it will not be called while we are also in
1206 ::process(). Its fine to do things that block
1210 _base_frame_rate = frames_per_second;
1214 Automatable::set_automation_interval ((jack_nframes_t) ceil ((double) frames_per_second * (0.001 * Config->get_automation_interval())));
1218 // XXX we need some equivalent to this, somehow
1219 // SndFileSource::setup_standard_crossfades (frames_per_second);
1223 /* XXX need to reset/reinstantiate all LADSPA plugins */
1227 Session::set_block_size (nframes_t nframes)
1229 /* the AudioEngine guarantees
1230 that it will not be called while we are also in
1231 ::process(). It is therefore fine to do things that block
1236 current_block_size = nframes;
1240 boost::shared_ptr<RouteList> r = routes.reader ();
1242 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1243 (*i)->set_block_size (nframes);
1246 boost::shared_ptr<RouteList> rl = routes.reader ();
1247 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1248 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1250 tr->set_block_size (nframes);
1254 set_worst_io_latencies ();
1259 Session::set_default_fade (float /*steepness*/, float /*fade_msecs*/)
1262 nframes_t fade_frames;
1264 /* Don't allow fade of less 1 frame */
1266 if (fade_msecs < (1000.0 * (1.0/_current_frame_rate))) {
1273 fade_frames = (nframes_t) floor (fade_msecs * _current_frame_rate * 0.001);
1277 default_fade_msecs = fade_msecs;
1278 default_fade_steepness = steepness;
1281 // jlc, WTF is this!
1282 Glib::RWLock::ReaderLock lm (route_lock);
1283 AudioRegion::set_default_fade (steepness, fade_frames);
1288 /* XXX have to do this at some point */
1289 /* foreach region using default fade, reset, then
1290 refill_all_diskstream_buffers ();
1295 struct RouteSorter {
1296 /** @return true to run r1 before r2, otherwise false */
1297 bool operator() (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> r2) {
1298 if (r2->feeds (r1)) {
1299 /* r1 fed by r2; run r2 early */
1301 } else if (r1->feeds (r2)) {
1302 /* r2 fed by r1; run r1 early */
1305 if (r1->not_fed ()) {
1306 if (r2->not_fed ()) {
1307 /* no ardour-based connections inbound to either route. just use signal order */
1308 return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1310 /* r2 has connections, r1 does not; run r1 early */
1314 if (r2->not_fed()) {
1315 /* r1 has connections, r2 does not; run r2 early */
1318 /* both r1 and r2 have connections, but not to each other. just use signal order */
1319 return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1327 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1329 boost::shared_ptr<Route> r2;
1331 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1332 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1336 /* make a copy of the existing list of routes that feed r1 */
1338 Route::FedBy existing (r1->fed_by());
1340 /* for each route that feeds r1, recurse, marking it as feeding
1344 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1345 if (!(r2 = i->r.lock ())) {
1346 /* (*i) went away, ignore it */
1350 /* r2 is a route that feeds r1 which somehow feeds base. mark
1351 base as being fed by r2
1354 rbase->add_fed_by (r2, i->sends_only);
1358 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1362 if (r1->feeds (r2) && r2->feeds (r1)) {
1366 /* now recurse, so that we can mark base as being fed by
1367 all routes that feed r2
1370 trace_terminal (r2, rbase);
1377 Session::resort_routes ()
1379 /* don't do anything here with signals emitted
1380 by Routes while we are being destroyed.
1383 if (_state_of_the_state & Deletion) {
1388 RCUWriter<RouteList> writer (routes);
1389 boost::shared_ptr<RouteList> r = writer.get_copy ();
1390 resort_routes_using (r);
1391 /* writer goes out of scope and forces update */
1394 //route_graph->dump(1);
1397 boost::shared_ptr<RouteList> rl = routes.reader ();
1398 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1399 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1401 const Route::FedBy& fb ((*i)->fed_by());
1403 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1404 boost::shared_ptr<Route> sf = f->r.lock();
1406 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1414 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1416 RouteList::iterator i, j;
1418 for (i = r->begin(); i != r->end(); ++i) {
1420 (*i)->clear_fed_by ();
1422 for (j = r->begin(); j != r->end(); ++j) {
1424 /* although routes can feed themselves, it will
1425 cause an endless recursive descent if we
1426 detect it. so don't bother checking for
1434 bool via_sends_only;
1436 if ((*j)->direct_feeds (*i, &via_sends_only)) {
1437 (*i)->add_fed_by (*j, via_sends_only);
1442 for (i = r->begin(); i != r->end(); ++i) {
1443 trace_terminal (*i, *i);
1449 route_graph->rechain (r);
1452 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1453 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1454 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1455 (*i)->name(), (*i)->order_key ("signal")));
1461 /** Find the route name starting with \a base with the lowest \a id.
1463 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1464 * The available route name with the lowest ID will be used, and \a id
1465 * will be set to the ID.
1467 * \return false if a route name could not be found, and \a track_name
1468 * and \a id do not reflect a free route name.
1471 Session::find_route_name (const char* base, uint32_t& id, char* name, size_t name_len)
1474 snprintf (name, name_len, "%s %" PRIu32, base, id);
1476 if (route_by_name (name) == 0) {
1482 } while (id < (UINT_MAX-1));
1487 /** Count the total ins and outs of all non-hidden routes in the session and return them in in and out */
1489 Session::count_existing_route_channels (ChanCount& in, ChanCount& out)
1491 in = ChanCount::ZERO;
1492 out = ChanCount::ZERO;
1493 boost::shared_ptr<RouteList> r = routes.reader ();
1494 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1495 if (!(*i)->is_hidden()) {
1496 in += (*i)->n_inputs();
1497 out += (*i)->n_outputs();
1502 /** Caller must not hold process lock */
1503 list<boost::shared_ptr<MidiTrack> >
1504 Session::new_midi_track (TrackMode mode, RouteGroup* route_group, uint32_t how_many)
1506 char track_name[32];
1507 uint32_t track_id = 0;
1508 ChanCount existing_inputs;
1509 ChanCount existing_outputs;
1511 RouteList new_routes;
1512 list<boost::shared_ptr<MidiTrack> > ret;
1513 uint32_t control_id;
1515 count_existing_route_channels (existing_inputs, existing_outputs);
1517 control_id = ntracks() + nbusses();
1520 if (!find_route_name ("Midi", ++track_id, track_name, sizeof(track_name))) {
1521 error << "cannot find name for new midi track" << endmsg;
1525 boost::shared_ptr<MidiTrack> track;
1528 MidiTrack* mt = new MidiTrack (*this, track_name, Route::Flag (0), mode);
1535 mt->use_new_diskstream();
1537 boost_debug_shared_ptr_mark_interesting (mt, "Track");
1538 track = boost::shared_ptr<MidiTrack>(mt);
1541 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1542 if (track->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1543 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1547 if (track->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1548 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1553 auto_connect_route (track.get(), existing_inputs, existing_outputs);
1555 track->non_realtime_input_change();
1558 route_group->add (track);
1561 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1562 track->set_remote_control_id (control_id);
1564 new_routes.push_back (track);
1565 ret.push_back (track);
1568 catch (failed_constructor &err) {
1569 error << _("Session: could not create new midi track.") << endmsg;
1573 catch (AudioEngine::PortRegistrationFailure& pfe) {
1575 error << string_compose (_("No more JACK ports are available. You will need to stop %1 and restart JACK with ports if you need this many tracks."), PROGRAM_NAME) << endmsg;
1583 if (!new_routes.empty()) {
1584 add_routes (new_routes, false);
1585 save_state (_current_snapshot_name);
1591 /** Caller must hold process lock.
1592 * @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1593 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1594 * @param output_start As \a input_start, but for outputs.
1597 Session::auto_connect_route (
1598 Route* route, ChanCount& existing_inputs, ChanCount& existing_outputs, bool connect_inputs, ChanCount input_start, ChanCount output_start
1601 /* If both inputs and outputs are auto-connected to physical ports,
1602 use the max of input and output offsets to ensure auto-connected
1603 port numbers always match up (e.g. the first audio input and the
1604 first audio output of the route will have the same physical
1605 port number). Otherwise just use the lowest input or output
1609 const bool in_out_physical =
1610 (Config->get_input_auto_connect() & AutoConnectPhysical)
1611 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1614 const ChanCount in_offset = in_out_physical
1615 ? ChanCount::max(existing_inputs, existing_outputs)
1618 const ChanCount out_offset = in_out_physical
1619 ? ChanCount::max(existing_inputs, existing_outputs)
1622 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1623 vector<string> physinputs;
1624 vector<string> physoutputs;
1626 _engine.get_physical_outputs (*t, physoutputs);
1627 _engine.get_physical_inputs (*t, physinputs);
1629 if (!physinputs.empty() && connect_inputs) {
1630 uint32_t nphysical_in = physinputs.size();
1631 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1634 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1635 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1638 if (!port.empty() && route->input()->connect (
1639 route->input()->ports().port(*t, i), port, this)) {
1645 if (!physoutputs.empty()) {
1646 uint32_t nphysical_out = physoutputs.size();
1647 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
1650 if (Config->get_output_auto_connect() & AutoConnectPhysical) {
1651 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1652 } else if (Config->get_output_auto_connect() & AutoConnectMaster) {
1653 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1654 port = _master_out->input()->ports().port(*t,
1655 i % _master_out->input()->n_ports().get(*t))->name();
1659 if (!port.empty() && route->output()->connect (
1660 route->output()->ports().port(*t, i), port, this)) {
1667 existing_inputs += route->n_inputs();
1668 existing_outputs += route->n_outputs();
1671 /** Caller must not hold process lock */
1672 list< boost::shared_ptr<AudioTrack> >
1673 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group, uint32_t how_many)
1675 char track_name[32];
1676 uint32_t track_id = 0;
1677 ChanCount existing_inputs;
1678 ChanCount existing_outputs;
1680 RouteList new_routes;
1681 list<boost::shared_ptr<AudioTrack> > ret;
1682 uint32_t control_id;
1684 count_existing_route_channels (existing_inputs, existing_outputs);
1686 control_id = ntracks() + nbusses() + 1;
1689 if (!find_route_name ("Audio", ++track_id, track_name, sizeof(track_name))) {
1690 error << "cannot find name for new audio track" << endmsg;
1694 boost::shared_ptr<AudioTrack> track;
1697 AudioTrack* at = new AudioTrack (*this, track_name, Route::Flag (0), mode);
1704 at->use_new_diskstream();
1706 boost_debug_shared_ptr_mark_interesting (at, "Track");
1707 track = boost::shared_ptr<AudioTrack>(at);
1710 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1712 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1713 error << string_compose (
1714 _("cannot configure %1 in/%2 out configuration for new audio track"),
1715 input_channels, output_channels)
1720 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1721 error << string_compose (
1722 _("cannot configure %1 in/%2 out configuration for new audio track"),
1723 input_channels, output_channels)
1728 auto_connect_route (track.get(), existing_inputs, existing_outputs);
1732 route_group->add (track);
1735 track->non_realtime_input_change();
1737 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1738 track->set_remote_control_id (control_id);
1741 new_routes.push_back (track);
1742 ret.push_back (track);
1745 catch (failed_constructor &err) {
1746 error << _("Session: could not create new audio track.") << endmsg;
1750 catch (AudioEngine::PortRegistrationFailure& pfe) {
1752 error << pfe.what() << endmsg;
1760 if (!new_routes.empty()) {
1761 add_routes (new_routes, true);
1768 Session::set_remote_control_ids ()
1770 RemoteModel m = Config->get_remote_model();
1771 bool emit_signal = false;
1773 boost::shared_ptr<RouteList> r = routes.reader ();
1775 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1776 if (MixerOrdered == m) {
1777 int32_t order = (*i)->order_key(N_("signal"));
1778 (*i)->set_remote_control_id (order+1, false);
1780 } else if (EditorOrdered == m) {
1781 int32_t order = (*i)->order_key(N_("editor"));
1782 (*i)->set_remote_control_id (order+1, false);
1784 } else if (UserOrdered == m) {
1785 //do nothing ... only changes to remote id's are initiated by user
1790 Route::RemoteControlIDChange();
1794 /** Caller must not hold process lock */
1796 Session::new_audio_route (bool aux, int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many)
1799 uint32_t bus_id = 0;
1800 ChanCount existing_inputs;
1801 ChanCount existing_outputs;
1804 uint32_t control_id;
1806 count_existing_route_channels (existing_inputs, existing_outputs);
1808 control_id = ntracks() + nbusses() + 1;
1811 if (!find_route_name ("Bus", ++bus_id, bus_name, sizeof(bus_name))) {
1812 error << "cannot find name for new audio bus" << endmsg;
1817 Route* rt = new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO);
1824 boost_debug_shared_ptr_mark_interesting (rt, "Route");
1825 boost::shared_ptr<Route> bus (rt);
1828 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1830 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1831 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1832 input_channels, output_channels)
1838 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1839 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1840 input_channels, output_channels)
1845 auto_connect_route (bus.get(), existing_inputs, existing_outputs, false);
1849 route_group->add (bus);
1851 bus->set_remote_control_id (control_id);
1855 bus->add_internal_return ();
1858 ret.push_back (bus);
1862 catch (failed_constructor &err) {
1863 error << _("Session: could not create new audio route.") << endmsg;
1867 catch (AudioEngine::PortRegistrationFailure& pfe) {
1868 error << pfe.what() << endmsg;
1878 add_routes (ret, true);
1886 Session::new_route_from_template (uint32_t how_many, const std::string& template_path)
1890 uint32_t control_id;
1892 uint32_t number = 0;
1894 if (!tree.read (template_path.c_str())) {
1898 XMLNode* node = tree.root();
1900 control_id = ntracks() + nbusses() + 1;
1904 XMLNode node_copy (*node); // make a copy so we can change the name if we need to
1906 std::string node_name = IO::name_from_state (*node_copy.children().front());
1908 /* generate a new name by adding a number to the end of the template name */
1909 if (!find_route_name (node_name.c_str(), ++number, name, sizeof(name))) {
1910 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
1914 /* set IO children to use the new name */
1915 XMLNodeList const & children = node_copy.children ();
1916 for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
1917 if ((*i)->name() == IO::state_node_name) {
1918 IO::set_name_in_state (**i, name);
1922 Track::zero_diskstream_id_in_xml (node_copy);
1925 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
1928 error << _("Session: cannot create track/bus from template description") << endmsg;
1932 if (boost::dynamic_pointer_cast<Track>(route)) {
1933 /* force input/output change signals so that the new diskstream
1934 picks up the configuration of the route. During session
1935 loading this normally happens in a different way.
1937 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
1938 change.after = route->input()->n_ports();
1939 route->input()->changed (change, this);
1940 change.after = route->output()->n_ports();
1941 route->output()->changed (change, this);
1944 route->set_remote_control_id (control_id);
1947 ret.push_back (route);
1950 catch (failed_constructor &err) {
1951 error << _("Session: could not create new route from template") << endmsg;
1955 catch (AudioEngine::PortRegistrationFailure& pfe) {
1956 error << pfe.what() << endmsg;
1965 add_routes (ret, true);
1972 Session::add_routes (RouteList& new_routes, bool save)
1975 RCUWriter<RouteList> writer (routes);
1976 boost::shared_ptr<RouteList> r = writer.get_copy ();
1977 r->insert (r->end(), new_routes.begin(), new_routes.end());
1980 /* if there is no control out and we're not in the middle of loading,
1981 resort the graph here. if there is a control out, we will resort
1982 toward the end of this method. if we are in the middle of loading,
1983 we will resort when done.
1986 if (!_monitor_out && IO::connecting_legal) {
1987 resort_routes_using (r);
1991 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
1993 boost::weak_ptr<Route> wpr (*x);
1994 boost::shared_ptr<Route> r (*x);
1996 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
1997 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
1998 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
1999 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2000 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2001 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2002 r->order_key_changed.connect_same_thread (*this, boost::bind (&Session::route_order_key_changed, this));
2004 if (r->is_master()) {
2008 if (r->is_monitor()) {
2012 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2014 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2015 track_playlist_changed (boost::weak_ptr<Track> (tr));
2016 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2018 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2020 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2025 if (_monitor_out && IO::connecting_legal) {
2027 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2028 if ((*x)->is_monitor()) {
2030 } else if ((*x)->is_master()) {
2033 (*x)->listen_via (_monitor_out,
2034 (Config->get_listen_position() == AfterFaderListen ? PostFader : PreFader),
2045 save_state (_current_snapshot_name);
2048 RouteAdded (new_routes); /* EMIT SIGNAL */
2049 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
2053 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2055 boost::shared_ptr<RouteList> r = routes.reader ();
2056 boost::shared_ptr<Send> s;
2060 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2061 if (boost::dynamic_pointer_cast<Track>(*i)) {
2062 if ((s = (*i)->internal_send_for (dest)) != 0) {
2063 s->amp()->gain_control()->set_value (0.0);
2070 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2072 boost::shared_ptr<RouteList> r = routes.reader ();
2073 boost::shared_ptr<Send> s;
2077 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2078 if (boost::dynamic_pointer_cast<Track>(*i)) {
2079 if ((s = (*i)->internal_send_for (dest)) != 0) {
2080 s->amp()->gain_control()->set_value (1.0);
2087 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2089 boost::shared_ptr<RouteList> r = routes.reader ();
2090 boost::shared_ptr<Send> s;
2094 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2095 if (boost::dynamic_pointer_cast<Track>(*i)) {
2096 if ((s = (*i)->internal_send_for (dest)) != 0) {
2097 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2104 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p)
2106 boost::shared_ptr<RouteList> r = routes.reader ();
2107 boost::shared_ptr<RouteList> t (new RouteList);
2109 /* only send tracks */
2111 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2112 if (boost::dynamic_pointer_cast<Track>(*i)) {
2117 add_internal_sends (dest, p, t);
2121 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2123 if (dest->is_monitor() || dest->is_master()) {
2127 if (!dest->internal_return()) {
2128 dest->add_internal_return();
2131 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2133 if ((*i)->is_monitor() || (*i)->is_master() || (*i) == dest) {
2137 (*i)->listen_via (dest, p, true, true);
2144 Session::remove_route (boost::shared_ptr<Route> route)
2146 if (((route == _master_out) || (route == _monitor_out)) && !Config->get_allow_special_bus_removal()) {
2150 route->set_solo (false, this);
2153 RCUWriter<RouteList> writer (routes);
2154 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2158 /* deleting the master out seems like a dumb
2159 idea, but its more of a UI policy issue
2163 if (route == _master_out) {
2164 _master_out = boost::shared_ptr<Route> ();
2167 if (route == _monitor_out) {
2169 /* cancel control outs for all routes */
2171 for (RouteList::iterator r = rs->begin(); r != rs->end(); ++r) {
2172 (*r)->drop_listen (_monitor_out);
2175 _monitor_out.reset ();
2178 /* writer goes out of scope, forces route list update */
2181 update_route_solo_state ();
2182 update_session_range_location_marker ();
2184 // We need to disconnect the route's inputs and outputs
2186 route->input()->disconnect (0);
2187 route->output()->disconnect (0);
2189 /* if the route had internal sends sending to it, remove them */
2190 if (route->internal_return()) {
2192 boost::shared_ptr<RouteList> r = routes.reader ();
2193 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2194 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2196 (*i)->remove_processor (s);
2201 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2202 if (mt && mt->step_editing()) {
2203 if (_step_editors > 0) {
2208 update_latency_compensation (false, false);
2211 /* Re-sort routes to remove the graph's current references to the one that is
2212 * going away, then flush old references out of the graph.
2216 route_graph->clear_other_chain ();
2218 /* get rid of it from the dead wood collection in the route list manager */
2220 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2224 /* try to cause everyone to drop their references */
2226 route->drop_references ();
2228 sync_order_keys (N_("session"));
2230 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2232 /* save the new state of the world */
2234 if (save_state (_current_snapshot_name)) {
2235 save_history (_current_snapshot_name);
2240 Session::route_mute_changed (void* /*src*/)
2246 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2248 boost::shared_ptr<Route> route = wpr.lock();
2250 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2254 if (route->listening()) {
2256 if (Config->get_exclusive_solo()) {
2257 /* new listen: disable all other listen */
2258 boost::shared_ptr<RouteList> r = routes.reader ();
2259 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2260 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2263 (*i)->set_listen (false, this);
2269 } else if (_listen_cnt > 0) {
2275 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2277 boost::shared_ptr<Route> route = wpr.lock ();
2280 /* should not happen */
2281 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2285 bool send_changed = false;
2287 if (route->solo_isolated()) {
2288 if (_solo_isolated_cnt == 0) {
2289 send_changed = true;
2291 _solo_isolated_cnt++;
2292 } else if (_solo_isolated_cnt > 0) {
2293 _solo_isolated_cnt--;
2294 if (_solo_isolated_cnt == 0) {
2295 send_changed = true;
2300 IsolatedChanged (); /* EMIT SIGNAL */
2305 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2307 if (!self_solo_change) {
2308 // session doesn't care about changes to soloed-by-others
2312 if (solo_update_disabled) {
2317 boost::shared_ptr<Route> route = wpr.lock ();
2320 /* should not happen */
2321 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2325 boost::shared_ptr<RouteList> r = routes.reader ();
2328 if (route->self_soloed()) {
2334 if (delta == 1 && Config->get_exclusive_solo()) {
2335 /* new solo: disable all other solos */
2336 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2337 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2340 (*i)->set_solo (false, this);
2344 solo_update_disabled = true;
2346 RouteList uninvolved;
2348 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2349 bool via_sends_only;
2350 bool in_signal_flow;
2352 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2356 in_signal_flow = false;
2358 if ((*i)->feeds (route, &via_sends_only)) {
2359 if (!via_sends_only) {
2360 if (!route->soloed_by_others_upstream()) {
2361 (*i)->mod_solo_by_others_downstream (delta);
2363 in_signal_flow = true;
2367 if (route->feeds (*i, &via_sends_only)) {
2368 (*i)->mod_solo_by_others_upstream (delta);
2369 in_signal_flow = true;
2372 if (!in_signal_flow) {
2373 uninvolved.push_back (*i);
2377 solo_update_disabled = false;
2378 update_route_solo_state (r);
2380 /* now notify that the mute state of the routes not involved in the signal
2381 pathway of the just-solo-changed route may have altered.
2384 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2385 (*i)->mute_changed (this);
2388 SoloChanged (); /* EMIT SIGNAL */
2393 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2395 /* now figure out if anything that matters is soloed (or is "listening")*/
2397 bool something_soloed = false;
2398 uint32_t listeners = 0;
2399 uint32_t isolated = 0;
2402 r = routes.reader();
2405 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2406 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2407 something_soloed = true;
2410 if (!(*i)->is_hidden() && (*i)->listening()) {
2411 if (Config->get_solo_control_is_listen_control()) {
2414 (*i)->set_listen (false, this);
2418 if ((*i)->solo_isolated()) {
2423 if (something_soloed != _non_soloed_outs_muted) {
2424 _non_soloed_outs_muted = something_soloed;
2425 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2428 _listen_cnt = listeners;
2430 if (isolated != _solo_isolated_cnt) {
2431 _solo_isolated_cnt = isolated;
2432 IsolatedChanged (); /* EMIT SIGNAL */
2436 boost::shared_ptr<RouteList>
2437 Session::get_routes_with_internal_returns() const
2439 boost::shared_ptr<RouteList> r = routes.reader ();
2440 boost::shared_ptr<RouteList> rl (new RouteList);
2442 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2443 if ((*i)->internal_return ()) {
2451 Session::io_name_is_legal (const std::string& name)
2453 boost::shared_ptr<RouteList> r = routes.reader ();
2455 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2456 if ((*i)->name() == name) {
2460 if ((*i)->has_io_processor_named (name)) {
2468 boost::shared_ptr<Route>
2469 Session::route_by_name (string name)
2471 boost::shared_ptr<RouteList> r = routes.reader ();
2473 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2474 if ((*i)->name() == name) {
2479 return boost::shared_ptr<Route> ((Route*) 0);
2482 boost::shared_ptr<Route>
2483 Session::route_by_id (PBD::ID id)
2485 boost::shared_ptr<RouteList> r = routes.reader ();
2487 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2488 if ((*i)->id() == id) {
2493 return boost::shared_ptr<Route> ((Route*) 0);
2496 boost::shared_ptr<Route>
2497 Session::route_by_remote_id (uint32_t id)
2499 boost::shared_ptr<RouteList> r = routes.reader ();
2501 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2502 if ((*i)->remote_control_id() == id) {
2507 return boost::shared_ptr<Route> ((Route*) 0);
2510 /** If either end of the session range location marker lies inside the current
2511 * session extent, move it to the corresponding session extent.
2514 Session::update_session_range_location_marker ()
2516 if (_state_of_the_state & Loading) {
2520 pair<framepos_t, framepos_t> const ext = get_extent ();
2522 if (_session_range_location == 0) {
2523 /* we don't have a session range yet; use this one (provided it is valid) */
2524 if (ext.first != max_framepos) {
2525 add_session_range_location (ext.first, ext.second);
2528 /* update the existing session range */
2529 if (ext.first < _session_range_location->start()) {
2530 _session_range_location->set_start (ext.first);
2534 if (ext.second > _session_range_location->end()) {
2535 _session_range_location->set_end (ext.second);
2542 /** @return Extent of the session's contents; if the session is empty, the first value of
2543 * the pair will equal max_framepos.
2545 pair<framepos_t, framepos_t>
2546 Session::get_extent () const
2548 pair<framepos_t, framepos_t> ext (max_framepos, 0);
2550 boost::shared_ptr<RouteList> rl = routes.reader ();
2551 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2552 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2553 if (!tr || tr->destructive()) {
2554 // ignore tape tracks when getting extents
2558 pair<framepos_t, framepos_t> e = tr->playlist()->get_extent ();
2559 if (e.first < ext.first) {
2560 ext.first = e.first;
2562 if (e.second > ext.second) {
2563 ext.second = e.second;
2570 /* Region management */
2572 boost::shared_ptr<Region>
2573 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2575 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2576 RegionFactory::RegionMap::const_iterator i;
2577 boost::shared_ptr<Region> region;
2579 Glib::Mutex::Lock lm (region_lock);
2581 for (i = regions.begin(); i != regions.end(); ++i) {
2585 if (region->whole_file()) {
2587 if (child->source_equivalent (region)) {
2593 return boost::shared_ptr<Region> ();
2597 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2599 set<boost::shared_ptr<Region> > relevant_regions;
2601 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2602 RegionFactory::get_regions_using_source (*s, relevant_regions);
2605 cerr << "There are " << relevant_regions.size() << " using " << srcs.size() << " sources" << endl;
2607 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2608 set<boost::shared_ptr<Region> >::iterator tmp;
2613 cerr << "Cleanup " << (*r)->name() << " UC = " << (*r).use_count() << endl;
2615 playlists->destroy_region (*r);
2616 RegionFactory::map_remove (*r);
2618 (*r)->drop_sources ();
2619 (*r)->drop_references ();
2621 cerr << "\tdone UC = " << (*r).use_count() << endl;
2623 relevant_regions.erase (r);
2628 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
2631 Glib::Mutex::Lock ls (source_lock);
2632 /* remove from the main source list */
2633 sources.erase ((*s)->id());
2636 (*s)->mark_for_remove ();
2637 (*s)->drop_references ();
2646 Session::remove_last_capture ()
2648 list<boost::shared_ptr<Source> > srcs;
2650 boost::shared_ptr<RouteList> rl = routes.reader ();
2651 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2652 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2657 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
2660 srcs.insert (srcs.end(), l.begin(), l.end());
2665 destroy_sources (srcs);
2667 save_state (_current_snapshot_name);
2672 /* Source Management */
2675 Session::add_source (boost::shared_ptr<Source> source)
2677 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
2678 pair<SourceMap::iterator,bool> result;
2680 entry.first = source->id();
2681 entry.second = source;
2684 Glib::Mutex::Lock lm (source_lock);
2685 result = sources.insert (entry);
2688 if (result.second) {
2690 /* yay, new source */
2694 boost::shared_ptr<AudioFileSource> afs;
2696 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
2697 if (Config->get_auto_analyse_audio()) {
2698 Analyser::queue_source_for_analysis (source, false);
2705 Session::remove_source (boost::weak_ptr<Source> src)
2707 SourceMap::iterator i;
2708 boost::shared_ptr<Source> source = src.lock();
2715 Glib::Mutex::Lock lm (source_lock);
2717 if ((i = sources.find (source->id())) != sources.end()) {
2718 cerr << "Removing source " << source->name() << endl;
2723 if (!_state_of_the_state & InCleanup) {
2725 /* save state so we don't end up with a session file
2726 referring to non-existent sources.
2729 save_state (_current_snapshot_name);
2733 boost::shared_ptr<Source>
2734 Session::source_by_id (const PBD::ID& id)
2736 Glib::Mutex::Lock lm (source_lock);
2737 SourceMap::iterator i;
2738 boost::shared_ptr<Source> source;
2740 if ((i = sources.find (id)) != sources.end()) {
2747 boost::shared_ptr<Source>
2748 Session::source_by_path_and_channel (const string& path, uint16_t chn)
2750 Glib::Mutex::Lock lm (source_lock);
2752 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2753 boost::shared_ptr<AudioFileSource> afs
2754 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
2756 if (afs && afs->path() == path && chn == afs->channel()) {
2760 return boost::shared_ptr<Source>();
2764 Session::count_sources_by_origin (const string& path)
2767 Glib::Mutex::Lock lm (source_lock);
2769 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2770 boost::shared_ptr<FileSource> fs
2771 = boost::dynamic_pointer_cast<FileSource>(i->second);
2773 if (fs && fs->origin() == path) {
2783 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
2786 string old_basename = PBD::basename_nosuffix (oldname);
2787 string new_legalized = legalize_for_path (newname);
2789 /* note: we know (or assume) the old path is already valid */
2793 /* destructive file sources have a name of the form:
2795 /path/to/Tnnnn-NAME(%[LR])?.wav
2797 the task here is to replace NAME with the new name.
2802 string::size_type dash;
2804 dir = Glib::path_get_dirname (path);
2805 path = Glib::path_get_basename (path);
2807 /* '-' is not a legal character for the NAME part of the path */
2809 if ((dash = path.find_last_of ('-')) == string::npos) {
2813 prefix = path.substr (0, dash);
2817 path += new_legalized;
2818 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
2819 path = Glib::build_filename (dir, path);
2823 /* non-destructive file sources have a name of the form:
2825 /path/to/NAME-nnnnn(%[LR])?.ext
2827 the task here is to replace NAME with the new name.
2832 string::size_type dash;
2833 string::size_type postfix;
2835 dir = Glib::path_get_dirname (path);
2836 path = Glib::path_get_basename (path);
2838 /* '-' is not a legal character for the NAME part of the path */
2840 if ((dash = path.find_last_of ('-')) == string::npos) {
2844 suffix = path.substr (dash+1);
2846 // Suffix is now everything after the dash. Now we need to eliminate
2847 // the nnnnn part, which is done by either finding a '%' or a '.'
2849 postfix = suffix.find_last_of ("%");
2850 if (postfix == string::npos) {
2851 postfix = suffix.find_last_of ('.');
2854 if (postfix != string::npos) {
2855 suffix = suffix.substr (postfix);
2857 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
2861 const uint32_t limit = 10000;
2862 char buf[PATH_MAX+1];
2864 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
2866 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
2868 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
2869 path = Glib::build_filename (dir, buf);
2877 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
2886 /** Return the full path (in some session directory) for a new within-session source.
2887 * \a name must be a session-unique name that does not contain slashes
2888 * (e.g. as returned by new_*_source_name)
2891 Session::new_source_path_from_name (DataType type, const string& name, bool as_stub)
2893 assert(name.find("/") == string::npos);
2895 SessionDirectory sdir(get_best_session_directory_for_new_source());
2898 if (type == DataType::AUDIO) {
2899 p = (as_stub ? sdir.sound_stub_path() : sdir.sound_path());
2900 } else if (type == DataType::MIDI) {
2901 p = (as_stub ? sdir.midi_stub_path() : sdir.midi_path());
2903 error << "Unknown source type, unable to create file path" << endmsg;
2908 return p.to_string();
2912 Session::peak_path (string base) const
2914 sys::path peakfile_path(_session_dir->peak_path());
2915 peakfile_path /= base + peakfile_suffix;
2916 return peakfile_path.to_string();
2919 /** Return a unique name based on \a base for a new internal audio source */
2921 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
2924 char buf[PATH_MAX+1];
2925 const uint32_t limit = 10000;
2927 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
2930 legalized = legalize_for_path (base);
2932 // Find a "version" of the base name that doesn't exist in any of the possible directories.
2933 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
2935 vector<space_and_path>::iterator i;
2936 uint32_t existing = 0;
2938 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2943 snprintf (buf, sizeof(buf), "T%04d-%s%s",
2944 cnt, legalized.c_str(), ext.c_str());
2945 } else if (nchan == 2) {
2947 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
2948 cnt, legalized.c_str(), ext.c_str());
2950 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
2951 cnt, legalized.c_str(), ext.c_str());
2953 } else if (nchan < 26) {
2954 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
2955 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
2957 snprintf (buf, sizeof(buf), "T%04d-%s%s",
2958 cnt, legalized.c_str(), ext.c_str());
2964 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
2965 } else if (nchan == 2) {
2967 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
2969 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
2971 } else if (nchan < 26) {
2972 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
2974 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
2978 SessionDirectory sdir((*i).path);
2980 string spath = sdir.sound_path().to_string();
2981 string spath_stubs = sdir.sound_stub_path().to_string();
2983 /* note that we search *without* the extension so that
2984 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
2985 in the event that this new name is required for
2986 a file format change.
2989 if (matching_unsuffixed_filename_exists_in (spath, buf) ||
2990 matching_unsuffixed_filename_exists_in (spath_stubs, buf)) {
2996 if (existing == 0) {
3001 error << string_compose(
3002 _("There are already %1 recordings for %2, which I consider too many."),
3003 limit, base) << endmsg;
3005 throw failed_constructor();
3009 return Glib::path_get_basename (buf);
3012 /** Create a new within-session audio source */
3013 boost::shared_ptr<AudioFileSource>
3014 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive, bool as_stub)
3016 const string name = new_audio_source_name (n, n_chans, chan, destructive);
3017 const string path = new_source_path_from_name(DataType::AUDIO, name, as_stub);
3019 return boost::dynamic_pointer_cast<AudioFileSource> (
3020 SourceFactory::createWritable (DataType::AUDIO, *this, path, string(), destructive, frame_rate()));
3023 /** Return a unique name based on \a base for a new internal MIDI source */
3025 Session::new_midi_source_name (const string& base)
3028 char buf[PATH_MAX+1];
3029 const uint32_t limit = 10000;
3033 legalized = legalize_for_path (base);
3035 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3036 for (cnt = 1; cnt <= limit; ++cnt) {
3038 vector<space_and_path>::iterator i;
3039 uint32_t existing = 0;
3041 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3043 SessionDirectory sdir((*i).path);
3045 sys::path p = sdir.midi_path();
3048 snprintf (buf, sizeof(buf), "%s-%u.mid", p.to_string().c_str(), cnt);
3050 if (sys::exists (buf)) {
3055 if (existing == 0) {
3060 error << string_compose(
3061 _("There are already %1 recordings for %2, which I consider too many."),
3062 limit, base) << endmsg;
3064 throw failed_constructor();
3068 return Glib::path_get_basename(buf);
3072 /** Create a new within-session MIDI source */
3073 boost::shared_ptr<MidiSource>
3074 Session::create_midi_source_for_session (Track* track, string const & n, bool as_stub)
3076 /* try to use the existing write source for the track, to keep numbering sane
3080 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3084 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3087 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3088 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3092 const string name = new_midi_source_name (n);
3093 const string path = new_source_path_from_name (DataType::MIDI, name, as_stub);
3095 return boost::dynamic_pointer_cast<SMFSource> (
3096 SourceFactory::createWritable (
3097 DataType::MIDI, *this, path, string(), false, frame_rate()));
3102 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3104 if (playlist->hidden()) {
3108 playlists->add (playlist);
3111 playlist->release();
3118 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3120 if (_state_of_the_state & Deletion) {
3124 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3130 playlists->remove (playlist);
3136 Session::set_audition (boost::shared_ptr<Region> r)
3138 pending_audition_region = r;
3139 add_post_transport_work (PostTransportAudition);
3140 _butler->schedule_transport_work ();
3144 Session::audition_playlist ()
3146 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3147 ev->region.reset ();
3152 Session::non_realtime_set_audition ()
3154 if (!pending_audition_region) {
3155 auditioner->audition_current_playlist ();
3157 auditioner->audition_region (pending_audition_region);
3158 pending_audition_region.reset ();
3160 AuditionActive (true); /* EMIT SIGNAL */
3164 Session::audition_region (boost::shared_ptr<Region> r)
3166 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3172 Session::cancel_audition ()
3174 if (auditioner->auditioning()) {
3175 auditioner->cancel_audition ();
3176 AuditionActive (false); /* EMIT SIGNAL */
3181 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3183 if (a->is_monitor()) {
3186 if (b->is_monitor()) {
3189 return a->order_key(N_("signal")) < b->order_key(N_("signal"));
3193 Session::is_auditioning () const
3195 /* can be called before we have an auditioner object */
3197 return auditioner->auditioning();
3204 Session::graph_reordered ()
3206 /* don't do this stuff if we are setting up connections
3207 from a set_state() call or creating new tracks. Ditto for deletion.
3210 if (_state_of_the_state & (InitialConnecting|Deletion)) {
3214 /* every track/bus asked for this to be handled but it was deferred because
3215 we were connecting. do it now.
3218 request_input_change_handling ();
3222 /* force all diskstreams to update their capture offset values to
3223 reflect any changes in latencies within the graph.
3226 boost::shared_ptr<RouteList> rl = routes.reader ();
3227 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3228 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3230 tr->set_capture_offset ();
3236 Session::available_capture_duration ()
3238 float sample_bytes_on_disk = 4.0; // keep gcc happy
3240 switch (config.get_native_file_data_format()) {
3242 sample_bytes_on_disk = 4.0;
3246 sample_bytes_on_disk = 3.0;
3250 sample_bytes_on_disk = 2.0;
3254 /* impossible, but keep some gcc versions happy */
3255 fatal << string_compose (_("programming error: %1"),
3256 X_("illegal native file data format"))
3261 double scale = 4096.0 / sample_bytes_on_disk;
3263 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3264 return max_framecnt;
3267 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3271 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3274 RCUWriter<BundleList> writer (_bundles);
3275 boost::shared_ptr<BundleList> b = writer.get_copy ();
3276 b->push_back (bundle);
3279 BundleAdded (bundle); /* EMIT SIGNAL */
3285 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3287 bool removed = false;
3290 RCUWriter<BundleList> writer (_bundles);
3291 boost::shared_ptr<BundleList> b = writer.get_copy ();
3292 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3294 if (i != b->end()) {
3301 BundleRemoved (bundle); /* EMIT SIGNAL */
3307 boost::shared_ptr<Bundle>
3308 Session::bundle_by_name (string name) const
3310 boost::shared_ptr<BundleList> b = _bundles.reader ();
3312 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3313 if ((*i)->name() == name) {
3318 return boost::shared_ptr<Bundle> ();
3322 Session::tempo_map_changed (const PropertyChange&)
3326 playlists->update_after_tempo_map_change ();
3328 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3334 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3336 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3337 (*i)->recompute_frames_from_bbt ();
3341 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3342 * the given count with the current block size.
3345 Session::ensure_buffers (ChanCount howmany)
3347 BufferManager::ensure_buffers (howmany);
3351 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3353 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3354 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3359 Session::next_insert_id ()
3361 /* this doesn't really loop forever. just think about it */
3364 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3365 if (!insert_bitset[n]) {
3366 insert_bitset[n] = true;
3372 /* none available, so resize and try again */
3374 insert_bitset.resize (insert_bitset.size() + 16, false);
3379 Session::next_send_id ()
3381 /* this doesn't really loop forever. just think about it */
3384 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3385 if (!send_bitset[n]) {
3386 send_bitset[n] = true;
3392 /* none available, so resize and try again */
3394 send_bitset.resize (send_bitset.size() + 16, false);
3399 Session::next_return_id ()
3401 /* this doesn't really loop forever. just think about it */
3404 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3405 if (!return_bitset[n]) {
3406 return_bitset[n] = true;
3412 /* none available, so resize and try again */
3414 return_bitset.resize (return_bitset.size() + 16, false);
3419 Session::mark_send_id (uint32_t id)
3421 if (id >= send_bitset.size()) {
3422 send_bitset.resize (id+16, false);
3424 if (send_bitset[id]) {
3425 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3427 send_bitset[id] = true;
3431 Session::mark_return_id (uint32_t id)
3433 if (id >= return_bitset.size()) {
3434 return_bitset.resize (id+16, false);
3436 if (return_bitset[id]) {
3437 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3439 return_bitset[id] = true;
3443 Session::mark_insert_id (uint32_t id)
3445 if (id >= insert_bitset.size()) {
3446 insert_bitset.resize (id+16, false);
3448 if (insert_bitset[id]) {
3449 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3451 insert_bitset[id] = true;
3455 Session::unmark_send_id (uint32_t id)
3457 if (id < send_bitset.size()) {
3458 send_bitset[id] = false;
3463 Session::unmark_return_id (uint32_t id)
3465 if (id < return_bitset.size()) {
3466 return_bitset[id] = false;
3471 Session::unmark_insert_id (uint32_t id)
3473 if (id < insert_bitset.size()) {
3474 insert_bitset[id] = false;
3479 /* Named Selection management */
3481 boost::shared_ptr<NamedSelection>
3482 Session::named_selection_by_name (string name)
3484 Glib::Mutex::Lock lm (named_selection_lock);
3485 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
3486 if ((*i)->name == name) {
3490 return boost::shared_ptr<NamedSelection>();
3494 Session::add_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3497 Glib::Mutex::Lock lm (named_selection_lock);
3498 named_selections.insert (named_selections.begin(), named_selection);
3503 NamedSelectionAdded (); /* EMIT SIGNAL */
3507 Session::remove_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3509 bool removed = false;
3512 Glib::Mutex::Lock lm (named_selection_lock);
3514 NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
3516 if (i != named_selections.end()) {
3517 named_selections.erase (i);
3524 NamedSelectionRemoved (); /* EMIT SIGNAL */
3529 Session::reset_native_file_format ()
3531 boost::shared_ptr<RouteList> rl = routes.reader ();
3532 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3533 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3535 /* don't save state as we do this, there's no point
3538 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3539 tr->reset_write_sources (false);
3540 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3546 Session::route_name_unique (string n) const
3548 boost::shared_ptr<RouteList> r = routes.reader ();
3550 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3551 if ((*i)->name() == n) {
3560 Session::route_name_internal (string n) const
3562 if (auditioner && auditioner->name() == n) {
3566 if (_click_io && _click_io->name() == n) {
3574 Session::freeze_all (InterThreadInfo& itt)
3576 boost::shared_ptr<RouteList> r = routes.reader ();
3578 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3580 boost::shared_ptr<Track> t;
3582 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3583 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3593 boost::shared_ptr<Region>
3594 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
3595 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3596 InterThreadInfo& itt, bool enable_processing)
3598 boost::shared_ptr<Region> result;
3599 boost::shared_ptr<Playlist> playlist;
3600 boost::shared_ptr<AudioFileSource> fsource;
3602 char buf[PATH_MAX+1];
3603 ChanCount nchans(track.n_channels());
3604 framepos_t position;
3605 framecnt_t this_chunk;
3608 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3609 const string sound_dir = sdir.sound_path().to_string();
3610 framepos_t len = end - start;
3611 bool need_block_size_reset = false;
3615 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3616 end, start) << endmsg;
3620 const framecnt_t chunk_size = (256 * 1024)/4;
3622 // block all process callback handling
3624 block_processing ();
3626 /* call tree *MUST* hold route_lock */
3628 if ((playlist = track.playlist()) == 0) {
3632 /* external redirects will be a problem */
3634 if (track.has_external_redirects()) {
3638 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3640 for (uint32_t chan_n=0; chan_n < nchans.n_audio(); ++chan_n) {
3642 for (x = 0; x < 99999; ++x) {
3643 snprintf (buf, sizeof(buf), "%s/%s-%d-bounce-%" PRIu32 "%s", sound_dir.c_str(), playlist->name().c_str(), chan_n, x+1, ext.c_str());
3644 if (access (buf, F_OK) != 0) {
3650 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3655 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
3656 SourceFactory::createWritable (DataType::AUDIO, *this, buf, string(), false, frame_rate()));
3659 catch (failed_constructor& err) {
3660 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
3664 srcs.push_back (fsource);
3667 /* tell redirects that care that we are about to use a much larger blocksize */
3669 need_block_size_reset = true;
3670 track.set_block_size (chunk_size);
3672 /* XXX need to flush all redirects */
3677 /* create a set of reasonably-sized buffers */
3678 buffers.ensure_buffers(DataType::AUDIO, nchans.n_audio(), chunk_size);
3679 buffers.set_count(nchans);
3681 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3682 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3684 afs->prepare_for_peakfile_writes ();
3687 while (to_do && !itt.cancel) {
3689 this_chunk = min (to_do, chunk_size);
3691 if (track.export_stuff (buffers, start, this_chunk, enable_processing)) {
3696 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
3697 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3700 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
3706 start += this_chunk;
3707 to_do -= this_chunk;
3709 itt.progress = (float) (1.0 - ((double) to_do / len));
3718 xnow = localtime (&now);
3720 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3721 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3724 afs->update_header (position, *xnow, now);
3725 afs->flush_header ();
3729 /* construct a region to represent the bounced material */
3733 plist.add (Properties::start, 0);
3734 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
3735 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
3737 result = RegionFactory::create (srcs, plist);
3743 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3744 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3747 afs->mark_for_remove ();
3750 (*src)->drop_references ();
3754 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3755 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3758 afs->done_with_peakfile_writes ();
3763 if (need_block_size_reset) {
3764 track.set_block_size (get_block_size());
3767 unblock_processing ();
3773 Session::gain_automation_buffer() const
3775 return ProcessThread::gain_automation_buffer ();
3779 Session::pan_automation_buffer() const
3781 return ProcessThread::pan_automation_buffer ();
3785 Session::get_silent_buffers (ChanCount count)
3787 return ProcessThread::get_silent_buffers (count);
3789 assert(_silent_buffers->available() >= count);
3790 _silent_buffers->set_count(count);
3792 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3793 for (size_t i= 0; i < count.get(*t); ++i) {
3794 _silent_buffers->get(*t, i).clear();
3798 return *_silent_buffers;
3803 Session::get_scratch_buffers (ChanCount count)
3805 return ProcessThread::get_scratch_buffers (count);
3807 if (count != ChanCount::ZERO) {
3808 assert(_scratch_buffers->available() >= count);
3809 _scratch_buffers->set_count(count);
3811 _scratch_buffers->set_count (_scratch_buffers->available());
3814 return *_scratch_buffers;
3819 Session::get_mix_buffers (ChanCount count)
3821 return ProcessThread::get_mix_buffers (count);
3823 assert(_mix_buffers->available() >= count);
3824 _mix_buffers->set_count(count);
3825 return *_mix_buffers;
3830 Session::ntracks () const
3833 boost::shared_ptr<RouteList> r = routes.reader ();
3835 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3836 if (boost::dynamic_pointer_cast<Track> (*i)) {
3845 Session::nbusses () const
3848 boost::shared_ptr<RouteList> r = routes.reader ();
3850 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3851 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
3860 Session::add_automation_list(AutomationList *al)
3862 automation_lists[al->id()] = al;
3866 Session::sync_order_keys (std::string const & base)
3868 if (deletion_in_progress()) {
3872 if (!Config->get_sync_all_route_ordering()) {
3873 /* leave order keys as they are */
3877 boost::shared_ptr<RouteList> r = routes.reader ();
3879 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3880 (*i)->sync_order_keys (base);
3883 Route::SyncOrderKeys (base); // EMIT SIGNAL
3885 /* this might not do anything */
3887 set_remote_control_ids ();
3890 /** @return true if there is at least one record-enabled track, otherwise false */
3892 Session::have_rec_enabled_track () const
3894 return g_atomic_int_get (&_have_rec_enabled_track) == 1;
3897 /** Update the state of our rec-enabled tracks flag */
3899 Session::update_have_rec_enabled_track ()
3901 boost::shared_ptr<RouteList> rl = routes.reader ();
3902 RouteList::iterator i = rl->begin();
3903 while (i != rl->end ()) {
3905 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3906 if (tr && tr->record_enabled ()) {
3913 int const old = g_atomic_int_get (&_have_rec_enabled_track);
3915 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
3917 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
3918 RecordStateChanged (); /* EMIT SIGNAL */
3923 Session::listen_position_changed ()
3927 switch (Config->get_listen_position()) {
3928 case AfterFaderListen:
3932 case PreFaderListen:
3937 boost::shared_ptr<RouteList> r = routes.reader ();
3939 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3940 (*i)->put_monitor_send_at (p);
3945 Session::solo_control_mode_changed ()
3947 /* cancel all solo or all listen when solo control mode changes */
3950 set_solo (get_routes(), false);
3951 } else if (listening()) {
3952 set_listen (get_routes(), false);
3956 /** Called when anything about any of our route groups changes (membership, state etc.) */
3958 Session::route_group_changed ()
3960 RouteGroupChanged (); /* EMIT SIGNAL */
3964 Session::get_available_sync_options () const
3966 vector<SyncSource> ret;
3968 ret.push_back (JACK);
3969 ret.push_back (MTC);
3970 ret.push_back (MIDIClock);
3975 boost::shared_ptr<RouteList>
3976 Session::get_routes_with_regions_at (framepos_t const p) const
3978 boost::shared_ptr<RouteList> r = routes.reader ();
3979 boost::shared_ptr<RouteList> rl (new RouteList);
3981 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3982 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3987 boost::shared_ptr<Playlist> pl = tr->playlist ();
3992 if (pl->has_region_at (p)) {
4001 Session::goto_end ()
4003 if (_session_range_location) {
4004 request_locate (_session_range_location->end(), false);
4006 request_locate (0, false);
4011 Session::goto_start ()
4013 if (_session_range_location) {
4014 request_locate (_session_range_location->start(), false);
4016 request_locate (0, false);
4021 Session::current_start_frame () const
4023 return _session_range_location ? _session_range_location->start() : 0;
4027 Session::current_end_frame () const
4029 return _session_range_location ? _session_range_location->end() : 0;
4033 Session::add_session_range_location (nframes_t start, nframes_t end)
4035 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4036 _locations->add (_session_range_location);
4039 /** Called when one of our routes' order keys has changed */
4041 Session::route_order_key_changed ()
4043 RouteOrderKeyChanged (); /* EMIT SIGNAL */
4047 Session::step_edit_status_change (bool yn)
4053 send = (_step_editors == 0);
4058 send = (_step_editors == 1);
4061 if (_step_editors > 0) {
4067 StepEditStatusChange (val);
4073 Session::start_time_changed (framepos_t old)
4075 /* Update the auto loop range to match the session range
4076 (unless the auto loop range has been changed by the user)
4079 Location* s = _locations->session_range_location ();
4080 Location* l = _locations->auto_loop_location ();
4082 if (l->start() == old) {
4083 l->set_start (s->start(), true);
4088 Session::end_time_changed (framepos_t old)
4090 /* Update the auto loop range to match the session range
4091 (unless the auto loop range has been changed by the user)
4094 Location* s = _locations->session_range_location ();
4095 Location* l = _locations->auto_loop_location ();
4097 if (l->end() == old) {
4098 l->set_end (s->end(), true);
4103 Session::source_search_path (DataType type) const
4107 if (session_dirs.size() == 1) {
4109 case DataType::AUDIO:
4110 search_path = _session_dir->sound_path().to_string();
4112 case DataType::MIDI:
4113 search_path = _session_dir->midi_path().to_string();
4117 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4118 SessionDirectory sdir (i->path);
4119 if (!search_path.empty()) {
4123 case DataType::AUDIO:
4124 search_path += sdir.sound_path().to_string();
4126 case DataType::MIDI:
4127 search_path += sdir.midi_path().to_string();
4133 /* now add user-specified locations
4136 vector<string> dirs;
4139 case DataType::AUDIO:
4140 split (config.get_audio_search_path (), dirs, ':');
4142 case DataType::MIDI:
4143 split (config.get_midi_search_path (), dirs, ':');
4147 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4157 Session::ensure_search_path_includes (const string& path, DataType type)
4160 vector<string> dirs;
4167 case DataType::AUDIO:
4168 search_path = config.get_audio_search_path ();
4170 case DataType::MIDI:
4171 search_path = config.get_midi_search_path ();
4175 split (search_path, dirs, ':');
4177 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4183 if (!search_path.empty()) {
4187 search_path += path;
4190 case DataType::AUDIO:
4191 config.set_audio_search_path (search_path);
4193 case DataType::MIDI:
4194 config.set_midi_search_path (search_path);
4200 Session::get_speakers()
4203 _speakers = new Speakers;
4210 Session::unknown_processors () const
4214 boost::shared_ptr<RouteList> r = routes.reader ();
4215 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4216 list<string> t = (*i)->unknown_processors ();
4217 copy (t.begin(), t.end(), back_inserter (p));