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/basename.h"
40 #include "pbd/boost_debug.h"
41 #include "pbd/convert.h"
42 #include "pbd/convert.h"
43 #include "pbd/error.h"
44 #include "pbd/file_utils.h"
46 #include "pbd/search_path.h"
47 #include "pbd/stacktrace.h"
48 #include "pbd/stl_delete.h"
49 #include "pbd/unwind.h"
51 #include "ardour/amp.h"
52 #include "ardour/analyser.h"
53 #include "ardour/async_midi_port.h"
54 #include "ardour/audio_buffer.h"
55 #include "ardour/audio_diskstream.h"
56 #include "ardour/audio_port.h"
57 #include "ardour/audio_track.h"
58 #include "ardour/audioengine.h"
59 #include "ardour/audiofilesource.h"
60 #include "ardour/auditioner.h"
61 #include "ardour/buffer_manager.h"
62 #include "ardour/buffer_set.h"
63 #include "ardour/bundle.h"
64 #include "ardour/butler.h"
65 #include "ardour/click.h"
66 #include "ardour/control_protocol_manager.h"
67 #include "ardour/data_type.h"
68 #include "ardour/debug.h"
69 #include "ardour/directory_names.h"
70 #include "ardour/filename_extensions.h"
71 #include "ardour/graph.h"
72 #include "ardour/midiport_manager.h"
73 #include "ardour/scene_changer.h"
74 #include "ardour/midi_track.h"
75 #include "ardour/midi_ui.h"
76 #include "ardour/operations.h"
77 #include "ardour/playlist.h"
78 #include "ardour/plugin.h"
79 #include "ardour/plugin_insert.h"
80 #include "ardour/process_thread.h"
81 #include "ardour/profile.h"
82 #include "ardour/rc_configuration.h"
83 #include "ardour/recent_sessions.h"
84 #include "ardour/region.h"
85 #include "ardour/region_factory.h"
86 #include "ardour/route_graph.h"
87 #include "ardour/route_group.h"
88 #include "ardour/route_sorters.h"
89 #include "ardour/send.h"
90 #include "ardour/session.h"
91 #include "ardour/session_directory.h"
92 #include "ardour/session_playlists.h"
93 #include "ardour/smf_source.h"
94 #include "ardour/source_factory.h"
95 #include "ardour/speakers.h"
96 #include "ardour/tempo.h"
97 #include "ardour/track.h"
98 #include "ardour/user_bundle.h"
99 #include "ardour/utils.h"
101 #include "midi++/port.h"
102 #include "midi++/mmc.h"
113 using namespace ARDOUR;
116 bool Session::_disable_all_loaded_plugins = false;
118 PBD::Signal1<int,uint32_t> Session::AudioEngineSetupRequired;
119 PBD::Signal1<void,std::string> Session::Dialog;
120 PBD::Signal0<int> Session::AskAboutPendingState;
121 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
122 PBD::Signal0<void> Session::SendFeedback;
123 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
125 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
126 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
127 PBD::Signal2<void,std::string, std::string> Session::Exported;
128 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
129 PBD::Signal0<void> Session::Quit;
130 PBD::Signal0<void> Session::FeedbackDetected;
131 PBD::Signal0<void> Session::SuccessfulGraphSort;
132 PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
134 const framecnt_t Session::bounce_chunk_size = 65536;
135 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
136 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
138 /** @param snapshot_name Snapshot name, without .ardour suffix */
139 Session::Session (AudioEngine &eng,
140 const string& fullpath,
141 const string& snapshot_name,
142 BusProfile* bus_profile,
144 : playlists (new SessionPlaylists)
146 , process_function (&Session::process_with_events)
147 , _bounce_processing_active (false)
148 , waiting_for_sync_offset (false)
149 , _base_frame_rate (0)
150 , _current_frame_rate (0)
151 , _nominal_frame_rate (0)
152 , transport_sub_state (0)
153 , _record_status (Disabled)
154 , _transport_frame (0)
155 , _session_range_location (0)
158 , _transport_speed (0)
159 , _default_transport_speed (1.0)
160 , _last_transport_speed (0)
161 , _target_transport_speed (0.0)
162 , auto_play_legal (false)
163 , _last_slave_transport_frame (0)
164 , maximum_output_latency (0)
165 , _requested_return_frame (-1)
166 , current_block_size (0)
167 , _worst_output_latency (0)
168 , _worst_input_latency (0)
169 , _worst_track_latency (0)
170 , _have_captured (false)
171 , _non_soloed_outs_muted (false)
173 , _solo_isolated_cnt (0)
175 , _was_seamless (Config->get_seamless_loop ())
176 , _under_nsm_control (false)
178 , delta_accumulator_cnt (0)
179 , average_slave_delta (1800) // !!! why 1800 ???
181 , have_first_delta_accumulator (false)
182 , _slave_state (Stopped)
183 , post_export_sync (false)
184 , post_export_position (0)
186 , _export_started (false)
187 , _export_rolling (false)
188 , _pre_export_mmc_enabled (false)
189 , _name (snapshot_name)
191 , _send_qf_mtc (false)
192 , _pframes_since_last_mtc (0)
193 , session_midi_feedback (0)
195 , loop_changing (false)
197 , _session_dir (new SessionDirectory (fullpath))
198 , _current_snapshot_name (snapshot_name)
200 , state_was_pending (false)
201 , _state_of_the_state (StateOfTheState(CannotSave|InitialConnecting|Loading))
203 , _save_queued (false)
204 , _last_roll_location (0)
205 , _last_roll_or_reversal_location (0)
206 , _last_record_location (0)
207 , pending_locate_roll (false)
208 , pending_locate_frame (0)
209 , pending_locate_flush (false)
210 , pending_abort (false)
211 , pending_auto_loop (false)
212 , _butler (new Butler (*this))
213 , _post_transport_work (0)
214 , cumulative_rf_motion (0)
216 , _locations (new Locations (*this))
217 , _ignore_skips_updates (false)
218 , _rt_thread_active (false)
219 , _rt_emit_pending (false)
221 , outbound_mtc_timecode_frame (0)
222 , next_quarter_frame_to_send (-1)
223 , _frames_per_timecode_frame (0)
224 , _frames_per_hour (0)
225 , _timecode_frames_per_hour (0)
226 , last_timecode_valid (false)
227 , last_timecode_when (0)
228 , _send_timecode_update (false)
240 , ltc_timecode_offset (0)
241 , ltc_timecode_negative_offset (false)
242 , midi_control_ui (0)
244 , _all_route_group (new RouteGroup (*this, "all"))
245 , routes (new RouteList)
246 , _adding_routes_in_progress (false)
247 , destructive_index (0)
248 , _track_number_decimals(1)
249 , solo_update_disabled (false)
250 , default_fade_steepness (0)
251 , default_fade_msecs (0)
252 , _total_free_4k_blocks (0)
253 , _total_free_4k_blocks_uncertain (false)
254 , no_questions_about_missing_files (false)
257 , _bundles (new BundleList)
258 , _bundle_xml_node (0)
262 , click_emphasis_data (0)
264 , click_emphasis_length (0)
265 , _clicks_cleared (0)
266 , _play_range (false)
268 , first_file_data_format_reset (true)
269 , first_file_header_format_reset (true)
270 , have_looped (false)
271 , _have_rec_enabled_track (false)
272 , _have_rec_disabled_track (true)
274 , _suspend_timecode_transmission (0)
275 , _speakers (new Speakers)
277 , ignore_route_processor_changes (false)
284 pthread_mutex_init (&_rt_emit_mutex, 0);
285 pthread_cond_init (&_rt_emit_cond, 0);
287 pre_engine_init (fullpath);
290 if (ensure_engine (sr)) {
292 throw failed_constructor ();
295 if (create (mix_template, bus_profile)) {
297 throw failed_constructor ();
300 /* if a mix template was provided, then ::create() will
301 * have copied it into the session and we need to load it
302 * so that we have the state ready for ::set_state()
303 * after the engine is started.
305 * Note that we do NOT try to get the sample rate from
306 * the template at this time, though doing so would
307 * be easy if we decided this was an appropriate part
311 if (!mix_template.empty()) {
312 if (load_state (_current_snapshot_name)) {
313 throw failed_constructor ();
315 store_recent_templates (mix_template);
318 /* load default session properties - if any */
323 if (load_state (_current_snapshot_name)) {
324 throw failed_constructor ();
327 /* try to get sample rate from XML state so that we
328 * can influence the SR if we set up the audio
333 const XMLProperty* prop;
334 if ((prop = state_tree->root()->property (X_("sample-rate"))) != 0) {
335 sr = atoi (prop->value());
339 if (ensure_engine (sr)) {
341 throw failed_constructor ();
345 if (post_engine_init ()) {
347 throw failed_constructor ();
350 store_recent_sessions (_name, _path);
352 bool was_dirty = dirty();
354 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
356 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
357 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
360 DirtyChanged (); /* EMIT SIGNAL */
363 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
364 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
368 emit_thread_start ();
370 /* hook us up to the engine since we are now completely constructed */
372 BootMessage (_("Connect to engine"));
374 _engine.set_session (this);
375 _engine.reset_timebase ();
377 BootMessage (_("Session loading complete"));
390 Session::ensure_engine (uint32_t desired_sample_rate)
392 if (_engine.current_backend() == 0) {
393 /* backend is unknown ... */
394 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
395 if (r.get_value_or (-1) != 0) {
398 } else if (_engine.setup_required()) {
399 /* backend is known, but setup is needed */
400 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
401 if (r.get_value_or (-1) != 0) {
404 } else if (!_engine.running()) {
405 if (_engine.start()) {
410 /* at this point the engine should be running
413 if (!_engine.running()) {
417 return immediately_post_engine ();
422 Session::immediately_post_engine ()
424 /* Do various initializations that should take place directly after we
425 * know that the engine is running, but before we either create a
426 * session or set state for an existing one.
429 if (how_many_dsp_threads () > 1) {
430 /* For now, only create the graph if we are using >1 DSP threads, as
431 it is a bit slower than the old code with 1 thread.
433 _process_graph.reset (new Graph (*this));
436 /* every time we reconnect, recompute worst case output latencies */
438 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
440 if (synced_to_engine()) {
441 _engine.transport_stop ();
444 if (config.get_jack_time_master()) {
445 _engine.transport_locate (_transport_frame);
449 BootMessage (_("Set up LTC"));
451 BootMessage (_("Set up Click"));
453 BootMessage (_("Set up standard connections"));
457 catch (failed_constructor& err) {
461 /* TODO, connect in different thread. (PortRegisteredOrUnregistered may be in RT context)
463 _engine.PortRegisteredOrUnregistered.connect_same_thread (*this, boost::bind (&Session::setup_bundles, this));
471 vector<void*> debug_pointers;
473 /* if we got to here, leaving pending capture state around
477 remove_pending_capture_state ();
479 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
481 /* disconnect from any and all signals that we are connected to */
485 _engine.remove_session ();
487 /* deregister all ports - there will be no process or any other
488 * callbacks from the engine any more.
491 Port::PortDrop (); /* EMIT SIGNAL */
495 /* clear history so that no references to objects are held any more */
499 /* clear state tree so that no references to objects are held any more */
504 /* reset dynamic state version back to default */
506 Stateful::loading_state_version = 0;
508 _butler->drop_references ();
512 delete _all_route_group;
514 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
515 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
519 if (click_data != default_click) {
520 delete [] click_data;
523 if (click_emphasis_data != default_click_emphasis) {
524 delete [] click_emphasis_data;
529 /* need to remove auditioner before monitoring section
530 * otherwise it is re-connected */
533 /* drop references to routes held by the monitoring section
534 * specifically _monitor_out aux/listen references */
535 remove_monitor_section();
537 /* clear out any pending dead wood from RCU managed objects */
542 AudioDiskstream::free_working_buffers();
544 /* tell everyone who is still standing that we're about to die */
547 /* tell everyone to drop references and delete objects as we go */
549 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
550 RegionFactory::delete_all_regions ();
552 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
554 /* reset these three references to special routes before we do the usual route delete thing */
556 _master_out.reset ();
557 _monitor_out.reset ();
560 RCUWriter<RouteList> writer (routes);
561 boost::shared_ptr<RouteList> r = writer.get_copy ();
563 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
564 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
565 (*i)->drop_references ();
569 /* writer goes out of scope and updates master */
574 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
575 Glib::Threads::Mutex::Lock lm (source_lock);
576 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
577 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
578 i->second->drop_references ();
584 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
587 emit_thread_terminate ();
589 pthread_cond_destroy (&_rt_emit_cond);
590 pthread_mutex_destroy (&_rt_emit_mutex);
592 delete _scene_changer; _scene_changer = 0;
593 delete midi_control_ui; midi_control_ui = 0;
595 delete _mmc; _mmc = 0;
596 delete _midi_ports; _midi_ports = 0;
597 delete _locations; _locations = 0;
601 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
603 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
604 boost_debug_list_ptrs ();
609 Session::setup_ltc ()
613 _ltc_input.reset (new IO (*this, X_("LTC In"), IO::Input));
614 _ltc_output.reset (new IO (*this, X_("LTC Out"), IO::Output));
616 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC In"))) != 0) {
617 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
620 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
621 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
623 reconnect_ltc_input ();
626 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC Out"))) != 0) {
627 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
630 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
631 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
633 reconnect_ltc_output ();
636 /* fix up names of LTC ports because we don't want the normal
637 * IO style of NAME/TYPE-{in,out}N
640 _ltc_input->nth (0)->set_name (X_("LTC-in"));
641 _ltc_output->nth (0)->set_name (X_("LTC-out"));
645 Session::setup_click ()
648 _click_io.reset (new ClickIO (*this, X_("Click")));
649 _click_gain.reset (new Amp (*this));
650 _click_gain->activate ();
652 setup_click_state (state_tree->root());
654 setup_click_state (0);
659 Session::setup_click_state (const XMLNode* node)
661 const XMLNode* child = 0;
663 if (node && (child = find_named_node (*node, "Click")) != 0) {
665 /* existing state for Click */
668 if (Stateful::loading_state_version < 3000) {
669 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
671 const XMLNodeList& children (child->children());
672 XMLNodeList::const_iterator i = children.begin();
673 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
675 if (i != children.end()) {
676 c = _click_gain->set_state (**i, Stateful::loading_state_version);
682 _clicking = Config->get_clicking ();
686 error << _("could not setup Click I/O") << endmsg;
693 /* default state for Click: dual-mono to first 2 physical outputs */
696 _engine.get_physical_outputs (DataType::AUDIO, outs);
698 for (uint32_t physport = 0; physport < 2; ++physport) {
699 if (outs.size() > physport) {
700 if (_click_io->add_port (outs[physport], this)) {
701 // relax, even though its an error
706 if (_click_io->n_ports () > ChanCount::ZERO) {
707 _clicking = Config->get_clicking ();
713 Session::setup_bundles ()
717 RCUWriter<BundleList> writer (_bundles);
718 boost::shared_ptr<BundleList> b = writer.get_copy ();
719 for (BundleList::iterator i = b->begin(); i != b->end();) {
720 if (boost::dynamic_pointer_cast<UserBundle>(*i)) {
728 vector<string> inputs[DataType::num_types];
729 vector<string> outputs[DataType::num_types];
730 for (uint32_t i = 0; i < DataType::num_types; ++i) {
731 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
732 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
735 /* Create a set of Bundle objects that map
736 to the physical I/O currently available. We create both
737 mono and stereo bundles, so that the common cases of mono
738 and stereo tracks get bundles to put in their mixer strip
739 in / out menus. There may be a nicer way of achieving that;
740 it doesn't really scale that well to higher channel counts
743 /* mono output bundles */
745 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
747 std::string pn = _engine.get_pretty_name_by_name (outputs[DataType::AUDIO][np]);
749 snprintf (buf, sizeof (buf), _("out %s"), pn.substr(0,12).c_str());
751 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
754 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
755 c->add_channel (_("mono"), DataType::AUDIO);
756 c->set_port (0, outputs[DataType::AUDIO][np]);
758 add_bundle (c, false);
761 /* stereo output bundles */
763 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
764 if (np + 1 < outputs[DataType::AUDIO].size()) {
766 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
767 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
768 c->add_channel (_("L"), DataType::AUDIO);
769 c->set_port (0, outputs[DataType::AUDIO][np]);
770 c->add_channel (_("R"), DataType::AUDIO);
771 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
773 add_bundle (c, false);
777 /* mono input bundles */
779 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
781 std::string pn = _engine.get_pretty_name_by_name (inputs[DataType::AUDIO][np]);
783 snprintf (buf, sizeof (buf), _("in %s"), pn.substr(0,12).c_str());
785 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
788 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
789 c->add_channel (_("mono"), DataType::AUDIO);
790 c->set_port (0, inputs[DataType::AUDIO][np]);
792 add_bundle (c, false);
795 /* stereo input bundles */
797 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
798 if (np + 1 < inputs[DataType::AUDIO].size()) {
800 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
802 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
803 c->add_channel (_("L"), DataType::AUDIO);
804 c->set_port (0, inputs[DataType::AUDIO][np]);
805 c->add_channel (_("R"), DataType::AUDIO);
806 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
808 add_bundle (c, false);
812 /* MIDI input bundles */
814 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
815 string n = inputs[DataType::MIDI][np];
816 std::string pn = _engine.get_pretty_name_by_name (n);
820 boost::erase_first (n, X_("alsa_pcm:"));
822 boost::shared_ptr<Bundle> c (new Bundle (n, false));
823 c->add_channel ("", DataType::MIDI);
824 c->set_port (0, inputs[DataType::MIDI][np]);
825 add_bundle (c, false);
828 /* MIDI output bundles */
830 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
831 string n = outputs[DataType::MIDI][np];
832 std::string pn = _engine.get_pretty_name_by_name (n);
836 boost::erase_first (n, X_("alsa_pcm:"));
838 boost::shared_ptr<Bundle> c (new Bundle (n, true));
839 c->add_channel ("", DataType::MIDI);
840 c->set_port (0, outputs[DataType::MIDI][np]);
841 add_bundle (c, false);
844 // we trust the backend to only calls us if there's a change
845 BundleAddedOrRemoved (); /* EMIT SIGNAL */
849 Session::auto_connect_master_bus ()
851 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
855 /* if requested auto-connect the outputs to the first N physical ports.
858 uint32_t limit = _master_out->n_outputs().n_total();
859 vector<string> outputs[DataType::num_types];
861 for (uint32_t i = 0; i < DataType::num_types; ++i) {
862 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
865 for (uint32_t n = 0; n < limit; ++n) {
866 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
868 if (outputs[p->type()].size() > n) {
869 connect_to = outputs[p->type()][n];
872 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
873 if (_master_out->output()->connect (p, connect_to, this)) {
874 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
883 Session::remove_monitor_section ()
889 /* force reversion to Solo-In-Place */
890 Config->set_solo_control_is_listen_control (false);
892 /* if we are auditioning, cancel it ... this is a workaround
893 to a problem (auditioning does not execute the process graph,
894 which is needed to remove routes when using >1 core for processing)
899 /* Hold process lock while doing this so that we don't hear bits and
900 * pieces of audio as we work on each route.
903 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
905 /* Connect tracks to monitor section. Note that in an
906 existing session, the internal sends will already exist, but we want the
907 routes to notice that they connect to the control out specifically.
911 boost::shared_ptr<RouteList> r = routes.reader ();
912 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
914 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
916 if ((*x)->is_monitor()) {
918 } else if ((*x)->is_master()) {
921 (*x)->remove_aux_or_listen (_monitor_out);
926 remove_route (_monitor_out);
927 auto_connect_master_bus ();
930 auditioner->connect ();
935 Session::add_monitor_section ()
939 if (_monitor_out || !_master_out) {
943 boost::shared_ptr<Route> r (new Route (*this, _("Monitor"), Route::MonitorOut, DataType::AUDIO));
949 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
950 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
953 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
954 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
955 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
959 add_routes (rl, false, false, false);
961 assert (_monitor_out);
963 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
964 are undefined, at best.
967 uint32_t limit = _monitor_out->n_inputs().n_audio();
971 /* connect the inputs to the master bus outputs. this
972 * represents a separate data feed from the internal sends from
973 * each route. as of jan 2011, it allows the monitor section to
974 * conditionally ignore either the internal sends or the normal
975 * input feed, but we should really find a better way to do
979 _master_out->output()->disconnect (this);
981 for (uint32_t n = 0; n < limit; ++n) {
982 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
983 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
986 string connect_to = o->name();
987 if (_monitor_out->input()->connect (p, connect_to, this)) {
988 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
996 /* if monitor section is not connected, connect it to physical outs
999 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
1001 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1003 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1006 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1008 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1009 Config->get_monitor_bus_preferred_bundle())
1015 /* Monitor bus is audio only */
1017 vector<string> outputs[DataType::num_types];
1019 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1020 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1023 uint32_t mod = outputs[DataType::AUDIO].size();
1024 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1028 for (uint32_t n = 0; n < limit; ++n) {
1030 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1032 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1033 connect_to = outputs[DataType::AUDIO][n % mod];
1036 if (!connect_to.empty()) {
1037 if (_monitor_out->output()->connect (p, connect_to, this)) {
1038 error << string_compose (
1039 _("cannot connect control output %1 to %2"),
1050 /* Hold process lock while doing this so that we don't hear bits and
1051 * pieces of audio as we work on each route.
1054 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1056 /* Connect tracks to monitor section. Note that in an
1057 existing session, the internal sends will already exist, but we want the
1058 routes to notice that they connect to the control out specifically.
1062 boost::shared_ptr<RouteList> rls = routes.reader ();
1064 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1066 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1068 if ((*x)->is_monitor()) {
1070 } else if ((*x)->is_master()) {
1073 (*x)->enable_monitor_send ();
1078 auditioner->connect ();
1083 Session::reset_monitor_section ()
1085 /* Process lock should be held by the caller.*/
1087 if (!_monitor_out) {
1091 uint32_t limit = _master_out->n_outputs().n_audio();
1093 /* connect the inputs to the master bus outputs. this
1094 * represents a separate data feed from the internal sends from
1095 * each route. as of jan 2011, it allows the monitor section to
1096 * conditionally ignore either the internal sends or the normal
1097 * input feed, but we should really find a better way to do
1101 _master_out->output()->disconnect (this);
1102 _monitor_out->output()->disconnect (this);
1104 _monitor_out->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1105 _monitor_out->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1107 for (uint32_t n = 0; n < limit; ++n) {
1108 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1109 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1112 string connect_to = o->name();
1113 if (_monitor_out->input()->connect (p, connect_to, this)) {
1114 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1121 /* connect monitor section to physical outs
1124 if (Config->get_auto_connect_standard_busses()) {
1126 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1128 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1131 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1133 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1134 Config->get_monitor_bus_preferred_bundle())
1140 /* Monitor bus is audio only */
1142 vector<string> outputs[DataType::num_types];
1144 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1145 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1148 uint32_t mod = outputs[DataType::AUDIO].size();
1149 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1153 for (uint32_t n = 0; n < limit; ++n) {
1155 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1157 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1158 connect_to = outputs[DataType::AUDIO][n % mod];
1161 if (!connect_to.empty()) {
1162 if (_monitor_out->output()->connect (p, connect_to, this)) {
1163 error << string_compose (
1164 _("cannot connect control output %1 to %2"),
1175 /* Connect tracks to monitor section. Note that in an
1176 existing session, the internal sends will already exist, but we want the
1177 routes to notice that they connect to the control out specifically.
1181 boost::shared_ptr<RouteList> rls = routes.reader ();
1183 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1185 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1187 if ((*x)->is_monitor()) {
1189 } else if ((*x)->is_master()) {
1192 (*x)->enable_monitor_send ();
1198 Session::hookup_io ()
1200 /* stop graph reordering notifications from
1201 causing resorts, etc.
1204 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
1208 /* we delay creating the auditioner till now because
1209 it makes its own connections to ports.
1213 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
1215 throw failed_constructor ();
1217 a->use_new_diskstream ();
1221 catch (failed_constructor& err) {
1222 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
1226 /* load bundles, which we may have postponed earlier on */
1227 if (_bundle_xml_node) {
1228 load_bundles (*_bundle_xml_node);
1229 delete _bundle_xml_node;
1232 /* Tell all IO objects to connect themselves together */
1234 IO::enable_connecting ();
1236 /* Now tell all "floating" ports to connect to whatever
1237 they should be connected to.
1240 AudioEngine::instance()->reconnect_ports ();
1242 /* Anyone who cares about input state, wake up and do something */
1244 IOConnectionsComplete (); /* EMIT SIGNAL */
1246 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
1248 /* now handle the whole enchilada as if it was one
1249 graph reorder event.
1254 /* update the full solo state, which can't be
1255 correctly determined on a per-route basis, but
1256 needs the global overview that only the session
1260 update_route_solo_state ();
1264 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
1266 boost::shared_ptr<Track> track = wp.lock ();
1271 boost::shared_ptr<Playlist> playlist;
1273 if ((playlist = track->playlist()) != 0) {
1274 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
1275 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
1276 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
1281 Session::record_enabling_legal () const
1283 /* this used to be in here, but survey says.... we don't need to restrict it */
1284 // if (record_status() == Recording) {
1288 if (Config->get_all_safe()) {
1295 Session::set_track_monitor_input_status (bool yn)
1297 boost::shared_ptr<RouteList> rl = routes.reader ();
1298 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1299 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1300 if (tr && tr->record_enabled ()) {
1301 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1302 tr->request_input_monitoring (yn);
1308 Session::auto_punch_start_changed (Location* location)
1310 replace_event (SessionEvent::PunchIn, location->start());
1312 if (get_record_enabled() && config.get_punch_in()) {
1313 /* capture start has been changed, so save new pending state */
1314 save_state ("", true);
1319 Session::auto_punch_end_changed (Location* location)
1321 framepos_t when_to_stop = location->end();
1322 // when_to_stop += _worst_output_latency + _worst_input_latency;
1323 replace_event (SessionEvent::PunchOut, when_to_stop);
1327 Session::auto_punch_changed (Location* location)
1329 framepos_t when_to_stop = location->end();
1331 replace_event (SessionEvent::PunchIn, location->start());
1332 //when_to_stop += _worst_output_latency + _worst_input_latency;
1333 replace_event (SessionEvent::PunchOut, when_to_stop);
1336 /** @param loc A loop location.
1337 * @param pos Filled in with the start time of the required fade-out (in session frames).
1338 * @param length Filled in with the length of the required fade-out.
1341 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
1343 pos = max (loc->start(), loc->end() - 64);
1344 length = loc->end() - pos;
1348 Session::auto_loop_changed (Location* location)
1350 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1353 auto_loop_declick_range (location, dcp, dcl);
1355 if (transport_rolling() && play_loop) {
1357 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1359 // if (_transport_frame > location->end()) {
1361 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1362 // relocate to beginning of loop
1363 clear_events (SessionEvent::LocateRoll);
1365 request_locate (location->start(), true);
1368 else if (Config->get_seamless_loop() && !loop_changing) {
1370 // schedule a locate-roll to refill the diskstreams at the
1371 // previous loop end
1372 loop_changing = true;
1374 if (location->end() > last_loopend) {
1375 clear_events (SessionEvent::LocateRoll);
1376 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1382 clear_events (SessionEvent::AutoLoopDeclick);
1383 clear_events (SessionEvent::AutoLoop);
1386 last_loopend = location->end();
1391 Session::set_auto_punch_location (Location* location)
1395 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1396 punch_connections.drop_connections();
1397 existing->set_auto_punch (false, this);
1398 remove_event (existing->start(), SessionEvent::PunchIn);
1399 clear_events (SessionEvent::PunchOut);
1400 auto_punch_location_changed (0);
1405 if (location == 0) {
1409 if (location->end() <= location->start()) {
1410 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1414 punch_connections.drop_connections ();
1416 location->StartChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, location));
1417 location->EndChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, location));
1418 location->Changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, location));
1420 location->set_auto_punch (true, this);
1422 auto_punch_changed (location);
1424 auto_punch_location_changed (location);
1428 Session::set_session_extents (framepos_t start, framepos_t end)
1431 if ((existing = _locations->session_range_location()) == 0) {
1432 //if there is no existing session, we need to make a new session location (should never happen)
1433 existing = new Location (*this, 0, 0, _("session"), Location::IsSessionRange);
1437 error << _("Session: you can't use that location for session start/end)") << endmsg;
1441 existing->set( start, end );
1447 Session::set_auto_loop_location (Location* location)
1451 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1452 loop_connections.drop_connections ();
1453 existing->set_auto_loop (false, this);
1454 remove_event (existing->end(), SessionEvent::AutoLoop);
1457 auto_loop_declick_range (existing, dcp, dcl);
1458 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1459 auto_loop_location_changed (0);
1464 if (location == 0) {
1468 if (location->end() <= location->start()) {
1469 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1473 last_loopend = location->end();
1475 loop_connections.drop_connections ();
1477 location->StartChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1478 location->EndChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1479 location->Changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1481 location->set_auto_loop (true, this);
1483 /* take care of our stuff first */
1485 auto_loop_changed (location);
1487 /* now tell everyone else */
1489 auto_loop_location_changed (location);
1493 Session::update_loop (Location*)
1499 Session::update_marks (Location*)
1505 Session::update_skips (Location* loc, bool consolidate)
1507 if (_ignore_skips_updates) {
1511 Locations::LocationList skips;
1514 PBD::Unwinder<bool> uw (_ignore_skips_updates, true);
1515 consolidate_skips (loc);
1518 sync_locations_to_skips ();
1524 Session::consolidate_skips (Location* loc)
1526 Locations::LocationList all_locations = _locations->list ();
1528 for (Locations::LocationList::iterator l = all_locations.begin(); l != all_locations.end(); ) {
1530 if (!(*l)->is_skip ()) {
1535 /* don't test against self */
1542 switch (Evoral::coverage ((*l)->start(), (*l)->end(), loc->start(), loc->end())) {
1543 case Evoral::OverlapInternal:
1544 case Evoral::OverlapExternal:
1545 case Evoral::OverlapStart:
1546 case Evoral::OverlapEnd:
1547 /* adjust new location to cover existing one */
1548 loc->set_start (min (loc->start(), (*l)->start()));
1549 loc->set_end (max (loc->end(), (*l)->end()));
1550 /* we don't need this one any more */
1551 _locations->remove (*l);
1552 /* the location has been deleted, so remove reference to it in our local list */
1553 l = all_locations.erase (l);
1556 case Evoral::OverlapNone:
1564 Session::sync_locations_to_skips ()
1566 /* This happens asynchronously (in the audioengine thread). After the clear is done, we will call
1567 * Session::_sync_locations_to_skips() from the audioengine thread.
1569 clear_events (SessionEvent::Skip, boost::bind (&Session::_sync_locations_to_skips, this));
1573 Session::_sync_locations_to_skips ()
1575 /* called as a callback after existing Skip events have been cleared from a realtime audioengine thread */
1577 Locations::LocationList const & locs (_locations->list());
1579 for (Locations::LocationList::const_iterator i = locs.begin(); i != locs.end(); ++i) {
1581 Location* location = *i;
1583 if (location->is_skip() && location->is_skipping()) {
1584 SessionEvent* ev = new SessionEvent (SessionEvent::Skip, SessionEvent::Add, location->start(), location->end(), 1.0);
1592 Session::location_added (Location *location)
1594 if (location->is_auto_punch()) {
1595 set_auto_punch_location (location);
1598 if (location->is_auto_loop()) {
1599 set_auto_loop_location (location);
1602 if (location->is_session_range()) {
1603 /* no need for any signal handling or event setting with the session range,
1604 because we keep a direct reference to it and use its start/end directly.
1606 _session_range_location = location;
1609 if (location->is_mark()) {
1610 /* listen for per-location signals that require us to do any * global updates for marks */
1612 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1613 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1614 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1615 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1618 if (location->is_skip()) {
1619 /* listen for per-location signals that require us to update skip-locate events */
1621 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1622 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1623 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1624 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, false));
1626 update_skips (location, true);
1633 Session::location_removed (Location *location)
1635 if (location->is_auto_loop()) {
1636 set_auto_loop_location (0);
1637 set_track_loop (false);
1640 if (location->is_auto_punch()) {
1641 set_auto_punch_location (0);
1644 if (location->is_session_range()) {
1645 /* this is never supposed to happen */
1646 error << _("programming error: session range removed!") << endl;
1649 if (location->is_skip()) {
1651 update_skips (location, false);
1658 Session::locations_changed ()
1660 _locations->apply (*this, &Session::_locations_changed);
1664 Session::_locations_changed (const Locations::LocationList& locations)
1666 /* There was some mass-change in the Locations object.
1668 We might be re-adding a location here but it doesn't actually matter
1669 for all the locations that the Session takes an interest in.
1672 for (Locations::LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
1673 location_added (*i);
1678 Session::enable_record ()
1680 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1681 /* no recording at anything except normal speed */
1686 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1688 if (rs == Recording) {
1692 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1694 _last_record_location = _transport_frame;
1695 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1697 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1698 set_track_monitor_input_status (true);
1701 RecordStateChanged ();
1708 Session::disable_record (bool rt_context, bool force)
1712 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1714 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1715 g_atomic_int_set (&_record_status, Disabled);
1716 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1718 if (rs == Recording) {
1719 g_atomic_int_set (&_record_status, Enabled);
1723 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1724 set_track_monitor_input_status (false);
1727 RecordStateChanged (); /* emit signal */
1730 remove_pending_capture_state ();
1736 Session::step_back_from_record ()
1738 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1740 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1741 set_track_monitor_input_status (false);
1744 RecordStateChanged (); /* emit signal */
1749 Session::maybe_enable_record ()
1751 if (_step_editors > 0) {
1755 g_atomic_int_set (&_record_status, Enabled);
1757 /* This function is currently called from somewhere other than an RT thread.
1758 This save_state() call therefore doesn't impact anything. Doing it here
1759 means that we save pending state of which sources the next record will use,
1760 which gives us some chance of recovering from a crash during the record.
1763 save_state ("", true);
1765 if (_transport_speed) {
1766 if (!config.get_punch_in()) {
1770 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1771 RecordStateChanged (); /* EMIT SIGNAL */
1778 Session::audible_frame () const
1784 offset = worst_playback_latency ();
1786 if (synced_to_engine()) {
1787 /* Note: this is basically just sync-to-JACK */
1788 tf = _engine.transport_frame();
1790 tf = _transport_frame;
1795 if (!non_realtime_work_pending()) {
1799 /* Check to see if we have passed the first guaranteed
1800 audible frame past our last start position. if not,
1801 return that last start point because in terms
1802 of audible frames, we have not moved yet.
1804 `Start position' in this context means the time we last
1805 either started, located, or changed transport direction.
1808 if (_transport_speed > 0.0f) {
1810 if (!play_loop || !have_looped) {
1811 if (tf < _last_roll_or_reversal_location + offset) {
1812 return _last_roll_or_reversal_location;
1820 } else if (_transport_speed < 0.0f) {
1822 /* XXX wot? no backward looping? */
1824 if (tf > _last_roll_or_reversal_location - offset) {
1825 return _last_roll_or_reversal_location;
1837 Session::set_frame_rate (framecnt_t frames_per_second)
1839 /** \fn void Session::set_frame_size(framecnt_t)
1840 the AudioEngine object that calls this guarantees
1841 that it will not be called while we are also in
1842 ::process(). Its fine to do things that block
1846 _base_frame_rate = frames_per_second;
1847 _nominal_frame_rate = frames_per_second;
1853 // XXX we need some equivalent to this, somehow
1854 // SndFileSource::setup_standard_crossfades (frames_per_second);
1858 /* XXX need to reset/reinstantiate all LADSPA plugins */
1862 Session::set_block_size (pframes_t nframes)
1864 /* the AudioEngine guarantees
1865 that it will not be called while we are also in
1866 ::process(). It is therefore fine to do things that block
1871 current_block_size = nframes;
1875 boost::shared_ptr<RouteList> r = routes.reader ();
1877 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1878 (*i)->set_block_size (nframes);
1881 boost::shared_ptr<RouteList> rl = routes.reader ();
1882 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1883 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1885 tr->set_block_size (nframes);
1889 set_worst_io_latencies ();
1895 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1897 boost::shared_ptr<Route> r2;
1899 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1900 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1904 /* make a copy of the existing list of routes that feed r1 */
1906 Route::FedBy existing (r1->fed_by());
1908 /* for each route that feeds r1, recurse, marking it as feeding
1912 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1913 if (!(r2 = i->r.lock ())) {
1914 /* (*i) went away, ignore it */
1918 /* r2 is a route that feeds r1 which somehow feeds base. mark
1919 base as being fed by r2
1922 rbase->add_fed_by (r2, i->sends_only);
1926 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1930 if (r1->feeds (r2) && r2->feeds (r1)) {
1934 /* now recurse, so that we can mark base as being fed by
1935 all routes that feed r2
1938 trace_terminal (r2, rbase);
1945 Session::resort_routes ()
1947 /* don't do anything here with signals emitted
1948 by Routes during initial setup or while we
1949 are being destroyed.
1952 if (_state_of_the_state & (InitialConnecting | Deletion)) {
1957 RCUWriter<RouteList> writer (routes);
1958 boost::shared_ptr<RouteList> r = writer.get_copy ();
1959 resort_routes_using (r);
1960 /* writer goes out of scope and forces update */
1964 boost::shared_ptr<RouteList> rl = routes.reader ();
1965 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1966 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1968 const Route::FedBy& fb ((*i)->fed_by());
1970 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1971 boost::shared_ptr<Route> sf = f->r.lock();
1973 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1981 /** This is called whenever we need to rebuild the graph of how we will process
1983 * @param r List of routes, in any order.
1987 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1989 /* We are going to build a directed graph of our routes;
1990 this is where the edges of that graph are put.
1995 /* Go through all routes doing two things:
1997 * 1. Collect the edges of the route graph. Each of these edges
1998 * is a pair of routes, one of which directly feeds the other
1999 * either by a JACK connection or by an internal send.
2001 * 2. Begin the process of making routes aware of which other
2002 * routes directly or indirectly feed them. This information
2003 * is used by the solo code.
2006 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2008 /* Clear out the route's list of direct or indirect feeds */
2009 (*i)->clear_fed_by ();
2011 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
2013 bool via_sends_only;
2015 /* See if this *j feeds *i according to the current state of the JACK
2016 connections and internal sends.
2018 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
2019 /* add the edge to the graph (part #1) */
2020 edges.add (*j, *i, via_sends_only);
2021 /* tell the route (for part #2) */
2022 (*i)->add_fed_by (*j, via_sends_only);
2027 /* Attempt a topological sort of the route graph */
2028 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
2030 if (sorted_routes) {
2031 /* We got a satisfactory topological sort, so there is no feedback;
2034 Note: the process graph rechain does not require a
2035 topologically-sorted list, but hey ho.
2037 if (_process_graph) {
2038 _process_graph->rechain (sorted_routes, edges);
2041 _current_route_graph = edges;
2043 /* Complete the building of the routes' lists of what directly
2044 or indirectly feeds them.
2046 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2047 trace_terminal (*i, *i);
2050 *r = *sorted_routes;
2053 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
2054 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2055 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
2056 (*i)->name(), (*i)->order_key ()));
2060 SuccessfulGraphSort (); /* EMIT SIGNAL */
2063 /* The topological sort failed, so we have a problem. Tell everyone
2064 and stick to the old graph; this will continue to be processed, so
2065 until the feedback is fixed, what is played back will not quite
2066 reflect what is actually connected. Note also that we do not
2067 do trace_terminal here, as it would fail due to an endless recursion,
2068 so the solo code will think that everything is still connected
2072 FeedbackDetected (); /* EMIT SIGNAL */
2077 /** Find a route name starting with \a base, maybe followed by the
2078 * lowest \a id. \a id will always be added if \a definitely_add_number
2079 * is true on entry; otherwise it will only be added if required
2080 * to make the name unique.
2082 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
2083 * The available route name with the lowest ID will be used, and \a id
2084 * will be set to the ID.
2086 * \return false if a route name could not be found, and \a track_name
2087 * and \a id do not reflect a free route name.
2090 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
2092 if (!definitely_add_number && route_by_name (base) == 0) {
2093 /* juse use the base */
2094 snprintf (name, name_len, "%s", base.c_str());
2099 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
2101 if (route_by_name (name) == 0) {
2107 } while (id < (UINT_MAX-1));
2112 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
2114 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
2116 in = ChanCount::ZERO;
2117 out = ChanCount::ZERO;
2119 boost::shared_ptr<RouteList> r = routes.reader ();
2121 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2122 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2123 if (tr && !tr->is_auditioner()) {
2124 in += tr->n_inputs();
2125 out += tr->n_outputs();
2130 /** Caller must not hold process lock
2131 * @param name_template string to use for the start of the name, or "" to use "MIDI".
2132 * @param instrument plugin info for the instrument to insert pre-fader, if any
2134 list<boost::shared_ptr<MidiTrack> >
2135 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
2136 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
2138 char track_name[32];
2139 uint32_t track_id = 0;
2141 RouteList new_routes;
2142 list<boost::shared_ptr<MidiTrack> > ret;
2144 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
2147 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
2148 error << "cannot find name for new midi track" << endmsg;
2152 boost::shared_ptr<MidiTrack> track;
2155 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
2157 if (track->init ()) {
2161 track->use_new_diskstream();
2163 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2164 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2167 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2168 if (track->input()->ensure_io (input, false, this)) {
2169 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
2173 if (track->output()->ensure_io (output, false, this)) {
2174 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
2179 track->non_realtime_input_change();
2182 route_group->add (track);
2185 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2187 if (Config->get_remote_model() == UserOrdered) {
2188 track->set_remote_control_id (next_control_id());
2191 new_routes.push_back (track);
2192 ret.push_back (track);
2195 catch (failed_constructor &err) {
2196 error << _("Session: could not create new midi track.") << endmsg;
2200 catch (AudioEngine::PortRegistrationFailure& pfe) {
2202 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;
2210 if (!new_routes.empty()) {
2211 StateProtector sp (this);
2212 if (Profile->get_trx()) {
2213 add_routes (new_routes, false, false, false);
2215 add_routes (new_routes, true, true, false);
2219 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
2220 PluginPtr plugin = instrument->load (*this);
2221 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2222 (*r)->add_processor (p, PreFader);
2232 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2234 boost::shared_ptr<Route> midi_track (wmt.lock());
2240 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2242 if (change.after.n_audio() <= change.before.n_audio()) {
2246 /* new audio ports: make sure the audio goes somewhere useful,
2247 unless the user has no-auto-connect selected.
2249 The existing ChanCounts don't matter for this call as they are only
2250 to do with matching input and output indices, and we are only changing
2256 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
2260 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
2261 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
2262 * @param output_start As \a input_start, but for outputs.
2265 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
2266 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
2268 if (!IO::connecting_legal) {
2272 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2278 /* If both inputs and outputs are auto-connected to physical ports,
2279 use the max of input and output offsets to ensure auto-connected
2280 port numbers always match up (e.g. the first audio input and the
2281 first audio output of the route will have the same physical
2282 port number). Otherwise just use the lowest input or output
2286 DEBUG_TRACE (DEBUG::Graph,
2287 string_compose("Auto-connect: existing in = %1 out = %2\n",
2288 existing_inputs, existing_outputs));
2290 const bool in_out_physical =
2291 (Config->get_input_auto_connect() & AutoConnectPhysical)
2292 && (Config->get_output_auto_connect() & AutoConnectPhysical)
2295 const ChanCount in_offset = in_out_physical
2296 ? ChanCount::max(existing_inputs, existing_outputs)
2299 const ChanCount out_offset = in_out_physical
2300 ? ChanCount::max(existing_inputs, existing_outputs)
2303 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2304 vector<string> physinputs;
2305 vector<string> physoutputs;
2307 _engine.get_physical_outputs (*t, physoutputs);
2308 _engine.get_physical_inputs (*t, physinputs);
2310 if (!physinputs.empty() && connect_inputs) {
2311 uint32_t nphysical_in = physinputs.size();
2313 DEBUG_TRACE (DEBUG::Graph,
2314 string_compose("There are %1 physical inputs of type %2\n",
2317 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
2320 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
2321 DEBUG_TRACE (DEBUG::Graph,
2322 string_compose("Get index %1 + %2 % %3 = %4\n",
2323 in_offset.get(*t), i, nphysical_in,
2324 (in_offset.get(*t) + i) % nphysical_in));
2325 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
2328 DEBUG_TRACE (DEBUG::Graph,
2329 string_compose("Connect route %1 IN to %2\n",
2330 route->name(), port));
2332 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
2336 ChanCount one_added (*t, 1);
2337 existing_inputs += one_added;
2341 if (!physoutputs.empty()) {
2342 uint32_t nphysical_out = physoutputs.size();
2343 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
2346 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
2347 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
2348 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
2349 /* master bus is audio only */
2350 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
2351 port = _master_out->input()->ports().port(*t,
2352 i % _master_out->input()->n_ports().get(*t))->name();
2356 DEBUG_TRACE (DEBUG::Graph,
2357 string_compose("Connect route %1 OUT to %2\n",
2358 route->name(), port));
2360 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
2364 ChanCount one_added (*t, 1);
2365 existing_outputs += one_added;
2372 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2374 /* TRX does stuff here, ardour does not (but probably should). This is called after an engine reset (in particular).
2379 Session::reconnect_midi_scene_ports(bool inputs)
2382 scene_in()->disconnect_all ();
2384 std::vector<EngineStateController::MidiPortState> midi_port_states;
2385 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2387 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2389 for (; state_iter != midi_port_states.end(); ++state_iter) {
2390 if (state_iter->active && state_iter->available && state_iter->connected) {
2391 scene_in()->connect (state_iter->name);
2396 scene_out()->disconnect_all ();
2398 std::vector<EngineStateController::MidiPortState> midi_port_states;
2399 EngineStateController::instance()->get_physical_midi_output_states (midi_port_states);
2401 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2403 for (; state_iter != midi_port_states.end(); ++state_iter) {
2404 if (state_iter->active && state_iter->available && state_iter->connected) {
2405 scene_out()->connect (state_iter->name);
2413 /** Caller must not hold process lock
2414 * @param name_template string to use for the start of the name, or "" to use "Audio".
2416 list< boost::shared_ptr<AudioTrack> >
2417 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
2418 uint32_t how_many, string name_template)
2420 char track_name[32];
2421 uint32_t track_id = 0;
2423 RouteList new_routes;
2424 list<boost::shared_ptr<AudioTrack> > ret;
2426 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
2429 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
2430 error << "cannot find name for new audio track" << endmsg;
2434 boost::shared_ptr<AudioTrack> track;
2437 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
2439 if (track->init ()) {
2443 track->use_new_diskstream();
2445 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2446 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2449 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2451 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2452 error << string_compose (
2453 _("cannot configure %1 in/%2 out configuration for new audio track"),
2454 input_channels, output_channels)
2459 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2460 error << string_compose (
2461 _("cannot configure %1 in/%2 out configuration for new audio track"),
2462 input_channels, output_channels)
2469 route_group->add (track);
2472 track->non_realtime_input_change();
2474 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2475 if (Config->get_remote_model() == UserOrdered) {
2476 track->set_remote_control_id (next_control_id());
2479 new_routes.push_back (track);
2480 ret.push_back (track);
2483 catch (failed_constructor &err) {
2484 error << _("Session: could not create new audio track.") << endmsg;
2488 catch (AudioEngine::PortRegistrationFailure& pfe) {
2490 error << pfe.what() << endmsg;
2498 if (!new_routes.empty()) {
2499 StateProtector sp (this);
2500 if (Profile->get_trx()) {
2501 add_routes (new_routes, false, false, false);
2503 add_routes (new_routes, true, true, false);
2510 /** Caller must not hold process lock.
2511 * @param name_template string to use for the start of the name, or "" to use "Bus".
2514 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
2517 uint32_t bus_id = 0;
2521 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
2524 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
2525 error << "cannot find name for new audio bus" << endmsg;
2530 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
2536 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2537 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
2540 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2542 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2543 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2544 input_channels, output_channels)
2550 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2551 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2552 input_channels, output_channels)
2559 route_group->add (bus);
2561 if (Config->get_remote_model() == UserOrdered) {
2562 bus->set_remote_control_id (next_control_id());
2565 bus->add_internal_return ();
2567 ret.push_back (bus);
2573 catch (failed_constructor &err) {
2574 error << _("Session: could not create new audio route.") << endmsg;
2578 catch (AudioEngine::PortRegistrationFailure& pfe) {
2579 error << pfe.what() << endmsg;
2589 StateProtector sp (this);
2590 if (Profile->get_trx()) {
2591 add_routes (ret, false, false, false);
2593 add_routes (ret, false, true, true); // autoconnect // outputs only
2602 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base)
2605 uint32_t control_id;
2607 uint32_t number = 0;
2608 const uint32_t being_added = how_many;
2610 if (!tree.read (template_path.c_str())) {
2614 XMLNode* node = tree.root();
2616 IO::disable_connecting ();
2618 control_id = next_control_id ();
2622 XMLNode node_copy (*node);
2624 /* Remove IDs of everything so that new ones are used */
2625 node_copy.remove_property_recursively (X_("id"));
2630 if (!name_base.empty()) {
2632 /* if we're adding more than one routes, force
2633 * all the names of the new routes to be
2634 * numbered, via the final parameter.
2637 if (!find_route_name (name_base.c_str(), ++number, name, sizeof(name), (being_added > 1))) {
2638 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2644 string const route_name = node_copy.property(X_("name"))->value ();
2646 /* generate a new name by adding a number to the end of the template name */
2647 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2648 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2649 abort(); /*NOTREACHED*/
2653 /* set this name in the XML description that we are about to use */
2654 Route::set_name_in_state (node_copy, name);
2656 /* trim bitslots from listen sends so that new ones are used */
2657 XMLNodeList children = node_copy.children ();
2658 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2659 if ((*i)->name() == X_("Processor")) {
2660 XMLProperty* role = (*i)->property (X_("role"));
2661 if (role && role->value() == X_("Listen")) {
2662 (*i)->remove_property (X_("bitslot"));
2667 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2670 error << _("Session: cannot create track/bus from template description") << endmsg;
2674 if (boost::dynamic_pointer_cast<Track>(route)) {
2675 /* force input/output change signals so that the new diskstream
2676 picks up the configuration of the route. During session
2677 loading this normally happens in a different way.
2680 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2682 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2683 change.after = route->input()->n_ports();
2684 route->input()->changed (change, this);
2685 change.after = route->output()->n_ports();
2686 route->output()->changed (change, this);
2689 route->set_remote_control_id (control_id);
2692 ret.push_back (route);
2695 catch (failed_constructor &err) {
2696 error << _("Session: could not create new route from template") << endmsg;
2700 catch (AudioEngine::PortRegistrationFailure& pfe) {
2701 error << pfe.what() << endmsg;
2710 StateProtector sp (this);
2711 if (Profile->get_trx()) {
2712 add_routes (ret, false, false, false);
2714 add_routes (ret, true, true, false);
2716 IO::enable_connecting ();
2723 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
2726 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
2727 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
2730 error << _("Adding new tracks/busses failed") << endmsg;
2735 update_latency (true);
2736 update_latency (false);
2741 save_state (_current_snapshot_name);
2744 reassign_track_numbers();
2746 update_route_record_state ();
2748 RouteAdded (new_routes); /* EMIT SIGNAL */
2752 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
2754 ChanCount existing_inputs;
2755 ChanCount existing_outputs;
2756 uint32_t order = next_control_id();
2758 if (_order_hint > -1) {
2759 order = _order_hint;
2763 count_existing_track_channels (existing_inputs, existing_outputs);
2766 RCUWriter<RouteList> writer (routes);
2767 boost::shared_ptr<RouteList> r = writer.get_copy ();
2768 r->insert (r->end(), new_routes.begin(), new_routes.end());
2770 /* if there is no control out and we're not in the middle of loading,
2771 resort the graph here. if there is a control out, we will resort
2772 toward the end of this method. if we are in the middle of loading,
2773 we will resort when done.
2776 if (!_monitor_out && IO::connecting_legal) {
2777 resort_routes_using (r);
2781 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2783 boost::weak_ptr<Route> wpr (*x);
2784 boost::shared_ptr<Route> r (*x);
2786 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2787 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2788 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2789 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2790 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2791 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2793 if (r->is_master()) {
2797 if (r->is_monitor()) {
2801 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2803 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2804 track_playlist_changed (boost::weak_ptr<Track> (tr));
2805 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
2807 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2809 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2810 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2815 if (input_auto_connect || output_auto_connect) {
2816 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
2819 /* order keys are a GUI responsibility but we need to set up
2820 reasonable defaults because they also affect the remote control
2821 ID in most situations.
2824 if (!r->has_order_key ()) {
2825 if (r->is_auditioner()) {
2826 /* use an arbitrarily high value */
2827 r->set_order_key (UINT_MAX);
2829 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
2830 r->set_order_key (order);
2838 if (_monitor_out && IO::connecting_legal) {
2839 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
2841 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2842 if ((*x)->is_monitor()) {
2844 } else if ((*x)->is_master()) {
2847 (*x)->enable_monitor_send ();
2854 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2856 boost::shared_ptr<RouteList> r = routes.reader ();
2857 boost::shared_ptr<Send> s;
2859 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2860 if ((s = (*i)->internal_send_for (dest)) != 0) {
2861 s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO);
2867 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2869 boost::shared_ptr<RouteList> r = routes.reader ();
2870 boost::shared_ptr<Send> s;
2872 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2873 if ((s = (*i)->internal_send_for (dest)) != 0) {
2874 s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY);
2880 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2882 boost::shared_ptr<RouteList> r = routes.reader ();
2883 boost::shared_ptr<Send> s;
2885 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2886 if ((s = (*i)->internal_send_for (dest)) != 0) {
2887 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2892 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2894 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2896 boost::shared_ptr<RouteList> r = routes.reader ();
2897 boost::shared_ptr<RouteList> t (new RouteList);
2899 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2900 /* no MIDI sends because there are no MIDI busses yet */
2901 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2906 add_internal_sends (dest, p, t);
2910 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2912 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2913 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
2918 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
2920 add_internal_send (dest, sender->before_processor_for_index (index), sender);
2924 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
2926 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
2930 if (!dest->internal_return()) {
2931 dest->add_internal_return ();
2934 sender->add_aux_send (dest, before);
2940 Session::remove_route (boost::shared_ptr<Route> route)
2942 if (route == _master_out) {
2946 route->set_solo (false, this);
2949 RCUWriter<RouteList> writer (routes);
2950 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2954 /* deleting the master out seems like a dumb
2955 idea, but its more of a UI policy issue
2959 if (route == _master_out) {
2960 _master_out = boost::shared_ptr<Route> ();
2963 if (route == _monitor_out) {
2964 _monitor_out.reset ();
2967 /* writer goes out of scope, forces route list update */
2970 update_route_solo_state ();
2972 // We need to disconnect the route's inputs and outputs
2974 route->input()->disconnect (0);
2975 route->output()->disconnect (0);
2977 /* if the route had internal sends sending to it, remove them */
2978 if (route->internal_return()) {
2980 boost::shared_ptr<RouteList> r = routes.reader ();
2981 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2982 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2984 (*i)->remove_processor (s);
2989 /* if the monitoring section had a pointer to this route, remove it */
2990 if (_monitor_out && !route->is_master() && !route->is_monitor()) {
2991 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2992 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
2993 route->remove_aux_or_listen (_monitor_out);
2996 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2997 if (mt && mt->step_editing()) {
2998 if (_step_editors > 0) {
3003 update_latency_compensation ();
3006 /* Re-sort routes to remove the graph's current references to the one that is
3007 * going away, then flush old references out of the graph.
3011 if (_process_graph) {
3012 _process_graph->clear_other_chain ();
3015 /* get rid of it from the dead wood collection in the route list manager */
3017 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
3021 /* try to cause everyone to drop their references */
3023 route->drop_references ();
3025 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
3027 /* save the new state of the world */
3029 if (save_state (_current_snapshot_name)) {
3030 save_history (_current_snapshot_name);
3032 reassign_track_numbers();
3034 update_route_record_state ();
3038 Session::route_mute_changed (void* /*src*/)
3044 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3046 boost::shared_ptr<Route> route = wpr.lock();
3048 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
3052 if (route->listening_via_monitor ()) {
3054 if (Config->get_exclusive_solo()) {
3055 /* new listen: disable all other listen */
3056 boost::shared_ptr<RouteList> r = routes.reader ();
3057 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3058 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3061 (*i)->set_listen (false, this);
3067 } else if (_listen_cnt > 0) {
3072 update_route_solo_state ();
3075 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3077 boost::shared_ptr<Route> route = wpr.lock ();
3080 /* should not happen */
3081 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
3085 bool send_changed = false;
3087 if (route->solo_isolated()) {
3088 if (_solo_isolated_cnt == 0) {
3089 send_changed = true;
3091 _solo_isolated_cnt++;
3092 } else if (_solo_isolated_cnt > 0) {
3093 _solo_isolated_cnt--;
3094 if (_solo_isolated_cnt == 0) {
3095 send_changed = true;
3100 IsolatedChanged (); /* EMIT SIGNAL */
3105 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
3107 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
3109 if (!self_solo_change) {
3110 // session doesn't care about changes to soloed-by-others
3114 if (solo_update_disabled) {
3116 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
3120 boost::shared_ptr<Route> route = wpr.lock ();
3123 boost::shared_ptr<RouteList> r = routes.reader ();
3126 if (route->self_soloed()) {
3132 RouteGroup* rg = route->route_group ();
3133 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
3135 if (delta == 1 && Config->get_exclusive_solo()) {
3137 /* new solo: disable all other solos, but not the group if its solo-enabled */
3139 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3140 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3141 (leave_group_alone && ((*i)->route_group() == rg))) {
3144 (*i)->set_solo (false, this);
3148 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3150 solo_update_disabled = true;
3152 RouteList uninvolved;
3154 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
3156 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3157 bool via_sends_only;
3158 bool in_signal_flow;
3160 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3161 (leave_group_alone && ((*i)->route_group() == rg))) {
3165 in_signal_flow = false;
3167 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3169 if ((*i)->feeds (route, &via_sends_only)) {
3170 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3171 if (!via_sends_only) {
3172 if (!route->soloed_by_others_upstream()) {
3173 (*i)->mod_solo_by_others_downstream (delta);
3176 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3178 in_signal_flow = true;
3180 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3183 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3185 if (route->feeds (*i, &via_sends_only)) {
3186 /* propagate solo upstream only if routing other than
3187 sends is involved, but do consider the other route
3188 (*i) to be part of the signal flow even if only
3191 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3195 route->soloed_by_others_downstream(),
3196 route->soloed_by_others_upstream()));
3197 if (!via_sends_only) {
3198 if (!route->soloed_by_others_downstream()) {
3199 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3200 (*i)->mod_solo_by_others_upstream (delta);
3202 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
3205 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3207 in_signal_flow = true;
3209 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3212 if (!in_signal_flow) {
3213 uninvolved.push_back (*i);
3217 solo_update_disabled = false;
3218 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3220 update_route_solo_state (r);
3222 /* now notify that the mute state of the routes not involved in the signal
3223 pathway of the just-solo-changed route may have altered.
3226 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3227 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
3228 (*i)->act_on_mute ();
3229 (*i)->mute_changed (this);
3232 SoloChanged (); /* EMIT SIGNAL */
3237 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
3239 /* now figure out if anything that matters is soloed (or is "listening")*/
3241 bool something_soloed = false;
3242 uint32_t listeners = 0;
3243 uint32_t isolated = 0;
3246 r = routes.reader();
3249 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3250 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
3251 something_soloed = true;
3254 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
3255 if (Config->get_solo_control_is_listen_control()) {
3258 (*i)->set_listen (false, this);
3262 if ((*i)->solo_isolated()) {
3267 if (something_soloed != _non_soloed_outs_muted) {
3268 _non_soloed_outs_muted = something_soloed;
3269 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
3272 _listen_cnt = listeners;
3274 if (isolated != _solo_isolated_cnt) {
3275 _solo_isolated_cnt = isolated;
3276 IsolatedChanged (); /* EMIT SIGNAL */
3279 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
3280 something_soloed, listeners, isolated));
3283 boost::shared_ptr<RouteList>
3284 Session::get_routes_with_internal_returns() const
3286 boost::shared_ptr<RouteList> r = routes.reader ();
3287 boost::shared_ptr<RouteList> rl (new RouteList);
3289 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3290 if ((*i)->internal_return ()) {
3298 Session::io_name_is_legal (const std::string& name)
3300 boost::shared_ptr<RouteList> r = routes.reader ();
3302 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3303 if ((*i)->name() == name) {
3307 if ((*i)->has_io_processor_named (name)) {
3316 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
3319 vector<string> connections;
3321 /* if we are passed only a single route and we're not told to turn
3322 * others off, then just do the simple thing.
3325 if (flip_others == false && rl->size() == 1) {
3326 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
3328 mt->set_input_active (onoff);
3333 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
3335 PortSet& ps ((*rt)->input()->ports());
3337 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
3338 p->get_connections (connections);
3341 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
3342 routes_using_input_from (*s, rl2);
3345 /* scan all relevant routes to see if others are on or off */
3347 bool others_are_already_on = false;
3349 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3351 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3357 if ((*r) != (*rt)) {
3358 if (mt->input_active()) {
3359 others_are_already_on = true;
3362 /* this one needs changing */
3363 mt->set_input_active (onoff);
3369 /* globally reverse other routes */
3371 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3372 if ((*r) != (*rt)) {
3373 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3375 mt->set_input_active (!others_are_already_on);
3384 Session::routes_using_input_from (const string& str, RouteList& rl)
3386 boost::shared_ptr<RouteList> r = routes.reader();
3388 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3389 if ((*i)->input()->connected_to (str)) {
3395 boost::shared_ptr<Route>
3396 Session::route_by_name (string name)
3398 boost::shared_ptr<RouteList> r = routes.reader ();
3400 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3401 if ((*i)->name() == name) {
3406 return boost::shared_ptr<Route> ((Route*) 0);
3409 boost::shared_ptr<Route>
3410 Session::route_by_id (PBD::ID id)
3412 boost::shared_ptr<RouteList> r = routes.reader ();
3414 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3415 if ((*i)->id() == id) {
3420 return boost::shared_ptr<Route> ((Route*) 0);
3423 boost::shared_ptr<Track>
3424 Session::track_by_diskstream_id (PBD::ID id)
3426 boost::shared_ptr<RouteList> r = routes.reader ();
3428 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3429 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3430 if (t && t->using_diskstream_id (id)) {
3435 return boost::shared_ptr<Track> ();
3438 boost::shared_ptr<Route>
3439 Session::route_by_remote_id (uint32_t id)
3441 boost::shared_ptr<RouteList> r = routes.reader ();
3443 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3444 if ((*i)->remote_control_id() == id) {
3449 return boost::shared_ptr<Route> ((Route*) 0);
3454 Session::reassign_track_numbers ()
3458 RouteList r (*(routes.reader ()));
3459 SignalOrderRouteSorter sorter;
3462 StateProtector sp (this);
3464 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3465 if (boost::dynamic_pointer_cast<Track> (*i)) {
3466 (*i)->set_track_number(++tn);
3468 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
3469 (*i)->set_track_number(--bn);
3472 const uint32_t decimals = ceilf (log10f (tn + 1));
3473 const bool decimals_changed = _track_number_decimals != decimals;
3474 _track_number_decimals = decimals;
3476 if (decimals_changed && config.get_track_name_number ()) {
3477 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3478 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3480 t->resync_track_name();
3483 // trigger GUI re-layout
3484 config.ParameterChanged("track-name-number");
3489 Session::playlist_region_added (boost::weak_ptr<Region> w)
3491 boost::shared_ptr<Region> r = w.lock ();
3496 /* These are the operations that are currently in progress... */
3497 list<GQuark> curr = _current_trans_quarks;
3500 /* ...and these are the operations during which we want to update
3501 the session range location markers.
3504 ops.push_back (Operations::capture);
3505 ops.push_back (Operations::paste);
3506 ops.push_back (Operations::duplicate_region);
3507 ops.push_back (Operations::insert_file);
3508 ops.push_back (Operations::insert_region);
3509 ops.push_back (Operations::drag_region_brush);
3510 ops.push_back (Operations::region_drag);
3511 ops.push_back (Operations::selection_grab);
3512 ops.push_back (Operations::region_fill);
3513 ops.push_back (Operations::fill_selection);
3514 ops.push_back (Operations::create_region);
3515 ops.push_back (Operations::region_copy);
3516 ops.push_back (Operations::fixed_time_region_copy);
3519 /* See if any of the current operations match the ones that we want */
3521 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
3523 /* If so, update the session range markers */
3525 maybe_update_session_range (r->position (), r->last_frame ());
3529 /** Update the session range markers if a is before the current start or
3530 * b is after the current end.
3533 Session::maybe_update_session_range (framepos_t a, framepos_t b)
3535 if (_state_of_the_state & Loading) {
3539 if (_session_range_location == 0) {
3541 add_session_range_location (a, b);
3545 if (a < _session_range_location->start()) {
3546 _session_range_location->set_start (a);
3549 if (b > _session_range_location->end()) {
3550 _session_range_location->set_end (b);
3556 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
3558 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3559 maybe_update_session_range (i->to, i->to + i->length);
3564 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
3566 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3567 maybe_update_session_range (i->from, i->to);
3571 /* Region management */
3573 boost::shared_ptr<Region>
3574 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
3576 const RegionFactory::RegionMap& regions (RegionFactory::regions());
3577 RegionFactory::RegionMap::const_iterator i;
3578 boost::shared_ptr<Region> region;
3580 Glib::Threads::Mutex::Lock lm (region_lock);
3582 for (i = regions.begin(); i != regions.end(); ++i) {
3586 if (region->whole_file()) {
3588 if (child->source_equivalent (region)) {
3594 return boost::shared_ptr<Region> ();
3598 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
3600 set<boost::shared_ptr<Region> > relevant_regions;
3602 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
3603 RegionFactory::get_regions_using_source (*s, relevant_regions);
3606 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
3607 set<boost::shared_ptr<Region> >::iterator tmp;
3612 playlists->destroy_region (*r);
3613 RegionFactory::map_remove (*r);
3615 (*r)->drop_sources ();
3616 (*r)->drop_references ();
3618 relevant_regions.erase (r);
3623 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
3626 Glib::Threads::Mutex::Lock ls (source_lock);
3627 /* remove from the main source list */
3628 sources.erase ((*s)->id());
3631 (*s)->mark_for_remove ();
3632 (*s)->drop_references ();
3641 Session::remove_last_capture ()
3643 list<boost::shared_ptr<Source> > srcs;
3645 boost::shared_ptr<RouteList> rl = routes.reader ();
3646 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3647 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3652 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
3655 srcs.insert (srcs.end(), l.begin(), l.end());
3660 destroy_sources (srcs);
3662 save_state (_current_snapshot_name);
3667 /* Source Management */
3670 Session::add_source (boost::shared_ptr<Source> source)
3672 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
3673 pair<SourceMap::iterator,bool> result;
3675 entry.first = source->id();
3676 entry.second = source;
3679 Glib::Threads::Mutex::Lock lm (source_lock);
3680 result = sources.insert (entry);
3683 if (result.second) {
3685 /* yay, new source */
3687 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
3690 if (!fs->within_session()) {
3691 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
3697 boost::shared_ptr<AudioFileSource> afs;
3699 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
3700 if (Config->get_auto_analyse_audio()) {
3701 Analyser::queue_source_for_analysis (source, false);
3705 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
3710 Session::remove_source (boost::weak_ptr<Source> src)
3712 if (_state_of_the_state & Deletion) {
3716 SourceMap::iterator i;
3717 boost::shared_ptr<Source> source = src.lock();
3724 Glib::Threads::Mutex::Lock lm (source_lock);
3726 if ((i = sources.find (source->id())) != sources.end()) {
3731 if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
3733 /* save state so we don't end up with a session file
3734 referring to non-existent sources.
3737 save_state (_current_snapshot_name);
3741 boost::shared_ptr<Source>
3742 Session::source_by_id (const PBD::ID& id)
3744 Glib::Threads::Mutex::Lock lm (source_lock);
3745 SourceMap::iterator i;
3746 boost::shared_ptr<Source> source;
3748 if ((i = sources.find (id)) != sources.end()) {
3755 boost::shared_ptr<AudioFileSource>
3756 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
3758 /* Restricted to audio files because only audio sources have channel
3762 Glib::Threads::Mutex::Lock lm (source_lock);
3764 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
3765 boost::shared_ptr<AudioFileSource> afs
3766 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
3768 if (afs && afs->path() == path && chn == afs->channel()) {
3773 return boost::shared_ptr<AudioFileSource>();
3776 boost::shared_ptr<MidiSource>
3777 Session::midi_source_by_path (const std::string& path) const
3779 /* Restricted to MIDI files because audio sources require a channel
3780 for unique identification, in addition to a path.
3783 Glib::Threads::Mutex::Lock lm (source_lock);
3785 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
3786 boost::shared_ptr<MidiSource> ms
3787 = boost::dynamic_pointer_cast<MidiSource>(s->second);
3788 boost::shared_ptr<FileSource> fs
3789 = boost::dynamic_pointer_cast<FileSource>(s->second);
3791 if (ms && fs && fs->path() == path) {
3796 return boost::shared_ptr<MidiSource>();
3800 Session::count_sources_by_origin (const string& path)
3803 Glib::Threads::Mutex::Lock lm (source_lock);
3805 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3806 boost::shared_ptr<FileSource> fs
3807 = boost::dynamic_pointer_cast<FileSource>(i->second);
3809 if (fs && fs->origin() == path) {
3818 Session::peak_path (string base) const
3820 if (Glib::path_is_absolute (base)) {
3822 /* rip the session dir from the audiofile source */
3824 string session_path;
3825 string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
3826 bool in_another_session = true;
3828 if (base.find (interchange_dir_string) != string::npos) {
3830 session_path = Glib::path_get_dirname (base); /* now ends in audiofiles */
3831 session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
3832 session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
3833 session_path = Glib::path_get_dirname (session_path); /* now has session path */
3835 /* see if it is within our session */
3837 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3838 if (i->path == session_path) {
3839 in_another_session = false;
3844 in_another_session = false;
3848 if (in_another_session) {
3849 SessionDirectory sd (session_path);
3850 return Glib::build_filename (sd.peak_path(), Glib::path_get_basename (base) + peakfile_suffix);
3854 base = Glib::path_get_basename (base);
3855 return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
3859 Session::new_audio_source_path_for_embedded (const std::string& path)
3863 * we know that the filename is already unique because it exists
3864 * out in the filesystem.
3866 * However, when we bring it into the session, we could get a
3869 * Eg. two embedded files:
3874 * When merged into session, these collide.
3876 * There will not be a conflict with in-memory sources
3877 * because when the source was created we already picked
3878 * a unique name for it.
3880 * This collision is not likely to be common, but we have to guard
3881 * against it. So, if there is a collision, take the md5 hash of the
3882 * the path, and use that as the filename instead.
3885 SessionDirectory sdir (get_best_session_directory_for_new_audio());
3886 string base = Glib::path_get_basename (path);
3887 string newpath = Glib::build_filename (sdir.sound_path(), base);
3889 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
3893 md5.digestString (path.c_str());
3894 md5.writeToString ();
3895 base = md5.digestChars;
3897 string ext = get_suffix (path);
3904 newpath = Glib::build_filename (sdir.sound_path(), base);
3906 /* if this collides, we're screwed */
3908 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
3909 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
3918 /** Return true if there are no audio file sources that use @param name as
3919 * the filename component of their path.
3921 * Return false otherwise.
3923 * This method MUST ONLY be used to check in-session, mono files since it
3924 * hard-codes the channel of the audio file source we are looking for as zero.
3926 * If/when Ardour supports native files in non-mono formats, the logic here
3927 * will need to be revisited.
3930 Session::audio_source_name_is_unique (const string& name)
3932 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
3933 vector<space_and_path>::iterator i;
3934 uint32_t existing = 0;
3936 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
3938 /* note that we search *without* the extension so that
3939 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3940 in the event that this new name is required for
3941 a file format change.
3944 const string spath = *i;
3946 if (matching_unsuffixed_filename_exists_in (spath, name)) {
3951 /* it is possible that we have the path already
3952 * assigned to a source that has not yet been written
3953 * (ie. the write source for a diskstream). we have to
3954 * check this in order to make sure that our candidate
3955 * path isn't used again, because that can lead to
3956 * two Sources point to the same file with different
3957 * notions of their removability.
3961 string possible_path = Glib::build_filename (spath, name);
3963 if (audio_source_by_path_and_channel (possible_path, 0)) {
3969 return (existing == 0);
3973 Session::format_audio_source_name (const string& legalized_base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required, uint32_t cnt, bool related_exists)
3976 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3980 sstr << setfill ('0') << setw (4) << cnt;
3981 sstr << legalized_base;
3983 sstr << legalized_base;
3985 if (take_required || related_exists) {
3997 } else if (nchan > 2) {
4002 /* XXX what? more than 26 channels! */
4013 /** Return a unique name based on \a base for a new internal audio source */
4015 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
4018 string possible_name;
4019 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
4021 bool some_related_source_name_exists = false;
4023 legalized = legalize_for_path (base);
4025 // Find a "version" of the base name that doesn't exist in any of the possible directories.
4027 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
4029 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
4031 if (audio_source_name_is_unique (possible_name)) {
4035 some_related_source_name_exists = true;
4038 error << string_compose(
4039 _("There are already %1 recordings for %2, which I consider too many."),
4040 limit, base) << endmsg;
4042 throw failed_constructor();
4046 /* We've established that the new name does not exist in any session
4047 * directory, so now find out which one we should use for this new
4051 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4053 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
4058 /** Return a unique name based on `base` for a new internal MIDI source */
4060 Session::new_midi_source_path (const string& base)
4063 char buf[PATH_MAX+1];
4064 const uint32_t limit = 10000;
4066 string possible_path;
4067 string possible_name;
4070 legalized = legalize_for_path (base);
4072 // Find a "version" of the file name that doesn't exist in any of the possible directories.
4073 std::vector<string> sdirs = source_search_path(DataType::MIDI);
4075 /* - the main session folder is the first in the vector.
4076 * - after checking all locations for file-name uniqueness,
4077 * we keep the one from the last iteration as new file name
4078 * - midi files are small and should just be kept in the main session-folder
4080 * -> reverse the array, check main session folder last and use that as location
4083 std::reverse(sdirs.begin(), sdirs.end());
4085 for (cnt = 1; cnt <= limit; ++cnt) {
4087 vector<space_and_path>::iterator i;
4088 uint32_t existing = 0;
4090 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4092 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
4093 possible_name = buf;
4095 possible_path = Glib::build_filename (*i, possible_name);
4097 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
4101 if (midi_source_by_path (possible_path)) {
4106 if (existing == 0) {
4111 error << string_compose(
4112 _("There are already %1 recordings for %2, which I consider too many."),
4113 limit, base) << endmsg;
4119 /* No need to "find best location" for software/app-based RAID, because
4120 MIDI is so small that we always put it in the same place.
4123 return possible_path;
4127 /** Create a new within-session audio source */
4128 boost::shared_ptr<AudioFileSource>
4129 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
4131 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
4133 if (!path.empty()) {
4134 return boost::dynamic_pointer_cast<AudioFileSource> (
4135 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
4137 throw failed_constructor ();
4141 /** Create a new within-session MIDI source */
4142 boost::shared_ptr<MidiSource>
4143 Session::create_midi_source_for_session (string const & basic_name)
4145 const string path = new_midi_source_path (basic_name);
4147 if (!path.empty()) {
4148 return boost::dynamic_pointer_cast<SMFSource> (
4149 SourceFactory::createWritable (
4150 DataType::MIDI, *this, path, false, frame_rate()));
4152 throw failed_constructor ();
4156 /** Create a new within-session MIDI source */
4157 boost::shared_ptr<MidiSource>
4158 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
4160 /* the caller passes in the track the source will be used in,
4161 so that we can keep the numbering sane.
4163 Rationale: a track with the name "Foo" that has had N
4164 captures carried out so far will ALREADY have a write source
4165 named "Foo-N+1.mid" waiting to be used for the next capture.
4167 If we call new_midi_source_name() we will get "Foo-N+2". But
4168 there is no region corresponding to "Foo-N+1", so when
4169 "Foo-N+2" appears in the track, the gap presents the user
4170 with odd behaviour - why did it skip past Foo-N+1?
4172 We could explain this to the user in some odd way, but
4173 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
4176 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
4179 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
4181 std::string name = track->steal_write_source_name ();
4184 return boost::shared_ptr<MidiSource>();
4187 /* MIDI files are small, just put them in the first location of the
4188 session source search path.
4191 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
4193 return boost::dynamic_pointer_cast<SMFSource> (
4194 SourceFactory::createWritable (
4195 DataType::MIDI, *this, path, false, frame_rate()));
4200 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
4202 if (playlist->hidden()) {
4206 playlists->add (playlist);
4209 playlist->release();
4216 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
4218 if (_state_of_the_state & Deletion) {
4222 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
4228 playlists->remove (playlist);
4234 Session::set_audition (boost::shared_ptr<Region> r)
4236 pending_audition_region = r;
4237 add_post_transport_work (PostTransportAudition);
4238 _butler->schedule_transport_work ();
4242 Session::audition_playlist ()
4244 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4245 ev->region.reset ();
4250 Session::non_realtime_set_audition ()
4252 assert (pending_audition_region);
4253 auditioner->audition_region (pending_audition_region);
4254 pending_audition_region.reset ();
4255 AuditionActive (true); /* EMIT SIGNAL */
4259 Session::audition_region (boost::shared_ptr<Region> r)
4261 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4267 Session::cancel_audition ()
4272 if (auditioner->auditioning()) {
4273 auditioner->cancel_audition ();
4274 AuditionActive (false); /* EMIT SIGNAL */
4279 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
4281 if (a->is_monitor()) {
4284 if (b->is_monitor()) {
4287 return a->order_key () < b->order_key ();
4291 Session::is_auditioning () const
4293 /* can be called before we have an auditioner object */
4295 return auditioner->auditioning();
4302 Session::graph_reordered ()
4304 /* don't do this stuff if we are setting up connections
4305 from a set_state() call or creating new tracks. Ditto for deletion.
4308 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
4312 /* every track/bus asked for this to be handled but it was deferred because
4313 we were connecting. do it now.
4316 request_input_change_handling ();
4320 /* force all diskstreams to update their capture offset values to
4321 reflect any changes in latencies within the graph.
4324 boost::shared_ptr<RouteList> rl = routes.reader ();
4325 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4326 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4328 tr->set_capture_offset ();
4333 /** @return Number of frames that there is disk space available to write,
4336 boost::optional<framecnt_t>
4337 Session::available_capture_duration ()
4339 Glib::Threads::Mutex::Lock lm (space_lock);
4341 if (_total_free_4k_blocks_uncertain) {
4342 return boost::optional<framecnt_t> ();
4345 float sample_bytes_on_disk = 4.0; // keep gcc happy
4347 switch (config.get_native_file_data_format()) {
4349 sample_bytes_on_disk = 4.0;
4353 sample_bytes_on_disk = 3.0;
4357 sample_bytes_on_disk = 2.0;
4361 /* impossible, but keep some gcc versions happy */
4362 fatal << string_compose (_("programming error: %1"),
4363 X_("illegal native file data format"))
4365 abort(); /*NOTREACHED*/
4368 double scale = 4096.0 / sample_bytes_on_disk;
4370 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
4371 return max_framecnt;
4374 return (framecnt_t) floor (_total_free_4k_blocks * scale);
4378 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
4381 RCUWriter<BundleList> writer (_bundles);
4382 boost::shared_ptr<BundleList> b = writer.get_copy ();
4383 b->push_back (bundle);
4387 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4394 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
4396 bool removed = false;
4399 RCUWriter<BundleList> writer (_bundles);
4400 boost::shared_ptr<BundleList> b = writer.get_copy ();
4401 BundleList::iterator i = find (b->begin(), b->end(), bundle);
4403 if (i != b->end()) {
4410 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4416 boost::shared_ptr<Bundle>
4417 Session::bundle_by_name (string name) const
4419 boost::shared_ptr<BundleList> b = _bundles.reader ();
4421 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
4422 if ((*i)->name() == name) {
4427 return boost::shared_ptr<Bundle> ();
4431 Session::tempo_map_changed (const PropertyChange&)
4435 playlists->update_after_tempo_map_change ();
4437 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
4443 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
4445 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
4446 (*i)->recompute_frames_from_bbt ();
4450 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
4451 * the given count with the current block size.
4454 Session::ensure_buffers (ChanCount howmany)
4456 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
4460 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
4462 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4463 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
4468 Session::next_insert_id ()
4470 /* this doesn't really loop forever. just think about it */
4473 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
4474 if (!insert_bitset[n]) {
4475 insert_bitset[n] = true;
4481 /* none available, so resize and try again */
4483 insert_bitset.resize (insert_bitset.size() + 16, false);
4488 Session::next_send_id ()
4490 /* this doesn't really loop forever. just think about it */
4493 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
4494 if (!send_bitset[n]) {
4495 send_bitset[n] = true;
4501 /* none available, so resize and try again */
4503 send_bitset.resize (send_bitset.size() + 16, false);
4508 Session::next_aux_send_id ()
4510 /* this doesn't really loop forever. just think about it */
4513 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
4514 if (!aux_send_bitset[n]) {
4515 aux_send_bitset[n] = true;
4521 /* none available, so resize and try again */
4523 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
4528 Session::next_return_id ()
4530 /* this doesn't really loop forever. just think about it */
4533 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
4534 if (!return_bitset[n]) {
4535 return_bitset[n] = true;
4541 /* none available, so resize and try again */
4543 return_bitset.resize (return_bitset.size() + 16, false);
4548 Session::mark_send_id (uint32_t id)
4550 if (id >= send_bitset.size()) {
4551 send_bitset.resize (id+16, false);
4553 if (send_bitset[id]) {
4554 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
4556 send_bitset[id] = true;
4560 Session::mark_aux_send_id (uint32_t id)
4562 if (id >= aux_send_bitset.size()) {
4563 aux_send_bitset.resize (id+16, false);
4565 if (aux_send_bitset[id]) {
4566 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
4568 aux_send_bitset[id] = true;
4572 Session::mark_return_id (uint32_t id)
4574 if (id >= return_bitset.size()) {
4575 return_bitset.resize (id+16, false);
4577 if (return_bitset[id]) {
4578 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
4580 return_bitset[id] = true;
4584 Session::mark_insert_id (uint32_t id)
4586 if (id >= insert_bitset.size()) {
4587 insert_bitset.resize (id+16, false);
4589 if (insert_bitset[id]) {
4590 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
4592 insert_bitset[id] = true;
4596 Session::unmark_send_id (uint32_t id)
4598 if (id < send_bitset.size()) {
4599 send_bitset[id] = false;
4604 Session::unmark_aux_send_id (uint32_t id)
4606 if (id < aux_send_bitset.size()) {
4607 aux_send_bitset[id] = false;
4612 Session::unmark_return_id (uint32_t id)
4614 if (id < return_bitset.size()) {
4615 return_bitset[id] = false;
4620 Session::unmark_insert_id (uint32_t id)
4622 if (id < insert_bitset.size()) {
4623 insert_bitset[id] = false;
4628 Session::reset_native_file_format ()
4630 boost::shared_ptr<RouteList> rl = routes.reader ();
4631 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4632 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4634 /* don't save state as we do this, there's no point
4637 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
4638 tr->reset_write_sources (false);
4639 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
4645 Session::route_name_unique (string n) const
4647 boost::shared_ptr<RouteList> r = routes.reader ();
4649 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4650 if ((*i)->name() == n) {
4659 Session::route_name_internal (string n) const
4661 if (auditioner && auditioner->name() == n) {
4665 if (_click_io && _click_io->name() == n) {
4673 Session::freeze_all (InterThreadInfo& itt)
4675 boost::shared_ptr<RouteList> r = routes.reader ();
4677 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4679 boost::shared_ptr<Track> t;
4681 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
4682 /* XXX this is wrong because itt.progress will keep returning to zero at the start
4692 boost::shared_ptr<Region>
4693 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
4694 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
4695 InterThreadInfo& itt,
4696 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
4697 bool for_export, bool for_freeze)
4699 boost::shared_ptr<Region> result;
4700 boost::shared_ptr<Playlist> playlist;
4701 boost::shared_ptr<Source> source;
4702 ChanCount diskstream_channels (track.n_channels());
4703 framepos_t position;
4704 framecnt_t this_chunk;
4706 framepos_t latency_skip;
4708 framepos_t len = end - start;
4709 bool need_block_size_reset = false;
4710 ChanCount const max_proc = track.max_processor_streams ();
4711 string legal_playlist_name;
4712 string possible_path;
4715 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
4716 end, start) << endmsg;
4720 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
4721 include_endpoint, for_export, for_freeze);
4723 if (diskstream_channels.n(track.data_type()) < 1) {
4724 error << _("Cannot write a range with no data.") << endmsg;
4728 // block all process callback handling
4730 block_processing ();
4733 // synchronize with AudioEngine::process_callback()
4734 // make sure processing is not currently running
4735 // and processing_blocked() is honored before
4736 // acquiring thread buffers
4737 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
4740 _bounce_processing_active = true;
4742 /* call tree *MUST* hold route_lock */
4744 if ((playlist = track.playlist()) == 0) {
4748 legal_playlist_name = legalize_for_path (playlist->name());
4750 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
4752 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
4753 string path = ((track.data_type() == DataType::AUDIO)
4754 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
4755 : new_midi_source_path (legal_playlist_name));
4762 source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
4765 catch (failed_constructor& err) {
4766 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
4770 srcs.push_back (source);
4773 /* tell redirects that care that we are about to use a much larger
4774 * blocksize. this will flush all plugins too, so that they are ready
4775 * to be used for this process.
4778 need_block_size_reset = true;
4779 track.set_block_size (bounce_chunk_size);
4780 _engine.main_thread()->get_buffers ();
4784 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
4786 /* create a set of reasonably-sized buffers */
4787 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4788 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
4790 buffers.set_count (max_proc);
4792 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4793 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4794 boost::shared_ptr<MidiSource> ms;
4796 afs->prepare_for_peakfile_writes ();
4797 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
4798 Source::Lock lock(ms->mutex());
4799 ms->mark_streaming_write_started(lock);
4803 while (to_do && !itt.cancel) {
4805 this_chunk = min (to_do, bounce_chunk_size);
4807 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
4811 start += this_chunk;
4812 to_do -= this_chunk;
4813 itt.progress = (float) (1.0 - ((double) to_do / len));
4815 if (latency_skip >= bounce_chunk_size) {
4816 latency_skip -= bounce_chunk_size;
4820 const framecnt_t current_chunk = this_chunk - latency_skip;
4823 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4824 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4825 boost::shared_ptr<MidiSource> ms;
4828 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
4831 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
4832 Source::Lock lock(ms->mutex());
4834 const MidiBuffer& buf = buffers.get_midi(0);
4835 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
4836 Evoral::Event<framepos_t> ev = *i;
4837 ev.set_time(ev.time() - position);
4838 ms->append_event_frames(lock, ev, ms->timeline_position());
4845 /* post-roll, pick up delayed processor output */
4846 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
4848 while (latency_skip && !itt.cancel) {
4849 this_chunk = min (latency_skip, bounce_chunk_size);
4850 latency_skip -= this_chunk;
4852 buffers.silence (this_chunk, 0);
4853 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
4856 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4857 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4860 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
4872 xnow = localtime (&now);
4874 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
4875 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4876 boost::shared_ptr<MidiSource> ms;
4879 afs->update_header (position, *xnow, now);
4880 afs->flush_header ();
4881 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
4882 Source::Lock lock(ms->mutex());
4883 ms->mark_streaming_write_completed(lock);
4887 /* construct a region to represent the bounced material */
4891 plist.add (Properties::start, 0);
4892 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4893 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4895 result = RegionFactory::create (srcs, plist);
4901 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4902 (*src)->mark_for_remove ();
4903 (*src)->drop_references ();
4907 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4908 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4911 afs->done_with_peakfile_writes ();
4915 _bounce_processing_active = false;
4917 if (need_block_size_reset) {
4918 _engine.main_thread()->drop_buffers ();
4919 track.set_block_size (get_block_size());
4922 unblock_processing ();
4928 Session::gain_automation_buffer() const
4930 return ProcessThread::gain_automation_buffer ();
4934 Session::trim_automation_buffer() const
4936 return ProcessThread::trim_automation_buffer ();
4940 Session::send_gain_automation_buffer() const
4942 return ProcessThread::send_gain_automation_buffer ();
4946 Session::pan_automation_buffer() const
4948 return ProcessThread::pan_automation_buffer ();
4952 Session::get_silent_buffers (ChanCount count)
4954 return ProcessThread::get_silent_buffers (count);
4958 Session::get_scratch_buffers (ChanCount count, bool silence)
4960 return ProcessThread::get_scratch_buffers (count, silence);
4964 Session::get_route_buffers (ChanCount count, bool silence)
4966 return ProcessThread::get_route_buffers (count, silence);
4971 Session::get_mix_buffers (ChanCount count)
4973 return ProcessThread::get_mix_buffers (count);
4977 Session::ntracks () const
4980 boost::shared_ptr<RouteList> r = routes.reader ();
4982 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4983 if (boost::dynamic_pointer_cast<Track> (*i)) {
4992 Session::nbusses () const
4995 boost::shared_ptr<RouteList> r = routes.reader ();
4997 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4998 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
5007 Session::add_automation_list(AutomationList *al)
5009 automation_lists[al->id()] = al;
5012 /** @return true if there is at least one record-enabled track, otherwise false */
5014 Session::have_rec_enabled_track () const
5016 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
5020 Session::have_rec_disabled_track () const
5022 return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
5025 /** Update the state of our rec-enabled tracks flag */
5027 Session::update_route_record_state ()
5029 boost::shared_ptr<RouteList> rl = routes.reader ();
5030 RouteList::iterator i = rl->begin();
5031 while (i != rl->end ()) {
5033 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5034 if (tr && tr->record_enabled ()) {
5041 int const old = g_atomic_int_get (&_have_rec_enabled_track);
5043 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
5045 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
5046 RecordStateChanged (); /* EMIT SIGNAL */
5051 while (i != rl->end ()) {
5053 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5054 if (tr && !tr->record_enabled ()) {
5061 g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
5065 Session::listen_position_changed ()
5067 boost::shared_ptr<RouteList> r = routes.reader ();
5069 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5070 (*i)->listen_position_changed ();
5075 Session::solo_control_mode_changed ()
5077 /* cancel all solo or all listen when solo control mode changes */
5080 set_solo (get_routes(), false);
5081 } else if (listening()) {
5082 set_listen (get_routes(), false);
5086 /** Called when a property of one of our route groups changes */
5088 Session::route_group_property_changed (RouteGroup* rg)
5090 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
5093 /** Called when a route is added to one of our route groups */
5095 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5097 RouteAddedToRouteGroup (rg, r);
5100 /** Called when a route is removed from one of our route groups */
5102 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5104 update_route_record_state ();
5105 RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
5108 boost::shared_ptr<RouteList>
5109 Session::get_tracks () const
5111 boost::shared_ptr<RouteList> rl = routes.reader ();
5112 boost::shared_ptr<RouteList> tl (new RouteList);
5114 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
5115 if (boost::dynamic_pointer_cast<Track> (*r)) {
5116 if (!(*r)->is_auditioner()) {
5124 boost::shared_ptr<RouteList>
5125 Session::get_routes_with_regions_at (framepos_t const p) const
5127 boost::shared_ptr<RouteList> r = routes.reader ();
5128 boost::shared_ptr<RouteList> rl (new RouteList);
5130 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5131 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5136 boost::shared_ptr<Playlist> pl = tr->playlist ();
5141 if (pl->has_region_at (p)) {
5150 Session::goto_end ()
5152 if (_session_range_location) {
5153 request_locate (_session_range_location->end(), false);
5155 request_locate (0, false);
5160 Session::goto_start ()
5162 if (_session_range_location) {
5163 request_locate (_session_range_location->start(), false);
5165 request_locate (0, false);
5170 Session::current_start_frame () const
5172 return _session_range_location ? _session_range_location->start() : 0;
5176 Session::current_end_frame () const
5178 return _session_range_location ? _session_range_location->end() : 0;
5182 Session::add_session_range_location (framepos_t start, framepos_t end)
5184 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
5185 _locations->add (_session_range_location);
5189 Session::step_edit_status_change (bool yn)
5195 send = (_step_editors == 0);
5200 send = (_step_editors == 1);
5203 if (_step_editors > 0) {
5209 StepEditStatusChange (val);
5215 Session::start_time_changed (framepos_t old)
5217 /* Update the auto loop range to match the session range
5218 (unless the auto loop range has been changed by the user)
5221 Location* s = _locations->session_range_location ();
5226 Location* l = _locations->auto_loop_location ();
5228 if (l && l->start() == old) {
5229 l->set_start (s->start(), true);
5234 Session::end_time_changed (framepos_t old)
5236 /* Update the auto loop range to match the session range
5237 (unless the auto loop range has been changed by the user)
5240 Location* s = _locations->session_range_location ();
5245 Location* l = _locations->auto_loop_location ();
5247 if (l && l->end() == old) {
5248 l->set_end (s->end(), true);
5252 std::vector<std::string>
5253 Session::source_search_path (DataType type) const
5257 if (session_dirs.size() == 1) {
5259 case DataType::AUDIO:
5260 sp.push_back (_session_dir->sound_path());
5262 case DataType::MIDI:
5263 sp.push_back (_session_dir->midi_path());
5267 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
5268 SessionDirectory sdir (i->path);
5270 case DataType::AUDIO:
5271 sp.push_back (sdir.sound_path());
5273 case DataType::MIDI:
5274 sp.push_back (sdir.midi_path());
5280 if (type == DataType::AUDIO) {
5281 const string sound_path_2X = _session_dir->sound_path_2X();
5282 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
5283 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
5284 sp.push_back (sound_path_2X);
5289 // now check the explicit (possibly user-specified) search path
5292 case DataType::AUDIO:
5293 sp += Searchpath(config.get_audio_search_path ());
5295 case DataType::MIDI:
5296 sp += Searchpath(config.get_midi_search_path ());
5304 Session::ensure_search_path_includes (const string& path, DataType type)
5313 case DataType::AUDIO:
5314 sp += Searchpath(config.get_audio_search_path ());
5316 case DataType::MIDI:
5317 sp += Searchpath (config.get_midi_search_path ());
5321 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
5322 /* No need to add this new directory if it has the same inode as
5323 an existing one; checking inode rather than name prevents duplicated
5324 directories when we are using symlinks.
5326 On Windows, I think we could just do if (*i == path) here.
5328 if (PBD::equivalent_paths (*i, path)) {
5336 case DataType::AUDIO:
5337 config.set_audio_search_path (sp.to_string());
5339 case DataType::MIDI:
5340 config.set_midi_search_path (sp.to_string());
5346 Session::remove_dir_from_search_path (const string& dir, DataType type)
5351 case DataType::AUDIO:
5352 sp = Searchpath(config.get_audio_search_path ());
5354 case DataType::MIDI:
5355 sp = Searchpath (config.get_midi_search_path ());
5362 case DataType::AUDIO:
5363 config.set_audio_search_path (sp.to_string());
5365 case DataType::MIDI:
5366 config.set_midi_search_path (sp.to_string());
5372 boost::shared_ptr<Speakers>
5373 Session::get_speakers()
5379 Session::unknown_processors () const
5383 boost::shared_ptr<RouteList> r = routes.reader ();
5384 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5385 list<string> t = (*i)->unknown_processors ();
5386 copy (t.begin(), t.end(), back_inserter (p));
5396 Session::update_latency (bool playback)
5398 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
5400 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
5404 boost::shared_ptr<RouteList> r = routes.reader ();
5405 framecnt_t max_latency = 0;
5408 /* reverse the list so that we work backwards from the last route to run to the first */
5409 RouteList* rl = routes.reader().get();
5410 r.reset (new RouteList (*rl));
5411 reverse (r->begin(), r->end());
5414 /* compute actual latency values for the given direction and store them all in per-port
5415 structures. this will also publish the same values (to JACK) so that computation of latency
5416 for routes can consistently use public latency values.
5419 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5420 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
5423 /* because we latency compensate playback, our published playback latencies should
5424 be the same for all output ports - all material played back by ardour has
5425 the same latency, whether its caused by plugins or by latency compensation. since
5426 these may differ from the values computed above, reset all playback port latencies
5430 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
5432 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5433 (*i)->set_public_port_latencies (max_latency, playback);
5438 post_playback_latency ();
5442 post_capture_latency ();
5445 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
5449 Session::post_playback_latency ()
5451 set_worst_playback_latency ();
5453 boost::shared_ptr<RouteList> r = routes.reader ();
5455 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5456 if (!(*i)->is_auditioner() && ((*i)->active())) {
5457 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
5461 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5462 (*i)->set_latency_compensation (_worst_track_latency);
5467 Session::post_capture_latency ()
5469 set_worst_capture_latency ();
5471 /* reflect any changes in capture latencies into capture offsets
5474 boost::shared_ptr<RouteList> rl = routes.reader();
5475 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5476 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5478 tr->set_capture_offset ();
5484 Session::initialize_latencies ()
5487 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5488 update_latency (false);
5489 update_latency (true);
5492 set_worst_io_latencies ();
5496 Session::set_worst_io_latencies ()
5498 set_worst_playback_latency ();
5499 set_worst_capture_latency ();
5503 Session::set_worst_playback_latency ()
5505 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5509 _worst_output_latency = 0;
5511 if (!_engine.connected()) {
5515 boost::shared_ptr<RouteList> r = routes.reader ();
5517 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5518 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
5521 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
5525 Session::set_worst_capture_latency ()
5527 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5531 _worst_input_latency = 0;
5533 if (!_engine.connected()) {
5537 boost::shared_ptr<RouteList> r = routes.reader ();
5539 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5540 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
5543 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
5547 Session::update_latency_compensation (bool force_whole_graph)
5549 bool some_track_latency_changed = false;
5551 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5555 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
5557 _worst_track_latency = 0;
5559 boost::shared_ptr<RouteList> r = routes.reader ();
5561 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5562 if (!(*i)->is_auditioner() && ((*i)->active())) {
5564 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
5565 some_track_latency_changed = true;
5567 _worst_track_latency = max (tl, _worst_track_latency);
5571 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
5572 (some_track_latency_changed ? "yes" : "no")));
5574 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
5576 if (some_track_latency_changed || force_whole_graph) {
5577 _engine.update_latencies ();
5581 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5582 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5586 tr->set_capture_offset ();
5591 Session::session_name_is_legal (const string& path)
5593 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
5595 for (int i = 0; illegal_chars[i]; ++i) {
5596 if (path.find (illegal_chars[i]) != string::npos) {
5597 return illegal_chars[i];
5605 Session::next_control_id () const
5609 /* the monitor bus remote ID is in a different
5610 * "namespace" than regular routes. its existence doesn't
5611 * affect normal (low) numbered routes.
5618 return nroutes() - subtract;
5622 Session::notify_remote_id_change ()
5624 if (deletion_in_progress()) {
5628 switch (Config->get_remote_model()) {
5630 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
5638 Session::sync_order_keys ()
5640 if (deletion_in_progress()) {
5644 /* tell everyone that something has happened to the sort keys
5645 and let them sync up with the change(s)
5646 this will give objects that manage the sort order keys the
5647 opportunity to keep them in sync if they wish to.
5650 DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
5652 reassign_track_numbers();
5654 Route::SyncOrderKeys (); /* EMIT SIGNAL */
5656 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
5660 Session::operation_in_progress (GQuark op) const
5662 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
5665 boost::shared_ptr<Port>
5666 Session::ltc_input_port () const
5668 return _ltc_input->nth (0);
5671 boost::shared_ptr<Port>
5672 Session::ltc_output_port () const
5674 return _ltc_output->nth (0);
5678 Session::reconnect_ltc_input ()
5682 string src = Config->get_ltc_source_port();
5684 _ltc_input->disconnect (this);
5686 if (src != _("None") && !src.empty()) {
5687 _ltc_input->nth (0)->connect (src);
5693 Session::reconnect_ltc_output ()
5698 string src = Config->get_ltc_sink_port();
5700 _ltc_output->disconnect (this);
5702 if (src != _("None") && !src.empty()) {
5703 _ltc_output->nth (0)->connect (src);