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/threads.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"
48 #include "pbd/unwind.h"
50 #include "ardour/amp.h"
51 #include "ardour/analyser.h"
52 #include "ardour/async_midi_port.h"
53 #include "ardour/audio_buffer.h"
54 #include "ardour/audio_diskstream.h"
55 #include "ardour/audio_port.h"
56 #include "ardour/audio_track.h"
57 #include "ardour/audioengine.h"
58 #include "ardour/audiofilesource.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/control_protocol_manager.h"
66 #include "ardour/data_type.h"
67 #include "ardour/debug.h"
68 #include "ardour/filename_extensions.h"
69 #include "ardour/graph.h"
70 #include "ardour/midiport_manager.h"
71 #include "ardour/midi_track.h"
72 #include "ardour/midi_ui.h"
73 #include "ardour/operations.h"
74 #include "ardour/playlist.h"
75 #include "ardour/plugin.h"
76 #include "ardour/plugin_insert.h"
77 #include "ardour/process_thread.h"
78 #include "ardour/rc_configuration.h"
79 #include "ardour/recent_sessions.h"
80 #include "ardour/region.h"
81 #include "ardour/region_factory.h"
82 #include "ardour/route_graph.h"
83 #include "ardour/route_group.h"
84 #include "ardour/send.h"
85 #include "ardour/session.h"
86 #include "ardour/session_directory.h"
87 #include "ardour/session_playlists.h"
88 #include "ardour/smf_source.h"
89 #include "ardour/source_factory.h"
90 #include "ardour/utils.h"
92 #include "midi++/port.h"
93 #include "midi++/mmc.h"
104 using namespace ARDOUR;
107 bool Session::_disable_all_loaded_plugins = false;
109 PBD::Signal1<void,std::string> Session::Dialog;
110 PBD::Signal0<int> Session::AskAboutPendingState;
111 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
112 PBD::Signal0<void> Session::SendFeedback;
113 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
115 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
116 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
117 PBD::Signal2<void,std::string, std::string> Session::Exported;
118 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
119 PBD::Signal0<void> Session::Quit;
120 PBD::Signal0<void> Session::FeedbackDetected;
121 PBD::Signal0<void> Session::SuccessfulGraphSort;
122 PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
124 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
125 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
127 /** @param snapshot_name Snapshot name, without .ardour suffix */
128 Session::Session (AudioEngine &eng,
129 const string& fullpath,
130 const string& snapshot_name,
131 BusProfile* bus_profile,
134 , _target_transport_speed (0.0)
135 , _requested_return_frame (-1)
136 , _under_nsm_control (false)
137 , _session_dir (new SessionDirectory(fullpath))
139 , _state_of_the_state (Clean)
140 , _butler (new Butler (*this))
141 , _post_transport_work (0)
142 , _send_timecode_update (false)
144 , _all_route_group (new RouteGroup (*this, "all"))
145 , routes (new RouteList)
146 , _total_free_4k_blocks (0)
147 , _total_free_4k_blocks_uncertain (false)
148 , _bundles (new BundleList)
149 , _bundle_xml_node (0)
152 , click_emphasis_data (0)
154 , _have_rec_enabled_track (false)
155 , _suspend_timecode_transmission (0)
157 _locations = new Locations (*this);
160 _midi_ports = new MidiPortManager;
161 _mmc = new MIDI::MachineControl;
163 _mmc->set_ports (_midi_ports->mmc_input_port(), _midi_ports->mmc_output_port());
165 if (how_many_dsp_threads () > 1) {
166 /* For now, only create the graph if we are using >1 DSP threads, as
167 it is a bit slower than the old code with 1 thread.
169 _process_graph.reset (new Graph (*this));
172 playlists.reset (new SessionPlaylists);
174 _all_route_group->set_active (true, this);
176 interpolation.add_channel_to (0, 0);
178 if (!eng.connected()) {
179 throw failed_constructor();
182 n_physical_outputs = _engine.n_physical_outputs ();
183 n_physical_inputs = _engine.n_physical_inputs ();
185 first_stage_init (fullpath, snapshot_name);
187 _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
190 if (create (mix_template, bus_profile)) {
192 throw failed_constructor ();
196 if (second_stage_init ()) {
198 throw failed_constructor ();
201 store_recent_sessions(_name, _path);
203 bool was_dirty = dirty();
205 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
207 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
208 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
211 DirtyChanged (); /* EMIT SIGNAL */
214 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
215 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
231 vector<void*> debug_pointers;
233 /* if we got to here, leaving pending capture state around
237 remove_pending_capture_state ();
239 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
241 /* disconnect from any and all signals that we are connected to */
245 _engine.remove_session ();
247 /* deregister all ports - there will be no process or any other
248 * callbacks from the engine any more.
251 Port::PortDrop (); /* EMIT SIGNAL */
255 /* clear history so that no references to objects are held any more */
259 /* clear state tree so that no references to objects are held any more */
263 /* reset dynamic state version back to default */
265 Stateful::loading_state_version = 0;
267 _butler->drop_references ();
271 delete midi_control_ui;
272 delete _all_route_group;
274 if (click_data != default_click) {
275 delete [] click_data;
278 if (click_emphasis_data != default_click_emphasis) {
279 delete [] click_emphasis_data;
284 /* clear out any pending dead wood from RCU managed objects */
289 AudioDiskstream::free_working_buffers();
291 /* tell everyone who is still standing that we're about to die */
294 /* tell everyone to drop references and delete objects as we go */
296 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
297 RegionFactory::delete_all_regions ();
299 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
301 /* reset these three references to special routes before we do the usual route delete thing */
304 _master_out.reset ();
305 _monitor_out.reset ();
308 RCUWriter<RouteList> writer (routes);
309 boost::shared_ptr<RouteList> r = writer.get_copy ();
311 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
312 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
313 (*i)->drop_references ();
317 /* writer goes out of scope and updates master */
321 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
322 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
323 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
324 i->second->drop_references ();
329 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
330 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
335 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
342 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
344 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
345 boost_debug_list_ptrs ();
350 Session::when_engine_running ()
352 string first_physical_output;
354 BootMessage (_("Set block size and sample rate"));
356 set_block_size (_engine.samples_per_cycle());
357 set_frame_rate (_engine.sample_rate());
359 BootMessage (_("Using configuration"));
361 boost::function<void (std::string)> ff (boost::bind (&Session::config_changed, this, _1, false));
362 boost::function<void (std::string)> ft (boost::bind (&Session::config_changed, this, _1, true));
364 Config->map_parameters (ff);
365 config.map_parameters (ft);
367 /* every time we reconnect, recompute worst case output latencies */
369 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
371 if (synced_to_jack()) {
372 _engine.transport_stop ();
375 if (config.get_jack_time_master()) {
376 _engine.transport_locate (_transport_frame);
384 _ltc_input.reset (new IO (*this, _("LTC In"), IO::Input));
385 _ltc_output.reset (new IO (*this, _("LTC Out"), IO::Output));
387 if (state_tree && (child = find_named_node (*state_tree->root(), "LTC-In")) != 0) {
388 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
391 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
392 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
394 reconnect_ltc_input ();
397 if (state_tree && (child = find_named_node (*state_tree->root(), "LTC-Out")) != 0) {
398 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
401 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
402 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
404 reconnect_ltc_output ();
407 /* fix up names of LTC ports because we don't want the normal
408 * IO style of NAME/TYPE-{in,out}N
411 _ltc_input->nth (0)->set_name (_("LTC-in"));
412 _ltc_output->nth (0)->set_name (_("LTC-out"));
414 _click_io.reset (new ClickIO (*this, "click"));
415 _click_gain.reset (new Amp (*this));
416 _click_gain->activate ();
418 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
420 /* existing state for Click */
423 if (Stateful::loading_state_version < 3000) {
424 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
426 const XMLNodeList& children (child->children());
427 XMLNodeList::const_iterator i = children.begin();
428 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
430 if (i != children.end()) {
431 c = _click_gain->set_state (**i, Stateful::loading_state_version);
437 _clicking = Config->get_clicking ();
441 error << _("could not setup Click I/O") << endmsg;
448 /* default state for Click: dual-mono to first 2 physical outputs */
451 _engine.get_physical_outputs (DataType::AUDIO, outs);
453 for (uint32_t physport = 0; physport < 2; ++physport) {
454 if (outs.size() > physport) {
455 if (_click_io->add_port (outs[physport], this)) {
456 // relax, even though its an error
461 if (_click_io->n_ports () > ChanCount::ZERO) {
462 _clicking = Config->get_clicking ();
467 catch (failed_constructor& err) {
468 error << _("cannot setup Click I/O") << endmsg;
471 BootMessage (_("Compute I/O Latencies"));
474 // XXX HOW TO ALERT UI TO THIS ? DO WE NEED TO?
477 BootMessage (_("Set up standard connections"));
479 vector<string> inputs[DataType::num_types];
480 vector<string> outputs[DataType::num_types];
481 for (uint32_t i = 0; i < DataType::num_types; ++i) {
482 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
483 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
486 /* Create a set of Bundle objects that map
487 to the physical I/O currently available. We create both
488 mono and stereo bundles, so that the common cases of mono
489 and stereo tracks get bundles to put in their mixer strip
490 in / out menus. There may be a nicer way of achieving that;
491 it doesn't really scale that well to higher channel counts
494 /* mono output bundles */
496 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
498 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
500 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
501 c->add_channel (_("mono"), DataType::AUDIO);
502 c->set_port (0, outputs[DataType::AUDIO][np]);
507 /* stereo output bundles */
509 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
510 if (np + 1 < outputs[DataType::AUDIO].size()) {
512 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
513 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
514 c->add_channel (_("L"), DataType::AUDIO);
515 c->set_port (0, outputs[DataType::AUDIO][np]);
516 c->add_channel (_("R"), DataType::AUDIO);
517 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
523 /* mono input bundles */
525 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
527 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
529 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
530 c->add_channel (_("mono"), DataType::AUDIO);
531 c->set_port (0, inputs[DataType::AUDIO][np]);
536 /* stereo input bundles */
538 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
539 if (np + 1 < inputs[DataType::AUDIO].size()) {
541 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
543 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
544 c->add_channel (_("L"), DataType::AUDIO);
545 c->set_port (0, inputs[DataType::AUDIO][np]);
546 c->add_channel (_("R"), DataType::AUDIO);
547 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
553 /* MIDI input bundles */
555 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
556 string n = inputs[DataType::MIDI][np];
557 boost::erase_first (n, X_("alsa_pcm:"));
559 boost::shared_ptr<Bundle> c (new Bundle (n, false));
560 c->add_channel ("", DataType::MIDI);
561 c->set_port (0, inputs[DataType::MIDI][np]);
565 /* MIDI output bundles */
567 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
568 string n = outputs[DataType::MIDI][np];
569 boost::erase_first (n, X_("alsa_pcm:"));
571 boost::shared_ptr<Bundle> c (new Bundle (n, true));
572 c->add_channel ("", DataType::MIDI);
573 c->set_port (0, outputs[DataType::MIDI][np]);
577 BootMessage (_("Setup signal flow and plugins"));
579 /* Reset all panners */
581 Delivery::reset_panners ();
583 /* this will cause the CPM to instantiate any protocols that are in use
584 * (or mandatory), which will pass it this Session, and then call
585 * set_state() on each instantiated protocol to match stored state.
588 ControlProtocolManager::instance().set_session (this);
590 /* This must be done after the ControlProtocolManager set_session above,
591 as it will set states for ports which the ControlProtocolManager creates.
594 // XXX set state of MIDI::Port's
595 // MidiPortManager::instance()->set_port_states (Config->midi_port_states ());
597 /* And this must be done after the MIDI::Manager::set_port_states as
598 * it will try to make connections whose details are loaded by set_port_states.
603 /* Let control protocols know that we are now all connected, so they
604 * could start talking to surfaces if they want to.
607 ControlProtocolManager::instance().midi_connectivity_established ();
609 if (_is_new && !no_auto_connect()) {
610 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock());
611 auto_connect_master_bus ();
614 _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
616 /* update latencies */
618 initialize_latencies ();
620 /* hook us up to the engine */
622 BootMessage (_("Connect to engine"));
623 _engine.set_session (this);
624 _engine.reset_timebase ();
628 Session::auto_connect_master_bus ()
630 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
634 /* if requested auto-connect the outputs to the first N physical ports.
637 uint32_t limit = _master_out->n_outputs().n_total();
638 vector<string> outputs[DataType::num_types];
640 for (uint32_t i = 0; i < DataType::num_types; ++i) {
641 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
644 for (uint32_t n = 0; n < limit; ++n) {
645 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
647 if (outputs[p->type()].size() > n) {
648 connect_to = outputs[p->type()][n];
651 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
652 if (_master_out->output()->connect (p, connect_to, this)) {
653 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
662 Session::remove_monitor_section ()
668 /* force reversion to Solo-In-Place */
669 Config->set_solo_control_is_listen_control (false);
672 /* Hold process lock while doing this so that we don't hear bits and
673 * pieces of audio as we work on each route.
676 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
678 /* Connect tracks to monitor section. Note that in an
679 existing session, the internal sends will already exist, but we want the
680 routes to notice that they connect to the control out specifically.
684 boost::shared_ptr<RouteList> r = routes.reader ();
685 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
687 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
689 if ((*x)->is_monitor()) {
691 } else if ((*x)->is_master()) {
694 (*x)->remove_aux_or_listen (_monitor_out);
699 remove_route (_monitor_out);
700 auto_connect_master_bus ();
704 Session::add_monitor_section ()
708 if (_monitor_out || !_master_out) {
712 boost::shared_ptr<Route> r (new Route (*this, _("monitor"), Route::MonitorOut, DataType::AUDIO));
718 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
719 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
722 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
723 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
724 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
728 add_routes (rl, false, false, false);
730 assert (_monitor_out);
732 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
733 are undefined, at best.
736 uint32_t limit = _monitor_out->n_inputs().n_audio();
740 /* connect the inputs to the master bus outputs. this
741 * represents a separate data feed from the internal sends from
742 * each route. as of jan 2011, it allows the monitor section to
743 * conditionally ignore either the internal sends or the normal
744 * input feed, but we should really find a better way to do
748 _master_out->output()->disconnect (this);
750 for (uint32_t n = 0; n < limit; ++n) {
751 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
752 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
755 string connect_to = o->name();
756 if (_monitor_out->input()->connect (p, connect_to, this)) {
757 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
765 /* if monitor section is not connected, connect it to physical outs
768 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
770 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
772 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
775 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
777 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
778 Config->get_monitor_bus_preferred_bundle())
784 /* Monitor bus is audio only */
786 uint32_t mod = n_physical_outputs.get (DataType::AUDIO);
787 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
788 vector<string> outputs[DataType::num_types];
790 for (uint32_t i = 0; i < DataType::num_types; ++i) {
791 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
797 for (uint32_t n = 0; n < limit; ++n) {
799 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
801 if (outputs[DataType::AUDIO].size() > (n % mod)) {
802 connect_to = outputs[DataType::AUDIO][n % mod];
805 if (!connect_to.empty()) {
806 if (_monitor_out->output()->connect (p, connect_to, this)) {
807 error << string_compose (
808 _("cannot connect control output %1 to %2"),
819 /* Hold process lock while doing this so that we don't hear bits and
820 * pieces of audio as we work on each route.
823 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
825 /* Connect tracks to monitor section. Note that in an
826 existing session, the internal sends will already exist, but we want the
827 routes to notice that they connect to the control out specifically.
831 boost::shared_ptr<RouteList> rls = routes.reader ();
833 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
835 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
837 if ((*x)->is_monitor()) {
839 } else if ((*x)->is_master()) {
842 (*x)->enable_monitor_send ();
848 Session::hookup_io ()
850 /* stop graph reordering notifications from
851 causing resorts, etc.
854 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
858 /* we delay creating the auditioner till now because
859 it makes its own connections to ports.
863 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
865 throw failed_constructor ();
867 a->use_new_diskstream ();
871 catch (failed_constructor& err) {
872 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
876 /* load bundles, which we may have postponed earlier on */
877 if (_bundle_xml_node) {
878 load_bundles (*_bundle_xml_node);
879 delete _bundle_xml_node;
882 /* Tell all IO objects to connect themselves together */
884 IO::enable_connecting ();
886 /* Now tell all "floating" ports to connect to whatever
887 they should be connected to.
890 AudioEngine::instance()->reconnect_ports ();
892 /* Anyone who cares about input state, wake up and do something */
894 IOConnectionsComplete (); /* EMIT SIGNAL */
896 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
898 /* now handle the whole enchilada as if it was one
904 /* update the full solo state, which can't be
905 correctly determined on a per-route basis, but
906 needs the global overview that only the session
910 update_route_solo_state ();
914 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
916 boost::shared_ptr<Track> track = wp.lock ();
921 boost::shared_ptr<Playlist> playlist;
923 if ((playlist = track->playlist()) != 0) {
924 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
925 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
926 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
931 Session::record_enabling_legal () const
933 /* this used to be in here, but survey says.... we don't need to restrict it */
934 // if (record_status() == Recording) {
938 if (Config->get_all_safe()) {
945 Session::set_track_monitor_input_status (bool yn)
947 boost::shared_ptr<RouteList> rl = routes.reader ();
948 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
949 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
950 if (tr && tr->record_enabled ()) {
951 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
952 tr->request_input_monitoring (yn);
958 Session::auto_punch_start_changed (Location* location)
960 replace_event (SessionEvent::PunchIn, location->start());
962 if (get_record_enabled() && config.get_punch_in()) {
963 /* capture start has been changed, so save new pending state */
964 save_state ("", true);
969 Session::auto_punch_end_changed (Location* location)
971 framepos_t when_to_stop = location->end();
972 // when_to_stop += _worst_output_latency + _worst_input_latency;
973 replace_event (SessionEvent::PunchOut, when_to_stop);
977 Session::auto_punch_changed (Location* location)
979 framepos_t when_to_stop = location->end();
981 replace_event (SessionEvent::PunchIn, location->start());
982 //when_to_stop += _worst_output_latency + _worst_input_latency;
983 replace_event (SessionEvent::PunchOut, when_to_stop);
986 /** @param loc A loop location.
987 * @param pos Filled in with the start time of the required fade-out (in session frames).
988 * @param length Filled in with the length of the required fade-out.
991 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
993 pos = max (loc->start(), loc->end() - 64);
994 length = loc->end() - pos;
998 Session::auto_loop_changed (Location* location)
1000 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1003 auto_loop_declick_range (location, dcp, dcl);
1004 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1006 if (transport_rolling() && play_loop) {
1009 // if (_transport_frame > location->end()) {
1011 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1012 // relocate to beginning of loop
1013 clear_events (SessionEvent::LocateRoll);
1015 request_locate (location->start(), true);
1018 else if (Config->get_seamless_loop() && !loop_changing) {
1020 // schedule a locate-roll to refill the diskstreams at the
1021 // previous loop end
1022 loop_changing = true;
1024 if (location->end() > last_loopend) {
1025 clear_events (SessionEvent::LocateRoll);
1026 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1033 last_loopend = location->end();
1037 Session::set_auto_punch_location (Location* location)
1041 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1042 punch_connections.drop_connections();
1043 existing->set_auto_punch (false, this);
1044 remove_event (existing->start(), SessionEvent::PunchIn);
1045 clear_events (SessionEvent::PunchOut);
1046 auto_punch_location_changed (0);
1051 if (location == 0) {
1055 if (location->end() <= location->start()) {
1056 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1060 punch_connections.drop_connections ();
1062 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
1063 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
1064 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
1066 location->set_auto_punch (true, this);
1068 auto_punch_changed (location);
1070 auto_punch_location_changed (location);
1074 Session::set_auto_loop_location (Location* location)
1078 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1079 loop_connections.drop_connections ();
1080 existing->set_auto_loop (false, this);
1081 remove_event (existing->end(), SessionEvent::AutoLoop);
1084 auto_loop_declick_range (existing, dcp, dcl);
1085 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1086 auto_loop_location_changed (0);
1091 if (location == 0) {
1095 if (location->end() <= location->start()) {
1096 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1100 last_loopend = location->end();
1102 loop_connections.drop_connections ();
1104 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1105 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1106 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1108 location->set_auto_loop (true, this);
1110 /* take care of our stuff first */
1112 auto_loop_changed (location);
1114 /* now tell everyone else */
1116 auto_loop_location_changed (location);
1120 Session::locations_added (Location *)
1126 Session::locations_changed ()
1128 _locations->apply (*this, &Session::handle_locations_changed);
1132 Session::handle_locations_changed (Locations::LocationList& locations)
1134 Locations::LocationList::iterator i;
1136 bool set_loop = false;
1137 bool set_punch = false;
1139 for (i = locations.begin(); i != locations.end(); ++i) {
1143 if (location->is_auto_punch()) {
1144 set_auto_punch_location (location);
1147 if (location->is_auto_loop()) {
1148 set_auto_loop_location (location);
1152 if (location->is_session_range()) {
1153 _session_range_location = location;
1158 set_auto_loop_location (0);
1161 set_auto_punch_location (0);
1168 Session::enable_record ()
1170 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1171 /* no recording at anything except normal speed */
1176 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1178 if (rs == Recording) {
1182 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1184 _last_record_location = _transport_frame;
1185 _mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1187 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1188 set_track_monitor_input_status (true);
1191 RecordStateChanged ();
1198 Session::disable_record (bool rt_context, bool force)
1202 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1204 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1205 g_atomic_int_set (&_record_status, Disabled);
1206 _mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1208 if (rs == Recording) {
1209 g_atomic_int_set (&_record_status, Enabled);
1213 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1214 set_track_monitor_input_status (false);
1217 RecordStateChanged (); /* emit signal */
1220 remove_pending_capture_state ();
1226 Session::step_back_from_record ()
1228 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1230 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1231 set_track_monitor_input_status (false);
1234 RecordStateChanged (); /* emit signal */
1239 Session::maybe_enable_record ()
1241 if (_step_editors > 0) {
1245 g_atomic_int_set (&_record_status, Enabled);
1247 /* This function is currently called from somewhere other than an RT thread.
1248 This save_state() call therefore doesn't impact anything. Doing it here
1249 means that we save pending state of which sources the next record will use,
1250 which gives us some chance of recovering from a crash during the record.
1253 save_state ("", true);
1255 if (_transport_speed) {
1256 if (!config.get_punch_in()) {
1260 _mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1261 RecordStateChanged (); /* EMIT SIGNAL */
1268 Session::audible_frame () const
1274 /* the first of these two possible settings for "offset"
1275 mean that the audible frame is stationary until
1276 audio emerges from the latency compensation
1279 the second means that the audible frame is stationary
1280 until audio would emerge from a physical port
1281 in the absence of any plugin latency compensation
1284 offset = worst_playback_latency ();
1286 if (offset > current_block_size) {
1287 offset -= current_block_size;
1289 /* XXX is this correct? if we have no external
1290 physical connections and everything is internal
1291 then surely this is zero? still, how
1292 likely is that anyway?
1294 offset = current_block_size;
1297 if (synced_to_jack()) {
1298 tf = _engine.transport_frame();
1300 tf = _transport_frame;
1305 if (!non_realtime_work_pending()) {
1309 /* Check to see if we have passed the first guaranteed
1310 audible frame past our last start position. if not,
1311 return that last start point because in terms
1312 of audible frames, we have not moved yet.
1314 `Start position' in this context means the time we last
1315 either started, located, or changed transport direction.
1318 if (_transport_speed > 0.0f) {
1320 if (!play_loop || !have_looped) {
1321 if (tf < _last_roll_or_reversal_location + offset) {
1322 return _last_roll_or_reversal_location;
1330 } else if (_transport_speed < 0.0f) {
1332 /* XXX wot? no backward looping? */
1334 if (tf > _last_roll_or_reversal_location - offset) {
1335 return _last_roll_or_reversal_location;
1347 Session::set_frame_rate (framecnt_t frames_per_second)
1349 /** \fn void Session::set_frame_size(framecnt_t)
1350 the AudioEngine object that calls this guarantees
1351 that it will not be called while we are also in
1352 ::process(). Its fine to do things that block
1356 _base_frame_rate = frames_per_second;
1362 // XXX we need some equivalent to this, somehow
1363 // SndFileSource::setup_standard_crossfades (frames_per_second);
1367 /* XXX need to reset/reinstantiate all LADSPA plugins */
1371 Session::set_block_size (pframes_t nframes)
1373 /* the AudioEngine guarantees
1374 that it will not be called while we are also in
1375 ::process(). It is therefore fine to do things that block
1380 current_block_size = nframes;
1384 boost::shared_ptr<RouteList> r = routes.reader ();
1386 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1387 (*i)->set_block_size (nframes);
1390 boost::shared_ptr<RouteList> rl = routes.reader ();
1391 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1392 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1394 tr->set_block_size (nframes);
1398 set_worst_io_latencies ();
1404 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1406 boost::shared_ptr<Route> r2;
1408 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1409 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1413 /* make a copy of the existing list of routes that feed r1 */
1415 Route::FedBy existing (r1->fed_by());
1417 /* for each route that feeds r1, recurse, marking it as feeding
1421 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1422 if (!(r2 = i->r.lock ())) {
1423 /* (*i) went away, ignore it */
1427 /* r2 is a route that feeds r1 which somehow feeds base. mark
1428 base as being fed by r2
1431 rbase->add_fed_by (r2, i->sends_only);
1435 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1439 if (r1->feeds (r2) && r2->feeds (r1)) {
1443 /* now recurse, so that we can mark base as being fed by
1444 all routes that feed r2
1447 trace_terminal (r2, rbase);
1454 Session::resort_routes ()
1456 /* don't do anything here with signals emitted
1457 by Routes during initial setup or while we
1458 are being destroyed.
1461 if (_state_of_the_state & (InitialConnecting | Deletion)) {
1466 RCUWriter<RouteList> writer (routes);
1467 boost::shared_ptr<RouteList> r = writer.get_copy ();
1468 resort_routes_using (r);
1469 /* writer goes out of scope and forces update */
1473 boost::shared_ptr<RouteList> rl = routes.reader ();
1474 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1475 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1477 const Route::FedBy& fb ((*i)->fed_by());
1479 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1480 boost::shared_ptr<Route> sf = f->r.lock();
1482 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1490 /** This is called whenever we need to rebuild the graph of how we will process
1492 * @param r List of routes, in any order.
1496 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1498 /* We are going to build a directed graph of our routes;
1499 this is where the edges of that graph are put.
1504 /* Go through all routes doing two things:
1506 * 1. Collect the edges of the route graph. Each of these edges
1507 * is a pair of routes, one of which directly feeds the other
1508 * either by a JACK connection or by an internal send.
1510 * 2. Begin the process of making routes aware of which other
1511 * routes directly or indirectly feed them. This information
1512 * is used by the solo code.
1515 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1517 /* Clear out the route's list of direct or indirect feeds */
1518 (*i)->clear_fed_by ();
1520 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
1522 bool via_sends_only;
1524 /* See if this *j feeds *i according to the current state of the JACK
1525 connections and internal sends.
1527 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
1528 /* add the edge to the graph (part #1) */
1529 edges.add (*j, *i, via_sends_only);
1530 /* tell the route (for part #2) */
1531 (*i)->add_fed_by (*j, via_sends_only);
1536 /* Attempt a topological sort of the route graph */
1537 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
1539 if (sorted_routes) {
1540 /* We got a satisfactory topological sort, so there is no feedback;
1543 Note: the process graph rechain does not require a
1544 topologically-sorted list, but hey ho.
1546 if (_process_graph) {
1547 _process_graph->rechain (sorted_routes, edges);
1550 _current_route_graph = edges;
1552 /* Complete the building of the routes' lists of what directly
1553 or indirectly feeds them.
1555 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1556 trace_terminal (*i, *i);
1559 *r = *sorted_routes;
1562 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1563 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1564 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1565 (*i)->name(), (*i)->order_key (MixerSort)));
1569 SuccessfulGraphSort (); /* EMIT SIGNAL */
1572 /* The topological sort failed, so we have a problem. Tell everyone
1573 and stick to the old graph; this will continue to be processed, so
1574 until the feedback is fixed, what is played back will not quite
1575 reflect what is actually connected. Note also that we do not
1576 do trace_terminal here, as it would fail due to an endless recursion,
1577 so the solo code will think that everything is still connected
1581 FeedbackDetected (); /* EMIT SIGNAL */
1586 /** Find a route name starting with \a base, maybe followed by the
1587 * lowest \a id. \a id will always be added if \a definitely_add_number
1588 * is true on entry; otherwise it will only be added if required
1589 * to make the name unique.
1591 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1592 * The available route name with the lowest ID will be used, and \a id
1593 * will be set to the ID.
1595 * \return false if a route name could not be found, and \a track_name
1596 * and \a id do not reflect a free route name.
1599 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1601 if (!definitely_add_number && route_by_name (base) == 0) {
1602 /* juse use the base */
1603 snprintf (name, name_len, "%s", base.c_str());
1608 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1610 if (route_by_name (name) == 0) {
1616 } while (id < (UINT_MAX-1));
1621 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
1623 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
1625 in = ChanCount::ZERO;
1626 out = ChanCount::ZERO;
1628 boost::shared_ptr<RouteList> r = routes.reader ();
1630 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1631 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1632 if (tr && !tr->is_auditioner()) {
1633 in += tr->n_inputs();
1634 out += tr->n_outputs();
1639 /** Caller must not hold process lock
1640 * @param name_template string to use for the start of the name, or "" to use "MIDI".
1641 * @param instrument plugin info for the instrument to insert pre-fader, if any
1643 list<boost::shared_ptr<MidiTrack> >
1644 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
1645 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1647 char track_name[32];
1648 uint32_t track_id = 0;
1650 RouteList new_routes;
1651 list<boost::shared_ptr<MidiTrack> > ret;
1653 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
1656 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1657 error << "cannot find name for new midi track" << endmsg;
1661 boost::shared_ptr<MidiTrack> track;
1664 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1666 if (track->init ()) {
1670 track->use_new_diskstream();
1672 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1673 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1676 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1677 if (track->input()->ensure_io (input, false, this)) {
1678 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
1682 if (track->output()->ensure_io (output, false, this)) {
1683 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
1688 track->non_realtime_input_change();
1691 route_group->add (track);
1694 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1696 if (Config->get_remote_model() == UserOrdered) {
1697 track->set_remote_control_id (next_control_id());
1700 new_routes.push_back (track);
1701 ret.push_back (track);
1704 catch (failed_constructor &err) {
1705 error << _("Session: could not create new midi track.") << endmsg;
1709 catch (AudioEngine::PortRegistrationFailure& pfe) {
1711 error << string_compose (_("No more JACK ports are available. You will need to stop %1 and restart JACK with more ports if you need this many tracks."), PROGRAM_NAME) << endmsg;
1719 if (!new_routes.empty()) {
1720 add_routes (new_routes, true, true, true);
1723 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
1724 PluginPtr plugin = instrument->load (*this);
1725 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
1726 (*r)->add_processor (p, PreFader);
1736 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
1738 boost::shared_ptr<Route> midi_track (wmt.lock());
1744 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
1746 if (change.after.n_audio() <= change.before.n_audio()) {
1750 /* new audio ports: make sure the audio goes somewhere useful,
1751 unless the user has no-auto-connect selected.
1753 The existing ChanCounts don't matter for this call as they are only
1754 to do with matching input and output indices, and we are only changing
1760 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
1764 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1765 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1766 * @param output_start As \a input_start, but for outputs.
1769 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
1770 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
1772 if (!IO::connecting_legal) {
1776 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1782 /* If both inputs and outputs are auto-connected to physical ports,
1783 use the max of input and output offsets to ensure auto-connected
1784 port numbers always match up (e.g. the first audio input and the
1785 first audio output of the route will have the same physical
1786 port number). Otherwise just use the lowest input or output
1790 DEBUG_TRACE (DEBUG::Graph,
1791 string_compose("Auto-connect: existing in = %1 out = %2\n",
1792 existing_inputs, existing_outputs));
1794 const bool in_out_physical =
1795 (Config->get_input_auto_connect() & AutoConnectPhysical)
1796 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1799 const ChanCount in_offset = in_out_physical
1800 ? ChanCount::max(existing_inputs, existing_outputs)
1803 const ChanCount out_offset = in_out_physical
1804 ? ChanCount::max(existing_inputs, existing_outputs)
1807 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1808 vector<string> physinputs;
1809 vector<string> physoutputs;
1811 _engine.get_physical_outputs (*t, physoutputs);
1812 _engine.get_physical_inputs (*t, physinputs);
1814 if (!physinputs.empty() && connect_inputs) {
1815 uint32_t nphysical_in = physinputs.size();
1817 DEBUG_TRACE (DEBUG::Graph,
1818 string_compose("There are %1 physical inputs of type %2\n",
1821 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1824 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1825 DEBUG_TRACE (DEBUG::Graph,
1826 string_compose("Get index %1 + %2 % %3 = %4\n",
1827 in_offset.get(*t), i, nphysical_in,
1828 (in_offset.get(*t) + i) % nphysical_in));
1829 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1832 DEBUG_TRACE (DEBUG::Graph,
1833 string_compose("Connect route %1 IN to %2\n",
1834 route->name(), port));
1836 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
1840 ChanCount one_added (*t, 1);
1841 existing_inputs += one_added;
1845 if (!physoutputs.empty()) {
1846 uint32_t nphysical_out = physoutputs.size();
1847 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
1850 if ((*t) == DataType::MIDI || Config->get_output_auto_connect() & AutoConnectPhysical) {
1851 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1852 } else if ((*t) == DataType::AUDIO && Config->get_output_auto_connect() & AutoConnectMaster) {
1853 /* master bus is audio only */
1854 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1855 port = _master_out->input()->ports().port(*t,
1856 i % _master_out->input()->n_ports().get(*t))->name();
1860 DEBUG_TRACE (DEBUG::Graph,
1861 string_compose("Connect route %1 OUT to %2\n",
1862 route->name(), port));
1864 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
1868 ChanCount one_added (*t, 1);
1869 existing_outputs += one_added;
1875 /** Caller must not hold process lock
1876 * @param name_template string to use for the start of the name, or "" to use "Audio".
1878 list< boost::shared_ptr<AudioTrack> >
1879 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
1880 uint32_t how_many, string name_template)
1882 char track_name[32];
1883 uint32_t track_id = 0;
1885 RouteList new_routes;
1886 list<boost::shared_ptr<AudioTrack> > ret;
1888 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
1891 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1892 error << "cannot find name for new audio track" << endmsg;
1896 boost::shared_ptr<AudioTrack> track;
1899 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
1901 if (track->init ()) {
1905 track->use_new_diskstream();
1907 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1908 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1911 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1913 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1914 error << string_compose (
1915 _("cannot configure %1 in/%2 out configuration for new audio track"),
1916 input_channels, output_channels)
1921 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1922 error << string_compose (
1923 _("cannot configure %1 in/%2 out configuration for new audio track"),
1924 input_channels, output_channels)
1931 route_group->add (track);
1934 track->non_realtime_input_change();
1936 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1937 if (Config->get_remote_model() == UserOrdered) {
1938 track->set_remote_control_id (next_control_id());
1941 new_routes.push_back (track);
1942 ret.push_back (track);
1945 catch (failed_constructor &err) {
1946 error << _("Session: could not create new audio track.") << endmsg;
1950 catch (AudioEngine::PortRegistrationFailure& pfe) {
1952 error << pfe.what() << endmsg;
1960 if (!new_routes.empty()) {
1961 add_routes (new_routes, true, true, true);
1967 /** Caller must not hold process lock.
1968 * @param name_template string to use for the start of the name, or "" to use "Bus".
1971 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
1974 uint32_t bus_id = 0;
1978 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
1981 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
1982 error << "cannot find name for new audio bus" << endmsg;
1987 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
1993 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1994 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
1997 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1999 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2000 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2001 input_channels, output_channels)
2007 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2008 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2009 input_channels, output_channels)
2016 route_group->add (bus);
2018 if (Config->get_remote_model() == UserOrdered) {
2019 bus->set_remote_control_id (next_control_id());
2022 bus->add_internal_return ();
2024 ret.push_back (bus);
2030 catch (failed_constructor &err) {
2031 error << _("Session: could not create new audio route.") << endmsg;
2035 catch (AudioEngine::PortRegistrationFailure& pfe) {
2036 error << pfe.what() << endmsg;
2046 add_routes (ret, false, true, true); // autoconnect outputs only
2054 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base)
2057 uint32_t control_id;
2059 uint32_t number = 0;
2060 const uint32_t being_added = how_many;
2062 if (!tree.read (template_path.c_str())) {
2066 XMLNode* node = tree.root();
2068 IO::disable_connecting ();
2070 control_id = next_control_id ();
2074 XMLNode node_copy (*node);
2076 /* Remove IDs of everything so that new ones are used */
2077 node_copy.remove_property_recursively (X_("id"));
2082 if (!name_base.empty()) {
2084 /* if we're adding more than one routes, force
2085 * all the names of the new routes to be
2086 * numbered, via the final parameter.
2089 if (!find_route_name (name_base.c_str(), ++number, name, sizeof(name), (being_added > 1))) {
2090 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2096 string const route_name = node_copy.property(X_("name"))->value ();
2098 /* generate a new name by adding a number to the end of the template name */
2099 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2100 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2105 /* set this name in the XML description that we are about to use */
2106 Route::set_name_in_state (node_copy, name);
2108 /* trim bitslots from listen sends so that new ones are used */
2109 XMLNodeList children = node_copy.children ();
2110 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2111 if ((*i)->name() == X_("Processor")) {
2112 XMLProperty* role = (*i)->property (X_("role"));
2113 if (role && role->value() == X_("Listen")) {
2114 (*i)->remove_property (X_("bitslot"));
2119 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2122 error << _("Session: cannot create track/bus from template description") << endmsg;
2126 if (boost::dynamic_pointer_cast<Track>(route)) {
2127 /* force input/output change signals so that the new diskstream
2128 picks up the configuration of the route. During session
2129 loading this normally happens in a different way.
2132 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2134 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2135 change.after = route->input()->n_ports();
2136 route->input()->changed (change, this);
2137 change.after = route->output()->n_ports();
2138 route->output()->changed (change, this);
2141 route->set_remote_control_id (control_id);
2144 ret.push_back (route);
2147 catch (failed_constructor &err) {
2148 error << _("Session: could not create new route from template") << endmsg;
2152 catch (AudioEngine::PortRegistrationFailure& pfe) {
2153 error << pfe.what() << endmsg;
2162 add_routes (ret, true, true, true);
2163 IO::enable_connecting ();
2170 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
2173 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
2174 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
2177 error << _("Adding new tracks/busses failed") << endmsg;
2182 update_latency (true);
2183 update_latency (false);
2188 save_state (_current_snapshot_name);
2191 RouteAdded (new_routes); /* EMIT SIGNAL */
2195 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
2197 ChanCount existing_inputs;
2198 ChanCount existing_outputs;
2199 uint32_t order = next_control_id();
2201 count_existing_track_channels (existing_inputs, existing_outputs);
2204 RCUWriter<RouteList> writer (routes);
2205 boost::shared_ptr<RouteList> r = writer.get_copy ();
2206 r->insert (r->end(), new_routes.begin(), new_routes.end());
2208 /* if there is no control out and we're not in the middle of loading,
2209 resort the graph here. if there is a control out, we will resort
2210 toward the end of this method. if we are in the middle of loading,
2211 we will resort when done.
2214 if (!_monitor_out && IO::connecting_legal) {
2215 resort_routes_using (r);
2219 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2221 boost::weak_ptr<Route> wpr (*x);
2222 boost::shared_ptr<Route> r (*x);
2224 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2225 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2226 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2227 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2228 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2229 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2231 if (r->is_master()) {
2235 if (r->is_monitor()) {
2239 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2241 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2242 track_playlist_changed (boost::weak_ptr<Track> (tr));
2243 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2245 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2247 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2248 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2253 if (input_auto_connect || output_auto_connect) {
2254 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
2257 /* order keys are a GUI responsibility but we need to set up
2258 reasonable defaults because they also affect the remote control
2259 ID in most situations.
2262 if (!r->has_order_key (EditorSort)) {
2263 if (r->is_auditioner()) {
2264 /* use an arbitrarily high value */
2265 r->set_order_key (EditorSort, UINT_MAX);
2266 r->set_order_key (MixerSort, UINT_MAX);
2268 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
2269 r->set_order_key (EditorSort, order);
2270 r->set_order_key (MixerSort, order);
2278 if (_monitor_out && IO::connecting_legal) {
2279 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
2281 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2282 if ((*x)->is_monitor()) {
2284 } else if ((*x)->is_master()) {
2287 (*x)->enable_monitor_send ();
2294 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2296 boost::shared_ptr<RouteList> r = routes.reader ();
2297 boost::shared_ptr<Send> s;
2299 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2300 if ((s = (*i)->internal_send_for (dest)) != 0) {
2301 s->amp()->gain_control()->set_value (0.0);
2307 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2309 boost::shared_ptr<RouteList> r = routes.reader ();
2310 boost::shared_ptr<Send> s;
2312 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2313 if ((s = (*i)->internal_send_for (dest)) != 0) {
2314 s->amp()->gain_control()->set_value (1.0);
2320 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2322 boost::shared_ptr<RouteList> r = routes.reader ();
2323 boost::shared_ptr<Send> s;
2325 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2326 if ((s = (*i)->internal_send_for (dest)) != 0) {
2327 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2332 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2334 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2336 boost::shared_ptr<RouteList> r = routes.reader ();
2337 boost::shared_ptr<RouteList> t (new RouteList);
2339 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2340 /* no MIDI sends because there are no MIDI busses yet */
2341 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2346 add_internal_sends (dest, p, t);
2350 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2352 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2353 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
2358 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
2360 add_internal_send (dest, sender->before_processor_for_index (index), sender);
2364 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
2366 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
2370 if (!dest->internal_return()) {
2371 dest->add_internal_return ();
2374 sender->add_aux_send (dest, before);
2380 Session::remove_route (boost::shared_ptr<Route> route)
2382 if (route == _master_out) {
2386 route->set_solo (false, this);
2389 RCUWriter<RouteList> writer (routes);
2390 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2394 /* deleting the master out seems like a dumb
2395 idea, but its more of a UI policy issue
2399 if (route == _master_out) {
2400 _master_out = boost::shared_ptr<Route> ();
2403 if (route == _monitor_out) {
2404 _monitor_out.reset ();
2407 /* writer goes out of scope, forces route list update */
2410 update_route_solo_state ();
2412 // We need to disconnect the route's inputs and outputs
2414 route->input()->disconnect (0);
2415 route->output()->disconnect (0);
2417 /* if the route had internal sends sending to it, remove them */
2418 if (route->internal_return()) {
2420 boost::shared_ptr<RouteList> r = routes.reader ();
2421 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2422 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2424 (*i)->remove_processor (s);
2429 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2430 if (mt && mt->step_editing()) {
2431 if (_step_editors > 0) {
2436 update_latency_compensation ();
2439 /* Re-sort routes to remove the graph's current references to the one that is
2440 * going away, then flush old references out of the graph.
2444 if (_process_graph) {
2445 _process_graph->clear_other_chain ();
2448 /* get rid of it from the dead wood collection in the route list manager */
2450 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2454 /* try to cause everyone to drop their references */
2456 route->drop_references ();
2458 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2460 /* save the new state of the world */
2462 if (save_state (_current_snapshot_name)) {
2463 save_history (_current_snapshot_name);
2468 Session::route_mute_changed (void* /*src*/)
2474 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2476 boost::shared_ptr<Route> route = wpr.lock();
2478 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2482 if (route->listening_via_monitor ()) {
2484 if (Config->get_exclusive_solo()) {
2485 /* new listen: disable all other listen */
2486 boost::shared_ptr<RouteList> r = routes.reader ();
2487 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2488 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
2491 (*i)->set_listen (false, this);
2497 } else if (_listen_cnt > 0) {
2502 update_route_solo_state ();
2505 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2507 boost::shared_ptr<Route> route = wpr.lock ();
2510 /* should not happen */
2511 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2515 bool send_changed = false;
2517 if (route->solo_isolated()) {
2518 if (_solo_isolated_cnt == 0) {
2519 send_changed = true;
2521 _solo_isolated_cnt++;
2522 } else if (_solo_isolated_cnt > 0) {
2523 _solo_isolated_cnt--;
2524 if (_solo_isolated_cnt == 0) {
2525 send_changed = true;
2530 IsolatedChanged (); /* EMIT SIGNAL */
2535 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2537 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
2539 if (!self_solo_change) {
2540 // session doesn't care about changes to soloed-by-others
2544 if (solo_update_disabled) {
2546 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
2550 boost::shared_ptr<Route> route = wpr.lock ();
2553 boost::shared_ptr<RouteList> r = routes.reader ();
2556 if (route->self_soloed()) {
2562 RouteGroup* rg = route->route_group ();
2563 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
2565 if (delta == 1 && Config->get_exclusive_solo()) {
2567 /* new solo: disable all other solos, but not the group if its solo-enabled */
2569 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2570 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
2571 (leave_group_alone && ((*i)->route_group() == rg))) {
2574 (*i)->set_solo (false, this);
2578 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
2580 solo_update_disabled = true;
2582 RouteList uninvolved;
2584 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
2586 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2587 bool via_sends_only;
2588 bool in_signal_flow;
2590 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
2591 (leave_group_alone && ((*i)->route_group() == rg))) {
2595 in_signal_flow = false;
2597 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
2599 if ((*i)->feeds (route, &via_sends_only)) {
2600 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
2601 if (!via_sends_only) {
2602 if (!route->soloed_by_others_upstream()) {
2603 (*i)->mod_solo_by_others_downstream (delta);
2606 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
2608 in_signal_flow = true;
2610 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
2613 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
2615 if (route->feeds (*i, &via_sends_only)) {
2616 /* propagate solo upstream only if routing other than
2617 sends is involved, but do consider the other route
2618 (*i) to be part of the signal flow even if only
2621 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
2625 route->soloed_by_others_downstream(),
2626 route->soloed_by_others_upstream()));
2627 if (!via_sends_only) {
2628 if (!route->soloed_by_others_downstream()) {
2629 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
2630 (*i)->mod_solo_by_others_upstream (delta);
2632 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
2635 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
2637 in_signal_flow = true;
2639 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
2642 if (!in_signal_flow) {
2643 uninvolved.push_back (*i);
2647 solo_update_disabled = false;
2648 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
2650 update_route_solo_state (r);
2652 /* now notify that the mute state of the routes not involved in the signal
2653 pathway of the just-solo-changed route may have altered.
2656 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2657 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
2658 (*i)->mute_changed (this);
2661 SoloChanged (); /* EMIT SIGNAL */
2666 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2668 /* now figure out if anything that matters is soloed (or is "listening")*/
2670 bool something_soloed = false;
2671 uint32_t listeners = 0;
2672 uint32_t isolated = 0;
2675 r = routes.reader();
2678 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2679 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
2680 something_soloed = true;
2683 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
2684 if (Config->get_solo_control_is_listen_control()) {
2687 (*i)->set_listen (false, this);
2691 if ((*i)->solo_isolated()) {
2696 if (something_soloed != _non_soloed_outs_muted) {
2697 _non_soloed_outs_muted = something_soloed;
2698 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2701 _listen_cnt = listeners;
2703 if (isolated != _solo_isolated_cnt) {
2704 _solo_isolated_cnt = isolated;
2705 IsolatedChanged (); /* EMIT SIGNAL */
2708 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
2709 something_soloed, listeners, isolated));
2712 boost::shared_ptr<RouteList>
2713 Session::get_routes_with_internal_returns() const
2715 boost::shared_ptr<RouteList> r = routes.reader ();
2716 boost::shared_ptr<RouteList> rl (new RouteList);
2718 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2719 if ((*i)->internal_return ()) {
2727 Session::io_name_is_legal (const std::string& name)
2729 boost::shared_ptr<RouteList> r = routes.reader ();
2731 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2732 if ((*i)->name() == name) {
2736 if ((*i)->has_io_processor_named (name)) {
2745 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
2748 vector<string> connections;
2750 /* if we are passed only a single route and we're not told to turn
2751 * others off, then just do the simple thing.
2754 if (flip_others == false && rl->size() == 1) {
2755 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
2757 mt->set_input_active (onoff);
2762 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
2764 PortSet& ps ((*rt)->input()->ports());
2766 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
2767 p->get_connections (connections);
2770 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
2771 routes_using_input_from (*s, rl2);
2774 /* scan all relevant routes to see if others are on or off */
2776 bool others_are_already_on = false;
2778 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
2780 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2786 if ((*r) != (*rt)) {
2787 if (mt->input_active()) {
2788 others_are_already_on = true;
2791 /* this one needs changing */
2792 mt->set_input_active (onoff);
2798 /* globally reverse other routes */
2800 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
2801 if ((*r) != (*rt)) {
2802 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2804 mt->set_input_active (!others_are_already_on);
2813 Session::routes_using_input_from (const string& str, RouteList& rl)
2815 boost::shared_ptr<RouteList> r = routes.reader();
2817 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2818 if ((*i)->input()->connected_to (str)) {
2824 boost::shared_ptr<Route>
2825 Session::route_by_name (string name)
2827 boost::shared_ptr<RouteList> r = routes.reader ();
2829 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2830 if ((*i)->name() == name) {
2835 return boost::shared_ptr<Route> ((Route*) 0);
2838 boost::shared_ptr<Route>
2839 Session::route_by_id (PBD::ID id)
2841 boost::shared_ptr<RouteList> r = routes.reader ();
2843 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2844 if ((*i)->id() == id) {
2849 return boost::shared_ptr<Route> ((Route*) 0);
2852 boost::shared_ptr<Track>
2853 Session::track_by_diskstream_id (PBD::ID id)
2855 boost::shared_ptr<RouteList> r = routes.reader ();
2857 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2858 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
2859 if (t && t->using_diskstream_id (id)) {
2864 return boost::shared_ptr<Track> ();
2867 boost::shared_ptr<Route>
2868 Session::route_by_remote_id (uint32_t id)
2870 boost::shared_ptr<RouteList> r = routes.reader ();
2872 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2873 if ((*i)->remote_control_id() == id) {
2878 return boost::shared_ptr<Route> ((Route*) 0);
2882 Session::playlist_region_added (boost::weak_ptr<Region> w)
2884 boost::shared_ptr<Region> r = w.lock ();
2889 /* These are the operations that are currently in progress... */
2890 list<GQuark> curr = _current_trans_quarks;
2893 /* ...and these are the operations during which we want to update
2894 the session range location markers.
2897 ops.push_back (Operations::capture);
2898 ops.push_back (Operations::paste);
2899 ops.push_back (Operations::duplicate_region);
2900 ops.push_back (Operations::insert_file);
2901 ops.push_back (Operations::insert_region);
2902 ops.push_back (Operations::drag_region_brush);
2903 ops.push_back (Operations::region_drag);
2904 ops.push_back (Operations::selection_grab);
2905 ops.push_back (Operations::region_fill);
2906 ops.push_back (Operations::fill_selection);
2907 ops.push_back (Operations::create_region);
2908 ops.push_back (Operations::region_copy);
2909 ops.push_back (Operations::fixed_time_region_copy);
2912 /* See if any of the current operations match the ones that we want */
2914 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
2916 /* If so, update the session range markers */
2918 maybe_update_session_range (r->position (), r->last_frame ());
2922 /** Update the session range markers if a is before the current start or
2923 * b is after the current end.
2926 Session::maybe_update_session_range (framepos_t a, framepos_t b)
2928 if (_state_of_the_state & Loading) {
2932 if (_session_range_location == 0) {
2934 add_session_range_location (a, b);
2938 if (a < _session_range_location->start()) {
2939 _session_range_location->set_start (a);
2942 if (b > _session_range_location->end()) {
2943 _session_range_location->set_end (b);
2949 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
2951 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2952 maybe_update_session_range (i->to, i->to + i->length);
2957 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
2959 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2960 maybe_update_session_range (i->from, i->to);
2964 /* Region management */
2966 boost::shared_ptr<Region>
2967 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2969 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2970 RegionFactory::RegionMap::const_iterator i;
2971 boost::shared_ptr<Region> region;
2973 Glib::Threads::Mutex::Lock lm (region_lock);
2975 for (i = regions.begin(); i != regions.end(); ++i) {
2979 if (region->whole_file()) {
2981 if (child->source_equivalent (region)) {
2987 return boost::shared_ptr<Region> ();
2991 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2993 set<boost::shared_ptr<Region> > relevant_regions;
2995 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2996 RegionFactory::get_regions_using_source (*s, relevant_regions);
2999 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
3000 set<boost::shared_ptr<Region> >::iterator tmp;
3005 playlists->destroy_region (*r);
3006 RegionFactory::map_remove (*r);
3008 (*r)->drop_sources ();
3009 (*r)->drop_references ();
3011 relevant_regions.erase (r);
3016 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
3019 Glib::Threads::Mutex::Lock ls (source_lock);
3020 /* remove from the main source list */
3021 sources.erase ((*s)->id());
3024 (*s)->mark_for_remove ();
3025 (*s)->drop_references ();
3034 Session::remove_last_capture ()
3036 list<boost::shared_ptr<Source> > srcs;
3038 boost::shared_ptr<RouteList> rl = routes.reader ();
3039 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3040 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3045 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
3048 srcs.insert (srcs.end(), l.begin(), l.end());
3053 destroy_sources (srcs);
3055 save_state (_current_snapshot_name);
3060 /* Source Management */
3063 Session::add_source (boost::shared_ptr<Source> source)
3065 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
3066 pair<SourceMap::iterator,bool> result;
3068 entry.first = source->id();
3069 entry.second = source;
3072 Glib::Threads::Mutex::Lock lm (source_lock);
3073 result = sources.insert (entry);
3076 if (result.second) {
3078 /* yay, new source */
3080 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
3083 if (!fs->within_session()) {
3084 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
3090 boost::shared_ptr<AudioFileSource> afs;
3092 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
3093 if (Config->get_auto_analyse_audio()) {
3094 Analyser::queue_source_for_analysis (source, false);
3098 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
3103 Session::remove_source (boost::weak_ptr<Source> src)
3105 if (_state_of_the_state & Deletion) {
3109 SourceMap::iterator i;
3110 boost::shared_ptr<Source> source = src.lock();
3117 Glib::Threads::Mutex::Lock lm (source_lock);
3119 if ((i = sources.find (source->id())) != sources.end()) {
3124 if (!(_state_of_the_state & InCleanup)) {
3126 /* save state so we don't end up with a session file
3127 referring to non-existent sources.
3130 save_state (_current_snapshot_name);
3134 boost::shared_ptr<Source>
3135 Session::source_by_id (const PBD::ID& id)
3137 Glib::Threads::Mutex::Lock lm (source_lock);
3138 SourceMap::iterator i;
3139 boost::shared_ptr<Source> source;
3141 if ((i = sources.find (id)) != sources.end()) {
3148 boost::shared_ptr<Source>
3149 Session::source_by_path_and_channel (const string& path, uint16_t chn)
3151 Glib::Threads::Mutex::Lock lm (source_lock);
3153 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3154 boost::shared_ptr<AudioFileSource> afs
3155 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
3157 if (afs && afs->path() == path && chn == afs->channel()) {
3161 return boost::shared_ptr<Source>();
3165 Session::count_sources_by_origin (const string& path)
3168 Glib::Threads::Mutex::Lock lm (source_lock);
3170 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3171 boost::shared_ptr<FileSource> fs
3172 = boost::dynamic_pointer_cast<FileSource>(i->second);
3174 if (fs && fs->origin() == path) {
3184 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
3187 string old_basename = PBD::basename_nosuffix (oldname);
3188 string new_legalized = legalize_for_path (newname);
3190 /* note: we know (or assume) the old path is already valid */
3194 /* destructive file sources have a name of the form:
3196 /path/to/Tnnnn-NAME(%[LR])?.wav
3198 the task here is to replace NAME with the new name.
3203 string::size_type dash;
3205 dir = Glib::path_get_dirname (path);
3206 path = Glib::path_get_basename (path);
3208 /* '-' is not a legal character for the NAME part of the path */
3210 if ((dash = path.find_last_of ('-')) == string::npos) {
3214 prefix = path.substr (0, dash);
3218 path += new_legalized;
3219 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3220 path = Glib::build_filename (dir, path);
3224 /* non-destructive file sources have a name of the form:
3226 /path/to/NAME-nnnnn(%[LR])?.ext
3228 the task here is to replace NAME with the new name.
3233 string::size_type dash;
3234 string::size_type postfix;
3236 dir = Glib::path_get_dirname (path);
3237 path = Glib::path_get_basename (path);
3239 /* '-' is not a legal character for the NAME part of the path */
3241 if ((dash = path.find_last_of ('-')) == string::npos) {
3245 suffix = path.substr (dash+1);
3247 // Suffix is now everything after the dash. Now we need to eliminate
3248 // the nnnnn part, which is done by either finding a '%' or a '.'
3250 postfix = suffix.find_last_of ("%");
3251 if (postfix == string::npos) {
3252 postfix = suffix.find_last_of ('.');
3255 if (postfix != string::npos) {
3256 suffix = suffix.substr (postfix);
3258 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
3262 const uint32_t limit = 10000;
3263 char buf[PATH_MAX+1];
3265 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
3267 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
3269 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
3270 path = Glib::build_filename (dir, buf);
3278 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
3287 /** Return the full path (in some session directory) for a new within-session source.
3288 * \a name must be a session-unique name that does not contain slashes
3289 * (e.g. as returned by new_*_source_name)
3292 Session::new_source_path_from_name (DataType type, const string& name)
3294 assert(name.find("/") == string::npos);
3296 SessionDirectory sdir(get_best_session_directory_for_new_source());
3299 if (type == DataType::AUDIO) {
3300 p = sdir.sound_path();
3301 } else if (type == DataType::MIDI) {
3302 p = sdir.midi_path();
3304 error << "Unknown source type, unable to create file path" << endmsg;
3308 return Glib::build_filename (p, name);
3312 Session::peak_path (string base) const
3314 return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
3317 /** Return a unique name based on \a base for a new internal audio source */
3319 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
3322 char buf[PATH_MAX+1];
3323 const uint32_t limit = 10000;
3325 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3328 legalized = legalize_for_path (base);
3330 // Find a "version" of the base name that doesn't exist in any of the possible directories.
3331 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3333 vector<space_and_path>::iterator i;
3334 uint32_t existing = 0;
3336 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3341 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3342 cnt, legalized.c_str(), ext.c_str());
3343 } else if (nchan == 2) {
3345 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
3346 cnt, legalized.c_str(), ext.c_str());
3348 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
3349 cnt, legalized.c_str(), ext.c_str());
3351 } else if (nchan < 26) {
3352 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
3353 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
3355 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3356 cnt, legalized.c_str(), ext.c_str());
3362 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3363 } else if (nchan == 2) {
3365 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
3367 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
3369 } else if (nchan < 26) {
3370 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
3372 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3376 SessionDirectory sdir((*i).path);
3378 string spath = sdir.sound_path();
3380 /* note that we search *without* the extension so that
3381 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3382 in the event that this new name is required for
3383 a file format change.
3386 if (matching_unsuffixed_filename_exists_in (spath, buf)) {
3392 if (existing == 0) {
3397 error << string_compose(
3398 _("There are already %1 recordings for %2, which I consider too many."),
3399 limit, base) << endmsg;
3401 throw failed_constructor();
3405 return Glib::path_get_basename (buf);
3408 /** Create a new within-session audio source */
3409 boost::shared_ptr<AudioFileSource>
3410 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
3412 const string name = new_audio_source_name (n, n_chans, chan, destructive);
3413 const string path = new_source_path_from_name(DataType::AUDIO, name);
3415 return boost::dynamic_pointer_cast<AudioFileSource> (
3416 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
3419 /** Return a unique name based on \a base for a new internal MIDI source */
3421 Session::new_midi_source_name (const string& base)
3424 char buf[PATH_MAX+1];
3425 const uint32_t limit = 10000;
3429 legalized = legalize_for_path (base);
3431 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3432 for (cnt = 1; cnt <= limit; ++cnt) {
3434 vector<space_and_path>::iterator i;
3435 uint32_t existing = 0;
3437 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3439 SessionDirectory sdir((*i).path);
3441 std::string p = Glib::build_filename (sdir.midi_path(), legalized);
3443 snprintf (buf, sizeof(buf), "%s-%u.mid", p.c_str(), cnt);
3445 if (Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
3450 if (existing == 0) {
3455 error << string_compose(
3456 _("There are already %1 recordings for %2, which I consider too many."),
3457 limit, base) << endmsg;
3459 throw failed_constructor();
3463 return Glib::path_get_basename(buf);
3467 /** Create a new within-session MIDI source */
3468 boost::shared_ptr<MidiSource>
3469 Session::create_midi_source_for_session (Track* track, string const & n)
3471 /* try to use the existing write source for the track, to keep numbering sane
3475 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3479 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3482 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3483 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3487 const string name = new_midi_source_name (n);
3488 const string path = new_source_path_from_name (DataType::MIDI, name);
3490 return boost::dynamic_pointer_cast<SMFSource> (
3491 SourceFactory::createWritable (
3492 DataType::MIDI, *this, path, false, frame_rate()));
3497 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3499 if (playlist->hidden()) {
3503 playlists->add (playlist);
3506 playlist->release();
3513 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3515 if (_state_of_the_state & Deletion) {
3519 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3525 playlists->remove (playlist);
3531 Session::set_audition (boost::shared_ptr<Region> r)
3533 pending_audition_region = r;
3534 add_post_transport_work (PostTransportAudition);
3535 _butler->schedule_transport_work ();
3539 Session::audition_playlist ()
3541 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3542 ev->region.reset ();
3547 Session::non_realtime_set_audition ()
3549 assert (pending_audition_region);
3550 auditioner->audition_region (pending_audition_region);
3551 pending_audition_region.reset ();
3552 AuditionActive (true); /* EMIT SIGNAL */
3556 Session::audition_region (boost::shared_ptr<Region> r)
3558 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3564 Session::cancel_audition ()
3566 if (auditioner->auditioning()) {
3567 auditioner->cancel_audition ();
3568 AuditionActive (false); /* EMIT SIGNAL */
3573 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3575 if (a->is_monitor()) {
3578 if (b->is_monitor()) {
3581 return a->order_key (MixerSort) < b->order_key (MixerSort);
3585 Session::is_auditioning () const
3587 /* can be called before we have an auditioner object */
3589 return auditioner->auditioning();
3596 Session::graph_reordered ()
3598 /* don't do this stuff if we are setting up connections
3599 from a set_state() call or creating new tracks. Ditto for deletion.
3602 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
3606 /* every track/bus asked for this to be handled but it was deferred because
3607 we were connecting. do it now.
3610 request_input_change_handling ();
3614 /* force all diskstreams to update their capture offset values to
3615 reflect any changes in latencies within the graph.
3618 boost::shared_ptr<RouteList> rl = routes.reader ();
3619 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3620 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3622 tr->set_capture_offset ();
3627 /** @return Number of frames that there is disk space available to write,
3630 boost::optional<framecnt_t>
3631 Session::available_capture_duration ()
3633 Glib::Threads::Mutex::Lock lm (space_lock);
3635 if (_total_free_4k_blocks_uncertain) {
3636 return boost::optional<framecnt_t> ();
3639 float sample_bytes_on_disk = 4.0; // keep gcc happy
3641 switch (config.get_native_file_data_format()) {
3643 sample_bytes_on_disk = 4.0;
3647 sample_bytes_on_disk = 3.0;
3651 sample_bytes_on_disk = 2.0;
3655 /* impossible, but keep some gcc versions happy */
3656 fatal << string_compose (_("programming error: %1"),
3657 X_("illegal native file data format"))
3662 double scale = 4096.0 / sample_bytes_on_disk;
3664 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3665 return max_framecnt;
3668 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3672 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3675 RCUWriter<BundleList> writer (_bundles);
3676 boost::shared_ptr<BundleList> b = writer.get_copy ();
3677 b->push_back (bundle);
3680 BundleAdded (bundle); /* EMIT SIGNAL */
3686 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3688 bool removed = false;
3691 RCUWriter<BundleList> writer (_bundles);
3692 boost::shared_ptr<BundleList> b = writer.get_copy ();
3693 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3695 if (i != b->end()) {
3702 BundleRemoved (bundle); /* EMIT SIGNAL */
3708 boost::shared_ptr<Bundle>
3709 Session::bundle_by_name (string name) const
3711 boost::shared_ptr<BundleList> b = _bundles.reader ();
3713 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3714 if ((*i)->name() == name) {
3719 return boost::shared_ptr<Bundle> ();
3723 Session::tempo_map_changed (const PropertyChange&)
3727 playlists->update_after_tempo_map_change ();
3729 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3735 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3737 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3738 (*i)->recompute_frames_from_bbt ();
3742 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3743 * the given count with the current block size.
3746 Session::ensure_buffers (ChanCount howmany)
3748 BufferManager::ensure_buffers (howmany);
3752 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3754 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3755 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3760 Session::next_insert_id ()
3762 /* this doesn't really loop forever. just think about it */
3765 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3766 if (!insert_bitset[n]) {
3767 insert_bitset[n] = true;
3773 /* none available, so resize and try again */
3775 insert_bitset.resize (insert_bitset.size() + 16, false);
3780 Session::next_send_id ()
3782 /* this doesn't really loop forever. just think about it */
3785 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3786 if (!send_bitset[n]) {
3787 send_bitset[n] = true;
3793 /* none available, so resize and try again */
3795 send_bitset.resize (send_bitset.size() + 16, false);
3800 Session::next_aux_send_id ()
3802 /* this doesn't really loop forever. just think about it */
3805 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
3806 if (!aux_send_bitset[n]) {
3807 aux_send_bitset[n] = true;
3813 /* none available, so resize and try again */
3815 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
3820 Session::next_return_id ()
3822 /* this doesn't really loop forever. just think about it */
3825 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3826 if (!return_bitset[n]) {
3827 return_bitset[n] = true;
3833 /* none available, so resize and try again */
3835 return_bitset.resize (return_bitset.size() + 16, false);
3840 Session::mark_send_id (uint32_t id)
3842 if (id >= send_bitset.size()) {
3843 send_bitset.resize (id+16, false);
3845 if (send_bitset[id]) {
3846 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3848 send_bitset[id] = true;
3852 Session::mark_aux_send_id (uint32_t id)
3854 if (id >= aux_send_bitset.size()) {
3855 aux_send_bitset.resize (id+16, false);
3857 if (aux_send_bitset[id]) {
3858 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
3860 aux_send_bitset[id] = true;
3864 Session::mark_return_id (uint32_t id)
3866 if (id >= return_bitset.size()) {
3867 return_bitset.resize (id+16, false);
3869 if (return_bitset[id]) {
3870 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3872 return_bitset[id] = true;
3876 Session::mark_insert_id (uint32_t id)
3878 if (id >= insert_bitset.size()) {
3879 insert_bitset.resize (id+16, false);
3881 if (insert_bitset[id]) {
3882 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3884 insert_bitset[id] = true;
3888 Session::unmark_send_id (uint32_t id)
3890 if (id < send_bitset.size()) {
3891 send_bitset[id] = false;
3896 Session::unmark_aux_send_id (uint32_t id)
3898 if (id < aux_send_bitset.size()) {
3899 aux_send_bitset[id] = false;
3904 Session::unmark_return_id (uint32_t id)
3906 if (id < return_bitset.size()) {
3907 return_bitset[id] = false;
3912 Session::unmark_insert_id (uint32_t id)
3914 if (id < insert_bitset.size()) {
3915 insert_bitset[id] = false;
3920 Session::reset_native_file_format ()
3922 boost::shared_ptr<RouteList> rl = routes.reader ();
3923 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3924 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3926 /* don't save state as we do this, there's no point
3929 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3930 tr->reset_write_sources (false);
3931 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3937 Session::route_name_unique (string n) const
3939 boost::shared_ptr<RouteList> r = routes.reader ();
3941 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3942 if ((*i)->name() == n) {
3951 Session::route_name_internal (string n) const
3953 if (auditioner && auditioner->name() == n) {
3957 if (_click_io && _click_io->name() == n) {
3965 Session::freeze_all (InterThreadInfo& itt)
3967 boost::shared_ptr<RouteList> r = routes.reader ();
3969 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3971 boost::shared_ptr<Track> t;
3973 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3974 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3984 boost::shared_ptr<Region>
3985 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
3986 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3987 InterThreadInfo& itt,
3988 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
3991 boost::shared_ptr<Region> result;
3992 boost::shared_ptr<Playlist> playlist;
3993 boost::shared_ptr<AudioFileSource> fsource;
3995 char buf[PATH_MAX+1];
3996 ChanCount diskstream_channels (track.n_channels());
3997 framepos_t position;
3998 framecnt_t this_chunk;
4001 SessionDirectory sdir(get_best_session_directory_for_new_source ());
4002 const string sound_dir = sdir.sound_path();
4003 framepos_t len = end - start;
4004 bool need_block_size_reset = false;
4006 ChanCount const max_proc = track.max_processor_streams ();
4009 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
4010 end, start) << endmsg;
4014 const framecnt_t chunk_size = (256 * 1024)/4;
4016 // block all process callback handling
4018 block_processing ();
4020 /* call tree *MUST* hold route_lock */
4022 if ((playlist = track.playlist()) == 0) {
4026 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4028 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
4030 for (x = 0; x < 99999; ++x) {
4031 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());
4032 if (!Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
4038 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
4043 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
4044 SourceFactory::createWritable (DataType::AUDIO, *this, buf, false, frame_rate()));
4047 catch (failed_constructor& err) {
4048 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
4052 srcs.push_back (fsource);
4055 /* tell redirects that care that we are about to use a much larger
4056 * blocksize. this will flush all plugins too, so that they are ready
4057 * to be used for this process.
4060 need_block_size_reset = true;
4061 track.set_block_size (chunk_size);
4066 /* create a set of reasonably-sized buffers */
4067 buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
4068 buffers.set_count (max_proc);
4070 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4071 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4073 afs->prepare_for_peakfile_writes ();
4076 while (to_do && !itt.cancel) {
4078 this_chunk = min (to_do, chunk_size);
4080 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export)) {
4085 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4086 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4089 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
4095 start += this_chunk;
4096 to_do -= this_chunk;
4098 itt.progress = (float) (1.0 - ((double) to_do / len));
4107 xnow = localtime (&now);
4109 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
4110 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4113 afs->update_header (position, *xnow, now);
4114 afs->flush_header ();
4118 /* construct a region to represent the bounced material */
4122 plist.add (Properties::start, 0);
4123 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4124 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4126 result = RegionFactory::create (srcs, plist);
4132 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4133 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4136 afs->mark_for_remove ();
4139 (*src)->drop_references ();
4143 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4144 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4147 afs->done_with_peakfile_writes ();
4152 if (need_block_size_reset) {
4153 track.set_block_size (get_block_size());
4156 unblock_processing ();
4162 Session::gain_automation_buffer() const
4164 return ProcessThread::gain_automation_buffer ();
4168 Session::send_gain_automation_buffer() const
4170 return ProcessThread::send_gain_automation_buffer ();
4174 Session::pan_automation_buffer() const
4176 return ProcessThread::pan_automation_buffer ();
4180 Session::get_silent_buffers (ChanCount count)
4182 return ProcessThread::get_silent_buffers (count);
4186 Session::get_scratch_buffers (ChanCount count, bool silence)
4188 return ProcessThread::get_scratch_buffers (count, silence);
4192 Session::get_route_buffers (ChanCount count, bool silence)
4194 return ProcessThread::get_route_buffers (count, silence);
4199 Session::get_mix_buffers (ChanCount count)
4201 return ProcessThread::get_mix_buffers (count);
4205 Session::ntracks () const
4208 boost::shared_ptr<RouteList> r = routes.reader ();
4210 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4211 if (boost::dynamic_pointer_cast<Track> (*i)) {
4220 Session::nbusses () const
4223 boost::shared_ptr<RouteList> r = routes.reader ();
4225 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4226 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
4235 Session::add_automation_list(AutomationList *al)
4237 automation_lists[al->id()] = al;
4240 /** @return true if there is at least one record-enabled track, otherwise false */
4242 Session::have_rec_enabled_track () const
4244 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
4247 /** Update the state of our rec-enabled tracks flag */
4249 Session::update_have_rec_enabled_track ()
4251 boost::shared_ptr<RouteList> rl = routes.reader ();
4252 RouteList::iterator i = rl->begin();
4253 while (i != rl->end ()) {
4255 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4256 if (tr && tr->record_enabled ()) {
4263 int const old = g_atomic_int_get (&_have_rec_enabled_track);
4265 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4267 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4268 RecordStateChanged (); /* EMIT SIGNAL */
4273 Session::listen_position_changed ()
4275 boost::shared_ptr<RouteList> r = routes.reader ();
4277 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4278 (*i)->listen_position_changed ();
4283 Session::solo_control_mode_changed ()
4285 /* cancel all solo or all listen when solo control mode changes */
4288 set_solo (get_routes(), false);
4289 } else if (listening()) {
4290 set_listen (get_routes(), false);
4294 /** Called when a property of one of our route groups changes */
4296 Session::route_group_property_changed (RouteGroup* rg)
4298 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4301 /** Called when a route is added to one of our route groups */
4303 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4305 RouteAddedToRouteGroup (rg, r);
4308 /** Called when a route is removed from one of our route groups */
4310 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4312 RouteRemovedFromRouteGroup (rg, r);
4315 boost::shared_ptr<RouteList>
4316 Session::get_routes_with_regions_at (framepos_t const p) const
4318 boost::shared_ptr<RouteList> r = routes.reader ();
4319 boost::shared_ptr<RouteList> rl (new RouteList);
4321 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4322 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4327 boost::shared_ptr<Playlist> pl = tr->playlist ();
4332 if (pl->has_region_at (p)) {
4341 Session::goto_end ()
4343 if (_session_range_location) {
4344 request_locate (_session_range_location->end(), false);
4346 request_locate (0, false);
4351 Session::goto_start ()
4353 if (_session_range_location) {
4354 request_locate (_session_range_location->start(), false);
4356 request_locate (0, false);
4361 Session::current_start_frame () const
4363 return _session_range_location ? _session_range_location->start() : 0;
4367 Session::current_end_frame () const
4369 return _session_range_location ? _session_range_location->end() : 0;
4373 Session::add_session_range_location (framepos_t start, framepos_t end)
4375 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4376 _locations->add (_session_range_location);
4380 Session::step_edit_status_change (bool yn)
4386 send = (_step_editors == 0);
4391 send = (_step_editors == 1);
4394 if (_step_editors > 0) {
4400 StepEditStatusChange (val);
4406 Session::start_time_changed (framepos_t old)
4408 /* Update the auto loop range to match the session range
4409 (unless the auto loop range has been changed by the user)
4412 Location* s = _locations->session_range_location ();
4417 Location* l = _locations->auto_loop_location ();
4419 if (l && l->start() == old) {
4420 l->set_start (s->start(), true);
4425 Session::end_time_changed (framepos_t old)
4427 /* Update the auto loop range to match the session range
4428 (unless the auto loop range has been changed by the user)
4431 Location* s = _locations->session_range_location ();
4436 Location* l = _locations->auto_loop_location ();
4438 if (l && l->end() == old) {
4439 l->set_end (s->end(), true);
4444 Session::source_search_path (DataType type) const
4448 if (session_dirs.size() == 1) {
4450 case DataType::AUDIO:
4451 s.push_back (_session_dir->sound_path());
4453 case DataType::MIDI:
4454 s.push_back (_session_dir->midi_path());
4458 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4459 SessionDirectory sdir (i->path);
4461 case DataType::AUDIO:
4462 s.push_back (sdir.sound_path());
4464 case DataType::MIDI:
4465 s.push_back (sdir.midi_path());
4471 if (type == DataType::AUDIO) {
4472 const string sound_path_2X = _session_dir->sound_path_2X();
4473 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
4474 if (find (s.begin(), s.end(), sound_path_2X) == s.end()) {
4475 s.push_back (sound_path_2X);
4480 /* now check the explicit (possibly user-specified) search path
4483 vector<string> dirs;
4486 case DataType::AUDIO:
4487 split (config.get_audio_search_path (), dirs, ':');
4489 case DataType::MIDI:
4490 split (config.get_midi_search_path (), dirs, ':');
4494 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4495 if (find (s.begin(), s.end(), *i) == s.end()) {
4502 for (vector<string>::iterator si = s.begin(); si != s.end(); ++si) {
4503 if (!search_path.empty()) {
4513 Session::ensure_search_path_includes (const string& path, DataType type)
4516 vector<string> dirs;
4523 case DataType::AUDIO:
4524 search_path = config.get_audio_search_path ();
4526 case DataType::MIDI:
4527 search_path = config.get_midi_search_path ();
4531 split (search_path, dirs, ':');
4533 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4534 /* No need to add this new directory if it has the same inode as
4535 an existing one; checking inode rather than name prevents duplicated
4536 directories when we are using symlinks.
4538 On Windows, I think we could just do if (*i == path) here.
4540 if (PBD::equivalent_paths (*i, path)) {
4545 if (!search_path.empty()) {
4549 search_path += path;
4552 case DataType::AUDIO:
4553 config.set_audio_search_path (search_path);
4555 case DataType::MIDI:
4556 config.set_midi_search_path (search_path);
4561 boost::shared_ptr<Speakers>
4562 Session::get_speakers()
4568 Session::unknown_processors () const
4572 boost::shared_ptr<RouteList> r = routes.reader ();
4573 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4574 list<string> t = (*i)->unknown_processors ();
4575 copy (t.begin(), t.end(), back_inserter (p));
4585 Session::update_latency (bool playback)
4587 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
4589 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
4593 boost::shared_ptr<RouteList> r = routes.reader ();
4594 framecnt_t max_latency = 0;
4597 /* reverse the list so that we work backwards from the last route to run to the first */
4598 RouteList* rl = routes.reader().get();
4599 r.reset (new RouteList (*rl));
4600 reverse (r->begin(), r->end());
4603 /* compute actual latency values for the given direction and store them all in per-port
4604 structures. this will also publish the same values (to JACK) so that computation of latency
4605 for routes can consistently use public latency values.
4608 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4609 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
4612 /* because we latency compensate playback, our published playback latencies should
4613 be the same for all output ports - all material played back by ardour has
4614 the same latency, whether its caused by plugins or by latency compensation. since
4615 these may differ from the values computed above, reset all playback port latencies
4619 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
4621 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4622 (*i)->set_public_port_latencies (max_latency, playback);
4627 post_playback_latency ();
4631 post_capture_latency ();
4634 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
4638 Session::post_playback_latency ()
4640 set_worst_playback_latency ();
4642 boost::shared_ptr<RouteList> r = routes.reader ();
4644 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4645 if (!(*i)->is_auditioner() && ((*i)->active())) {
4646 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
4650 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4651 (*i)->set_latency_compensation (_worst_track_latency);
4656 Session::post_capture_latency ()
4658 set_worst_capture_latency ();
4660 /* reflect any changes in capture latencies into capture offsets
4663 boost::shared_ptr<RouteList> rl = routes.reader();
4664 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4665 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4667 tr->set_capture_offset ();
4673 Session::initialize_latencies ()
4676 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
4677 update_latency (false);
4678 update_latency (true);
4681 set_worst_io_latencies ();
4685 Session::set_worst_io_latencies ()
4687 set_worst_playback_latency ();
4688 set_worst_capture_latency ();
4692 Session::set_worst_playback_latency ()
4694 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4698 _worst_output_latency = 0;
4700 if (!_engine.connected()) {
4704 boost::shared_ptr<RouteList> r = routes.reader ();
4706 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4707 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
4710 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
4714 Session::set_worst_capture_latency ()
4716 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4720 _worst_input_latency = 0;
4722 if (!_engine.connected()) {
4726 boost::shared_ptr<RouteList> r = routes.reader ();
4728 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4729 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
4732 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
4736 Session::update_latency_compensation (bool force_whole_graph)
4738 bool some_track_latency_changed = false;
4740 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4744 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
4746 _worst_track_latency = 0;
4748 boost::shared_ptr<RouteList> r = routes.reader ();
4750 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4751 if (!(*i)->is_auditioner() && ((*i)->active())) {
4753 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
4754 some_track_latency_changed = true;
4756 _worst_track_latency = max (tl, _worst_track_latency);
4760 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
4761 (some_track_latency_changed ? "yes" : "no")));
4763 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
4765 if (some_track_latency_changed || force_whole_graph) {
4766 _engine.update_latencies ();
4770 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4771 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4775 tr->set_capture_offset ();
4780 Session::session_name_is_legal (const string& path)
4782 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
4784 for (int i = 0; illegal_chars[i]; ++i) {
4785 if (path.find (illegal_chars[i]) != string::npos) {
4786 return illegal_chars[i];
4794 Session::next_control_id () const
4798 /* the monitor bus remote ID is in a different
4799 * "namespace" than regular routes. its existence doesn't
4800 * affect normal (low) numbered routes.
4807 return nroutes() - subtract;
4811 Session::notify_remote_id_change ()
4813 if (deletion_in_progress()) {
4817 switch (Config->get_remote_model()) {
4820 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
4828 Session::sync_order_keys (RouteSortOrderKey sort_key_changed)
4830 if (deletion_in_progress()) {
4834 /* tell everyone that something has happened to the sort keys
4835 and let them sync up with the change(s)
4836 this will give objects that manage the sort order keys the
4837 opportunity to keep them in sync if they wish to.
4840 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("Sync Order Keys, based on %1\n", enum_2_string (sort_key_changed)));
4842 Route::SyncOrderKeys (sort_key_changed); /* EMIT SIGNAL */
4844 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
4848 Session::operation_in_progress (GQuark op) const
4850 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
4853 boost::shared_ptr<Port>
4854 Session::ltc_input_port () const
4856 return _ltc_input->nth (0);
4859 boost::shared_ptr<Port>
4860 Session::ltc_output_port () const
4862 return _ltc_output->nth (0);
4866 Session::reconnect_ltc_input ()
4870 string src = Config->get_ltc_source_port();
4872 _ltc_input->disconnect (this);
4874 if (src != _("None") && !src.empty()) {
4875 _ltc_input->nth (0)->connect (src);
4881 Session::reconnect_ltc_output ()
4886 string src = Config->get_ltc_sink_port();
4888 _ltc_output->disconnect (this);
4890 if (src != _("None") && !src.empty()) {
4891 _ltc_output->nth (0)->connect (src);