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).
2378 #ifdef USE_TRACKS_CODE_FEATURES
2381 Session::reconnect_midi_scene_ports(bool inputs)
2384 scene_in()->disconnect_all ();
2386 std::vector<EngineStateController::MidiPortState> midi_port_states;
2387 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2389 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2391 for (; state_iter != midi_port_states.end(); ++state_iter) {
2392 if (state_iter->active && state_iter->available && state_iter->connected) {
2393 scene_in()->connect (state_iter->name);
2398 scene_out()->disconnect_all ();
2400 std::vector<EngineStateController::MidiPortState> midi_port_states;
2401 EngineStateController::instance()->get_physical_midi_output_states (midi_port_states);
2403 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2405 for (; state_iter != midi_port_states.end(); ++state_iter) {
2406 if (state_iter->active && state_iter->available && state_iter->connected) {
2407 scene_out()->connect (state_iter->name);
2416 /** Caller must not hold process lock
2417 * @param name_template string to use for the start of the name, or "" to use "Audio".
2419 list< boost::shared_ptr<AudioTrack> >
2420 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
2421 uint32_t how_many, string name_template)
2423 char track_name[32];
2424 uint32_t track_id = 0;
2426 RouteList new_routes;
2427 list<boost::shared_ptr<AudioTrack> > ret;
2429 string name_pattern;
2431 if (Profile->get_trx() ) {
2432 name_pattern = "Track ";
2434 name_pattern = "Audio ";
2437 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _(name_pattern.c_str() );
2441 if (!find_route_name (name_template.empty() ? _(name_pattern.c_str()) : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
2442 error << "cannot find name for new audio track" << endmsg;
2446 boost::shared_ptr<AudioTrack> track;
2449 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
2451 if (track->init ()) {
2455 track->use_new_diskstream();
2457 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2458 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2461 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2463 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2464 error << string_compose (
2465 _("cannot configure %1 in/%2 out configuration for new audio track"),
2466 input_channels, output_channels)
2471 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2472 error << string_compose (
2473 _("cannot configure %1 in/%2 out configuration for new audio track"),
2474 input_channels, output_channels)
2481 route_group->add (track);
2484 track->non_realtime_input_change();
2486 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2487 if (Config->get_remote_model() == UserOrdered) {
2488 track->set_remote_control_id (next_control_id());
2491 new_routes.push_back (track);
2492 ret.push_back (track);
2495 catch (failed_constructor &err) {
2496 error << _("Session: could not create new audio track.") << endmsg;
2500 catch (AudioEngine::PortRegistrationFailure& pfe) {
2502 error << pfe.what() << endmsg;
2510 if (!new_routes.empty()) {
2511 StateProtector sp (this);
2512 if (Profile->get_trx()) {
2513 add_routes (new_routes, false, false, false);
2515 add_routes (new_routes, true, true, false);
2522 /** Caller must not hold process lock.
2523 * @param name_template string to use for the start of the name, or "" to use "Bus".
2526 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
2529 uint32_t bus_id = 0;
2533 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
2536 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
2537 error << "cannot find name for new audio bus" << endmsg;
2542 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
2548 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2549 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
2552 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2554 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2555 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2556 input_channels, output_channels)
2562 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2563 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2564 input_channels, output_channels)
2571 route_group->add (bus);
2573 if (Config->get_remote_model() == UserOrdered) {
2574 bus->set_remote_control_id (next_control_id());
2577 bus->add_internal_return ();
2579 ret.push_back (bus);
2585 catch (failed_constructor &err) {
2586 error << _("Session: could not create new audio route.") << endmsg;
2590 catch (AudioEngine::PortRegistrationFailure& pfe) {
2591 error << pfe.what() << endmsg;
2601 StateProtector sp (this);
2602 if (Profile->get_trx()) {
2603 add_routes (ret, false, false, false);
2605 add_routes (ret, false, true, true); // autoconnect // outputs only
2614 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base)
2617 uint32_t control_id;
2619 uint32_t number = 0;
2620 const uint32_t being_added = how_many;
2622 if (!tree.read (template_path.c_str())) {
2626 XMLNode* node = tree.root();
2628 IO::disable_connecting ();
2630 control_id = next_control_id ();
2634 XMLNode node_copy (*node);
2636 /* Remove IDs of everything so that new ones are used */
2637 node_copy.remove_property_recursively (X_("id"));
2642 if (!name_base.empty()) {
2644 /* if we're adding more than one routes, force
2645 * all the names of the new routes to be
2646 * numbered, via the final parameter.
2649 if (!find_route_name (name_base.c_str(), ++number, name, sizeof(name), (being_added > 1))) {
2650 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2656 string const route_name = node_copy.property(X_("name"))->value ();
2658 /* generate a new name by adding a number to the end of the template name */
2659 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2660 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2661 abort(); /*NOTREACHED*/
2665 /* set this name in the XML description that we are about to use */
2666 Route::set_name_in_state (node_copy, name);
2668 /* trim bitslots from listen sends so that new ones are used */
2669 XMLNodeList children = node_copy.children ();
2670 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2671 if ((*i)->name() == X_("Processor")) {
2672 XMLProperty* role = (*i)->property (X_("role"));
2673 if (role && role->value() == X_("Listen")) {
2674 (*i)->remove_property (X_("bitslot"));
2679 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2682 error << _("Session: cannot create track/bus from template description") << endmsg;
2686 if (boost::dynamic_pointer_cast<Track>(route)) {
2687 /* force input/output change signals so that the new diskstream
2688 picks up the configuration of the route. During session
2689 loading this normally happens in a different way.
2692 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2694 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2695 change.after = route->input()->n_ports();
2696 route->input()->changed (change, this);
2697 change.after = route->output()->n_ports();
2698 route->output()->changed (change, this);
2701 route->set_remote_control_id (control_id);
2704 ret.push_back (route);
2707 catch (failed_constructor &err) {
2708 error << _("Session: could not create new route from template") << endmsg;
2712 catch (AudioEngine::PortRegistrationFailure& pfe) {
2713 error << pfe.what() << endmsg;
2722 StateProtector sp (this);
2723 if (Profile->get_trx()) {
2724 add_routes (ret, false, false, false);
2726 add_routes (ret, true, true, false);
2728 IO::enable_connecting ();
2735 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
2738 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
2739 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
2742 error << _("Adding new tracks/busses failed") << endmsg;
2747 update_latency (true);
2748 update_latency (false);
2753 save_state (_current_snapshot_name);
2756 reassign_track_numbers();
2758 update_route_record_state ();
2760 RouteAdded (new_routes); /* EMIT SIGNAL */
2764 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
2766 ChanCount existing_inputs;
2767 ChanCount existing_outputs;
2768 uint32_t order = next_control_id();
2770 if (_order_hint > -1) {
2771 order = _order_hint;
2775 count_existing_track_channels (existing_inputs, existing_outputs);
2778 RCUWriter<RouteList> writer (routes);
2779 boost::shared_ptr<RouteList> r = writer.get_copy ();
2780 r->insert (r->end(), new_routes.begin(), new_routes.end());
2782 /* if there is no control out and we're not in the middle of loading,
2783 resort the graph here. if there is a control out, we will resort
2784 toward the end of this method. if we are in the middle of loading,
2785 we will resort when done.
2788 if (!_monitor_out && IO::connecting_legal) {
2789 resort_routes_using (r);
2793 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2795 boost::weak_ptr<Route> wpr (*x);
2796 boost::shared_ptr<Route> r (*x);
2798 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2799 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2800 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2801 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2802 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2803 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2805 if (r->is_master()) {
2809 if (r->is_monitor()) {
2813 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2815 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2816 track_playlist_changed (boost::weak_ptr<Track> (tr));
2817 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
2819 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2821 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2822 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2827 if (input_auto_connect || output_auto_connect) {
2828 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
2831 /* order keys are a GUI responsibility but we need to set up
2832 reasonable defaults because they also affect the remote control
2833 ID in most situations.
2836 if (!r->has_order_key ()) {
2837 if (r->is_auditioner()) {
2838 /* use an arbitrarily high value */
2839 r->set_order_key (UINT_MAX);
2841 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
2842 r->set_order_key (order);
2850 if (_monitor_out && IO::connecting_legal) {
2851 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
2853 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2854 if ((*x)->is_monitor()) {
2856 } else if ((*x)->is_master()) {
2859 (*x)->enable_monitor_send ();
2866 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2868 boost::shared_ptr<RouteList> r = routes.reader ();
2869 boost::shared_ptr<Send> s;
2871 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2872 if ((s = (*i)->internal_send_for (dest)) != 0) {
2873 s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO);
2879 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2881 boost::shared_ptr<RouteList> r = routes.reader ();
2882 boost::shared_ptr<Send> s;
2884 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2885 if ((s = (*i)->internal_send_for (dest)) != 0) {
2886 s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY);
2892 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2894 boost::shared_ptr<RouteList> r = routes.reader ();
2895 boost::shared_ptr<Send> s;
2897 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2898 if ((s = (*i)->internal_send_for (dest)) != 0) {
2899 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2904 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2906 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2908 boost::shared_ptr<RouteList> r = routes.reader ();
2909 boost::shared_ptr<RouteList> t (new RouteList);
2911 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2912 /* no MIDI sends because there are no MIDI busses yet */
2913 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2918 add_internal_sends (dest, p, t);
2922 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2924 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2925 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
2930 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
2932 add_internal_send (dest, sender->before_processor_for_index (index), sender);
2936 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
2938 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
2942 if (!dest->internal_return()) {
2943 dest->add_internal_return ();
2946 sender->add_aux_send (dest, before);
2952 Session::remove_route (boost::shared_ptr<Route> route)
2954 if (route == _master_out) {
2958 route->set_solo (false, this);
2961 RCUWriter<RouteList> writer (routes);
2962 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2966 /* deleting the master out seems like a dumb
2967 idea, but its more of a UI policy issue
2971 if (route == _master_out) {
2972 _master_out = boost::shared_ptr<Route> ();
2975 if (route == _monitor_out) {
2976 _monitor_out.reset ();
2979 /* writer goes out of scope, forces route list update */
2982 update_route_solo_state ();
2984 // We need to disconnect the route's inputs and outputs
2986 route->input()->disconnect (0);
2987 route->output()->disconnect (0);
2989 /* if the route had internal sends sending to it, remove them */
2990 if (route->internal_return()) {
2992 boost::shared_ptr<RouteList> r = routes.reader ();
2993 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2994 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2996 (*i)->remove_processor (s);
3001 /* if the monitoring section had a pointer to this route, remove it */
3002 if (_monitor_out && !route->is_master() && !route->is_monitor()) {
3003 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3004 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
3005 route->remove_aux_or_listen (_monitor_out);
3008 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
3009 if (mt && mt->step_editing()) {
3010 if (_step_editors > 0) {
3015 update_latency_compensation ();
3018 /* Re-sort routes to remove the graph's current references to the one that is
3019 * going away, then flush old references out of the graph.
3023 if (_process_graph) {
3024 _process_graph->clear_other_chain ();
3027 /* get rid of it from the dead wood collection in the route list manager */
3029 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
3033 /* try to cause everyone to drop their references */
3035 route->drop_references ();
3037 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
3039 /* save the new state of the world */
3041 if (save_state (_current_snapshot_name)) {
3042 save_history (_current_snapshot_name);
3044 reassign_track_numbers();
3046 update_route_record_state ();
3050 Session::route_mute_changed (void* /*src*/)
3056 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3058 boost::shared_ptr<Route> route = wpr.lock();
3060 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
3064 if (route->listening_via_monitor ()) {
3066 if (Config->get_exclusive_solo()) {
3067 /* new listen: disable all other listen */
3068 boost::shared_ptr<RouteList> r = routes.reader ();
3069 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3070 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3073 (*i)->set_listen (false, this);
3079 } else if (_listen_cnt > 0) {
3084 update_route_solo_state ();
3087 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3089 boost::shared_ptr<Route> route = wpr.lock ();
3092 /* should not happen */
3093 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
3097 bool send_changed = false;
3099 if (route->solo_isolated()) {
3100 if (_solo_isolated_cnt == 0) {
3101 send_changed = true;
3103 _solo_isolated_cnt++;
3104 } else if (_solo_isolated_cnt > 0) {
3105 _solo_isolated_cnt--;
3106 if (_solo_isolated_cnt == 0) {
3107 send_changed = true;
3112 IsolatedChanged (); /* EMIT SIGNAL */
3117 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
3119 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
3121 if (!self_solo_change) {
3122 // session doesn't care about changes to soloed-by-others
3126 if (solo_update_disabled) {
3128 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
3132 boost::shared_ptr<Route> route = wpr.lock ();
3135 boost::shared_ptr<RouteList> r = routes.reader ();
3138 if (route->self_soloed()) {
3144 RouteGroup* rg = route->route_group ();
3145 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
3147 if (delta == 1 && Config->get_exclusive_solo()) {
3149 /* new solo: disable all other solos, but not the group if its solo-enabled */
3151 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3152 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3153 (leave_group_alone && ((*i)->route_group() == rg))) {
3156 (*i)->set_solo (false, this);
3160 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3162 solo_update_disabled = true;
3164 RouteList uninvolved;
3166 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
3168 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3169 bool via_sends_only;
3170 bool in_signal_flow;
3172 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3173 (leave_group_alone && ((*i)->route_group() == rg))) {
3177 in_signal_flow = false;
3179 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3181 if ((*i)->feeds (route, &via_sends_only)) {
3182 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3183 if (!via_sends_only) {
3184 if (!route->soloed_by_others_upstream()) {
3185 (*i)->mod_solo_by_others_downstream (delta);
3188 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3190 in_signal_flow = true;
3192 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3195 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3197 if (route->feeds (*i, &via_sends_only)) {
3198 /* propagate solo upstream only if routing other than
3199 sends is involved, but do consider the other route
3200 (*i) to be part of the signal flow even if only
3203 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3207 route->soloed_by_others_downstream(),
3208 route->soloed_by_others_upstream()));
3209 if (!via_sends_only) {
3210 if (!route->soloed_by_others_downstream()) {
3211 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3212 (*i)->mod_solo_by_others_upstream (delta);
3214 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
3217 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3219 in_signal_flow = true;
3221 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3224 if (!in_signal_flow) {
3225 uninvolved.push_back (*i);
3229 solo_update_disabled = false;
3230 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3232 update_route_solo_state (r);
3234 /* now notify that the mute state of the routes not involved in the signal
3235 pathway of the just-solo-changed route may have altered.
3238 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3239 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
3240 (*i)->act_on_mute ();
3241 (*i)->mute_changed (this);
3244 SoloChanged (); /* EMIT SIGNAL */
3249 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
3251 /* now figure out if anything that matters is soloed (or is "listening")*/
3253 bool something_soloed = false;
3254 uint32_t listeners = 0;
3255 uint32_t isolated = 0;
3258 r = routes.reader();
3261 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3262 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
3263 something_soloed = true;
3266 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
3267 if (Config->get_solo_control_is_listen_control()) {
3270 (*i)->set_listen (false, this);
3274 if ((*i)->solo_isolated()) {
3279 if (something_soloed != _non_soloed_outs_muted) {
3280 _non_soloed_outs_muted = something_soloed;
3281 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
3284 _listen_cnt = listeners;
3286 if (isolated != _solo_isolated_cnt) {
3287 _solo_isolated_cnt = isolated;
3288 IsolatedChanged (); /* EMIT SIGNAL */
3291 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
3292 something_soloed, listeners, isolated));
3295 boost::shared_ptr<RouteList>
3296 Session::get_routes_with_internal_returns() const
3298 boost::shared_ptr<RouteList> r = routes.reader ();
3299 boost::shared_ptr<RouteList> rl (new RouteList);
3301 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3302 if ((*i)->internal_return ()) {
3310 Session::io_name_is_legal (const std::string& name)
3312 boost::shared_ptr<RouteList> r = routes.reader ();
3314 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3315 if ((*i)->name() == name) {
3319 if ((*i)->has_io_processor_named (name)) {
3328 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
3331 vector<string> connections;
3333 /* if we are passed only a single route and we're not told to turn
3334 * others off, then just do the simple thing.
3337 if (flip_others == false && rl->size() == 1) {
3338 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
3340 mt->set_input_active (onoff);
3345 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
3347 PortSet& ps ((*rt)->input()->ports());
3349 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
3350 p->get_connections (connections);
3353 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
3354 routes_using_input_from (*s, rl2);
3357 /* scan all relevant routes to see if others are on or off */
3359 bool others_are_already_on = false;
3361 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3363 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3369 if ((*r) != (*rt)) {
3370 if (mt->input_active()) {
3371 others_are_already_on = true;
3374 /* this one needs changing */
3375 mt->set_input_active (onoff);
3381 /* globally reverse other routes */
3383 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3384 if ((*r) != (*rt)) {
3385 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3387 mt->set_input_active (!others_are_already_on);
3396 Session::routes_using_input_from (const string& str, RouteList& rl)
3398 boost::shared_ptr<RouteList> r = routes.reader();
3400 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3401 if ((*i)->input()->connected_to (str)) {
3407 boost::shared_ptr<Route>
3408 Session::route_by_name (string name)
3410 boost::shared_ptr<RouteList> r = routes.reader ();
3412 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3413 if ((*i)->name() == name) {
3418 return boost::shared_ptr<Route> ((Route*) 0);
3421 boost::shared_ptr<Route>
3422 Session::route_by_id (PBD::ID id)
3424 boost::shared_ptr<RouteList> r = routes.reader ();
3426 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3427 if ((*i)->id() == id) {
3432 return boost::shared_ptr<Route> ((Route*) 0);
3435 boost::shared_ptr<Track>
3436 Session::track_by_diskstream_id (PBD::ID id)
3438 boost::shared_ptr<RouteList> r = routes.reader ();
3440 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3441 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3442 if (t && t->using_diskstream_id (id)) {
3447 return boost::shared_ptr<Track> ();
3450 boost::shared_ptr<Route>
3451 Session::route_by_remote_id (uint32_t id)
3453 boost::shared_ptr<RouteList> r = routes.reader ();
3455 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3456 if ((*i)->remote_control_id() == id) {
3461 return boost::shared_ptr<Route> ((Route*) 0);
3466 Session::reassign_track_numbers ()
3470 RouteList r (*(routes.reader ()));
3471 SignalOrderRouteSorter sorter;
3474 StateProtector sp (this);
3476 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3477 if (boost::dynamic_pointer_cast<Track> (*i)) {
3478 (*i)->set_track_number(++tn);
3480 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
3481 (*i)->set_track_number(--bn);
3484 const uint32_t decimals = ceilf (log10f (tn + 1));
3485 const bool decimals_changed = _track_number_decimals != decimals;
3486 _track_number_decimals = decimals;
3488 if (decimals_changed && config.get_track_name_number ()) {
3489 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3490 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3492 t->resync_track_name();
3495 // trigger GUI re-layout
3496 config.ParameterChanged("track-name-number");
3501 Session::playlist_region_added (boost::weak_ptr<Region> w)
3503 boost::shared_ptr<Region> r = w.lock ();
3508 /* These are the operations that are currently in progress... */
3509 list<GQuark> curr = _current_trans_quarks;
3512 /* ...and these are the operations during which we want to update
3513 the session range location markers.
3516 ops.push_back (Operations::capture);
3517 ops.push_back (Operations::paste);
3518 ops.push_back (Operations::duplicate_region);
3519 ops.push_back (Operations::insert_file);
3520 ops.push_back (Operations::insert_region);
3521 ops.push_back (Operations::drag_region_brush);
3522 ops.push_back (Operations::region_drag);
3523 ops.push_back (Operations::selection_grab);
3524 ops.push_back (Operations::region_fill);
3525 ops.push_back (Operations::fill_selection);
3526 ops.push_back (Operations::create_region);
3527 ops.push_back (Operations::region_copy);
3528 ops.push_back (Operations::fixed_time_region_copy);
3531 /* See if any of the current operations match the ones that we want */
3533 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
3535 /* If so, update the session range markers */
3537 maybe_update_session_range (r->position (), r->last_frame ());
3541 /** Update the session range markers if a is before the current start or
3542 * b is after the current end.
3545 Session::maybe_update_session_range (framepos_t a, framepos_t b)
3547 if (_state_of_the_state & Loading) {
3551 if (_session_range_location == 0) {
3553 add_session_range_location (a, b);
3557 if (a < _session_range_location->start()) {
3558 _session_range_location->set_start (a);
3561 if (b > _session_range_location->end()) {
3562 _session_range_location->set_end (b);
3568 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
3570 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3571 maybe_update_session_range (i->to, i->to + i->length);
3576 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
3578 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3579 maybe_update_session_range (i->from, i->to);
3583 /* Region management */
3585 boost::shared_ptr<Region>
3586 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
3588 const RegionFactory::RegionMap& regions (RegionFactory::regions());
3589 RegionFactory::RegionMap::const_iterator i;
3590 boost::shared_ptr<Region> region;
3592 Glib::Threads::Mutex::Lock lm (region_lock);
3594 for (i = regions.begin(); i != regions.end(); ++i) {
3598 if (region->whole_file()) {
3600 if (child->source_equivalent (region)) {
3606 return boost::shared_ptr<Region> ();
3610 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
3612 set<boost::shared_ptr<Region> > relevant_regions;
3614 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
3615 RegionFactory::get_regions_using_source (*s, relevant_regions);
3618 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
3619 set<boost::shared_ptr<Region> >::iterator tmp;
3624 playlists->destroy_region (*r);
3625 RegionFactory::map_remove (*r);
3627 (*r)->drop_sources ();
3628 (*r)->drop_references ();
3630 relevant_regions.erase (r);
3635 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
3638 Glib::Threads::Mutex::Lock ls (source_lock);
3639 /* remove from the main source list */
3640 sources.erase ((*s)->id());
3643 (*s)->mark_for_remove ();
3644 (*s)->drop_references ();
3653 Session::remove_last_capture ()
3655 list<boost::shared_ptr<Source> > srcs;
3657 boost::shared_ptr<RouteList> rl = routes.reader ();
3658 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3659 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3664 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
3667 srcs.insert (srcs.end(), l.begin(), l.end());
3672 destroy_sources (srcs);
3674 save_state (_current_snapshot_name);
3679 /* Source Management */
3682 Session::add_source (boost::shared_ptr<Source> source)
3684 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
3685 pair<SourceMap::iterator,bool> result;
3687 entry.first = source->id();
3688 entry.second = source;
3691 Glib::Threads::Mutex::Lock lm (source_lock);
3692 result = sources.insert (entry);
3695 if (result.second) {
3697 /* yay, new source */
3699 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
3702 if (!fs->within_session()) {
3703 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
3709 boost::shared_ptr<AudioFileSource> afs;
3711 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
3712 if (Config->get_auto_analyse_audio()) {
3713 Analyser::queue_source_for_analysis (source, false);
3717 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
3722 Session::remove_source (boost::weak_ptr<Source> src)
3724 if (_state_of_the_state & Deletion) {
3728 SourceMap::iterator i;
3729 boost::shared_ptr<Source> source = src.lock();
3736 Glib::Threads::Mutex::Lock lm (source_lock);
3738 if ((i = sources.find (source->id())) != sources.end()) {
3743 if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
3745 /* save state so we don't end up with a session file
3746 referring to non-existent sources.
3749 save_state (_current_snapshot_name);
3753 boost::shared_ptr<Source>
3754 Session::source_by_id (const PBD::ID& id)
3756 Glib::Threads::Mutex::Lock lm (source_lock);
3757 SourceMap::iterator i;
3758 boost::shared_ptr<Source> source;
3760 if ((i = sources.find (id)) != sources.end()) {
3767 boost::shared_ptr<AudioFileSource>
3768 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
3770 /* Restricted to audio files because only audio sources have channel
3774 Glib::Threads::Mutex::Lock lm (source_lock);
3776 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
3777 boost::shared_ptr<AudioFileSource> afs
3778 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
3780 if (afs && afs->path() == path && chn == afs->channel()) {
3785 return boost::shared_ptr<AudioFileSource>();
3788 boost::shared_ptr<MidiSource>
3789 Session::midi_source_by_path (const std::string& path) const
3791 /* Restricted to MIDI files because audio sources require a channel
3792 for unique identification, in addition to a path.
3795 Glib::Threads::Mutex::Lock lm (source_lock);
3797 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
3798 boost::shared_ptr<MidiSource> ms
3799 = boost::dynamic_pointer_cast<MidiSource>(s->second);
3800 boost::shared_ptr<FileSource> fs
3801 = boost::dynamic_pointer_cast<FileSource>(s->second);
3803 if (ms && fs && fs->path() == path) {
3808 return boost::shared_ptr<MidiSource>();
3812 Session::count_sources_by_origin (const string& path)
3815 Glib::Threads::Mutex::Lock lm (source_lock);
3817 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3818 boost::shared_ptr<FileSource> fs
3819 = boost::dynamic_pointer_cast<FileSource>(i->second);
3821 if (fs && fs->origin() == path) {
3830 Session::peak_path (string base) const
3832 if (Glib::path_is_absolute (base)) {
3834 /* rip the session dir from the audiofile source */
3836 string session_path;
3837 string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
3838 bool in_another_session = true;
3840 if (base.find (interchange_dir_string) != string::npos) {
3842 session_path = Glib::path_get_dirname (base); /* now ends in audiofiles */
3843 session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
3844 session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
3845 session_path = Glib::path_get_dirname (session_path); /* now has session path */
3847 /* see if it is within our session */
3849 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3850 if (i->path == session_path) {
3851 in_another_session = false;
3856 in_another_session = false;
3860 if (in_another_session) {
3861 SessionDirectory sd (session_path);
3862 return Glib::build_filename (sd.peak_path(), Glib::path_get_basename (base) + peakfile_suffix);
3866 base = Glib::path_get_basename (base);
3867 return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
3871 Session::new_audio_source_path_for_embedded (const std::string& path)
3875 * we know that the filename is already unique because it exists
3876 * out in the filesystem.
3878 * However, when we bring it into the session, we could get a
3881 * Eg. two embedded files:
3886 * When merged into session, these collide.
3888 * There will not be a conflict with in-memory sources
3889 * because when the source was created we already picked
3890 * a unique name for it.
3892 * This collision is not likely to be common, but we have to guard
3893 * against it. So, if there is a collision, take the md5 hash of the
3894 * the path, and use that as the filename instead.
3897 SessionDirectory sdir (get_best_session_directory_for_new_audio());
3898 string base = Glib::path_get_basename (path);
3899 string newpath = Glib::build_filename (sdir.sound_path(), base);
3901 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
3905 md5.digestString (path.c_str());
3906 md5.writeToString ();
3907 base = md5.digestChars;
3909 string ext = get_suffix (path);
3916 newpath = Glib::build_filename (sdir.sound_path(), base);
3918 /* if this collides, we're screwed */
3920 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
3921 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
3930 /** Return true if there are no audio file sources that use @param name as
3931 * the filename component of their path.
3933 * Return false otherwise.
3935 * This method MUST ONLY be used to check in-session, mono files since it
3936 * hard-codes the channel of the audio file source we are looking for as zero.
3938 * If/when Ardour supports native files in non-mono formats, the logic here
3939 * will need to be revisited.
3942 Session::audio_source_name_is_unique (const string& name)
3944 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
3945 vector<space_and_path>::iterator i;
3946 uint32_t existing = 0;
3948 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
3950 /* note that we search *without* the extension so that
3951 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3952 in the event that this new name is required for
3953 a file format change.
3956 const string spath = *i;
3958 if (matching_unsuffixed_filename_exists_in (spath, name)) {
3963 /* it is possible that we have the path already
3964 * assigned to a source that has not yet been written
3965 * (ie. the write source for a diskstream). we have to
3966 * check this in order to make sure that our candidate
3967 * path isn't used again, because that can lead to
3968 * two Sources point to the same file with different
3969 * notions of their removability.
3973 string possible_path = Glib::build_filename (spath, name);
3975 if (audio_source_by_path_and_channel (possible_path, 0)) {
3981 return (existing == 0);
3985 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)
3988 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3992 sstr << setfill ('0') << setw (4) << cnt;
3993 sstr << legalized_base;
3995 sstr << legalized_base;
3997 if (take_required || related_exists) {
4009 } else if (nchan > 2) {
4014 /* XXX what? more than 26 channels! */
4025 /** Return a unique name based on \a base for a new internal audio source */
4027 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
4030 string possible_name;
4031 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
4033 bool some_related_source_name_exists = false;
4035 legalized = legalize_for_path (base);
4037 // Find a "version" of the base name that doesn't exist in any of the possible directories.
4039 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
4041 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
4043 if (audio_source_name_is_unique (possible_name)) {
4047 some_related_source_name_exists = true;
4050 error << string_compose(
4051 _("There are already %1 recordings for %2, which I consider too many."),
4052 limit, base) << endmsg;
4054 throw failed_constructor();
4058 /* We've established that the new name does not exist in any session
4059 * directory, so now find out which one we should use for this new
4063 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4065 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
4070 /** Return a unique name based on `base` for a new internal MIDI source */
4072 Session::new_midi_source_path (const string& base)
4075 char buf[PATH_MAX+1];
4076 const uint32_t limit = 10000;
4078 string possible_path;
4079 string possible_name;
4082 legalized = legalize_for_path (base);
4084 // Find a "version" of the file name that doesn't exist in any of the possible directories.
4085 std::vector<string> sdirs = source_search_path(DataType::MIDI);
4087 /* - the main session folder is the first in the vector.
4088 * - after checking all locations for file-name uniqueness,
4089 * we keep the one from the last iteration as new file name
4090 * - midi files are small and should just be kept in the main session-folder
4092 * -> reverse the array, check main session folder last and use that as location
4095 std::reverse(sdirs.begin(), sdirs.end());
4097 for (cnt = 1; cnt <= limit; ++cnt) {
4099 vector<space_and_path>::iterator i;
4100 uint32_t existing = 0;
4102 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4104 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
4105 possible_name = buf;
4107 possible_path = Glib::build_filename (*i, possible_name);
4109 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
4113 if (midi_source_by_path (possible_path)) {
4118 if (existing == 0) {
4123 error << string_compose(
4124 _("There are already %1 recordings for %2, which I consider too many."),
4125 limit, base) << endmsg;
4131 /* No need to "find best location" for software/app-based RAID, because
4132 MIDI is so small that we always put it in the same place.
4135 return possible_path;
4139 /** Create a new within-session audio source */
4140 boost::shared_ptr<AudioFileSource>
4141 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
4143 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
4145 if (!path.empty()) {
4146 return boost::dynamic_pointer_cast<AudioFileSource> (
4147 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
4149 throw failed_constructor ();
4153 /** Create a new within-session MIDI source */
4154 boost::shared_ptr<MidiSource>
4155 Session::create_midi_source_for_session (string const & basic_name)
4157 const string path = new_midi_source_path (basic_name);
4159 if (!path.empty()) {
4160 return boost::dynamic_pointer_cast<SMFSource> (
4161 SourceFactory::createWritable (
4162 DataType::MIDI, *this, path, false, frame_rate()));
4164 throw failed_constructor ();
4168 /** Create a new within-session MIDI source */
4169 boost::shared_ptr<MidiSource>
4170 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
4172 /* the caller passes in the track the source will be used in,
4173 so that we can keep the numbering sane.
4175 Rationale: a track with the name "Foo" that has had N
4176 captures carried out so far will ALREADY have a write source
4177 named "Foo-N+1.mid" waiting to be used for the next capture.
4179 If we call new_midi_source_name() we will get "Foo-N+2". But
4180 there is no region corresponding to "Foo-N+1", so when
4181 "Foo-N+2" appears in the track, the gap presents the user
4182 with odd behaviour - why did it skip past Foo-N+1?
4184 We could explain this to the user in some odd way, but
4185 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
4188 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
4191 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
4193 std::string name = track->steal_write_source_name ();
4196 return boost::shared_ptr<MidiSource>();
4199 /* MIDI files are small, just put them in the first location of the
4200 session source search path.
4203 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
4205 return boost::dynamic_pointer_cast<SMFSource> (
4206 SourceFactory::createWritable (
4207 DataType::MIDI, *this, path, false, frame_rate()));
4212 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
4214 if (playlist->hidden()) {
4218 playlists->add (playlist);
4221 playlist->release();
4228 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
4230 if (_state_of_the_state & Deletion) {
4234 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
4240 playlists->remove (playlist);
4246 Session::set_audition (boost::shared_ptr<Region> r)
4248 pending_audition_region = r;
4249 add_post_transport_work (PostTransportAudition);
4250 _butler->schedule_transport_work ();
4254 Session::audition_playlist ()
4256 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4257 ev->region.reset ();
4262 Session::non_realtime_set_audition ()
4264 assert (pending_audition_region);
4265 auditioner->audition_region (pending_audition_region);
4266 pending_audition_region.reset ();
4267 AuditionActive (true); /* EMIT SIGNAL */
4271 Session::audition_region (boost::shared_ptr<Region> r)
4273 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4279 Session::cancel_audition ()
4284 if (auditioner->auditioning()) {
4285 auditioner->cancel_audition ();
4286 AuditionActive (false); /* EMIT SIGNAL */
4291 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
4293 if (a->is_monitor()) {
4296 if (b->is_monitor()) {
4299 return a->order_key () < b->order_key ();
4303 Session::is_auditioning () const
4305 /* can be called before we have an auditioner object */
4307 return auditioner->auditioning();
4314 Session::graph_reordered ()
4316 /* don't do this stuff if we are setting up connections
4317 from a set_state() call or creating new tracks. Ditto for deletion.
4320 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
4324 /* every track/bus asked for this to be handled but it was deferred because
4325 we were connecting. do it now.
4328 request_input_change_handling ();
4332 /* force all diskstreams to update their capture offset values to
4333 reflect any changes in latencies within the graph.
4336 boost::shared_ptr<RouteList> rl = routes.reader ();
4337 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4338 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4340 tr->set_capture_offset ();
4345 /** @return Number of frames that there is disk space available to write,
4348 boost::optional<framecnt_t>
4349 Session::available_capture_duration ()
4351 Glib::Threads::Mutex::Lock lm (space_lock);
4353 if (_total_free_4k_blocks_uncertain) {
4354 return boost::optional<framecnt_t> ();
4357 float sample_bytes_on_disk = 4.0; // keep gcc happy
4359 switch (config.get_native_file_data_format()) {
4361 sample_bytes_on_disk = 4.0;
4365 sample_bytes_on_disk = 3.0;
4369 sample_bytes_on_disk = 2.0;
4373 /* impossible, but keep some gcc versions happy */
4374 fatal << string_compose (_("programming error: %1"),
4375 X_("illegal native file data format"))
4377 abort(); /*NOTREACHED*/
4380 double scale = 4096.0 / sample_bytes_on_disk;
4382 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
4383 return max_framecnt;
4386 return (framecnt_t) floor (_total_free_4k_blocks * scale);
4390 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
4393 RCUWriter<BundleList> writer (_bundles);
4394 boost::shared_ptr<BundleList> b = writer.get_copy ();
4395 b->push_back (bundle);
4399 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4406 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
4408 bool removed = false;
4411 RCUWriter<BundleList> writer (_bundles);
4412 boost::shared_ptr<BundleList> b = writer.get_copy ();
4413 BundleList::iterator i = find (b->begin(), b->end(), bundle);
4415 if (i != b->end()) {
4422 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4428 boost::shared_ptr<Bundle>
4429 Session::bundle_by_name (string name) const
4431 boost::shared_ptr<BundleList> b = _bundles.reader ();
4433 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
4434 if ((*i)->name() == name) {
4439 return boost::shared_ptr<Bundle> ();
4443 Session::tempo_map_changed (const PropertyChange&)
4447 playlists->update_after_tempo_map_change ();
4449 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
4455 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
4457 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
4458 (*i)->recompute_frames_from_bbt ();
4462 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
4463 * the given count with the current block size.
4466 Session::ensure_buffers (ChanCount howmany)
4468 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
4472 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
4474 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4475 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
4480 Session::next_insert_id ()
4482 /* this doesn't really loop forever. just think about it */
4485 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
4486 if (!insert_bitset[n]) {
4487 insert_bitset[n] = true;
4493 /* none available, so resize and try again */
4495 insert_bitset.resize (insert_bitset.size() + 16, false);
4500 Session::next_send_id ()
4502 /* this doesn't really loop forever. just think about it */
4505 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
4506 if (!send_bitset[n]) {
4507 send_bitset[n] = true;
4513 /* none available, so resize and try again */
4515 send_bitset.resize (send_bitset.size() + 16, false);
4520 Session::next_aux_send_id ()
4522 /* this doesn't really loop forever. just think about it */
4525 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
4526 if (!aux_send_bitset[n]) {
4527 aux_send_bitset[n] = true;
4533 /* none available, so resize and try again */
4535 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
4540 Session::next_return_id ()
4542 /* this doesn't really loop forever. just think about it */
4545 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
4546 if (!return_bitset[n]) {
4547 return_bitset[n] = true;
4553 /* none available, so resize and try again */
4555 return_bitset.resize (return_bitset.size() + 16, false);
4560 Session::mark_send_id (uint32_t id)
4562 if (id >= send_bitset.size()) {
4563 send_bitset.resize (id+16, false);
4565 if (send_bitset[id]) {
4566 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
4568 send_bitset[id] = true;
4572 Session::mark_aux_send_id (uint32_t id)
4574 if (id >= aux_send_bitset.size()) {
4575 aux_send_bitset.resize (id+16, false);
4577 if (aux_send_bitset[id]) {
4578 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
4580 aux_send_bitset[id] = true;
4584 Session::mark_return_id (uint32_t id)
4586 if (id >= return_bitset.size()) {
4587 return_bitset.resize (id+16, false);
4589 if (return_bitset[id]) {
4590 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
4592 return_bitset[id] = true;
4596 Session::mark_insert_id (uint32_t id)
4598 if (id >= insert_bitset.size()) {
4599 insert_bitset.resize (id+16, false);
4601 if (insert_bitset[id]) {
4602 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
4604 insert_bitset[id] = true;
4608 Session::unmark_send_id (uint32_t id)
4610 if (id < send_bitset.size()) {
4611 send_bitset[id] = false;
4616 Session::unmark_aux_send_id (uint32_t id)
4618 if (id < aux_send_bitset.size()) {
4619 aux_send_bitset[id] = false;
4624 Session::unmark_return_id (uint32_t id)
4626 if (id < return_bitset.size()) {
4627 return_bitset[id] = false;
4632 Session::unmark_insert_id (uint32_t id)
4634 if (id < insert_bitset.size()) {
4635 insert_bitset[id] = false;
4640 Session::reset_native_file_format ()
4642 boost::shared_ptr<RouteList> rl = routes.reader ();
4643 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4644 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4646 /* don't save state as we do this, there's no point
4649 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
4650 tr->reset_write_sources (false);
4651 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
4657 Session::route_name_unique (string n) const
4659 boost::shared_ptr<RouteList> r = routes.reader ();
4661 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4662 if ((*i)->name() == n) {
4671 Session::route_name_internal (string n) const
4673 if (auditioner && auditioner->name() == n) {
4677 if (_click_io && _click_io->name() == n) {
4685 Session::freeze_all (InterThreadInfo& itt)
4687 boost::shared_ptr<RouteList> r = routes.reader ();
4689 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4691 boost::shared_ptr<Track> t;
4693 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
4694 /* XXX this is wrong because itt.progress will keep returning to zero at the start
4704 boost::shared_ptr<Region>
4705 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
4706 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
4707 InterThreadInfo& itt,
4708 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
4709 bool for_export, bool for_freeze)
4711 boost::shared_ptr<Region> result;
4712 boost::shared_ptr<Playlist> playlist;
4713 boost::shared_ptr<Source> source;
4714 ChanCount diskstream_channels (track.n_channels());
4715 framepos_t position;
4716 framecnt_t this_chunk;
4718 framepos_t latency_skip;
4720 framepos_t len = end - start;
4721 bool need_block_size_reset = false;
4722 ChanCount const max_proc = track.max_processor_streams ();
4723 string legal_playlist_name;
4724 string possible_path;
4727 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
4728 end, start) << endmsg;
4732 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
4733 include_endpoint, for_export, for_freeze);
4735 if (diskstream_channels.n(track.data_type()) < 1) {
4736 error << _("Cannot write a range with no data.") << endmsg;
4740 // block all process callback handling
4742 block_processing ();
4745 // synchronize with AudioEngine::process_callback()
4746 // make sure processing is not currently running
4747 // and processing_blocked() is honored before
4748 // acquiring thread buffers
4749 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
4752 _bounce_processing_active = true;
4754 /* call tree *MUST* hold route_lock */
4756 if ((playlist = track.playlist()) == 0) {
4760 legal_playlist_name = legalize_for_path (playlist->name());
4762 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
4764 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
4765 string path = ((track.data_type() == DataType::AUDIO)
4766 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
4767 : new_midi_source_path (legal_playlist_name));
4774 source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
4777 catch (failed_constructor& err) {
4778 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
4782 srcs.push_back (source);
4785 /* tell redirects that care that we are about to use a much larger
4786 * blocksize. this will flush all plugins too, so that they are ready
4787 * to be used for this process.
4790 need_block_size_reset = true;
4791 track.set_block_size (bounce_chunk_size);
4792 _engine.main_thread()->get_buffers ();
4796 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
4798 /* create a set of reasonably-sized buffers */
4799 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4800 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
4802 buffers.set_count (max_proc);
4804 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4805 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4806 boost::shared_ptr<MidiSource> ms;
4808 afs->prepare_for_peakfile_writes ();
4809 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
4810 Source::Lock lock(ms->mutex());
4811 ms->mark_streaming_write_started(lock);
4815 while (to_do && !itt.cancel) {
4817 this_chunk = min (to_do, bounce_chunk_size);
4819 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
4823 start += this_chunk;
4824 to_do -= this_chunk;
4825 itt.progress = (float) (1.0 - ((double) to_do / len));
4827 if (latency_skip >= bounce_chunk_size) {
4828 latency_skip -= bounce_chunk_size;
4832 const framecnt_t current_chunk = this_chunk - latency_skip;
4835 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4836 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4837 boost::shared_ptr<MidiSource> ms;
4840 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
4843 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
4844 Source::Lock lock(ms->mutex());
4846 const MidiBuffer& buf = buffers.get_midi(0);
4847 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
4848 Evoral::Event<framepos_t> ev = *i;
4849 ev.set_time(ev.time() - position);
4850 ms->append_event_frames(lock, ev, ms->timeline_position());
4857 /* post-roll, pick up delayed processor output */
4858 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
4860 while (latency_skip && !itt.cancel) {
4861 this_chunk = min (latency_skip, bounce_chunk_size);
4862 latency_skip -= this_chunk;
4864 buffers.silence (this_chunk, 0);
4865 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
4868 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4869 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4872 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
4884 xnow = localtime (&now);
4886 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
4887 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4888 boost::shared_ptr<MidiSource> ms;
4891 afs->update_header (position, *xnow, now);
4892 afs->flush_header ();
4893 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
4894 Source::Lock lock(ms->mutex());
4895 ms->mark_streaming_write_completed(lock);
4899 /* construct a region to represent the bounced material */
4903 plist.add (Properties::start, 0);
4904 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4905 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4907 result = RegionFactory::create (srcs, plist);
4913 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4914 (*src)->mark_for_remove ();
4915 (*src)->drop_references ();
4919 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4920 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4923 afs->done_with_peakfile_writes ();
4927 _bounce_processing_active = false;
4929 if (need_block_size_reset) {
4930 _engine.main_thread()->drop_buffers ();
4931 track.set_block_size (get_block_size());
4934 unblock_processing ();
4940 Session::gain_automation_buffer() const
4942 return ProcessThread::gain_automation_buffer ();
4946 Session::trim_automation_buffer() const
4948 return ProcessThread::trim_automation_buffer ();
4952 Session::send_gain_automation_buffer() const
4954 return ProcessThread::send_gain_automation_buffer ();
4958 Session::pan_automation_buffer() const
4960 return ProcessThread::pan_automation_buffer ();
4964 Session::get_silent_buffers (ChanCount count)
4966 return ProcessThread::get_silent_buffers (count);
4970 Session::get_scratch_buffers (ChanCount count, bool silence)
4972 return ProcessThread::get_scratch_buffers (count, silence);
4976 Session::get_route_buffers (ChanCount count, bool silence)
4978 return ProcessThread::get_route_buffers (count, silence);
4983 Session::get_mix_buffers (ChanCount count)
4985 return ProcessThread::get_mix_buffers (count);
4989 Session::ntracks () const
4992 boost::shared_ptr<RouteList> r = routes.reader ();
4994 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4995 if (boost::dynamic_pointer_cast<Track> (*i)) {
5004 Session::nbusses () const
5007 boost::shared_ptr<RouteList> r = routes.reader ();
5009 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5010 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
5019 Session::add_automation_list(AutomationList *al)
5021 automation_lists[al->id()] = al;
5024 /** @return true if there is at least one record-enabled track, otherwise false */
5026 Session::have_rec_enabled_track () const
5028 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
5032 Session::have_rec_disabled_track () const
5034 return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
5037 /** Update the state of our rec-enabled tracks flag */
5039 Session::update_route_record_state ()
5041 boost::shared_ptr<RouteList> rl = routes.reader ();
5042 RouteList::iterator i = rl->begin();
5043 while (i != rl->end ()) {
5045 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5046 if (tr && tr->record_enabled ()) {
5053 int const old = g_atomic_int_get (&_have_rec_enabled_track);
5055 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
5057 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
5058 RecordStateChanged (); /* EMIT SIGNAL */
5063 while (i != rl->end ()) {
5065 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5066 if (tr && !tr->record_enabled ()) {
5073 g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
5077 Session::listen_position_changed ()
5079 boost::shared_ptr<RouteList> r = routes.reader ();
5081 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5082 (*i)->listen_position_changed ();
5087 Session::solo_control_mode_changed ()
5089 /* cancel all solo or all listen when solo control mode changes */
5092 set_solo (get_routes(), false);
5093 } else if (listening()) {
5094 set_listen (get_routes(), false);
5098 /** Called when a property of one of our route groups changes */
5100 Session::route_group_property_changed (RouteGroup* rg)
5102 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
5105 /** Called when a route is added to one of our route groups */
5107 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5109 RouteAddedToRouteGroup (rg, r);
5112 /** Called when a route is removed from one of our route groups */
5114 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5116 update_route_record_state ();
5117 RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
5120 boost::shared_ptr<RouteList>
5121 Session::get_tracks () const
5123 boost::shared_ptr<RouteList> rl = routes.reader ();
5124 boost::shared_ptr<RouteList> tl (new RouteList);
5126 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
5127 if (boost::dynamic_pointer_cast<Track> (*r)) {
5128 if (!(*r)->is_auditioner()) {
5136 boost::shared_ptr<RouteList>
5137 Session::get_routes_with_regions_at (framepos_t const p) const
5139 boost::shared_ptr<RouteList> r = routes.reader ();
5140 boost::shared_ptr<RouteList> rl (new RouteList);
5142 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5143 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5148 boost::shared_ptr<Playlist> pl = tr->playlist ();
5153 if (pl->has_region_at (p)) {
5162 Session::goto_end ()
5164 if (_session_range_location) {
5165 request_locate (_session_range_location->end(), false);
5167 request_locate (0, false);
5172 Session::goto_start ()
5174 if (_session_range_location) {
5175 request_locate (_session_range_location->start(), false);
5177 request_locate (0, false);
5182 Session::current_start_frame () const
5184 return _session_range_location ? _session_range_location->start() : 0;
5188 Session::current_end_frame () const
5190 return _session_range_location ? _session_range_location->end() : 0;
5194 Session::add_session_range_location (framepos_t start, framepos_t end)
5196 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
5197 _locations->add (_session_range_location);
5201 Session::step_edit_status_change (bool yn)
5207 send = (_step_editors == 0);
5212 send = (_step_editors == 1);
5215 if (_step_editors > 0) {
5221 StepEditStatusChange (val);
5227 Session::start_time_changed (framepos_t old)
5229 /* Update the auto loop range to match the session range
5230 (unless the auto loop range has been changed by the user)
5233 Location* s = _locations->session_range_location ();
5238 Location* l = _locations->auto_loop_location ();
5240 if (l && l->start() == old) {
5241 l->set_start (s->start(), true);
5246 Session::end_time_changed (framepos_t old)
5248 /* Update the auto loop range to match the session range
5249 (unless the auto loop range has been changed by the user)
5252 Location* s = _locations->session_range_location ();
5257 Location* l = _locations->auto_loop_location ();
5259 if (l && l->end() == old) {
5260 l->set_end (s->end(), true);
5264 std::vector<std::string>
5265 Session::source_search_path (DataType type) const
5269 if (session_dirs.size() == 1) {
5271 case DataType::AUDIO:
5272 sp.push_back (_session_dir->sound_path());
5274 case DataType::MIDI:
5275 sp.push_back (_session_dir->midi_path());
5279 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
5280 SessionDirectory sdir (i->path);
5282 case DataType::AUDIO:
5283 sp.push_back (sdir.sound_path());
5285 case DataType::MIDI:
5286 sp.push_back (sdir.midi_path());
5292 if (type == DataType::AUDIO) {
5293 const string sound_path_2X = _session_dir->sound_path_2X();
5294 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
5295 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
5296 sp.push_back (sound_path_2X);
5301 // now check the explicit (possibly user-specified) search path
5304 case DataType::AUDIO:
5305 sp += Searchpath(config.get_audio_search_path ());
5307 case DataType::MIDI:
5308 sp += Searchpath(config.get_midi_search_path ());
5316 Session::ensure_search_path_includes (const string& path, DataType type)
5325 case DataType::AUDIO:
5326 sp += Searchpath(config.get_audio_search_path ());
5328 case DataType::MIDI:
5329 sp += Searchpath (config.get_midi_search_path ());
5333 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
5334 /* No need to add this new directory if it has the same inode as
5335 an existing one; checking inode rather than name prevents duplicated
5336 directories when we are using symlinks.
5338 On Windows, I think we could just do if (*i == path) here.
5340 if (PBD::equivalent_paths (*i, path)) {
5348 case DataType::AUDIO:
5349 config.set_audio_search_path (sp.to_string());
5351 case DataType::MIDI:
5352 config.set_midi_search_path (sp.to_string());
5358 Session::remove_dir_from_search_path (const string& dir, DataType type)
5363 case DataType::AUDIO:
5364 sp = Searchpath(config.get_audio_search_path ());
5366 case DataType::MIDI:
5367 sp = Searchpath (config.get_midi_search_path ());
5374 case DataType::AUDIO:
5375 config.set_audio_search_path (sp.to_string());
5377 case DataType::MIDI:
5378 config.set_midi_search_path (sp.to_string());
5384 boost::shared_ptr<Speakers>
5385 Session::get_speakers()
5391 Session::unknown_processors () const
5395 boost::shared_ptr<RouteList> r = routes.reader ();
5396 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5397 list<string> t = (*i)->unknown_processors ();
5398 copy (t.begin(), t.end(), back_inserter (p));
5408 Session::update_latency (bool playback)
5410 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
5412 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
5416 boost::shared_ptr<RouteList> r = routes.reader ();
5417 framecnt_t max_latency = 0;
5420 /* reverse the list so that we work backwards from the last route to run to the first */
5421 RouteList* rl = routes.reader().get();
5422 r.reset (new RouteList (*rl));
5423 reverse (r->begin(), r->end());
5426 /* compute actual latency values for the given direction and store them all in per-port
5427 structures. this will also publish the same values (to JACK) so that computation of latency
5428 for routes can consistently use public latency values.
5431 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5432 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
5435 /* because we latency compensate playback, our published playback latencies should
5436 be the same for all output ports - all material played back by ardour has
5437 the same latency, whether its caused by plugins or by latency compensation. since
5438 these may differ from the values computed above, reset all playback port latencies
5442 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
5444 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5445 (*i)->set_public_port_latencies (max_latency, playback);
5450 post_playback_latency ();
5454 post_capture_latency ();
5457 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
5461 Session::post_playback_latency ()
5463 set_worst_playback_latency ();
5465 boost::shared_ptr<RouteList> r = routes.reader ();
5467 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5468 if (!(*i)->is_auditioner() && ((*i)->active())) {
5469 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
5473 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5474 (*i)->set_latency_compensation (_worst_track_latency);
5479 Session::post_capture_latency ()
5481 set_worst_capture_latency ();
5483 /* reflect any changes in capture latencies into capture offsets
5486 boost::shared_ptr<RouteList> rl = routes.reader();
5487 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5488 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5490 tr->set_capture_offset ();
5496 Session::initialize_latencies ()
5499 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5500 update_latency (false);
5501 update_latency (true);
5504 set_worst_io_latencies ();
5508 Session::set_worst_io_latencies ()
5510 set_worst_playback_latency ();
5511 set_worst_capture_latency ();
5515 Session::set_worst_playback_latency ()
5517 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5521 _worst_output_latency = 0;
5523 if (!_engine.connected()) {
5527 boost::shared_ptr<RouteList> r = routes.reader ();
5529 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5530 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
5533 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
5537 Session::set_worst_capture_latency ()
5539 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5543 _worst_input_latency = 0;
5545 if (!_engine.connected()) {
5549 boost::shared_ptr<RouteList> r = routes.reader ();
5551 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5552 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
5555 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
5559 Session::update_latency_compensation (bool force_whole_graph)
5561 bool some_track_latency_changed = false;
5563 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5567 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
5569 _worst_track_latency = 0;
5571 boost::shared_ptr<RouteList> r = routes.reader ();
5573 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5574 if (!(*i)->is_auditioner() && ((*i)->active())) {
5576 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
5577 some_track_latency_changed = true;
5579 _worst_track_latency = max (tl, _worst_track_latency);
5583 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
5584 (some_track_latency_changed ? "yes" : "no")));
5586 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
5588 if (some_track_latency_changed || force_whole_graph) {
5589 _engine.update_latencies ();
5593 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5594 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5598 tr->set_capture_offset ();
5603 Session::session_name_is_legal (const string& path)
5605 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
5607 for (int i = 0; illegal_chars[i]; ++i) {
5608 if (path.find (illegal_chars[i]) != string::npos) {
5609 return illegal_chars[i];
5617 Session::next_control_id () const
5621 /* the monitor bus remote ID is in a different
5622 * "namespace" than regular routes. its existence doesn't
5623 * affect normal (low) numbered routes.
5630 return nroutes() - subtract;
5634 Session::notify_remote_id_change ()
5636 if (deletion_in_progress()) {
5640 switch (Config->get_remote_model()) {
5642 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
5650 Session::sync_order_keys ()
5652 if (deletion_in_progress()) {
5656 /* tell everyone that something has happened to the sort keys
5657 and let them sync up with the change(s)
5658 this will give objects that manage the sort order keys the
5659 opportunity to keep them in sync if they wish to.
5662 DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
5664 reassign_track_numbers();
5666 Route::SyncOrderKeys (); /* EMIT SIGNAL */
5668 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
5672 Session::operation_in_progress (GQuark op) const
5674 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
5677 boost::shared_ptr<Port>
5678 Session::ltc_input_port () const
5680 return _ltc_input->nth (0);
5683 boost::shared_ptr<Port>
5684 Session::ltc_output_port () const
5686 return _ltc_output->nth (0);
5690 Session::reconnect_ltc_input ()
5694 string src = Config->get_ltc_source_port();
5696 _ltc_input->disconnect (this);
5698 if (src != _("None") && !src.empty()) {
5699 _ltc_input->nth (0)->connect (src);
5705 Session::reconnect_ltc_output ()
5710 string src = Config->get_ltc_sink_port();
5712 _ltc_output->disconnect (this);
5714 if (src != _("None") && !src.empty()) {
5715 _ltc_output->nth (0)->connect (src);