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, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
119 PBD::Signal0<void> Session::SendFeedback;
120 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
122 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
123 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
124 PBD::Signal0<void> Session::AutoBindingOn;
125 PBD::Signal0<void> Session::AutoBindingOff;
126 PBD::Signal2<void,std::string, std::string> Session::Exported;
127 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
128 PBD::Signal0<void> Session::Quit;
130 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
131 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
133 Session::Session (AudioEngine &eng,
134 const string& fullpath,
135 const string& snapshot_name,
136 BusProfile* bus_profile,
140 , _target_transport_speed (0.0)
141 , _requested_return_frame (-1)
142 , _session_dir (new SessionDirectory(fullpath))
144 , _state_of_the_state (Clean)
145 , _butler (new Butler (*this))
146 , _post_transport_work (0)
147 , _send_timecode_update (false)
148 , _all_route_group (new RouteGroup (*this, "all"))
149 , route_graph (new Graph(*this))
150 , routes (new RouteList)
151 , _total_free_4k_blocks (0)
152 , _bundles (new BundleList)
153 , _bundle_xml_node (0)
154 , _click_io ((IO*) 0)
156 , click_emphasis_data (0)
158 , _metadata (new SessionMetadata())
159 , _have_rec_enabled_track (false)
160 , _suspend_timecode_transmission (0)
162 _locations = new Locations (*this);
164 playlists.reset (new SessionPlaylists);
166 _all_route_group->set_active (true, this);
168 interpolation.add_channel_to (0, 0);
170 if (!eng.connected()) {
171 throw failed_constructor();
174 n_physical_outputs = _engine.n_physical_outputs ();
175 n_physical_inputs = _engine.n_physical_inputs ();
177 first_stage_init (fullpath, snapshot_name);
179 _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
182 if (create (mix_template, bus_profile)) {
184 throw failed_constructor ();
188 if (second_stage_init ()) {
190 throw failed_constructor ();
193 store_recent_sessions(_name, _path);
195 bool was_dirty = dirty();
197 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
199 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
200 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
203 DirtyChanged (); /* EMIT SIGNAL */
206 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
207 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
220 vector<void*> debug_pointers;
222 /* if we got to here, leaving pending capture state around
226 remove_pending_capture_state ();
228 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
230 _engine.remove_session ();
232 /* clear history so that no references to objects are held any more */
236 /* clear state tree so that no references to objects are held any more */
240 /* remove all stubfiles that might still be lurking */
242 cleanup_stubfiles ();
244 /* reset dynamic state version back to default */
246 Stateful::loading_state_version = 0;
248 _butler->drop_references ();
250 delete midi_control_ui;
251 delete _all_route_group;
253 if (click_data != default_click) {
254 delete [] click_data;
257 if (click_emphasis_data != default_click_emphasis) {
258 delete [] click_emphasis_data;
263 /* clear out any pending dead wood from RCU managed objects */
268 AudioDiskstream::free_working_buffers();
270 /* tell everyone who is still standing that we're about to die */
273 /* tell everyone to drop references and delete objects as we go */
275 DEBUG_TRACE (DEBUG::Destruction, "delete named selections\n");
276 named_selections.clear ();
278 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
279 RegionFactory::delete_all_regions ();
281 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
283 /* reset these three references to special routes before we do the usual route delete thing */
286 _master_out.reset ();
287 _monitor_out.reset ();
290 RCUWriter<RouteList> writer (routes);
291 boost::shared_ptr<RouteList> r = writer.get_copy ();
293 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
294 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
295 (*i)->drop_references ();
299 /* writer goes out of scope and updates master */
303 boost::shared_ptr<RouteList> r = routes.reader ();
305 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
306 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
307 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->path(), i->second.use_count()));
308 i->second->drop_references ();
313 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
314 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
319 Crossfade::set_buffer_size (0);
321 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
324 boost_debug_list_ptrs ();
329 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
333 Session::set_worst_io_latencies ()
335 _worst_output_latency = 0;
336 _worst_input_latency = 0;
338 if (!_engine.connected()) {
342 boost::shared_ptr<RouteList> r = routes.reader ();
344 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
345 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
346 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
351 Session::when_engine_running ()
353 string first_physical_output;
355 BootMessage (_("Set block size and sample rate"));
357 set_block_size (_engine.frames_per_cycle());
358 set_frame_rate (_engine.frame_rate());
360 BootMessage (_("Using configuration"));
362 boost::function<void (std::string)> ff (boost::bind (&Session::config_changed, this, _1, false));
363 boost::function<void (std::string)> ft (boost::bind (&Session::config_changed, this, _1, true));
365 Config->map_parameters (ff);
366 config.map_parameters (ft);
368 /* every time we reconnect, recompute worst case output latencies */
370 _engine.Running.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies, this));
372 if (synced_to_jack()) {
373 _engine.transport_stop ();
376 if (config.get_jack_time_master()) {
377 _engine.transport_locate (_transport_frame);
385 _click_io.reset (new ClickIO (*this, "click"));
387 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
389 /* existing state for Click */
392 if (Stateful::loading_state_version < 3000) {
393 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
395 c = _click_io->set_state (*child->children().front(), Stateful::loading_state_version);
400 _clicking = Config->get_clicking ();
404 error << _("could not setup Click I/O") << endmsg;
411 /* default state for Click: dual-mono to first 2 physical outputs */
414 _engine.get_physical_outputs (DataType::AUDIO, outs);
416 for (uint32_t physport = 0; physport < 2; ++physport) {
417 if (outs.size() > physport) {
418 if (_click_io->add_port (outs[physport], this)) {
419 // relax, even though its an error
424 if (_click_io->n_ports () > ChanCount::ZERO) {
425 _clicking = Config->get_clicking ();
430 catch (failed_constructor& err) {
431 error << _("cannot setup Click I/O") << endmsg;
434 BootMessage (_("Compute I/O Latencies"));
436 set_worst_io_latencies ();
439 // XXX HOW TO ALERT UI TO THIS ? DO WE NEED TO?
442 BootMessage (_("Set up standard connections"));
444 vector<string> inputs[DataType::num_types];
445 vector<string> outputs[DataType::num_types];
446 for (uint32_t i = 0; i < DataType::num_types; ++i) {
447 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
448 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
451 /* Create a set of Bundle objects that map
452 to the physical I/O currently available. We create both
453 mono and stereo bundles, so that the common cases of mono
454 and stereo tracks get bundles to put in their mixer strip
455 in / out menus. There may be a nicer way of achieving that;
456 it doesn't really scale that well to higher channel counts
459 /* mono output bundles */
461 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
463 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
465 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
466 c->add_channel (_("mono"), DataType::AUDIO);
467 c->set_port (0, outputs[DataType::AUDIO][np]);
472 /* stereo output bundles */
474 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
475 if (np + 1 < outputs[DataType::AUDIO].size()) {
477 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
478 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
479 c->add_channel (_("L"), DataType::AUDIO);
480 c->set_port (0, outputs[DataType::AUDIO][np]);
481 c->add_channel (_("R"), DataType::AUDIO);
482 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
488 /* mono input bundles */
490 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
492 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
494 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
495 c->add_channel (_("mono"), DataType::AUDIO);
496 c->set_port (0, inputs[DataType::AUDIO][np]);
501 /* stereo input bundles */
503 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
504 if (np + 1 < inputs[DataType::AUDIO].size()) {
506 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
508 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
509 c->add_channel (_("L"), DataType::AUDIO);
510 c->set_port (0, inputs[DataType::AUDIO][np]);
511 c->add_channel (_("R"), DataType::AUDIO);
512 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
518 /* MIDI input bundles */
520 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
521 string n = inputs[DataType::MIDI][np];
522 boost::erase_first (n, X_("alsa_pcm:"));
524 boost::shared_ptr<Bundle> c (new Bundle (n, false));
525 c->add_channel ("", DataType::MIDI);
526 c->set_port (0, inputs[DataType::MIDI][np]);
530 /* MIDI output bundles */
532 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
533 string n = outputs[DataType::MIDI][np];
534 boost::erase_first (n, X_("alsa_pcm:"));
536 boost::shared_ptr<Bundle> c (new Bundle (n, true));
537 c->add_channel ("", DataType::MIDI);
538 c->set_port (0, outputs[DataType::MIDI][np]);
542 BootMessage (_("Setup signal flow and plugins"));
546 if (_is_new && !no_auto_connect()) {
548 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock());
550 /* don't connect the master bus outputs if there is a monitor bus */
552 if (_master_out && Config->get_auto_connect_standard_busses() && !_monitor_out) {
554 /* if requested auto-connect the outputs to the first N physical ports.
557 uint32_t limit = _master_out->n_outputs().n_total();
559 for (uint32_t n = 0; n < limit; ++n) {
560 Port* p = _master_out->output()->nth (n);
562 if (outputs[p->type()].size() > n) {
563 connect_to = outputs[p->type()][n];
566 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
567 if (_master_out->output()->connect (p, connect_to, this)) {
568 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
578 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
579 are undefined, at best.
582 /* control out listens to master bus (but ignores it
583 under some conditions)
586 uint32_t limit = _monitor_out->n_inputs().n_audio();
589 for (uint32_t n = 0; n < limit; ++n) {
590 AudioPort* p = _monitor_out->input()->ports().nth_audio_port (n);
591 AudioPort* o = _master_out->output()->ports().nth_audio_port (n);
594 string connect_to = o->name();
595 if (_monitor_out->input()->connect (p, connect_to, this)) {
596 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
604 /* if control out is not connected, connect control out to physical outs
607 if (!_monitor_out->output()->connected ()) {
609 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
611 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
614 _monitor_out->output()->connect_ports_to_bundle (b, this);
616 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
617 Config->get_monitor_bus_preferred_bundle())
623 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
624 uint32_t mod = n_physical_outputs.get (*t);
625 uint32_t limit = _monitor_out->n_outputs().get(*t);
627 for (uint32_t n = 0; n < limit; ++n) {
629 Port* p = _monitor_out->output()->ports().port(*t, n);
631 if (outputs[*t].size() > (n % mod)) {
632 connect_to = outputs[*t][n % mod];
635 if (!connect_to.empty()) {
636 if (_monitor_out->output()->connect (p, connect_to, this)) {
637 error << string_compose (
638 _("cannot connect control output %1 to %2"),
651 /* catch up on send+insert cnts */
653 _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
655 /* hook us up to the engine */
657 BootMessage (_("Connect to engine"));
659 _engine.set_session (this);
663 Session::hookup_io ()
665 /* stop graph reordering notifications from
666 causing resorts, etc.
669 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
674 /* we delay creating the auditioner till now because
675 it makes its own connections to ports.
679 Auditioner* a = new Auditioner (*this);
682 throw failed_constructor();
684 a->use_new_diskstream ();
685 auditioner.reset (a);
688 catch (failed_constructor& err) {
689 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
693 /* load bundles, which we may have postponed earlier on */
694 if (_bundle_xml_node) {
695 load_bundles (*_bundle_xml_node);
696 delete _bundle_xml_node;
699 /* Tell all IO objects to connect themselves together */
701 IO::enable_connecting ();
702 MIDI::Port::MakeConnections ();
704 /* Now reset all panners */
706 Delivery::reset_panners ();
708 /* Connect tracks to monitor/listen bus if there is one.
709 Note that in an existing session, the internal sends will
710 already exist, but we want the routes to notice that
711 they connect to the control out specifically.
715 boost::shared_ptr<RouteList> r = routes.reader ();
716 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
718 if ((*x)->is_monitor()) {
722 } else if ((*x)->is_master()) {
728 (*x)->listen_via (_monitor_out,
729 (Config->get_listen_position() == AfterFaderListen ? PostFader : PreFader),
735 /* Anyone who cares about input state, wake up and do something */
737 IOConnectionsComplete (); /* EMIT SIGNAL */
739 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
741 /* now handle the whole enchilada as if it was one
747 /* update the full solo state, which can't be
748 correctly determined on a per-route basis, but
749 needs the global overview that only the session
753 update_route_solo_state ();
757 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
759 boost::shared_ptr<Track> track = wp.lock ();
764 boost::shared_ptr<Playlist> playlist;
766 if ((playlist = track->playlist()) != 0) {
767 playlist->LengthChanged.connect_same_thread (*this, boost::bind (&Session::update_session_range_location_marker, this));
768 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::update_session_range_location_marker, this));
771 update_session_range_location_marker ();
775 Session::record_enabling_legal () const
777 /* this used to be in here, but survey says.... we don't need to restrict it */
778 // if (record_status() == Recording) {
782 if (Config->get_all_safe()) {
789 Session::reset_input_monitor_state ()
791 if (transport_rolling()) {
793 boost::shared_ptr<RouteList> rl = routes.reader ();
794 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
795 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
796 if (tr && tr->record_enabled ()) {
797 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
798 tr->monitor_input (Config->get_monitoring_model() == HardwareMonitoring && !config.get_auto_input());
804 boost::shared_ptr<RouteList> rl = routes.reader ();
805 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
806 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
807 if (tr && tr->record_enabled ()) {
808 //cerr << "switching to input = " << !Config->get_auto_input() << __FILE__ << __LINE__ << endl << endl;
809 tr->monitor_input (Config->get_monitoring_model() == HardwareMonitoring);
816 Session::auto_punch_start_changed (Location* location)
818 replace_event (SessionEvent::PunchIn, location->start());
820 if (get_record_enabled() && config.get_punch_in()) {
821 /* capture start has been changed, so save new pending state */
822 save_state ("", true);
827 Session::auto_punch_end_changed (Location* location)
829 framepos_t when_to_stop = location->end();
830 // when_to_stop += _worst_output_latency + _worst_input_latency;
831 replace_event (SessionEvent::PunchOut, when_to_stop);
835 Session::auto_punch_changed (Location* location)
837 framepos_t when_to_stop = location->end();
839 replace_event (SessionEvent::PunchIn, location->start());
840 //when_to_stop += _worst_output_latency + _worst_input_latency;
841 replace_event (SessionEvent::PunchOut, when_to_stop);
845 Session::auto_loop_changed (Location* location)
847 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
849 if (transport_rolling() && play_loop) {
852 // if (_transport_frame > location->end()) {
854 if (_transport_frame < location->start() || _transport_frame > location->end()) {
855 // relocate to beginning of loop
856 clear_events (SessionEvent::LocateRoll);
858 request_locate (location->start(), true);
861 else if (Config->get_seamless_loop() && !loop_changing) {
863 // schedule a locate-roll to refill the diskstreams at the
865 loop_changing = true;
867 if (location->end() > last_loopend) {
868 clear_events (SessionEvent::LocateRoll);
869 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
876 last_loopend = location->end();
880 Session::set_auto_punch_location (Location* location)
884 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
885 punch_connections.drop_connections();
886 existing->set_auto_punch (false, this);
887 remove_event (existing->start(), SessionEvent::PunchIn);
888 clear_events (SessionEvent::PunchOut);
889 auto_punch_location_changed (0);
898 if (location->end() <= location->start()) {
899 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
903 punch_connections.drop_connections ();
905 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
906 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
907 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
909 location->set_auto_punch (true, this);
911 auto_punch_changed (location);
913 auto_punch_location_changed (location);
917 Session::set_auto_loop_location (Location* location)
921 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
922 loop_connections.drop_connections ();
923 existing->set_auto_loop (false, this);
924 remove_event (existing->end(), SessionEvent::AutoLoop);
925 auto_loop_location_changed (0);
934 if (location->end() <= location->start()) {
935 error << _("Session: you can't use a mark for auto loop") << endmsg;
939 last_loopend = location->end();
941 loop_connections.drop_connections ();
943 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
944 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
945 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
947 location->set_auto_loop (true, this);
949 /* take care of our stuff first */
951 auto_loop_changed (location);
953 /* now tell everyone else */
955 auto_loop_location_changed (location);
959 Session::locations_added (Location *)
965 Session::locations_changed ()
967 _locations->apply (*this, &Session::handle_locations_changed);
971 Session::handle_locations_changed (Locations::LocationList& locations)
973 Locations::LocationList::iterator i;
975 bool set_loop = false;
976 bool set_punch = false;
978 for (i = locations.begin(); i != locations.end(); ++i) {
982 if (location->is_auto_punch()) {
983 set_auto_punch_location (location);
986 if (location->is_auto_loop()) {
987 set_auto_loop_location (location);
991 if (location->is_session_range()) {
992 _session_range_location = location;
997 set_auto_loop_location (0);
1000 set_auto_punch_location (0);
1007 Session::enable_record ()
1010 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1012 if (rs == Recording) {
1016 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1018 _last_record_location = _transport_frame;
1019 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1021 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1023 boost::shared_ptr<RouteList> rl = routes.reader ();
1024 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1025 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1026 if (tr && tr->record_enabled ()) {
1027 tr->monitor_input (true);
1032 RecordStateChanged ();
1039 Session::disable_record (bool rt_context, bool force)
1043 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1045 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1046 g_atomic_int_set (&_record_status, Disabled);
1047 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1049 if (rs == Recording) {
1050 g_atomic_int_set (&_record_status, Enabled);
1054 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1056 boost::shared_ptr<RouteList> rl = routes.reader ();
1057 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1058 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1059 if (tr && tr->record_enabled ()) {
1060 tr->monitor_input (false);
1065 RecordStateChanged (); /* emit signal */
1068 remove_pending_capture_state ();
1074 Session::step_back_from_record ()
1076 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1078 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1079 boost::shared_ptr<RouteList> rl = routes.reader ();
1080 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1081 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1082 if (tr && tr->record_enabled ()) {
1083 //cerr << "switching from input" << __FILE__ << __LINE__ << endl << endl;
1084 tr->monitor_input (false);
1092 Session::maybe_enable_record ()
1094 if (_step_editors > 0) {
1098 g_atomic_int_set (&_record_status, Enabled);
1100 /* This function is currently called from somewhere other than an RT thread.
1101 This save_state() call therefore doesn't impact anything. Doing it here
1102 means that we save pending state of which sources the next record will use,
1103 which gives us some chance of recovering from a crash during the record.
1106 save_state ("", true);
1108 if (_transport_speed) {
1109 if (!config.get_punch_in()) {
1113 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1114 RecordStateChanged (); /* EMIT SIGNAL */
1121 Session::audible_frame () const
1127 /* the first of these two possible settings for "offset"
1128 mean that the audible frame is stationary until
1129 audio emerges from the latency compensation
1132 the second means that the audible frame is stationary
1133 until audio would emerge from a physical port
1134 in the absence of any plugin latency compensation
1137 offset = _worst_output_latency;
1139 if (offset > current_block_size) {
1140 offset -= current_block_size;
1142 /* XXX is this correct? if we have no external
1143 physical connections and everything is internal
1144 then surely this is zero? still, how
1145 likely is that anyway?
1147 offset = current_block_size;
1150 if (synced_to_jack()) {
1151 tf = _engine.transport_frame();
1153 tf = _transport_frame;
1158 if (!non_realtime_work_pending()) {
1162 /* Check to see if we have passed the first guaranteed
1163 audible frame past our last start position. if not,
1164 return that last start point because in terms
1165 of audible frames, we have not moved yet.
1167 `Start position' in this context means the time we last
1168 either started or changed transport direction.
1171 if (_transport_speed > 0.0f) {
1173 if (!play_loop || !have_looped) {
1174 if (tf < _last_roll_or_reversal_location + offset) {
1175 return _last_roll_or_reversal_location;
1183 } else if (_transport_speed < 0.0f) {
1185 /* XXX wot? no backward looping? */
1187 if (tf > _last_roll_or_reversal_location - offset) {
1188 return _last_roll_or_reversal_location;
1200 Session::set_frame_rate (framecnt_t frames_per_second)
1202 /** \fn void Session::set_frame_size(framecnt_t)
1203 the AudioEngine object that calls this guarantees
1204 that it will not be called while we are also in
1205 ::process(). Its fine to do things that block
1209 _base_frame_rate = frames_per_second;
1213 Automatable::set_automation_interval (ceil ((double) frames_per_second * (0.001 * Config->get_automation_interval())));
1217 // XXX we need some equivalent to this, somehow
1218 // SndFileSource::setup_standard_crossfades (frames_per_second);
1222 /* XXX need to reset/reinstantiate all LADSPA plugins */
1226 Session::set_block_size (pframes_t nframes)
1228 /* the AudioEngine guarantees
1229 that it will not be called while we are also in
1230 ::process(). It is therefore fine to do things that block
1235 current_block_size = nframes;
1239 boost::shared_ptr<RouteList> r = routes.reader ();
1241 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1242 (*i)->set_block_size (nframes);
1245 boost::shared_ptr<RouteList> rl = routes.reader ();
1246 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1247 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1249 tr->set_block_size (nframes);
1253 set_worst_io_latencies ();
1258 Session::set_default_fade (float /*steepness*/, float /*fade_msecs*/)
1261 framecnt_t fade_frames;
1263 /* Don't allow fade of less 1 frame */
1265 if (fade_msecs < (1000.0 * (1.0/_current_frame_rate))) {
1272 fade_frames = (framecnt_t) floor (fade_msecs * _current_frame_rate * 0.001);
1276 default_fade_msecs = fade_msecs;
1277 default_fade_steepness = steepness;
1280 // jlc, WTF is this!
1281 Glib::RWLock::ReaderLock lm (route_lock);
1282 AudioRegion::set_default_fade (steepness, fade_frames);
1287 /* XXX have to do this at some point */
1288 /* foreach region using default fade, reset, then
1289 refill_all_diskstream_buffers ();
1294 struct RouteSorter {
1295 /** @return true to run r1 before r2, otherwise false */
1296 bool operator() (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> r2) {
1297 if (r2->feeds (r1)) {
1298 /* r1 fed by r2; run r2 early */
1300 } else if (r1->feeds (r2)) {
1301 /* r2 fed by r1; run r1 early */
1304 if (r1->not_fed ()) {
1305 if (r2->not_fed ()) {
1306 /* no ardour-based connections inbound to either route. just use signal order */
1307 return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1309 /* r2 has connections, r1 does not; run r1 early */
1313 if (r2->not_fed()) {
1314 /* r1 has connections, r2 does not; run r2 early */
1317 /* both r1 and r2 have connections, but not to each other. just use signal order */
1318 return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1326 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1328 boost::shared_ptr<Route> r2;
1330 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1331 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1335 /* make a copy of the existing list of routes that feed r1 */
1337 Route::FedBy existing (r1->fed_by());
1339 /* for each route that feeds r1, recurse, marking it as feeding
1343 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1344 if (!(r2 = i->r.lock ())) {
1345 /* (*i) went away, ignore it */
1349 /* r2 is a route that feeds r1 which somehow feeds base. mark
1350 base as being fed by r2
1353 rbase->add_fed_by (r2, i->sends_only);
1357 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1361 if (r1->feeds (r2) && r2->feeds (r1)) {
1365 /* now recurse, so that we can mark base as being fed by
1366 all routes that feed r2
1369 trace_terminal (r2, rbase);
1376 Session::resort_routes ()
1378 /* don't do anything here with signals emitted
1379 by Routes while we are being destroyed.
1382 if (_state_of_the_state & Deletion) {
1387 RCUWriter<RouteList> writer (routes);
1388 boost::shared_ptr<RouteList> r = writer.get_copy ();
1389 resort_routes_using (r);
1390 /* writer goes out of scope and forces update */
1393 //route_graph->dump(1);
1396 boost::shared_ptr<RouteList> rl = routes.reader ();
1397 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1398 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1400 const Route::FedBy& fb ((*i)->fed_by());
1402 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1403 boost::shared_ptr<Route> sf = f->r.lock();
1405 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1413 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1415 RouteList::iterator i, j;
1417 for (i = r->begin(); i != r->end(); ++i) {
1419 (*i)->clear_fed_by ();
1421 for (j = r->begin(); j != r->end(); ++j) {
1423 /* although routes can feed themselves, it will
1424 cause an endless recursive descent if we
1425 detect it. so don't bother checking for
1433 bool via_sends_only;
1435 if ((*j)->direct_feeds (*i, &via_sends_only)) {
1436 (*i)->add_fed_by (*j, via_sends_only);
1441 for (i = r->begin(); i != r->end(); ++i) {
1442 trace_terminal (*i, *i);
1448 route_graph->rechain (r);
1451 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1452 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1453 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1454 (*i)->name(), (*i)->order_key ("signal")));
1460 /** Find the route name starting with \a base with the lowest \a id.
1462 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1463 * The available route name with the lowest ID will be used, and \a id
1464 * will be set to the ID.
1466 * \return false if a route name could not be found, and \a track_name
1467 * and \a id do not reflect a free route name.
1470 Session::find_route_name (const char* base, uint32_t& id, char* name, size_t name_len)
1473 snprintf (name, name_len, "%s %" PRIu32, base, id);
1475 if (route_by_name (name) == 0) {
1481 } while (id < (UINT_MAX-1));
1486 /** Count the total ins and outs of all non-hidden routes in the session and return them in in and out */
1488 Session::count_existing_route_channels (ChanCount& in, ChanCount& out)
1490 in = ChanCount::ZERO;
1491 out = ChanCount::ZERO;
1492 boost::shared_ptr<RouteList> r = routes.reader ();
1493 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1494 if (!(*i)->is_hidden()) {
1495 in += (*i)->n_inputs();
1496 out += (*i)->n_outputs();
1501 /** Caller must not hold process lock */
1502 list<boost::shared_ptr<MidiTrack> >
1503 Session::new_midi_track (TrackMode mode, RouteGroup* route_group, uint32_t how_many)
1505 char track_name[32];
1506 uint32_t track_id = 0;
1507 ChanCount existing_inputs;
1508 ChanCount existing_outputs;
1510 RouteList new_routes;
1511 list<boost::shared_ptr<MidiTrack> > ret;
1512 uint32_t control_id;
1514 count_existing_route_channels (existing_inputs, existing_outputs);
1516 control_id = ntracks() + nbusses();
1519 if (!find_route_name ("Midi", ++track_id, track_name, sizeof(track_name))) {
1520 error << "cannot find name for new midi track" << endmsg;
1524 boost::shared_ptr<MidiTrack> track;
1527 MidiTrack* mt = new MidiTrack (*this, track_name, Route::Flag (0), mode);
1534 mt->use_new_diskstream();
1536 boost_debug_shared_ptr_mark_interesting (mt, "Track");
1537 track = boost::shared_ptr<MidiTrack>(mt);
1540 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1541 if (track->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1542 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1546 if (track->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1547 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1552 auto_connect_route (track.get(), existing_inputs, existing_outputs);
1554 track->non_realtime_input_change();
1557 route_group->add (track);
1560 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1561 track->set_remote_control_id (control_id);
1563 new_routes.push_back (track);
1564 ret.push_back (track);
1567 catch (failed_constructor &err) {
1568 error << _("Session: could not create new midi track.") << endmsg;
1572 catch (AudioEngine::PortRegistrationFailure& pfe) {
1574 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;
1582 if (!new_routes.empty()) {
1583 add_routes (new_routes, false);
1584 save_state (_current_snapshot_name);
1590 /** Caller must hold process lock.
1591 * @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1592 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1593 * @param output_start As \a input_start, but for outputs.
1596 Session::auto_connect_route (
1597 Route* route, ChanCount& existing_inputs, ChanCount& existing_outputs, bool connect_inputs, ChanCount input_start, ChanCount output_start
1600 /* If both inputs and outputs are auto-connected to physical ports,
1601 use the max of input and output offsets to ensure auto-connected
1602 port numbers always match up (e.g. the first audio input and the
1603 first audio output of the route will have the same physical
1604 port number). Otherwise just use the lowest input or output
1608 const bool in_out_physical =
1609 (Config->get_input_auto_connect() & AutoConnectPhysical)
1610 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1613 const ChanCount in_offset = in_out_physical
1614 ? ChanCount::max(existing_inputs, existing_outputs)
1617 const ChanCount out_offset = in_out_physical
1618 ? ChanCount::max(existing_inputs, existing_outputs)
1621 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1622 vector<string> physinputs;
1623 vector<string> physoutputs;
1625 _engine.get_physical_outputs (*t, physoutputs);
1626 _engine.get_physical_inputs (*t, physinputs);
1628 if (!physinputs.empty() && connect_inputs) {
1629 uint32_t nphysical_in = physinputs.size();
1630 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1633 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1634 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1637 if (!port.empty() && route->input()->connect (
1638 route->input()->ports().port(*t, i), port, this)) {
1644 if (!physoutputs.empty()) {
1645 uint32_t nphysical_out = physoutputs.size();
1646 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
1649 if (Config->get_output_auto_connect() & AutoConnectPhysical) {
1650 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1651 } else if (Config->get_output_auto_connect() & AutoConnectMaster) {
1652 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1653 port = _master_out->input()->ports().port(*t,
1654 i % _master_out->input()->n_ports().get(*t))->name();
1658 if (!port.empty() && route->output()->connect (
1659 route->output()->ports().port(*t, i), port, this)) {
1666 existing_inputs += route->n_inputs();
1667 existing_outputs += route->n_outputs();
1670 /** Caller must not hold process lock */
1671 list< boost::shared_ptr<AudioTrack> >
1672 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group, uint32_t how_many)
1674 char track_name[32];
1675 uint32_t track_id = 0;
1676 ChanCount existing_inputs;
1677 ChanCount existing_outputs;
1679 RouteList new_routes;
1680 list<boost::shared_ptr<AudioTrack> > ret;
1681 uint32_t control_id;
1683 count_existing_route_channels (existing_inputs, existing_outputs);
1685 control_id = ntracks() + nbusses() + 1;
1688 if (!find_route_name ("Audio", ++track_id, track_name, sizeof(track_name))) {
1689 error << "cannot find name for new audio track" << endmsg;
1693 boost::shared_ptr<AudioTrack> track;
1696 AudioTrack* at = new AudioTrack (*this, track_name, Route::Flag (0), mode);
1703 at->use_new_diskstream();
1705 boost_debug_shared_ptr_mark_interesting (at, "Track");
1706 track = boost::shared_ptr<AudioTrack>(at);
1709 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1711 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1712 error << string_compose (
1713 _("cannot configure %1 in/%2 out configuration for new audio track"),
1714 input_channels, output_channels)
1719 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1720 error << string_compose (
1721 _("cannot configure %1 in/%2 out configuration for new audio track"),
1722 input_channels, output_channels)
1727 auto_connect_route (track.get(), existing_inputs, existing_outputs);
1731 route_group->add (track);
1734 track->non_realtime_input_change();
1736 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1737 track->set_remote_control_id (control_id);
1740 new_routes.push_back (track);
1741 ret.push_back (track);
1744 catch (failed_constructor &err) {
1745 error << _("Session: could not create new audio track.") << endmsg;
1749 catch (AudioEngine::PortRegistrationFailure& pfe) {
1751 error << pfe.what() << endmsg;
1759 if (!new_routes.empty()) {
1760 add_routes (new_routes, true);
1767 Session::set_remote_control_ids ()
1769 RemoteModel m = Config->get_remote_model();
1770 bool emit_signal = false;
1772 boost::shared_ptr<RouteList> r = routes.reader ();
1774 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1775 if (MixerOrdered == m) {
1776 int32_t order = (*i)->order_key(N_("signal"));
1777 (*i)->set_remote_control_id (order+1, false);
1779 } else if (EditorOrdered == m) {
1780 int32_t order = (*i)->order_key(N_("editor"));
1781 (*i)->set_remote_control_id (order+1, false);
1783 } else if (UserOrdered == m) {
1784 //do nothing ... only changes to remote id's are initiated by user
1789 Route::RemoteControlIDChange();
1793 /** Caller must not hold process lock */
1795 Session::new_audio_route (bool aux, int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many)
1798 uint32_t bus_id = 0;
1799 ChanCount existing_inputs;
1800 ChanCount existing_outputs;
1803 uint32_t control_id;
1805 count_existing_route_channels (existing_inputs, existing_outputs);
1807 control_id = ntracks() + nbusses() + 1;
1810 if (!find_route_name ("Bus", ++bus_id, bus_name, sizeof(bus_name))) {
1811 error << "cannot find name for new audio bus" << endmsg;
1816 Route* rt = new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO);
1823 boost_debug_shared_ptr_mark_interesting (rt, "Route");
1824 boost::shared_ptr<Route> bus (rt);
1827 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1829 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1830 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1831 input_channels, output_channels)
1837 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1838 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1839 input_channels, output_channels)
1844 auto_connect_route (bus.get(), existing_inputs, existing_outputs, false);
1848 route_group->add (bus);
1850 bus->set_remote_control_id (control_id);
1854 bus->add_internal_return ();
1857 ret.push_back (bus);
1861 catch (failed_constructor &err) {
1862 error << _("Session: could not create new audio route.") << endmsg;
1866 catch (AudioEngine::PortRegistrationFailure& pfe) {
1867 error << pfe.what() << endmsg;
1877 add_routes (ret, true);
1885 Session::new_route_from_template (uint32_t how_many, const std::string& template_path)
1889 uint32_t control_id;
1891 uint32_t number = 0;
1893 if (!tree.read (template_path.c_str())) {
1897 XMLNode* node = tree.root();
1899 control_id = ntracks() + nbusses() + 1;
1903 XMLNode node_copy (*node); // make a copy so we can change the name if we need to
1905 std::string node_name = IO::name_from_state (*node_copy.children().front());
1907 /* generate a new name by adding a number to the end of the template name */
1908 if (!find_route_name (node_name.c_str(), ++number, name, sizeof(name))) {
1909 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
1913 /* set IO children to use the new name */
1914 XMLNodeList const & children = node_copy.children ();
1915 for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
1916 if ((*i)->name() == IO::state_node_name) {
1917 IO::set_name_in_state (**i, name);
1921 Track::zero_diskstream_id_in_xml (node_copy);
1924 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
1927 error << _("Session: cannot create track/bus from template description") << endmsg;
1931 if (boost::dynamic_pointer_cast<Track>(route)) {
1932 /* force input/output change signals so that the new diskstream
1933 picks up the configuration of the route. During session
1934 loading this normally happens in a different way.
1937 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1939 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
1940 change.after = route->input()->n_ports();
1941 route->input()->changed (change, this);
1942 change.after = route->output()->n_ports();
1943 route->output()->changed (change, this);
1946 route->set_remote_control_id (control_id);
1949 ret.push_back (route);
1952 catch (failed_constructor &err) {
1953 error << _("Session: could not create new route from template") << endmsg;
1957 catch (AudioEngine::PortRegistrationFailure& pfe) {
1958 error << pfe.what() << endmsg;
1967 add_routes (ret, true);
1974 Session::add_routes (RouteList& new_routes, bool save)
1977 RCUWriter<RouteList> writer (routes);
1978 boost::shared_ptr<RouteList> r = writer.get_copy ();
1979 r->insert (r->end(), new_routes.begin(), new_routes.end());
1982 /* if there is no control out and we're not in the middle of loading,
1983 resort the graph here. if there is a control out, we will resort
1984 toward the end of this method. if we are in the middle of loading,
1985 we will resort when done.
1988 if (!_monitor_out && IO::connecting_legal) {
1989 resort_routes_using (r);
1993 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
1995 boost::weak_ptr<Route> wpr (*x);
1996 boost::shared_ptr<Route> r (*x);
1998 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
1999 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2000 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2001 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2002 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2003 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2004 r->order_key_changed.connect_same_thread (*this, boost::bind (&Session::route_order_key_changed, this));
2006 if (r->is_master()) {
2010 if (r->is_monitor()) {
2014 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2016 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2017 track_playlist_changed (boost::weak_ptr<Track> (tr));
2018 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2020 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2022 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2027 if (_monitor_out && IO::connecting_legal) {
2029 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2030 if ((*x)->is_monitor()) {
2032 } else if ((*x)->is_master()) {
2035 (*x)->listen_via (_monitor_out,
2036 (Config->get_listen_position() == AfterFaderListen ? PostFader : PreFader),
2047 save_state (_current_snapshot_name);
2050 RouteAdded (new_routes); /* EMIT SIGNAL */
2051 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
2055 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2057 boost::shared_ptr<RouteList> r = routes.reader ();
2058 boost::shared_ptr<Send> s;
2060 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2061 if ((s = (*i)->internal_send_for (dest)) != 0) {
2062 s->amp()->gain_control()->set_value (0.0);
2068 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2070 boost::shared_ptr<RouteList> r = routes.reader ();
2071 boost::shared_ptr<Send> s;
2073 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2074 if ((s = (*i)->internal_send_for (dest)) != 0) {
2075 s->amp()->gain_control()->set_value (1.0);
2081 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2083 boost::shared_ptr<RouteList> r = routes.reader ();
2084 boost::shared_ptr<Send> s;
2086 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2087 if ((s = (*i)->internal_send_for (dest)) != 0) {
2088 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2093 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2095 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2097 boost::shared_ptr<RouteList> r = routes.reader ();
2098 boost::shared_ptr<RouteList> t (new RouteList);
2100 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2101 if (include_buses || boost::dynamic_pointer_cast<Track>(*i)) {
2106 add_internal_sends (dest, p, t);
2110 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2112 if (dest->is_monitor() || dest->is_master()) {
2116 if (!dest->internal_return()) {
2117 dest->add_internal_return();
2120 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2122 if ((*i)->is_monitor() || (*i)->is_master() || (*i) == dest) {
2126 (*i)->listen_via (dest, p, true, true);
2133 Session::remove_route (boost::shared_ptr<Route> route)
2135 if (((route == _master_out) || (route == _monitor_out)) && !Config->get_allow_special_bus_removal()) {
2139 route->set_solo (false, this);
2142 RCUWriter<RouteList> writer (routes);
2143 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2147 /* deleting the master out seems like a dumb
2148 idea, but its more of a UI policy issue
2152 if (route == _master_out) {
2153 _master_out = boost::shared_ptr<Route> ();
2156 if (route == _monitor_out) {
2158 /* cancel control outs for all routes */
2160 for (RouteList::iterator r = rs->begin(); r != rs->end(); ++r) {
2161 (*r)->drop_listen (_monitor_out);
2164 _monitor_out.reset ();
2167 /* writer goes out of scope, forces route list update */
2170 update_route_solo_state ();
2171 update_session_range_location_marker ();
2173 // We need to disconnect the route's inputs and outputs
2175 route->input()->disconnect (0);
2176 route->output()->disconnect (0);
2178 /* if the route had internal sends sending to it, remove them */
2179 if (route->internal_return()) {
2181 boost::shared_ptr<RouteList> r = routes.reader ();
2182 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2183 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2185 (*i)->remove_processor (s);
2190 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2191 if (mt && mt->step_editing()) {
2192 if (_step_editors > 0) {
2197 update_latency_compensation (false, false);
2200 /* Re-sort routes to remove the graph's current references to the one that is
2201 * going away, then flush old references out of the graph.
2205 route_graph->clear_other_chain ();
2207 /* get rid of it from the dead wood collection in the route list manager */
2209 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2213 /* try to cause everyone to drop their references */
2215 route->drop_references ();
2217 sync_order_keys (N_("session"));
2219 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2221 /* save the new state of the world */
2223 if (save_state (_current_snapshot_name)) {
2224 save_history (_current_snapshot_name);
2229 Session::route_mute_changed (void* /*src*/)
2235 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2237 boost::shared_ptr<Route> route = wpr.lock();
2239 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2243 if (route->listening()) {
2245 if (Config->get_exclusive_solo()) {
2246 /* new listen: disable all other listen */
2247 boost::shared_ptr<RouteList> r = routes.reader ();
2248 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2249 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2252 (*i)->set_listen (false, this);
2258 } else if (_listen_cnt > 0) {
2264 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2266 boost::shared_ptr<Route> route = wpr.lock ();
2269 /* should not happen */
2270 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2274 bool send_changed = false;
2276 if (route->solo_isolated()) {
2277 if (_solo_isolated_cnt == 0) {
2278 send_changed = true;
2280 _solo_isolated_cnt++;
2281 } else if (_solo_isolated_cnt > 0) {
2282 _solo_isolated_cnt--;
2283 if (_solo_isolated_cnt == 0) {
2284 send_changed = true;
2289 IsolatedChanged (); /* EMIT SIGNAL */
2294 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2296 if (!self_solo_change) {
2297 // session doesn't care about changes to soloed-by-others
2301 if (solo_update_disabled) {
2306 boost::shared_ptr<Route> route = wpr.lock ();
2309 /* should not happen */
2310 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2314 boost::shared_ptr<RouteList> r = routes.reader ();
2317 if (route->self_soloed()) {
2323 if (delta == 1 && Config->get_exclusive_solo()) {
2324 /* new solo: disable all other solos */
2325 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2326 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2329 (*i)->set_solo (false, this);
2333 solo_update_disabled = true;
2335 RouteList uninvolved;
2337 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2338 bool via_sends_only;
2339 bool in_signal_flow;
2341 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2345 in_signal_flow = false;
2347 if ((*i)->feeds (route, &via_sends_only)) {
2348 if (!via_sends_only) {
2349 if (!route->soloed_by_others_upstream()) {
2350 (*i)->mod_solo_by_others_downstream (delta);
2352 in_signal_flow = true;
2356 if (route->feeds (*i, &via_sends_only)) {
2357 (*i)->mod_solo_by_others_upstream (delta);
2358 in_signal_flow = true;
2361 if (!in_signal_flow) {
2362 uninvolved.push_back (*i);
2366 solo_update_disabled = false;
2367 update_route_solo_state (r);
2369 /* now notify that the mute state of the routes not involved in the signal
2370 pathway of the just-solo-changed route may have altered.
2373 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2374 (*i)->mute_changed (this);
2377 SoloChanged (); /* EMIT SIGNAL */
2382 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2384 /* now figure out if anything that matters is soloed (or is "listening")*/
2386 bool something_soloed = false;
2387 uint32_t listeners = 0;
2388 uint32_t isolated = 0;
2391 r = routes.reader();
2394 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2395 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2396 something_soloed = true;
2399 if (!(*i)->is_hidden() && (*i)->listening()) {
2400 if (Config->get_solo_control_is_listen_control()) {
2403 (*i)->set_listen (false, this);
2407 if ((*i)->solo_isolated()) {
2412 if (something_soloed != _non_soloed_outs_muted) {
2413 _non_soloed_outs_muted = something_soloed;
2414 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2417 _listen_cnt = listeners;
2419 if (isolated != _solo_isolated_cnt) {
2420 _solo_isolated_cnt = isolated;
2421 IsolatedChanged (); /* EMIT SIGNAL */
2425 boost::shared_ptr<RouteList>
2426 Session::get_routes_with_internal_returns() const
2428 boost::shared_ptr<RouteList> r = routes.reader ();
2429 boost::shared_ptr<RouteList> rl (new RouteList);
2431 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2432 if ((*i)->internal_return ()) {
2440 Session::io_name_is_legal (const std::string& name)
2442 boost::shared_ptr<RouteList> r = routes.reader ();
2444 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2445 if ((*i)->name() == name) {
2449 if ((*i)->has_io_processor_named (name)) {
2457 boost::shared_ptr<Route>
2458 Session::route_by_name (string name)
2460 boost::shared_ptr<RouteList> r = routes.reader ();
2462 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2463 if ((*i)->name() == name) {
2468 return boost::shared_ptr<Route> ((Route*) 0);
2471 boost::shared_ptr<Route>
2472 Session::route_by_id (PBD::ID id)
2474 boost::shared_ptr<RouteList> r = routes.reader ();
2476 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2477 if ((*i)->id() == id) {
2482 return boost::shared_ptr<Route> ((Route*) 0);
2485 boost::shared_ptr<Route>
2486 Session::route_by_remote_id (uint32_t id)
2488 boost::shared_ptr<RouteList> r = routes.reader ();
2490 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2491 if ((*i)->remote_control_id() == id) {
2496 return boost::shared_ptr<Route> ((Route*) 0);
2499 /** If either end of the session range location marker lies inside the current
2500 * session extent, move it to the corresponding session extent.
2503 Session::update_session_range_location_marker ()
2505 if (_state_of_the_state & Loading) {
2509 pair<framepos_t, framepos_t> const ext = get_extent ();
2511 if (_session_range_location == 0) {
2512 /* we don't have a session range yet; use this one (provided it is valid) */
2513 if (ext.first != max_framepos) {
2514 add_session_range_location (ext.first, ext.second);
2517 /* update the existing session range */
2518 if (ext.first < _session_range_location->start()) {
2519 _session_range_location->set_start (ext.first);
2523 if (ext.second > _session_range_location->end()) {
2524 _session_range_location->set_end (ext.second);
2531 /** @return Extent of the session's contents; if the session is empty, the first value of
2532 * the pair will equal max_framepos.
2534 pair<framepos_t, framepos_t>
2535 Session::get_extent () const
2537 pair<framepos_t, framepos_t> ext (max_framepos, 0);
2539 boost::shared_ptr<RouteList> rl = routes.reader ();
2540 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2541 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2542 if (!tr || tr->destructive()) {
2543 // ignore tape tracks when getting extents
2547 pair<framepos_t, framepos_t> e = tr->playlist()->get_extent ();
2548 if (e.first < ext.first) {
2549 ext.first = e.first;
2551 if (e.second > ext.second) {
2552 ext.second = e.second;
2559 /* Region management */
2561 boost::shared_ptr<Region>
2562 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2564 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2565 RegionFactory::RegionMap::const_iterator i;
2566 boost::shared_ptr<Region> region;
2568 Glib::Mutex::Lock lm (region_lock);
2570 for (i = regions.begin(); i != regions.end(); ++i) {
2574 if (region->whole_file()) {
2576 if (child->source_equivalent (region)) {
2582 return boost::shared_ptr<Region> ();
2586 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2588 set<boost::shared_ptr<Region> > relevant_regions;
2590 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2591 RegionFactory::get_regions_using_source (*s, relevant_regions);
2594 cerr << "There are " << relevant_regions.size() << " using " << srcs.size() << " sources" << endl;
2596 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2597 set<boost::shared_ptr<Region> >::iterator tmp;
2602 cerr << "Cleanup " << (*r)->name() << " UC = " << (*r).use_count() << endl;
2604 playlists->destroy_region (*r);
2605 RegionFactory::map_remove (*r);
2607 (*r)->drop_sources ();
2608 (*r)->drop_references ();
2610 cerr << "\tdone UC = " << (*r).use_count() << endl;
2612 relevant_regions.erase (r);
2617 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
2620 Glib::Mutex::Lock ls (source_lock);
2621 /* remove from the main source list */
2622 sources.erase ((*s)->id());
2625 (*s)->mark_for_remove ();
2626 (*s)->drop_references ();
2635 Session::remove_last_capture ()
2637 list<boost::shared_ptr<Source> > srcs;
2639 boost::shared_ptr<RouteList> rl = routes.reader ();
2640 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2641 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2646 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
2649 srcs.insert (srcs.end(), l.begin(), l.end());
2654 destroy_sources (srcs);
2656 save_state (_current_snapshot_name);
2661 /* Source Management */
2664 Session::add_source (boost::shared_ptr<Source> source)
2666 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
2667 pair<SourceMap::iterator,bool> result;
2669 entry.first = source->id();
2670 entry.second = source;
2673 Glib::Mutex::Lock lm (source_lock);
2674 result = sources.insert (entry);
2677 if (result.second) {
2679 /* yay, new source */
2683 boost::shared_ptr<AudioFileSource> afs;
2685 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
2686 if (Config->get_auto_analyse_audio()) {
2687 Analyser::queue_source_for_analysis (source, false);
2694 Session::remove_source (boost::weak_ptr<Source> src)
2696 SourceMap::iterator i;
2697 boost::shared_ptr<Source> source = src.lock();
2704 Glib::Mutex::Lock lm (source_lock);
2706 if ((i = sources.find (source->id())) != sources.end()) {
2707 cerr << "Removing source " << source->name() << endl;
2712 if (!_state_of_the_state & InCleanup) {
2714 /* save state so we don't end up with a session file
2715 referring to non-existent sources.
2718 save_state (_current_snapshot_name);
2722 boost::shared_ptr<Source>
2723 Session::source_by_id (const PBD::ID& id)
2725 Glib::Mutex::Lock lm (source_lock);
2726 SourceMap::iterator i;
2727 boost::shared_ptr<Source> source;
2729 if ((i = sources.find (id)) != sources.end()) {
2736 boost::shared_ptr<Source>
2737 Session::source_by_path_and_channel (const string& path, uint16_t chn)
2739 Glib::Mutex::Lock lm (source_lock);
2741 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2742 boost::shared_ptr<AudioFileSource> afs
2743 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
2745 if (afs && afs->path() == path && chn == afs->channel()) {
2749 return boost::shared_ptr<Source>();
2753 Session::count_sources_by_origin (const string& path)
2756 Glib::Mutex::Lock lm (source_lock);
2758 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2759 boost::shared_ptr<FileSource> fs
2760 = boost::dynamic_pointer_cast<FileSource>(i->second);
2762 if (fs && fs->origin() == path) {
2772 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
2775 string old_basename = PBD::basename_nosuffix (oldname);
2776 string new_legalized = legalize_for_path (newname);
2778 /* note: we know (or assume) the old path is already valid */
2782 /* destructive file sources have a name of the form:
2784 /path/to/Tnnnn-NAME(%[LR])?.wav
2786 the task here is to replace NAME with the new name.
2791 string::size_type dash;
2793 dir = Glib::path_get_dirname (path);
2794 path = Glib::path_get_basename (path);
2796 /* '-' is not a legal character for the NAME part of the path */
2798 if ((dash = path.find_last_of ('-')) == string::npos) {
2802 prefix = path.substr (0, dash);
2806 path += new_legalized;
2807 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
2808 path = Glib::build_filename (dir, path);
2812 /* non-destructive file sources have a name of the form:
2814 /path/to/NAME-nnnnn(%[LR])?.ext
2816 the task here is to replace NAME with the new name.
2821 string::size_type dash;
2822 string::size_type postfix;
2824 dir = Glib::path_get_dirname (path);
2825 path = Glib::path_get_basename (path);
2827 /* '-' is not a legal character for the NAME part of the path */
2829 if ((dash = path.find_last_of ('-')) == string::npos) {
2833 suffix = path.substr (dash+1);
2835 // Suffix is now everything after the dash. Now we need to eliminate
2836 // the nnnnn part, which is done by either finding a '%' or a '.'
2838 postfix = suffix.find_last_of ("%");
2839 if (postfix == string::npos) {
2840 postfix = suffix.find_last_of ('.');
2843 if (postfix != string::npos) {
2844 suffix = suffix.substr (postfix);
2846 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
2850 const uint32_t limit = 10000;
2851 char buf[PATH_MAX+1];
2853 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
2855 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
2857 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
2858 path = Glib::build_filename (dir, buf);
2866 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
2875 /** Return the full path (in some session directory) for a new within-session source.
2876 * \a name must be a session-unique name that does not contain slashes
2877 * (e.g. as returned by new_*_source_name)
2880 Session::new_source_path_from_name (DataType type, const string& name, bool as_stub)
2882 assert(name.find("/") == string::npos);
2884 SessionDirectory sdir(get_best_session_directory_for_new_source());
2887 if (type == DataType::AUDIO) {
2888 p = (as_stub ? sdir.sound_stub_path() : sdir.sound_path());
2889 } else if (type == DataType::MIDI) {
2890 p = (as_stub ? sdir.midi_stub_path() : sdir.midi_path());
2892 error << "Unknown source type, unable to create file path" << endmsg;
2897 return p.to_string();
2901 Session::peak_path (string base) const
2903 sys::path peakfile_path(_session_dir->peak_path());
2904 peakfile_path /= base + peakfile_suffix;
2905 return peakfile_path.to_string();
2908 /** Return a unique name based on \a base for a new internal audio source */
2910 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
2913 char buf[PATH_MAX+1];
2914 const uint32_t limit = 10000;
2916 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
2919 legalized = legalize_for_path (base);
2921 // Find a "version" of the base name that doesn't exist in any of the possible directories.
2922 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
2924 vector<space_and_path>::iterator i;
2925 uint32_t existing = 0;
2927 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2932 snprintf (buf, sizeof(buf), "T%04d-%s%s",
2933 cnt, legalized.c_str(), ext.c_str());
2934 } else if (nchan == 2) {
2936 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
2937 cnt, legalized.c_str(), ext.c_str());
2939 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
2940 cnt, legalized.c_str(), ext.c_str());
2942 } else if (nchan < 26) {
2943 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
2944 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
2946 snprintf (buf, sizeof(buf), "T%04d-%s%s",
2947 cnt, legalized.c_str(), ext.c_str());
2953 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
2954 } else if (nchan == 2) {
2956 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
2958 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
2960 } else if (nchan < 26) {
2961 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
2963 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
2967 SessionDirectory sdir((*i).path);
2969 string spath = sdir.sound_path().to_string();
2970 string spath_stubs = sdir.sound_stub_path().to_string();
2972 /* note that we search *without* the extension so that
2973 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
2974 in the event that this new name is required for
2975 a file format change.
2978 if (matching_unsuffixed_filename_exists_in (spath, buf) ||
2979 matching_unsuffixed_filename_exists_in (spath_stubs, buf)) {
2985 if (existing == 0) {
2990 error << string_compose(
2991 _("There are already %1 recordings for %2, which I consider too many."),
2992 limit, base) << endmsg;
2994 throw failed_constructor();
2998 return Glib::path_get_basename (buf);
3001 /** Create a new within-session audio source */
3002 boost::shared_ptr<AudioFileSource>
3003 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive, bool as_stub)
3005 const string name = new_audio_source_name (n, n_chans, chan, destructive);
3006 const string path = new_source_path_from_name(DataType::AUDIO, name, as_stub);
3008 return boost::dynamic_pointer_cast<AudioFileSource> (
3009 SourceFactory::createWritable (DataType::AUDIO, *this, path, string(), destructive, frame_rate()));
3012 /** Return a unique name based on \a base for a new internal MIDI source */
3014 Session::new_midi_source_name (const string& base)
3017 char buf[PATH_MAX+1];
3018 const uint32_t limit = 10000;
3022 legalized = legalize_for_path (base);
3024 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3025 for (cnt = 1; cnt <= limit; ++cnt) {
3027 vector<space_and_path>::iterator i;
3028 uint32_t existing = 0;
3030 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3032 SessionDirectory sdir((*i).path);
3034 sys::path p = sdir.midi_path();
3037 snprintf (buf, sizeof(buf), "%s-%u.mid", p.to_string().c_str(), cnt);
3039 if (sys::exists (buf)) {
3044 if (existing == 0) {
3049 error << string_compose(
3050 _("There are already %1 recordings for %2, which I consider too many."),
3051 limit, base) << endmsg;
3053 throw failed_constructor();
3057 return Glib::path_get_basename(buf);
3061 /** Create a new within-session MIDI source */
3062 boost::shared_ptr<MidiSource>
3063 Session::create_midi_source_for_session (Track* track, string const & n, bool as_stub)
3065 /* try to use the existing write source for the track, to keep numbering sane
3069 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3073 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3076 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3077 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3081 const string name = new_midi_source_name (n);
3082 const string path = new_source_path_from_name (DataType::MIDI, name, as_stub);
3084 return boost::dynamic_pointer_cast<SMFSource> (
3085 SourceFactory::createWritable (
3086 DataType::MIDI, *this, path, string(), false, frame_rate()));
3091 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3093 if (playlist->hidden()) {
3097 playlists->add (playlist);
3100 playlist->release();
3107 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3109 if (_state_of_the_state & Deletion) {
3113 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3119 playlists->remove (playlist);
3125 Session::set_audition (boost::shared_ptr<Region> r)
3127 pending_audition_region = r;
3128 add_post_transport_work (PostTransportAudition);
3129 _butler->schedule_transport_work ();
3133 Session::audition_playlist ()
3135 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3136 ev->region.reset ();
3141 Session::non_realtime_set_audition ()
3143 if (!pending_audition_region) {
3144 auditioner->audition_current_playlist ();
3146 auditioner->audition_region (pending_audition_region);
3147 pending_audition_region.reset ();
3149 AuditionActive (true); /* EMIT SIGNAL */
3153 Session::audition_region (boost::shared_ptr<Region> r)
3155 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3161 Session::cancel_audition ()
3163 if (auditioner->auditioning()) {
3164 auditioner->cancel_audition ();
3165 AuditionActive (false); /* EMIT SIGNAL */
3170 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3172 if (a->is_monitor()) {
3175 if (b->is_monitor()) {
3178 return a->order_key(N_("signal")) < b->order_key(N_("signal"));
3182 Session::is_auditioning () const
3184 /* can be called before we have an auditioner object */
3186 return auditioner->auditioning();
3193 Session::graph_reordered ()
3195 /* don't do this stuff if we are setting up connections
3196 from a set_state() call or creating new tracks. Ditto for deletion.
3199 if (_state_of_the_state & (InitialConnecting|Deletion)) {
3203 /* every track/bus asked for this to be handled but it was deferred because
3204 we were connecting. do it now.
3207 request_input_change_handling ();
3211 /* force all diskstreams to update their capture offset values to
3212 reflect any changes in latencies within the graph.
3215 boost::shared_ptr<RouteList> rl = routes.reader ();
3216 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3217 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3219 tr->set_capture_offset ();
3225 Session::available_capture_duration ()
3227 float sample_bytes_on_disk = 4.0; // keep gcc happy
3229 switch (config.get_native_file_data_format()) {
3231 sample_bytes_on_disk = 4.0;
3235 sample_bytes_on_disk = 3.0;
3239 sample_bytes_on_disk = 2.0;
3243 /* impossible, but keep some gcc versions happy */
3244 fatal << string_compose (_("programming error: %1"),
3245 X_("illegal native file data format"))
3250 double scale = 4096.0 / sample_bytes_on_disk;
3252 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3253 return max_framecnt;
3256 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3260 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3263 RCUWriter<BundleList> writer (_bundles);
3264 boost::shared_ptr<BundleList> b = writer.get_copy ();
3265 b->push_back (bundle);
3268 BundleAdded (bundle); /* EMIT SIGNAL */
3274 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3276 bool removed = false;
3279 RCUWriter<BundleList> writer (_bundles);
3280 boost::shared_ptr<BundleList> b = writer.get_copy ();
3281 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3283 if (i != b->end()) {
3290 BundleRemoved (bundle); /* EMIT SIGNAL */
3296 boost::shared_ptr<Bundle>
3297 Session::bundle_by_name (string name) const
3299 boost::shared_ptr<BundleList> b = _bundles.reader ();
3301 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3302 if ((*i)->name() == name) {
3307 return boost::shared_ptr<Bundle> ();
3311 Session::tempo_map_changed (const PropertyChange&)
3315 playlists->update_after_tempo_map_change ();
3317 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3323 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3325 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3326 (*i)->recompute_frames_from_bbt ();
3330 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3331 * the given count with the current block size.
3334 Session::ensure_buffers (ChanCount howmany)
3336 BufferManager::ensure_buffers (howmany);
3340 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3342 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3343 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3348 Session::next_insert_id ()
3350 /* this doesn't really loop forever. just think about it */
3353 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3354 if (!insert_bitset[n]) {
3355 insert_bitset[n] = true;
3361 /* none available, so resize and try again */
3363 insert_bitset.resize (insert_bitset.size() + 16, false);
3368 Session::next_send_id ()
3370 /* this doesn't really loop forever. just think about it */
3373 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3374 if (!send_bitset[n]) {
3375 send_bitset[n] = true;
3381 /* none available, so resize and try again */
3383 send_bitset.resize (send_bitset.size() + 16, false);
3388 Session::next_return_id ()
3390 /* this doesn't really loop forever. just think about it */
3393 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3394 if (!return_bitset[n]) {
3395 return_bitset[n] = true;
3401 /* none available, so resize and try again */
3403 return_bitset.resize (return_bitset.size() + 16, false);
3408 Session::mark_send_id (uint32_t id)
3410 if (id >= send_bitset.size()) {
3411 send_bitset.resize (id+16, false);
3413 if (send_bitset[id]) {
3414 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3416 send_bitset[id] = true;
3420 Session::mark_return_id (uint32_t id)
3422 if (id >= return_bitset.size()) {
3423 return_bitset.resize (id+16, false);
3425 if (return_bitset[id]) {
3426 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3428 return_bitset[id] = true;
3432 Session::mark_insert_id (uint32_t id)
3434 if (id >= insert_bitset.size()) {
3435 insert_bitset.resize (id+16, false);
3437 if (insert_bitset[id]) {
3438 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3440 insert_bitset[id] = true;
3444 Session::unmark_send_id (uint32_t id)
3446 if (id < send_bitset.size()) {
3447 send_bitset[id] = false;
3452 Session::unmark_return_id (uint32_t id)
3454 if (id < return_bitset.size()) {
3455 return_bitset[id] = false;
3460 Session::unmark_insert_id (uint32_t id)
3462 if (id < insert_bitset.size()) {
3463 insert_bitset[id] = false;
3468 /* Named Selection management */
3470 boost::shared_ptr<NamedSelection>
3471 Session::named_selection_by_name (string name)
3473 Glib::Mutex::Lock lm (named_selection_lock);
3474 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
3475 if ((*i)->name == name) {
3479 return boost::shared_ptr<NamedSelection>();
3483 Session::add_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3486 Glib::Mutex::Lock lm (named_selection_lock);
3487 named_selections.insert (named_selections.begin(), named_selection);
3492 NamedSelectionAdded (); /* EMIT SIGNAL */
3496 Session::remove_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3498 bool removed = false;
3501 Glib::Mutex::Lock lm (named_selection_lock);
3503 NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
3505 if (i != named_selections.end()) {
3506 named_selections.erase (i);
3513 NamedSelectionRemoved (); /* EMIT SIGNAL */
3518 Session::reset_native_file_format ()
3520 boost::shared_ptr<RouteList> rl = routes.reader ();
3521 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3522 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3524 /* don't save state as we do this, there's no point
3527 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3528 tr->reset_write_sources (false);
3529 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3535 Session::route_name_unique (string n) const
3537 boost::shared_ptr<RouteList> r = routes.reader ();
3539 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3540 if ((*i)->name() == n) {
3549 Session::route_name_internal (string n) const
3551 if (auditioner && auditioner->name() == n) {
3555 if (_click_io && _click_io->name() == n) {
3563 Session::freeze_all (InterThreadInfo& itt)
3565 boost::shared_ptr<RouteList> r = routes.reader ();
3567 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3569 boost::shared_ptr<Track> t;
3571 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3572 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3582 boost::shared_ptr<Region>
3583 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
3584 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3585 InterThreadInfo& itt, bool enable_processing)
3587 boost::shared_ptr<Region> result;
3588 boost::shared_ptr<Playlist> playlist;
3589 boost::shared_ptr<AudioFileSource> fsource;
3591 char buf[PATH_MAX+1];
3592 ChanCount diskstream_channels (track.n_channels());
3593 framepos_t position;
3594 framecnt_t this_chunk;
3597 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3598 const string sound_dir = sdir.sound_path().to_string();
3599 framepos_t len = end - start;
3600 bool need_block_size_reset = false;
3602 ChanCount const max_proc = track.max_processor_streams ();
3605 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3606 end, start) << endmsg;
3610 const framecnt_t chunk_size = (256 * 1024)/4;
3612 // block all process callback handling
3614 block_processing ();
3616 /* call tree *MUST* hold route_lock */
3618 if ((playlist = track.playlist()) == 0) {
3622 /* external redirects will be a problem */
3624 if (track.has_external_redirects()) {
3628 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3630 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
3632 for (x = 0; x < 99999; ++x) {
3633 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());
3634 if (access (buf, F_OK) != 0) {
3640 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3645 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
3646 SourceFactory::createWritable (DataType::AUDIO, *this, buf, string(), false, frame_rate()));
3649 catch (failed_constructor& err) {
3650 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
3654 srcs.push_back (fsource);
3657 /* tell redirects that care that we are about to use a much larger blocksize */
3659 need_block_size_reset = true;
3660 track.set_block_size (chunk_size);
3662 /* XXX need to flush all redirects */
3667 /* create a set of reasonably-sized buffers */
3668 buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
3669 buffers.set_count (max_proc);
3671 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3672 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3674 afs->prepare_for_peakfile_writes ();
3677 while (to_do && !itt.cancel) {
3679 this_chunk = min (to_do, chunk_size);
3681 if (track.export_stuff (buffers, start, this_chunk, enable_processing)) {
3686 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
3687 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3690 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
3696 start += this_chunk;
3697 to_do -= this_chunk;
3699 itt.progress = (float) (1.0 - ((double) to_do / len));
3708 xnow = localtime (&now);
3710 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3711 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3714 afs->update_header (position, *xnow, now);
3715 afs->flush_header ();
3719 /* construct a region to represent the bounced material */
3723 plist.add (Properties::start, 0);
3724 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
3725 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
3727 result = RegionFactory::create (srcs, plist);
3733 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3734 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3737 afs->mark_for_remove ();
3740 (*src)->drop_references ();
3744 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3745 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3748 afs->done_with_peakfile_writes ();
3753 if (need_block_size_reset) {
3754 track.set_block_size (get_block_size());
3757 unblock_processing ();
3763 Session::gain_automation_buffer() const
3765 return ProcessThread::gain_automation_buffer ();
3769 Session::pan_automation_buffer() const
3771 return ProcessThread::pan_automation_buffer ();
3775 Session::get_silent_buffers (ChanCount count)
3777 return ProcessThread::get_silent_buffers (count);
3779 assert(_silent_buffers->available() >= count);
3780 _silent_buffers->set_count(count);
3782 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3783 for (size_t i= 0; i < count.get(*t); ++i) {
3784 _silent_buffers->get(*t, i).clear();
3788 return *_silent_buffers;
3793 Session::get_scratch_buffers (ChanCount count)
3795 return ProcessThread::get_scratch_buffers (count);
3797 if (count != ChanCount::ZERO) {
3798 assert(_scratch_buffers->available() >= count);
3799 _scratch_buffers->set_count(count);
3801 _scratch_buffers->set_count (_scratch_buffers->available());
3804 return *_scratch_buffers;
3809 Session::get_mix_buffers (ChanCount count)
3811 return ProcessThread::get_mix_buffers (count);
3813 assert(_mix_buffers->available() >= count);
3814 _mix_buffers->set_count(count);
3815 return *_mix_buffers;
3820 Session::ntracks () const
3823 boost::shared_ptr<RouteList> r = routes.reader ();
3825 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3826 if (boost::dynamic_pointer_cast<Track> (*i)) {
3835 Session::nbusses () const
3838 boost::shared_ptr<RouteList> r = routes.reader ();
3840 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3841 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
3850 Session::add_automation_list(AutomationList *al)
3852 automation_lists[al->id()] = al;
3856 Session::sync_order_keys (std::string const & base)
3858 if (deletion_in_progress()) {
3862 if (!Config->get_sync_all_route_ordering()) {
3863 /* leave order keys as they are */
3867 boost::shared_ptr<RouteList> r = routes.reader ();
3869 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3870 (*i)->sync_order_keys (base);
3873 Route::SyncOrderKeys (base); // EMIT SIGNAL
3875 /* this might not do anything */
3877 set_remote_control_ids ();
3880 /** @return true if there is at least one record-enabled track, otherwise false */
3882 Session::have_rec_enabled_track () const
3884 return g_atomic_int_get (&_have_rec_enabled_track) == 1;
3887 /** Update the state of our rec-enabled tracks flag */
3889 Session::update_have_rec_enabled_track ()
3891 boost::shared_ptr<RouteList> rl = routes.reader ();
3892 RouteList::iterator i = rl->begin();
3893 while (i != rl->end ()) {
3895 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3896 if (tr && tr->record_enabled ()) {
3903 int const old = g_atomic_int_get (&_have_rec_enabled_track);
3905 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
3907 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
3908 RecordStateChanged (); /* EMIT SIGNAL */
3913 Session::listen_position_changed ()
3917 switch (Config->get_listen_position()) {
3918 case AfterFaderListen:
3922 case PreFaderListen:
3927 boost::shared_ptr<RouteList> r = routes.reader ();
3929 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3930 (*i)->put_monitor_send_at (p);
3935 Session::solo_control_mode_changed ()
3937 /* cancel all solo or all listen when solo control mode changes */
3940 set_solo (get_routes(), false);
3941 } else if (listening()) {
3942 set_listen (get_routes(), false);
3946 /** Called when anything about any of our route groups changes (membership, state etc.) */
3948 Session::route_group_changed ()
3950 RouteGroupChanged (); /* EMIT SIGNAL */
3954 Session::get_available_sync_options () const
3956 vector<SyncSource> ret;
3958 ret.push_back (JACK);
3959 ret.push_back (MTC);
3960 ret.push_back (MIDIClock);
3965 boost::shared_ptr<RouteList>
3966 Session::get_routes_with_regions_at (framepos_t const p) const
3968 boost::shared_ptr<RouteList> r = routes.reader ();
3969 boost::shared_ptr<RouteList> rl (new RouteList);
3971 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3972 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3977 boost::shared_ptr<Playlist> pl = tr->playlist ();
3982 if (pl->has_region_at (p)) {
3991 Session::goto_end ()
3993 if (_session_range_location) {
3994 request_locate (_session_range_location->end(), false);
3996 request_locate (0, false);
4001 Session::goto_start ()
4003 if (_session_range_location) {
4004 request_locate (_session_range_location->start(), false);
4006 request_locate (0, false);
4011 Session::current_start_frame () const
4013 return _session_range_location ? _session_range_location->start() : 0;
4017 Session::current_end_frame () const
4019 return _session_range_location ? _session_range_location->end() : 0;
4023 Session::add_session_range_location (framepos_t start, framepos_t end)
4025 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4026 _locations->add (_session_range_location);
4029 /** Called when one of our routes' order keys has changed */
4031 Session::route_order_key_changed ()
4033 RouteOrderKeyChanged (); /* EMIT SIGNAL */
4037 Session::step_edit_status_change (bool yn)
4043 send = (_step_editors == 0);
4048 send = (_step_editors == 1);
4051 if (_step_editors > 0) {
4057 StepEditStatusChange (val);
4063 Session::start_time_changed (framepos_t old)
4065 /* Update the auto loop range to match the session range
4066 (unless the auto loop range has been changed by the user)
4069 Location* s = _locations->session_range_location ();
4070 Location* l = _locations->auto_loop_location ();
4072 if (l->start() == old) {
4073 l->set_start (s->start(), true);
4078 Session::end_time_changed (framepos_t old)
4080 /* Update the auto loop range to match the session range
4081 (unless the auto loop range has been changed by the user)
4084 Location* s = _locations->session_range_location ();
4085 Location* l = _locations->auto_loop_location ();
4087 if (l->end() == old) {
4088 l->set_end (s->end(), true);
4093 Session::source_search_path (DataType type) const
4097 if (session_dirs.size() == 1) {
4099 case DataType::AUDIO:
4100 search_path = _session_dir->sound_path().to_string();
4102 case DataType::MIDI:
4103 search_path = _session_dir->midi_path().to_string();
4107 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4108 SessionDirectory sdir (i->path);
4109 if (!search_path.empty()) {
4113 case DataType::AUDIO:
4114 search_path += sdir.sound_path().to_string();
4116 case DataType::MIDI:
4117 search_path += sdir.midi_path().to_string();
4123 /* now add user-specified locations
4126 vector<string> dirs;
4129 case DataType::AUDIO:
4130 split (config.get_audio_search_path (), dirs, ':');
4132 case DataType::MIDI:
4133 split (config.get_midi_search_path (), dirs, ':');
4137 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4147 Session::ensure_search_path_includes (const string& path, DataType type)
4150 vector<string> dirs;
4157 case DataType::AUDIO:
4158 search_path = config.get_audio_search_path ();
4160 case DataType::MIDI:
4161 search_path = config.get_midi_search_path ();
4165 split (search_path, dirs, ':');
4167 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4173 if (!search_path.empty()) {
4177 search_path += path;
4180 case DataType::AUDIO:
4181 config.set_audio_search_path (search_path);
4183 case DataType::MIDI:
4184 config.set_midi_search_path (search_path);
4190 Session::get_speakers()
4193 _speakers = new Speakers;
4200 Session::unknown_processors () const
4204 boost::shared_ptr<RouteList> r = routes.reader ();
4205 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4206 list<string> t = (*i)->unknown_processors ();
4207 copy (t.begin(), t.end(), back_inserter (p));