2 Copyright (C) 1999-2010 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #include <cstdio> /* sprintf(3) ... grrr */
33 #include <glibmm/threads.h>
34 #include <glibmm/miscutils.h>
35 #include <glibmm/fileutils.h>
37 #include <boost/algorithm/string/erase.hpp>
39 #include "pbd/error.h"
40 #include "pbd/boost_debug.h"
41 #include "pbd/pathscanner.h"
42 #include "pbd/stl_delete.h"
43 #include "pbd/basename.h"
44 #include "pbd/stacktrace.h"
45 #include "pbd/file_utils.h"
46 #include "pbd/convert.h"
47 #include "pbd/unwind.h"
48 #include "pbd/search_path.h"
50 #include "ardour/amp.h"
51 #include "ardour/analyser.h"
52 #include "ardour/async_midi_port.h"
53 #include "ardour/audio_buffer.h"
54 #include "ardour/audio_diskstream.h"
55 #include "ardour/audio_port.h"
56 #include "ardour/audio_track.h"
57 #include "ardour/audioengine.h"
58 #include "ardour/audiofilesource.h"
59 #include "ardour/auditioner.h"
60 #include "ardour/buffer_manager.h"
61 #include "ardour/buffer_set.h"
62 #include "ardour/bundle.h"
63 #include "ardour/butler.h"
64 #include "ardour/click.h"
65 #include "ardour/control_protocol_manager.h"
66 #include "ardour/data_type.h"
67 #include "ardour/debug.h"
68 #include "ardour/filename_extensions.h"
69 #include "ardour/graph.h"
70 #include "ardour/midiport_manager.h"
71 #include "ardour/midi_track.h"
72 #include "ardour/midi_ui.h"
73 #include "ardour/operations.h"
74 #include "ardour/playlist.h"
75 #include "ardour/plugin.h"
76 #include "ardour/plugin_insert.h"
77 #include "ardour/process_thread.h"
78 #include "ardour/rc_configuration.h"
79 #include "ardour/recent_sessions.h"
80 #include "ardour/region.h"
81 #include "ardour/region_factory.h"
82 #include "ardour/route_graph.h"
83 #include "ardour/route_group.h"
84 #include "ardour/send.h"
85 #include "ardour/session.h"
86 #include "ardour/session_directory.h"
87 #include "ardour/session_playlists.h"
88 #include "ardour/smf_source.h"
89 #include "ardour/source_factory.h"
90 #include "ardour/speakers.h"
91 #include "ardour/utils.h"
93 #include "midi++/port.h"
94 #include "midi++/mmc.h"
105 using namespace ARDOUR;
108 bool Session::_disable_all_loaded_plugins = false;
110 PBD::Signal1<int,uint32_t> Session::AudioEngineSetupRequired;
111 PBD::Signal1<void,std::string> Session::Dialog;
112 PBD::Signal0<int> Session::AskAboutPendingState;
113 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
114 PBD::Signal0<void> Session::SendFeedback;
115 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
117 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
118 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
119 PBD::Signal2<void,std::string, std::string> Session::Exported;
120 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
121 PBD::Signal0<void> Session::Quit;
122 PBD::Signal0<void> Session::FeedbackDetected;
123 PBD::Signal0<void> Session::SuccessfulGraphSort;
124 PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
126 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
127 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
129 /** @param snapshot_name Snapshot name, without .ardour suffix */
130 Session::Session (AudioEngine &eng,
131 const string& fullpath,
132 const string& snapshot_name,
133 BusProfile* bus_profile,
135 : playlists (new SessionPlaylists)
137 , process_function (&Session::process_with_events)
138 , waiting_for_sync_offset (false)
139 , _base_frame_rate (0)
140 , _current_frame_rate (0)
141 , _nominal_frame_rate (0)
142 , transport_sub_state (0)
143 , _record_status (Disabled)
144 , _transport_frame (0)
145 , _session_range_location (0)
148 , _transport_speed (0)
149 , _default_transport_speed (1.0)
150 , _last_transport_speed (0)
151 , _target_transport_speed (0.0)
152 , auto_play_legal (false)
153 , _last_slave_transport_frame (0)
154 , maximum_output_latency (0)
155 , _requested_return_frame (-1)
156 , current_block_size (0)
157 , _worst_output_latency (0)
158 , _worst_input_latency (0)
159 , _worst_track_latency (0)
160 , _have_captured (false)
163 , _non_soloed_outs_muted (false)
165 , _solo_isolated_cnt (0)
167 , _was_seamless (Config->get_seamless_loop ())
168 , _under_nsm_control (false)
169 , delta_accumulator_cnt (0)
170 , average_slave_delta (1800) // !!! why 1800 ???
172 , have_first_delta_accumulator (false)
173 , _slave_state (Stopped)
174 , post_export_sync (false)
175 , post_export_position (0)
177 , _export_started (false)
178 , _export_rolling (false)
179 , _pre_export_mmc_enabled (false)
180 , _name (snapshot_name)
182 , _send_qf_mtc (false)
183 , _pframes_since_last_mtc (0)
184 , session_midi_feedback (0)
186 , loop_changing (false)
188 , _session_dir (new SessionDirectory (fullpath))
189 , _current_snapshot_name (snapshot_name)
191 , state_was_pending (false)
192 , _state_of_the_state (StateOfTheState(CannotSave|InitialConnecting|Loading))
193 , _last_roll_location (0)
194 , _last_roll_or_reversal_location (0)
195 , _last_record_location (0)
196 , pending_locate_roll (false)
197 , pending_locate_frame (0)
198 , pending_locate_flush (false)
199 , pending_abort (false)
200 , pending_auto_loop (false)
201 , _butler (new Butler (*this))
202 , _post_transport_work (0)
203 , cumulative_rf_motion (0)
205 , _locations (new Locations (*this))
207 , outbound_mtc_timecode_frame (0)
208 , next_quarter_frame_to_send (-1)
209 , _frames_per_timecode_frame (0)
210 , _frames_per_hour (0)
211 , _timecode_frames_per_hour (0)
212 , last_timecode_valid (false)
213 , last_timecode_when (0)
214 , _send_timecode_update (false)
226 , ltc_timecode_offset (0)
227 , ltc_timecode_negative_offset (false)
228 , midi_control_ui (0)
230 , _all_route_group (new RouteGroup (*this, "all"))
231 , routes (new RouteList)
232 , _adding_routes_in_progress (false)
233 , destructive_index (0)
234 , solo_update_disabled (false)
235 , default_fade_steepness (0)
236 , default_fade_msecs (0)
237 , _total_free_4k_blocks (0)
238 , _total_free_4k_blocks_uncertain (false)
239 , no_questions_about_missing_files (false)
242 , _bundles (new BundleList)
243 , _bundle_xml_node (0)
247 , click_emphasis_data (0)
249 , click_emphasis_length (0)
250 , _clicks_cleared (0)
251 , _play_range (false)
253 , first_file_data_format_reset (true)
254 , first_file_header_format_reset (true)
255 , have_looped (false)
256 , _have_rec_enabled_track (false)
258 , _suspend_timecode_transmission (0)
259 , _speakers (new Speakers)
260 , ignore_route_processor_changes (false)
266 pre_engine_init (fullpath);
269 if (ensure_engine (sr)) {
271 throw failed_constructor ();
274 if (create (mix_template, bus_profile)) {
276 throw failed_constructor ();
281 if (load_state (_current_snapshot_name)) {
282 throw failed_constructor ();
285 /* try to get sample rate from XML state so that we
286 * can influence the SR if we set up the audio
291 const XMLProperty* prop;
292 if ((prop = state_tree->root()->property (X_("sample-rate"))) != 0) {
293 sr = atoi (prop->value());
297 if (ensure_engine (sr)) {
299 throw failed_constructor ();
303 if (post_engine_init ()) {
305 throw failed_constructor ();
308 store_recent_sessions (_name, _path);
310 bool was_dirty = dirty();
312 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
314 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
315 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
318 DirtyChanged (); /* EMIT SIGNAL */
321 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
322 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
326 /* hook us up to the engine since we are now completely constructed */
328 BootMessage (_("Connect to engine"));
330 _engine.set_session (this);
331 _engine.reset_timebase ();
333 BootMessage (_("Session loading complete"));
346 Session::ensure_engine (uint32_t desired_sample_rate)
348 if (_engine.current_backend() == 0) {
349 /* backend is unknown ... */
350 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
351 if (r.get_value_or (-1) != 0) {
354 } else if (_engine.setup_required()) {
355 /* backend is known, but setup is needed */
356 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
357 if (r.get_value_or (-1) != 0) {
360 } else if (!_engine.running()) {
361 if (_engine.start()) {
366 /* at this point the engine should be running
369 if (!_engine.running()) {
373 return immediately_post_engine ();
378 Session::immediately_post_engine ()
380 /* Do various initializations that should take place directly after we
381 * know that the engine is running, but before we either create a
382 * session or set state for an existing one.
385 if (how_many_dsp_threads () > 1) {
386 /* For now, only create the graph if we are using >1 DSP threads, as
387 it is a bit slower than the old code with 1 thread.
389 _process_graph.reset (new Graph (*this));
392 /* every time we reconnect, recompute worst case output latencies */
394 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
396 if (synced_to_jack()) {
397 _engine.transport_stop ();
400 if (config.get_jack_time_master()) {
401 _engine.transport_locate (_transport_frame);
405 BootMessage (_("Set up LTC"));
407 BootMessage (_("Set up Click"));
409 BootMessage (_("Set up standard connections"));
413 catch (failed_constructor& err) {
423 vector<void*> debug_pointers;
425 /* if we got to here, leaving pending capture state around
429 remove_pending_capture_state ();
431 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
433 /* disconnect from any and all signals that we are connected to */
437 _engine.remove_session ();
439 /* deregister all ports - there will be no process or any other
440 * callbacks from the engine any more.
443 Port::PortDrop (); /* EMIT SIGNAL */
447 /* clear history so that no references to objects are held any more */
451 /* clear state tree so that no references to objects are held any more */
455 /* reset dynamic state version back to default */
457 Stateful::loading_state_version = 0;
459 _butler->drop_references ();
463 delete midi_control_ui;
464 delete _all_route_group;
466 if (click_data != default_click) {
467 delete [] click_data;
470 if (click_emphasis_data != default_click_emphasis) {
471 delete [] click_emphasis_data;
476 /* clear out any pending dead wood from RCU managed objects */
481 AudioDiskstream::free_working_buffers();
483 /* tell everyone who is still standing that we're about to die */
486 /* tell everyone to drop references and delete objects as we go */
488 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
489 RegionFactory::delete_all_regions ();
491 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
493 /* reset these three references to special routes before we do the usual route delete thing */
496 _master_out.reset ();
497 _monitor_out.reset ();
500 RCUWriter<RouteList> writer (routes);
501 boost::shared_ptr<RouteList> r = writer.get_copy ();
503 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
504 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
505 (*i)->drop_references ();
509 /* writer goes out of scope and updates master */
513 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
514 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
515 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
516 i->second->drop_references ();
521 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
522 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
527 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
530 delete _mmc; _mmc = 0;
531 delete _midi_ports; _midi_ports = 0;
532 delete _locations; _locations = 0;
534 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
536 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
537 boost_debug_list_ptrs ();
542 Session::setup_ltc ()
546 _ltc_input.reset (new IO (*this, _("LTC In"), IO::Input));
547 _ltc_output.reset (new IO (*this, _("LTC Out"), IO::Output));
549 if (state_tree && (child = find_named_node (*state_tree->root(), "LTC-In")) != 0) {
550 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
553 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
554 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
556 reconnect_ltc_input ();
559 if (state_tree && (child = find_named_node (*state_tree->root(), "LTC-Out")) != 0) {
560 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
563 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
564 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
566 reconnect_ltc_output ();
569 /* fix up names of LTC ports because we don't want the normal
570 * IO style of NAME/TYPE-{in,out}N
573 _ltc_input->nth (0)->set_name (_("LTC-in"));
574 _ltc_output->nth (0)->set_name (_("LTC-out"));
578 Session::setup_click ()
583 _click_io.reset (new ClickIO (*this, "click"));
584 _click_gain.reset (new Amp (*this));
585 _click_gain->activate ();
587 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
589 /* existing state for Click */
592 if (Stateful::loading_state_version < 3000) {
593 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
595 const XMLNodeList& children (child->children());
596 XMLNodeList::const_iterator i = children.begin();
597 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
599 if (i != children.end()) {
600 c = _click_gain->set_state (**i, Stateful::loading_state_version);
606 _clicking = Config->get_clicking ();
610 error << _("could not setup Click I/O") << endmsg;
617 /* default state for Click: dual-mono to first 2 physical outputs */
620 _engine.get_physical_outputs (DataType::AUDIO, outs);
622 for (uint32_t physport = 0; physport < 2; ++physport) {
623 if (outs.size() > physport) {
624 if (_click_io->add_port (outs[physport], this)) {
625 // relax, even though its an error
630 if (_click_io->n_ports () > ChanCount::ZERO) {
631 _clicking = Config->get_clicking ();
637 Session::setup_bundles ()
639 vector<string> inputs[DataType::num_types];
640 vector<string> outputs[DataType::num_types];
641 for (uint32_t i = 0; i < DataType::num_types; ++i) {
642 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
643 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
646 /* Create a set of Bundle objects that map
647 to the physical I/O currently available. We create both
648 mono and stereo bundles, so that the common cases of mono
649 and stereo tracks get bundles to put in their mixer strip
650 in / out menus. There may be a nicer way of achieving that;
651 it doesn't really scale that well to higher channel counts
654 /* mono output bundles */
656 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
658 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
660 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
661 c->add_channel (_("mono"), DataType::AUDIO);
662 c->set_port (0, outputs[DataType::AUDIO][np]);
667 /* stereo output bundles */
669 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
670 if (np + 1 < outputs[DataType::AUDIO].size()) {
672 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
673 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
674 c->add_channel (_("L"), DataType::AUDIO);
675 c->set_port (0, outputs[DataType::AUDIO][np]);
676 c->add_channel (_("R"), DataType::AUDIO);
677 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
683 /* mono input bundles */
685 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
687 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
689 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
690 c->add_channel (_("mono"), DataType::AUDIO);
691 c->set_port (0, inputs[DataType::AUDIO][np]);
696 /* stereo input bundles */
698 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
699 if (np + 1 < inputs[DataType::AUDIO].size()) {
701 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
703 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
704 c->add_channel (_("L"), DataType::AUDIO);
705 c->set_port (0, inputs[DataType::AUDIO][np]);
706 c->add_channel (_("R"), DataType::AUDIO);
707 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
713 /* MIDI input bundles */
715 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
716 string n = inputs[DataType::MIDI][np];
717 boost::erase_first (n, X_("alsa_pcm:"));
719 boost::shared_ptr<Bundle> c (new Bundle (n, false));
720 c->add_channel ("", DataType::MIDI);
721 c->set_port (0, inputs[DataType::MIDI][np]);
725 /* MIDI output bundles */
727 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
728 string n = outputs[DataType::MIDI][np];
729 boost::erase_first (n, X_("alsa_pcm:"));
731 boost::shared_ptr<Bundle> c (new Bundle (n, true));
732 c->add_channel ("", DataType::MIDI);
733 c->set_port (0, outputs[DataType::MIDI][np]);
740 Session::auto_connect_master_bus ()
742 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
746 /* if requested auto-connect the outputs to the first N physical ports.
749 uint32_t limit = _master_out->n_outputs().n_total();
750 vector<string> outputs[DataType::num_types];
752 for (uint32_t i = 0; i < DataType::num_types; ++i) {
753 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
756 for (uint32_t n = 0; n < limit; ++n) {
757 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
759 if (outputs[p->type()].size() > n) {
760 connect_to = outputs[p->type()][n];
763 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
764 if (_master_out->output()->connect (p, connect_to, this)) {
765 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
774 Session::remove_monitor_section ()
780 /* force reversion to Solo-In-Place */
781 Config->set_solo_control_is_listen_control (false);
784 /* Hold process lock while doing this so that we don't hear bits and
785 * pieces of audio as we work on each route.
788 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
790 /* Connect tracks to monitor section. Note that in an
791 existing session, the internal sends will already exist, but we want the
792 routes to notice that they connect to the control out specifically.
796 boost::shared_ptr<RouteList> r = routes.reader ();
797 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
799 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
801 if ((*x)->is_monitor()) {
803 } else if ((*x)->is_master()) {
806 (*x)->remove_aux_or_listen (_monitor_out);
811 remove_route (_monitor_out);
812 auto_connect_master_bus ();
816 Session::add_monitor_section ()
820 if (_monitor_out || !_master_out) {
824 boost::shared_ptr<Route> r (new Route (*this, _("monitor"), Route::MonitorOut, DataType::AUDIO));
830 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
831 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
834 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
835 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
836 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
840 add_routes (rl, false, false, false);
842 assert (_monitor_out);
844 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
845 are undefined, at best.
848 uint32_t limit = _monitor_out->n_inputs().n_audio();
852 /* connect the inputs to the master bus outputs. this
853 * represents a separate data feed from the internal sends from
854 * each route. as of jan 2011, it allows the monitor section to
855 * conditionally ignore either the internal sends or the normal
856 * input feed, but we should really find a better way to do
860 _master_out->output()->disconnect (this);
862 for (uint32_t n = 0; n < limit; ++n) {
863 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
864 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
867 string connect_to = o->name();
868 if (_monitor_out->input()->connect (p, connect_to, this)) {
869 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
877 /* if monitor section is not connected, connect it to physical outs
880 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
882 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
884 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
887 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
889 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
890 Config->get_monitor_bus_preferred_bundle())
896 /* Monitor bus is audio only */
898 vector<string> outputs[DataType::num_types];
900 for (uint32_t i = 0; i < DataType::num_types; ++i) {
901 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
904 uint32_t mod = outputs[DataType::AUDIO].size();
905 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
909 for (uint32_t n = 0; n < limit; ++n) {
911 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
913 if (outputs[DataType::AUDIO].size() > (n % mod)) {
914 connect_to = outputs[DataType::AUDIO][n % mod];
917 if (!connect_to.empty()) {
918 if (_monitor_out->output()->connect (p, connect_to, this)) {
919 error << string_compose (
920 _("cannot connect control output %1 to %2"),
931 /* Hold process lock while doing this so that we don't hear bits and
932 * pieces of audio as we work on each route.
935 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
937 /* Connect tracks to monitor section. Note that in an
938 existing session, the internal sends will already exist, but we want the
939 routes to notice that they connect to the control out specifically.
943 boost::shared_ptr<RouteList> rls = routes.reader ();
945 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
947 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
949 if ((*x)->is_monitor()) {
951 } else if ((*x)->is_master()) {
954 (*x)->enable_monitor_send ();
960 Session::hookup_io ()
962 /* stop graph reordering notifications from
963 causing resorts, etc.
966 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
970 /* we delay creating the auditioner till now because
971 it makes its own connections to ports.
975 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
977 throw failed_constructor ();
979 a->use_new_diskstream ();
983 catch (failed_constructor& err) {
984 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
988 /* load bundles, which we may have postponed earlier on */
989 if (_bundle_xml_node) {
990 load_bundles (*_bundle_xml_node);
991 delete _bundle_xml_node;
994 /* Tell all IO objects to connect themselves together */
996 IO::enable_connecting ();
998 /* Now tell all "floating" ports to connect to whatever
999 they should be connected to.
1002 AudioEngine::instance()->reconnect_ports ();
1004 /* Anyone who cares about input state, wake up and do something */
1006 IOConnectionsComplete (); /* EMIT SIGNAL */
1008 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
1010 /* now handle the whole enchilada as if it was one
1011 graph reorder event.
1016 /* update the full solo state, which can't be
1017 correctly determined on a per-route basis, but
1018 needs the global overview that only the session
1022 update_route_solo_state ();
1026 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
1028 boost::shared_ptr<Track> track = wp.lock ();
1033 boost::shared_ptr<Playlist> playlist;
1035 if ((playlist = track->playlist()) != 0) {
1036 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
1037 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
1038 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
1043 Session::record_enabling_legal () const
1045 /* this used to be in here, but survey says.... we don't need to restrict it */
1046 // if (record_status() == Recording) {
1050 if (Config->get_all_safe()) {
1057 Session::set_track_monitor_input_status (bool yn)
1059 boost::shared_ptr<RouteList> rl = routes.reader ();
1060 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1061 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1062 if (tr && tr->record_enabled ()) {
1063 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1064 tr->request_input_monitoring (yn);
1070 Session::auto_punch_start_changed (Location* location)
1072 replace_event (SessionEvent::PunchIn, location->start());
1074 if (get_record_enabled() && config.get_punch_in()) {
1075 /* capture start has been changed, so save new pending state */
1076 save_state ("", true);
1081 Session::auto_punch_end_changed (Location* location)
1083 framepos_t when_to_stop = location->end();
1084 // when_to_stop += _worst_output_latency + _worst_input_latency;
1085 replace_event (SessionEvent::PunchOut, when_to_stop);
1089 Session::auto_punch_changed (Location* location)
1091 framepos_t when_to_stop = location->end();
1093 replace_event (SessionEvent::PunchIn, location->start());
1094 //when_to_stop += _worst_output_latency + _worst_input_latency;
1095 replace_event (SessionEvent::PunchOut, when_to_stop);
1098 /** @param loc A loop location.
1099 * @param pos Filled in with the start time of the required fade-out (in session frames).
1100 * @param length Filled in with the length of the required fade-out.
1103 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
1105 pos = max (loc->start(), loc->end() - 64);
1106 length = loc->end() - pos;
1110 Session::auto_loop_changed (Location* location)
1112 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1115 auto_loop_declick_range (location, dcp, dcl);
1116 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1118 if (transport_rolling() && play_loop) {
1121 // if (_transport_frame > location->end()) {
1123 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1124 // relocate to beginning of loop
1125 clear_events (SessionEvent::LocateRoll);
1127 request_locate (location->start(), true);
1130 else if (Config->get_seamless_loop() && !loop_changing) {
1132 // schedule a locate-roll to refill the diskstreams at the
1133 // previous loop end
1134 loop_changing = true;
1136 if (location->end() > last_loopend) {
1137 clear_events (SessionEvent::LocateRoll);
1138 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1145 last_loopend = location->end();
1149 Session::set_auto_punch_location (Location* location)
1153 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1154 punch_connections.drop_connections();
1155 existing->set_auto_punch (false, this);
1156 remove_event (existing->start(), SessionEvent::PunchIn);
1157 clear_events (SessionEvent::PunchOut);
1158 auto_punch_location_changed (0);
1163 if (location == 0) {
1167 if (location->end() <= location->start()) {
1168 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1172 punch_connections.drop_connections ();
1174 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
1175 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
1176 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
1178 location->set_auto_punch (true, this);
1180 auto_punch_changed (location);
1182 auto_punch_location_changed (location);
1186 Session::set_auto_loop_location (Location* location)
1190 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1191 loop_connections.drop_connections ();
1192 existing->set_auto_loop (false, this);
1193 remove_event (existing->end(), SessionEvent::AutoLoop);
1196 auto_loop_declick_range (existing, dcp, dcl);
1197 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1198 auto_loop_location_changed (0);
1203 if (location == 0) {
1207 if (location->end() <= location->start()) {
1208 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1212 last_loopend = location->end();
1214 loop_connections.drop_connections ();
1216 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1217 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1218 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1220 location->set_auto_loop (true, this);
1222 /* take care of our stuff first */
1224 auto_loop_changed (location);
1226 /* now tell everyone else */
1228 auto_loop_location_changed (location);
1232 Session::locations_added (Location *)
1238 Session::locations_changed ()
1240 _locations->apply (*this, &Session::handle_locations_changed);
1244 Session::handle_locations_changed (Locations::LocationList& locations)
1246 Locations::LocationList::iterator i;
1248 bool set_loop = false;
1249 bool set_punch = false;
1251 for (i = locations.begin(); i != locations.end(); ++i) {
1255 if (location->is_auto_punch()) {
1256 set_auto_punch_location (location);
1259 if (location->is_auto_loop()) {
1260 set_auto_loop_location (location);
1264 if (location->is_session_range()) {
1265 _session_range_location = location;
1270 set_auto_loop_location (0);
1273 set_auto_punch_location (0);
1280 Session::enable_record ()
1282 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1283 /* no recording at anything except normal speed */
1288 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1290 if (rs == Recording) {
1294 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1296 _last_record_location = _transport_frame;
1297 _mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1299 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1300 set_track_monitor_input_status (true);
1303 RecordStateChanged ();
1310 Session::disable_record (bool rt_context, bool force)
1314 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1316 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1317 g_atomic_int_set (&_record_status, Disabled);
1318 _mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1320 if (rs == Recording) {
1321 g_atomic_int_set (&_record_status, Enabled);
1325 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1326 set_track_monitor_input_status (false);
1329 RecordStateChanged (); /* emit signal */
1332 remove_pending_capture_state ();
1338 Session::step_back_from_record ()
1340 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1342 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1343 set_track_monitor_input_status (false);
1346 RecordStateChanged (); /* emit signal */
1351 Session::maybe_enable_record ()
1353 if (_step_editors > 0) {
1357 g_atomic_int_set (&_record_status, Enabled);
1359 /* This function is currently called from somewhere other than an RT thread.
1360 This save_state() call therefore doesn't impact anything. Doing it here
1361 means that we save pending state of which sources the next record will use,
1362 which gives us some chance of recovering from a crash during the record.
1365 save_state ("", true);
1367 if (_transport_speed) {
1368 if (!config.get_punch_in()) {
1372 _mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1373 RecordStateChanged (); /* EMIT SIGNAL */
1380 Session::audible_frame () const
1386 /* the first of these two possible settings for "offset"
1387 mean that the audible frame is stationary until
1388 audio emerges from the latency compensation
1391 the second means that the audible frame is stationary
1392 until audio would emerge from a physical port
1393 in the absence of any plugin latency compensation
1396 offset = worst_playback_latency ();
1398 if (offset > current_block_size) {
1399 offset -= current_block_size;
1401 /* XXX is this correct? if we have no external
1402 physical connections and everything is internal
1403 then surely this is zero? still, how
1404 likely is that anyway?
1406 offset = current_block_size;
1409 if (synced_to_jack()) {
1410 tf = _engine.transport_frame();
1412 tf = _transport_frame;
1417 if (!non_realtime_work_pending()) {
1421 /* Check to see if we have passed the first guaranteed
1422 audible frame past our last start position. if not,
1423 return that last start point because in terms
1424 of audible frames, we have not moved yet.
1426 `Start position' in this context means the time we last
1427 either started, located, or changed transport direction.
1430 if (_transport_speed > 0.0f) {
1432 if (!play_loop || !have_looped) {
1433 if (tf < _last_roll_or_reversal_location + offset) {
1434 return _last_roll_or_reversal_location;
1442 } else if (_transport_speed < 0.0f) {
1444 /* XXX wot? no backward looping? */
1446 if (tf > _last_roll_or_reversal_location - offset) {
1447 return _last_roll_or_reversal_location;
1459 Session::set_frame_rate (framecnt_t frames_per_second)
1461 /** \fn void Session::set_frame_size(framecnt_t)
1462 the AudioEngine object that calls this guarantees
1463 that it will not be called while we are also in
1464 ::process(). Its fine to do things that block
1468 _base_frame_rate = frames_per_second;
1469 _nominal_frame_rate = frames_per_second;
1475 // XXX we need some equivalent to this, somehow
1476 // SndFileSource::setup_standard_crossfades (frames_per_second);
1480 /* XXX need to reset/reinstantiate all LADSPA plugins */
1484 Session::set_block_size (pframes_t nframes)
1486 /* the AudioEngine guarantees
1487 that it will not be called while we are also in
1488 ::process(). It is therefore fine to do things that block
1493 current_block_size = nframes;
1497 boost::shared_ptr<RouteList> r = routes.reader ();
1499 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1500 (*i)->set_block_size (nframes);
1503 boost::shared_ptr<RouteList> rl = routes.reader ();
1504 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1505 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1507 tr->set_block_size (nframes);
1511 set_worst_io_latencies ();
1517 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1519 boost::shared_ptr<Route> r2;
1521 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1522 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1526 /* make a copy of the existing list of routes that feed r1 */
1528 Route::FedBy existing (r1->fed_by());
1530 /* for each route that feeds r1, recurse, marking it as feeding
1534 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1535 if (!(r2 = i->r.lock ())) {
1536 /* (*i) went away, ignore it */
1540 /* r2 is a route that feeds r1 which somehow feeds base. mark
1541 base as being fed by r2
1544 rbase->add_fed_by (r2, i->sends_only);
1548 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1552 if (r1->feeds (r2) && r2->feeds (r1)) {
1556 /* now recurse, so that we can mark base as being fed by
1557 all routes that feed r2
1560 trace_terminal (r2, rbase);
1567 Session::resort_routes ()
1569 /* don't do anything here with signals emitted
1570 by Routes during initial setup or while we
1571 are being destroyed.
1574 if (_state_of_the_state & (InitialConnecting | Deletion)) {
1579 RCUWriter<RouteList> writer (routes);
1580 boost::shared_ptr<RouteList> r = writer.get_copy ();
1581 resort_routes_using (r);
1582 /* writer goes out of scope and forces update */
1586 boost::shared_ptr<RouteList> rl = routes.reader ();
1587 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1588 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1590 const Route::FedBy& fb ((*i)->fed_by());
1592 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1593 boost::shared_ptr<Route> sf = f->r.lock();
1595 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1603 /** This is called whenever we need to rebuild the graph of how we will process
1605 * @param r List of routes, in any order.
1609 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1611 /* We are going to build a directed graph of our routes;
1612 this is where the edges of that graph are put.
1617 /* Go through all routes doing two things:
1619 * 1. Collect the edges of the route graph. Each of these edges
1620 * is a pair of routes, one of which directly feeds the other
1621 * either by a JACK connection or by an internal send.
1623 * 2. Begin the process of making routes aware of which other
1624 * routes directly or indirectly feed them. This information
1625 * is used by the solo code.
1628 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1630 /* Clear out the route's list of direct or indirect feeds */
1631 (*i)->clear_fed_by ();
1633 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
1635 bool via_sends_only;
1637 /* See if this *j feeds *i according to the current state of the JACK
1638 connections and internal sends.
1640 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
1641 /* add the edge to the graph (part #1) */
1642 edges.add (*j, *i, via_sends_only);
1643 /* tell the route (for part #2) */
1644 (*i)->add_fed_by (*j, via_sends_only);
1649 /* Attempt a topological sort of the route graph */
1650 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
1652 if (sorted_routes) {
1653 /* We got a satisfactory topological sort, so there is no feedback;
1656 Note: the process graph rechain does not require a
1657 topologically-sorted list, but hey ho.
1659 if (_process_graph) {
1660 _process_graph->rechain (sorted_routes, edges);
1663 _current_route_graph = edges;
1665 /* Complete the building of the routes' lists of what directly
1666 or indirectly feeds them.
1668 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1669 trace_terminal (*i, *i);
1672 *r = *sorted_routes;
1675 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1676 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1677 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1678 (*i)->name(), (*i)->order_key (MixerSort)));
1682 SuccessfulGraphSort (); /* EMIT SIGNAL */
1685 /* The topological sort failed, so we have a problem. Tell everyone
1686 and stick to the old graph; this will continue to be processed, so
1687 until the feedback is fixed, what is played back will not quite
1688 reflect what is actually connected. Note also that we do not
1689 do trace_terminal here, as it would fail due to an endless recursion,
1690 so the solo code will think that everything is still connected
1694 FeedbackDetected (); /* EMIT SIGNAL */
1699 /** Find a route name starting with \a base, maybe followed by the
1700 * lowest \a id. \a id will always be added if \a definitely_add_number
1701 * is true on entry; otherwise it will only be added if required
1702 * to make the name unique.
1704 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1705 * The available route name with the lowest ID will be used, and \a id
1706 * will be set to the ID.
1708 * \return false if a route name could not be found, and \a track_name
1709 * and \a id do not reflect a free route name.
1712 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1714 if (!definitely_add_number && route_by_name (base) == 0) {
1715 /* juse use the base */
1716 snprintf (name, name_len, "%s", base.c_str());
1721 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1723 if (route_by_name (name) == 0) {
1729 } while (id < (UINT_MAX-1));
1734 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
1736 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
1738 in = ChanCount::ZERO;
1739 out = ChanCount::ZERO;
1741 boost::shared_ptr<RouteList> r = routes.reader ();
1743 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1744 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1745 if (tr && !tr->is_auditioner()) {
1746 in += tr->n_inputs();
1747 out += tr->n_outputs();
1752 /** Caller must not hold process lock
1753 * @param name_template string to use for the start of the name, or "" to use "MIDI".
1754 * @param instrument plugin info for the instrument to insert pre-fader, if any
1756 list<boost::shared_ptr<MidiTrack> >
1757 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
1758 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1760 char track_name[32];
1761 uint32_t track_id = 0;
1763 RouteList new_routes;
1764 list<boost::shared_ptr<MidiTrack> > ret;
1766 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
1769 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1770 error << "cannot find name for new midi track" << endmsg;
1774 boost::shared_ptr<MidiTrack> track;
1777 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1779 if (track->init ()) {
1783 track->use_new_diskstream();
1785 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1786 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1789 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1790 if (track->input()->ensure_io (input, false, this)) {
1791 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
1795 if (track->output()->ensure_io (output, false, this)) {
1796 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
1801 track->non_realtime_input_change();
1804 route_group->add (track);
1807 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1809 if (Config->get_remote_model() == UserOrdered) {
1810 track->set_remote_control_id (next_control_id());
1813 new_routes.push_back (track);
1814 ret.push_back (track);
1817 catch (failed_constructor &err) {
1818 error << _("Session: could not create new midi track.") << endmsg;
1822 catch (AudioEngine::PortRegistrationFailure& pfe) {
1824 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;
1832 if (!new_routes.empty()) {
1833 add_routes (new_routes, true, true, true);
1836 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
1837 PluginPtr plugin = instrument->load (*this);
1838 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
1839 (*r)->add_processor (p, PreFader);
1849 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
1851 boost::shared_ptr<Route> midi_track (wmt.lock());
1857 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
1859 if (change.after.n_audio() <= change.before.n_audio()) {
1863 /* new audio ports: make sure the audio goes somewhere useful,
1864 unless the user has no-auto-connect selected.
1866 The existing ChanCounts don't matter for this call as they are only
1867 to do with matching input and output indices, and we are only changing
1873 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
1877 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1878 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1879 * @param output_start As \a input_start, but for outputs.
1882 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
1883 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
1885 if (!IO::connecting_legal) {
1889 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1895 /* If both inputs and outputs are auto-connected to physical ports,
1896 use the max of input and output offsets to ensure auto-connected
1897 port numbers always match up (e.g. the first audio input and the
1898 first audio output of the route will have the same physical
1899 port number). Otherwise just use the lowest input or output
1903 DEBUG_TRACE (DEBUG::Graph,
1904 string_compose("Auto-connect: existing in = %1 out = %2\n",
1905 existing_inputs, existing_outputs));
1907 const bool in_out_physical =
1908 (Config->get_input_auto_connect() & AutoConnectPhysical)
1909 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1912 const ChanCount in_offset = in_out_physical
1913 ? ChanCount::max(existing_inputs, existing_outputs)
1916 const ChanCount out_offset = in_out_physical
1917 ? ChanCount::max(existing_inputs, existing_outputs)
1920 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1921 vector<string> physinputs;
1922 vector<string> physoutputs;
1924 _engine.get_physical_outputs (*t, physoutputs);
1925 _engine.get_physical_inputs (*t, physinputs);
1927 if (!physinputs.empty() && connect_inputs) {
1928 uint32_t nphysical_in = physinputs.size();
1930 DEBUG_TRACE (DEBUG::Graph,
1931 string_compose("There are %1 physical inputs of type %2\n",
1934 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1937 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1938 DEBUG_TRACE (DEBUG::Graph,
1939 string_compose("Get index %1 + %2 % %3 = %4\n",
1940 in_offset.get(*t), i, nphysical_in,
1941 (in_offset.get(*t) + i) % nphysical_in));
1942 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1945 DEBUG_TRACE (DEBUG::Graph,
1946 string_compose("Connect route %1 IN to %2\n",
1947 route->name(), port));
1949 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
1953 ChanCount one_added (*t, 1);
1954 existing_inputs += one_added;
1958 if (!physoutputs.empty()) {
1959 uint32_t nphysical_out = physoutputs.size();
1960 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
1963 if ((*t) == DataType::MIDI || Config->get_output_auto_connect() & AutoConnectPhysical) {
1964 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1965 } else if ((*t) == DataType::AUDIO && Config->get_output_auto_connect() & AutoConnectMaster) {
1966 /* master bus is audio only */
1967 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1968 port = _master_out->input()->ports().port(*t,
1969 i % _master_out->input()->n_ports().get(*t))->name();
1973 DEBUG_TRACE (DEBUG::Graph,
1974 string_compose("Connect route %1 OUT to %2\n",
1975 route->name(), port));
1977 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
1981 ChanCount one_added (*t, 1);
1982 existing_outputs += one_added;
1988 /** Caller must not hold process lock
1989 * @param name_template string to use for the start of the name, or "" to use "Audio".
1991 list< boost::shared_ptr<AudioTrack> >
1992 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
1993 uint32_t how_many, string name_template)
1995 char track_name[32];
1996 uint32_t track_id = 0;
1998 RouteList new_routes;
1999 list<boost::shared_ptr<AudioTrack> > ret;
2001 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
2004 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
2005 error << "cannot find name for new audio track" << endmsg;
2009 boost::shared_ptr<AudioTrack> track;
2012 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
2014 if (track->init ()) {
2018 track->use_new_diskstream();
2020 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2021 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2024 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2026 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2027 error << string_compose (
2028 _("cannot configure %1 in/%2 out configuration for new audio track"),
2029 input_channels, output_channels)
2034 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2035 error << string_compose (
2036 _("cannot configure %1 in/%2 out configuration for new audio track"),
2037 input_channels, output_channels)
2044 route_group->add (track);
2047 track->non_realtime_input_change();
2049 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2050 if (Config->get_remote_model() == UserOrdered) {
2051 track->set_remote_control_id (next_control_id());
2054 new_routes.push_back (track);
2055 ret.push_back (track);
2058 catch (failed_constructor &err) {
2059 error << _("Session: could not create new audio track.") << endmsg;
2063 catch (AudioEngine::PortRegistrationFailure& pfe) {
2065 error << pfe.what() << endmsg;
2073 if (!new_routes.empty()) {
2074 add_routes (new_routes, true, true, true);
2080 /** Caller must not hold process lock.
2081 * @param name_template string to use for the start of the name, or "" to use "Bus".
2084 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
2087 uint32_t bus_id = 0;
2091 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
2094 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
2095 error << "cannot find name for new audio bus" << endmsg;
2100 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
2106 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2107 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
2110 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2112 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2113 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2114 input_channels, output_channels)
2120 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2121 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2122 input_channels, output_channels)
2129 route_group->add (bus);
2131 if (Config->get_remote_model() == UserOrdered) {
2132 bus->set_remote_control_id (next_control_id());
2135 bus->add_internal_return ();
2137 ret.push_back (bus);
2143 catch (failed_constructor &err) {
2144 error << _("Session: could not create new audio route.") << endmsg;
2148 catch (AudioEngine::PortRegistrationFailure& pfe) {
2149 error << pfe.what() << endmsg;
2159 add_routes (ret, false, true, true); // autoconnect outputs only
2167 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base)
2170 uint32_t control_id;
2172 uint32_t number = 0;
2173 const uint32_t being_added = how_many;
2175 if (!tree.read (template_path.c_str())) {
2179 XMLNode* node = tree.root();
2181 IO::disable_connecting ();
2183 control_id = next_control_id ();
2187 XMLNode node_copy (*node);
2189 /* Remove IDs of everything so that new ones are used */
2190 node_copy.remove_property_recursively (X_("id"));
2195 if (!name_base.empty()) {
2197 /* if we're adding more than one routes, force
2198 * all the names of the new routes to be
2199 * numbered, via the final parameter.
2202 if (!find_route_name (name_base.c_str(), ++number, name, sizeof(name), (being_added > 1))) {
2203 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2209 string const route_name = node_copy.property(X_("name"))->value ();
2211 /* generate a new name by adding a number to the end of the template name */
2212 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2213 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2218 /* set this name in the XML description that we are about to use */
2219 Route::set_name_in_state (node_copy, name);
2221 /* trim bitslots from listen sends so that new ones are used */
2222 XMLNodeList children = node_copy.children ();
2223 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2224 if ((*i)->name() == X_("Processor")) {
2225 XMLProperty* role = (*i)->property (X_("role"));
2226 if (role && role->value() == X_("Listen")) {
2227 (*i)->remove_property (X_("bitslot"));
2232 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2235 error << _("Session: cannot create track/bus from template description") << endmsg;
2239 if (boost::dynamic_pointer_cast<Track>(route)) {
2240 /* force input/output change signals so that the new diskstream
2241 picks up the configuration of the route. During session
2242 loading this normally happens in a different way.
2245 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2247 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2248 change.after = route->input()->n_ports();
2249 route->input()->changed (change, this);
2250 change.after = route->output()->n_ports();
2251 route->output()->changed (change, this);
2254 route->set_remote_control_id (control_id);
2257 ret.push_back (route);
2260 catch (failed_constructor &err) {
2261 error << _("Session: could not create new route from template") << endmsg;
2265 catch (AudioEngine::PortRegistrationFailure& pfe) {
2266 error << pfe.what() << endmsg;
2275 add_routes (ret, true, true, true);
2276 IO::enable_connecting ();
2283 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
2286 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
2287 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
2290 error << _("Adding new tracks/busses failed") << endmsg;
2295 update_latency (true);
2296 update_latency (false);
2301 save_state (_current_snapshot_name);
2304 RouteAdded (new_routes); /* EMIT SIGNAL */
2308 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
2310 ChanCount existing_inputs;
2311 ChanCount existing_outputs;
2312 uint32_t order = next_control_id();
2314 count_existing_track_channels (existing_inputs, existing_outputs);
2317 RCUWriter<RouteList> writer (routes);
2318 boost::shared_ptr<RouteList> r = writer.get_copy ();
2319 r->insert (r->end(), new_routes.begin(), new_routes.end());
2321 /* if there is no control out and we're not in the middle of loading,
2322 resort the graph here. if there is a control out, we will resort
2323 toward the end of this method. if we are in the middle of loading,
2324 we will resort when done.
2327 if (!_monitor_out && IO::connecting_legal) {
2328 resort_routes_using (r);
2332 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2334 boost::weak_ptr<Route> wpr (*x);
2335 boost::shared_ptr<Route> r (*x);
2337 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2338 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2339 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2340 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2341 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2342 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2344 if (r->is_master()) {
2348 if (r->is_monitor()) {
2352 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2354 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2355 track_playlist_changed (boost::weak_ptr<Track> (tr));
2356 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2358 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2360 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2361 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2366 if (input_auto_connect || output_auto_connect) {
2367 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
2370 /* order keys are a GUI responsibility but we need to set up
2371 reasonable defaults because they also affect the remote control
2372 ID in most situations.
2375 if (!r->has_order_key (EditorSort)) {
2376 if (r->is_auditioner()) {
2377 /* use an arbitrarily high value */
2378 r->set_order_key (EditorSort, UINT_MAX);
2379 r->set_order_key (MixerSort, UINT_MAX);
2381 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
2382 r->set_order_key (EditorSort, order);
2383 r->set_order_key (MixerSort, order);
2391 if (_monitor_out && IO::connecting_legal) {
2392 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
2394 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2395 if ((*x)->is_monitor()) {
2397 } else if ((*x)->is_master()) {
2400 (*x)->enable_monitor_send ();
2407 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2409 boost::shared_ptr<RouteList> r = routes.reader ();
2410 boost::shared_ptr<Send> s;
2412 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2413 if ((s = (*i)->internal_send_for (dest)) != 0) {
2414 s->amp()->gain_control()->set_value (0.0);
2420 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2422 boost::shared_ptr<RouteList> r = routes.reader ();
2423 boost::shared_ptr<Send> s;
2425 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2426 if ((s = (*i)->internal_send_for (dest)) != 0) {
2427 s->amp()->gain_control()->set_value (1.0);
2433 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2435 boost::shared_ptr<RouteList> r = routes.reader ();
2436 boost::shared_ptr<Send> s;
2438 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2439 if ((s = (*i)->internal_send_for (dest)) != 0) {
2440 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2445 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2447 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2449 boost::shared_ptr<RouteList> r = routes.reader ();
2450 boost::shared_ptr<RouteList> t (new RouteList);
2452 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2453 /* no MIDI sends because there are no MIDI busses yet */
2454 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2459 add_internal_sends (dest, p, t);
2463 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2465 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2466 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
2471 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
2473 add_internal_send (dest, sender->before_processor_for_index (index), sender);
2477 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
2479 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
2483 if (!dest->internal_return()) {
2484 dest->add_internal_return ();
2487 sender->add_aux_send (dest, before);
2493 Session::remove_route (boost::shared_ptr<Route> route)
2495 if (route == _master_out) {
2499 route->set_solo (false, this);
2502 RCUWriter<RouteList> writer (routes);
2503 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2507 /* deleting the master out seems like a dumb
2508 idea, but its more of a UI policy issue
2512 if (route == _master_out) {
2513 _master_out = boost::shared_ptr<Route> ();
2516 if (route == _monitor_out) {
2517 _monitor_out.reset ();
2520 /* writer goes out of scope, forces route list update */
2523 update_route_solo_state ();
2525 // We need to disconnect the route's inputs and outputs
2527 route->input()->disconnect (0);
2528 route->output()->disconnect (0);
2530 /* if the route had internal sends sending to it, remove them */
2531 if (route->internal_return()) {
2533 boost::shared_ptr<RouteList> r = routes.reader ();
2534 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2535 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2537 (*i)->remove_processor (s);
2542 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2543 if (mt && mt->step_editing()) {
2544 if (_step_editors > 0) {
2549 update_latency_compensation ();
2552 /* Re-sort routes to remove the graph's current references to the one that is
2553 * going away, then flush old references out of the graph.
2557 if (_process_graph) {
2558 _process_graph->clear_other_chain ();
2561 /* get rid of it from the dead wood collection in the route list manager */
2563 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2567 /* try to cause everyone to drop their references */
2569 route->drop_references ();
2571 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2573 /* save the new state of the world */
2575 if (save_state (_current_snapshot_name)) {
2576 save_history (_current_snapshot_name);
2581 Session::route_mute_changed (void* /*src*/)
2587 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2589 boost::shared_ptr<Route> route = wpr.lock();
2591 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2595 if (route->listening_via_monitor ()) {
2597 if (Config->get_exclusive_solo()) {
2598 /* new listen: disable all other listen */
2599 boost::shared_ptr<RouteList> r = routes.reader ();
2600 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2601 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
2604 (*i)->set_listen (false, this);
2610 } else if (_listen_cnt > 0) {
2615 update_route_solo_state ();
2618 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2620 boost::shared_ptr<Route> route = wpr.lock ();
2623 /* should not happen */
2624 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2628 bool send_changed = false;
2630 if (route->solo_isolated()) {
2631 if (_solo_isolated_cnt == 0) {
2632 send_changed = true;
2634 _solo_isolated_cnt++;
2635 } else if (_solo_isolated_cnt > 0) {
2636 _solo_isolated_cnt--;
2637 if (_solo_isolated_cnt == 0) {
2638 send_changed = true;
2643 IsolatedChanged (); /* EMIT SIGNAL */
2648 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2650 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
2652 if (!self_solo_change) {
2653 // session doesn't care about changes to soloed-by-others
2657 if (solo_update_disabled) {
2659 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
2663 boost::shared_ptr<Route> route = wpr.lock ();
2666 boost::shared_ptr<RouteList> r = routes.reader ();
2669 if (route->self_soloed()) {
2675 RouteGroup* rg = route->route_group ();
2676 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
2678 if (delta == 1 && Config->get_exclusive_solo()) {
2680 /* new solo: disable all other solos, but not the group if its solo-enabled */
2682 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2683 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
2684 (leave_group_alone && ((*i)->route_group() == rg))) {
2687 (*i)->set_solo (false, this);
2691 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
2693 solo_update_disabled = true;
2695 RouteList uninvolved;
2697 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
2699 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2700 bool via_sends_only;
2701 bool in_signal_flow;
2703 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
2704 (leave_group_alone && ((*i)->route_group() == rg))) {
2708 in_signal_flow = false;
2710 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
2712 if ((*i)->feeds (route, &via_sends_only)) {
2713 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
2714 if (!via_sends_only) {
2715 if (!route->soloed_by_others_upstream()) {
2716 (*i)->mod_solo_by_others_downstream (delta);
2719 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
2721 in_signal_flow = true;
2723 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
2726 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
2728 if (route->feeds (*i, &via_sends_only)) {
2729 /* propagate solo upstream only if routing other than
2730 sends is involved, but do consider the other route
2731 (*i) to be part of the signal flow even if only
2734 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
2738 route->soloed_by_others_downstream(),
2739 route->soloed_by_others_upstream()));
2740 if (!via_sends_only) {
2741 if (!route->soloed_by_others_downstream()) {
2742 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
2743 (*i)->mod_solo_by_others_upstream (delta);
2745 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
2748 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
2750 in_signal_flow = true;
2752 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
2755 if (!in_signal_flow) {
2756 uninvolved.push_back (*i);
2760 solo_update_disabled = false;
2761 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
2763 update_route_solo_state (r);
2765 /* now notify that the mute state of the routes not involved in the signal
2766 pathway of the just-solo-changed route may have altered.
2769 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2770 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
2771 (*i)->mute_changed (this);
2774 SoloChanged (); /* EMIT SIGNAL */
2779 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2781 /* now figure out if anything that matters is soloed (or is "listening")*/
2783 bool something_soloed = false;
2784 uint32_t listeners = 0;
2785 uint32_t isolated = 0;
2788 r = routes.reader();
2791 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2792 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
2793 something_soloed = true;
2796 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
2797 if (Config->get_solo_control_is_listen_control()) {
2800 (*i)->set_listen (false, this);
2804 if ((*i)->solo_isolated()) {
2809 if (something_soloed != _non_soloed_outs_muted) {
2810 _non_soloed_outs_muted = something_soloed;
2811 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2814 _listen_cnt = listeners;
2816 if (isolated != _solo_isolated_cnt) {
2817 _solo_isolated_cnt = isolated;
2818 IsolatedChanged (); /* EMIT SIGNAL */
2821 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
2822 something_soloed, listeners, isolated));
2825 boost::shared_ptr<RouteList>
2826 Session::get_routes_with_internal_returns() const
2828 boost::shared_ptr<RouteList> r = routes.reader ();
2829 boost::shared_ptr<RouteList> rl (new RouteList);
2831 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2832 if ((*i)->internal_return ()) {
2840 Session::io_name_is_legal (const std::string& name)
2842 boost::shared_ptr<RouteList> r = routes.reader ();
2844 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2845 if ((*i)->name() == name) {
2849 if ((*i)->has_io_processor_named (name)) {
2858 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
2861 vector<string> connections;
2863 /* if we are passed only a single route and we're not told to turn
2864 * others off, then just do the simple thing.
2867 if (flip_others == false && rl->size() == 1) {
2868 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
2870 mt->set_input_active (onoff);
2875 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
2877 PortSet& ps ((*rt)->input()->ports());
2879 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
2880 p->get_connections (connections);
2883 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
2884 routes_using_input_from (*s, rl2);
2887 /* scan all relevant routes to see if others are on or off */
2889 bool others_are_already_on = false;
2891 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
2893 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2899 if ((*r) != (*rt)) {
2900 if (mt->input_active()) {
2901 others_are_already_on = true;
2904 /* this one needs changing */
2905 mt->set_input_active (onoff);
2911 /* globally reverse other routes */
2913 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
2914 if ((*r) != (*rt)) {
2915 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2917 mt->set_input_active (!others_are_already_on);
2926 Session::routes_using_input_from (const string& str, RouteList& rl)
2928 boost::shared_ptr<RouteList> r = routes.reader();
2930 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2931 if ((*i)->input()->connected_to (str)) {
2937 boost::shared_ptr<Route>
2938 Session::route_by_name (string name)
2940 boost::shared_ptr<RouteList> r = routes.reader ();
2942 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2943 if ((*i)->name() == name) {
2948 return boost::shared_ptr<Route> ((Route*) 0);
2951 boost::shared_ptr<Route>
2952 Session::route_by_id (PBD::ID id)
2954 boost::shared_ptr<RouteList> r = routes.reader ();
2956 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2957 if ((*i)->id() == id) {
2962 return boost::shared_ptr<Route> ((Route*) 0);
2965 boost::shared_ptr<Track>
2966 Session::track_by_diskstream_id (PBD::ID id)
2968 boost::shared_ptr<RouteList> r = routes.reader ();
2970 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2971 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
2972 if (t && t->using_diskstream_id (id)) {
2977 return boost::shared_ptr<Track> ();
2980 boost::shared_ptr<Route>
2981 Session::route_by_remote_id (uint32_t id)
2983 boost::shared_ptr<RouteList> r = routes.reader ();
2985 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2986 if ((*i)->remote_control_id() == id) {
2991 return boost::shared_ptr<Route> ((Route*) 0);
2995 Session::playlist_region_added (boost::weak_ptr<Region> w)
2997 boost::shared_ptr<Region> r = w.lock ();
3002 /* These are the operations that are currently in progress... */
3003 list<GQuark> curr = _current_trans_quarks;
3006 /* ...and these are the operations during which we want to update
3007 the session range location markers.
3010 ops.push_back (Operations::capture);
3011 ops.push_back (Operations::paste);
3012 ops.push_back (Operations::duplicate_region);
3013 ops.push_back (Operations::insert_file);
3014 ops.push_back (Operations::insert_region);
3015 ops.push_back (Operations::drag_region_brush);
3016 ops.push_back (Operations::region_drag);
3017 ops.push_back (Operations::selection_grab);
3018 ops.push_back (Operations::region_fill);
3019 ops.push_back (Operations::fill_selection);
3020 ops.push_back (Operations::create_region);
3021 ops.push_back (Operations::region_copy);
3022 ops.push_back (Operations::fixed_time_region_copy);
3025 /* See if any of the current operations match the ones that we want */
3027 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
3029 /* If so, update the session range markers */
3031 maybe_update_session_range (r->position (), r->last_frame ());
3035 /** Update the session range markers if a is before the current start or
3036 * b is after the current end.
3039 Session::maybe_update_session_range (framepos_t a, framepos_t b)
3041 if (_state_of_the_state & Loading) {
3045 if (_session_range_location == 0) {
3047 add_session_range_location (a, b);
3051 if (a < _session_range_location->start()) {
3052 _session_range_location->set_start (a);
3055 if (b > _session_range_location->end()) {
3056 _session_range_location->set_end (b);
3062 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
3064 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3065 maybe_update_session_range (i->to, i->to + i->length);
3070 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
3072 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3073 maybe_update_session_range (i->from, i->to);
3077 /* Region management */
3079 boost::shared_ptr<Region>
3080 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
3082 const RegionFactory::RegionMap& regions (RegionFactory::regions());
3083 RegionFactory::RegionMap::const_iterator i;
3084 boost::shared_ptr<Region> region;
3086 Glib::Threads::Mutex::Lock lm (region_lock);
3088 for (i = regions.begin(); i != regions.end(); ++i) {
3092 if (region->whole_file()) {
3094 if (child->source_equivalent (region)) {
3100 return boost::shared_ptr<Region> ();
3104 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
3106 set<boost::shared_ptr<Region> > relevant_regions;
3108 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
3109 RegionFactory::get_regions_using_source (*s, relevant_regions);
3112 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
3113 set<boost::shared_ptr<Region> >::iterator tmp;
3118 playlists->destroy_region (*r);
3119 RegionFactory::map_remove (*r);
3121 (*r)->drop_sources ();
3122 (*r)->drop_references ();
3124 relevant_regions.erase (r);
3129 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
3132 Glib::Threads::Mutex::Lock ls (source_lock);
3133 /* remove from the main source list */
3134 sources.erase ((*s)->id());
3137 (*s)->mark_for_remove ();
3138 (*s)->drop_references ();
3147 Session::remove_last_capture ()
3149 list<boost::shared_ptr<Source> > srcs;
3151 boost::shared_ptr<RouteList> rl = routes.reader ();
3152 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3153 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3158 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
3161 srcs.insert (srcs.end(), l.begin(), l.end());
3166 destroy_sources (srcs);
3168 save_state (_current_snapshot_name);
3173 /* Source Management */
3176 Session::add_source (boost::shared_ptr<Source> source)
3178 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
3179 pair<SourceMap::iterator,bool> result;
3181 entry.first = source->id();
3182 entry.second = source;
3185 Glib::Threads::Mutex::Lock lm (source_lock);
3186 result = sources.insert (entry);
3189 if (result.second) {
3191 /* yay, new source */
3193 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
3196 if (!fs->within_session()) {
3197 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
3203 boost::shared_ptr<AudioFileSource> afs;
3205 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
3206 if (Config->get_auto_analyse_audio()) {
3207 Analyser::queue_source_for_analysis (source, false);
3211 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
3216 Session::remove_source (boost::weak_ptr<Source> src)
3218 if (_state_of_the_state & Deletion) {
3222 SourceMap::iterator i;
3223 boost::shared_ptr<Source> source = src.lock();
3230 Glib::Threads::Mutex::Lock lm (source_lock);
3232 if ((i = sources.find (source->id())) != sources.end()) {
3237 if (!(_state_of_the_state & InCleanup)) {
3239 /* save state so we don't end up with a session file
3240 referring to non-existent sources.
3243 save_state (_current_snapshot_name);
3247 boost::shared_ptr<Source>
3248 Session::source_by_id (const PBD::ID& id)
3250 Glib::Threads::Mutex::Lock lm (source_lock);
3251 SourceMap::iterator i;
3252 boost::shared_ptr<Source> source;
3254 if ((i = sources.find (id)) != sources.end()) {
3261 boost::shared_ptr<Source>
3262 Session::source_by_path_and_channel (const string& path, uint16_t chn)
3264 Glib::Threads::Mutex::Lock lm (source_lock);
3266 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3267 boost::shared_ptr<AudioFileSource> afs
3268 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
3270 if (afs && afs->path() == path && chn == afs->channel()) {
3274 return boost::shared_ptr<Source>();
3278 Session::count_sources_by_origin (const string& path)
3281 Glib::Threads::Mutex::Lock lm (source_lock);
3283 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3284 boost::shared_ptr<FileSource> fs
3285 = boost::dynamic_pointer_cast<FileSource>(i->second);
3287 if (fs && fs->origin() == path) {
3297 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
3300 string old_basename = PBD::basename_nosuffix (oldname);
3301 string new_legalized = legalize_for_path (newname);
3303 /* note: we know (or assume) the old path is already valid */
3307 /* destructive file sources have a name of the form:
3309 /path/to/Tnnnn-NAME(%[LR])?.wav
3311 the task here is to replace NAME with the new name.
3316 string::size_type dash;
3318 dir = Glib::path_get_dirname (path);
3319 path = Glib::path_get_basename (path);
3321 /* '-' is not a legal character for the NAME part of the path */
3323 if ((dash = path.find_last_of ('-')) == string::npos) {
3327 prefix = path.substr (0, dash);
3331 path += new_legalized;
3332 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3333 path = Glib::build_filename (dir, path);
3337 /* non-destructive file sources have a name of the form:
3339 /path/to/NAME-nnnnn(%[LR])?.ext
3341 the task here is to replace NAME with the new name.
3346 string::size_type dash;
3347 string::size_type postfix;
3349 dir = Glib::path_get_dirname (path);
3350 path = Glib::path_get_basename (path);
3352 /* '-' is not a legal character for the NAME part of the path */
3354 if ((dash = path.find_last_of ('-')) == string::npos) {
3358 suffix = path.substr (dash+1);
3360 // Suffix is now everything after the dash. Now we need to eliminate
3361 // the nnnnn part, which is done by either finding a '%' or a '.'
3363 postfix = suffix.find_last_of ("%");
3364 if (postfix == string::npos) {
3365 postfix = suffix.find_last_of ('.');
3368 if (postfix != string::npos) {
3369 suffix = suffix.substr (postfix);
3371 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
3375 const uint32_t limit = 10000;
3376 char buf[PATH_MAX+1];
3378 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
3380 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
3382 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
3383 path = Glib::build_filename (dir, buf);
3391 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
3400 /** Return the full path (in some session directory) for a new within-session source.
3401 * \a name must be a session-unique name that does not contain slashes
3402 * (e.g. as returned by new_*_source_name)
3405 Session::new_source_path_from_name (DataType type, const string& name)
3407 assert(name.find("/") == string::npos);
3409 SessionDirectory sdir(get_best_session_directory_for_new_source());
3412 if (type == DataType::AUDIO) {
3413 p = sdir.sound_path();
3414 } else if (type == DataType::MIDI) {
3415 p = sdir.midi_path();
3417 error << "Unknown source type, unable to create file path" << endmsg;
3421 return Glib::build_filename (p, name);
3425 Session::peak_path (string base) const
3427 return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
3430 /** Return a unique name based on \a base for a new internal audio source */
3432 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
3435 char buf[PATH_MAX+1];
3436 const uint32_t limit = 10000;
3438 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3441 legalized = legalize_for_path (base);
3443 // Find a "version" of the base name that doesn't exist in any of the possible directories.
3444 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3446 vector<space_and_path>::iterator i;
3447 uint32_t existing = 0;
3449 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3454 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3455 cnt, legalized.c_str(), ext.c_str());
3456 } else if (nchan == 2) {
3458 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
3459 cnt, legalized.c_str(), ext.c_str());
3461 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
3462 cnt, legalized.c_str(), ext.c_str());
3464 } else if (nchan < 26) {
3465 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
3466 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
3468 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3469 cnt, legalized.c_str(), ext.c_str());
3475 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3476 } else if (nchan == 2) {
3478 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
3480 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
3482 } else if (nchan < 26) {
3483 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
3485 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3489 SessionDirectory sdir((*i).path);
3491 string spath = sdir.sound_path();
3493 /* note that we search *without* the extension so that
3494 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3495 in the event that this new name is required for
3496 a file format change.
3499 if (matching_unsuffixed_filename_exists_in (spath, buf)) {
3505 if (existing == 0) {
3510 error << string_compose(
3511 _("There are already %1 recordings for %2, which I consider too many."),
3512 limit, base) << endmsg;
3514 throw failed_constructor();
3518 return Glib::path_get_basename (buf);
3521 /** Create a new within-session audio source */
3522 boost::shared_ptr<AudioFileSource>
3523 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
3525 const string name = new_audio_source_name (n, n_chans, chan, destructive);
3526 const string path = new_source_path_from_name(DataType::AUDIO, name);
3528 return boost::dynamic_pointer_cast<AudioFileSource> (
3529 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
3532 /** Return a unique name based on \a base for a new internal MIDI source */
3534 Session::new_midi_source_name (const string& base)
3537 char buf[PATH_MAX+1];
3538 const uint32_t limit = 10000;
3542 legalized = legalize_for_path (base);
3544 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3545 for (cnt = 1; cnt <= limit; ++cnt) {
3547 vector<space_and_path>::iterator i;
3548 uint32_t existing = 0;
3550 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3552 SessionDirectory sdir((*i).path);
3554 std::string p = Glib::build_filename (sdir.midi_path(), legalized);
3556 snprintf (buf, sizeof(buf), "%s-%u.mid", p.c_str(), cnt);
3558 if (Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
3563 if (existing == 0) {
3568 error << string_compose(
3569 _("There are already %1 recordings for %2, which I consider too many."),
3570 limit, base) << endmsg;
3572 throw failed_constructor();
3576 return Glib::path_get_basename(buf);
3580 /** Create a new within-session MIDI source */
3581 boost::shared_ptr<MidiSource>
3582 Session::create_midi_source_for_session (Track* track, string const & n)
3584 /* try to use the existing write source for the track, to keep numbering sane
3588 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3592 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3595 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3596 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3600 const string name = new_midi_source_name (n);
3601 const string path = new_source_path_from_name (DataType::MIDI, name);
3603 return boost::dynamic_pointer_cast<SMFSource> (
3604 SourceFactory::createWritable (
3605 DataType::MIDI, *this, path, false, frame_rate()));
3610 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3612 if (playlist->hidden()) {
3616 playlists->add (playlist);
3619 playlist->release();
3626 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3628 if (_state_of_the_state & Deletion) {
3632 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3638 playlists->remove (playlist);
3644 Session::set_audition (boost::shared_ptr<Region> r)
3646 pending_audition_region = r;
3647 add_post_transport_work (PostTransportAudition);
3648 _butler->schedule_transport_work ();
3652 Session::audition_playlist ()
3654 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3655 ev->region.reset ();
3660 Session::non_realtime_set_audition ()
3662 assert (pending_audition_region);
3663 auditioner->audition_region (pending_audition_region);
3664 pending_audition_region.reset ();
3665 AuditionActive (true); /* EMIT SIGNAL */
3669 Session::audition_region (boost::shared_ptr<Region> r)
3671 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3677 Session::cancel_audition ()
3679 if (auditioner->auditioning()) {
3680 auditioner->cancel_audition ();
3681 AuditionActive (false); /* EMIT SIGNAL */
3686 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3688 if (a->is_monitor()) {
3691 if (b->is_monitor()) {
3694 return a->order_key (MixerSort) < b->order_key (MixerSort);
3698 Session::is_auditioning () const
3700 /* can be called before we have an auditioner object */
3702 return auditioner->auditioning();
3709 Session::graph_reordered ()
3711 /* don't do this stuff if we are setting up connections
3712 from a set_state() call or creating new tracks. Ditto for deletion.
3715 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
3719 /* every track/bus asked for this to be handled but it was deferred because
3720 we were connecting. do it now.
3723 request_input_change_handling ();
3727 /* force all diskstreams to update their capture offset values to
3728 reflect any changes in latencies within the graph.
3731 boost::shared_ptr<RouteList> rl = routes.reader ();
3732 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3733 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3735 tr->set_capture_offset ();
3740 /** @return Number of frames that there is disk space available to write,
3743 boost::optional<framecnt_t>
3744 Session::available_capture_duration ()
3746 Glib::Threads::Mutex::Lock lm (space_lock);
3748 if (_total_free_4k_blocks_uncertain) {
3749 return boost::optional<framecnt_t> ();
3752 float sample_bytes_on_disk = 4.0; // keep gcc happy
3754 switch (config.get_native_file_data_format()) {
3756 sample_bytes_on_disk = 4.0;
3760 sample_bytes_on_disk = 3.0;
3764 sample_bytes_on_disk = 2.0;
3768 /* impossible, but keep some gcc versions happy */
3769 fatal << string_compose (_("programming error: %1"),
3770 X_("illegal native file data format"))
3775 double scale = 4096.0 / sample_bytes_on_disk;
3777 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3778 return max_framecnt;
3781 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3785 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3788 RCUWriter<BundleList> writer (_bundles);
3789 boost::shared_ptr<BundleList> b = writer.get_copy ();
3790 b->push_back (bundle);
3793 BundleAdded (bundle); /* EMIT SIGNAL */
3799 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3801 bool removed = false;
3804 RCUWriter<BundleList> writer (_bundles);
3805 boost::shared_ptr<BundleList> b = writer.get_copy ();
3806 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3808 if (i != b->end()) {
3815 BundleRemoved (bundle); /* EMIT SIGNAL */
3821 boost::shared_ptr<Bundle>
3822 Session::bundle_by_name (string name) const
3824 boost::shared_ptr<BundleList> b = _bundles.reader ();
3826 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3827 if ((*i)->name() == name) {
3832 return boost::shared_ptr<Bundle> ();
3836 Session::tempo_map_changed (const PropertyChange&)
3840 playlists->update_after_tempo_map_change ();
3842 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3848 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3850 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3851 (*i)->recompute_frames_from_bbt ();
3855 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3856 * the given count with the current block size.
3859 Session::ensure_buffers (ChanCount howmany)
3861 BufferManager::ensure_buffers (howmany);
3865 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3867 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3868 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3873 Session::next_insert_id ()
3875 /* this doesn't really loop forever. just think about it */
3878 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3879 if (!insert_bitset[n]) {
3880 insert_bitset[n] = true;
3886 /* none available, so resize and try again */
3888 insert_bitset.resize (insert_bitset.size() + 16, false);
3893 Session::next_send_id ()
3895 /* this doesn't really loop forever. just think about it */
3898 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3899 if (!send_bitset[n]) {
3900 send_bitset[n] = true;
3906 /* none available, so resize and try again */
3908 send_bitset.resize (send_bitset.size() + 16, false);
3913 Session::next_aux_send_id ()
3915 /* this doesn't really loop forever. just think about it */
3918 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
3919 if (!aux_send_bitset[n]) {
3920 aux_send_bitset[n] = true;
3926 /* none available, so resize and try again */
3928 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
3933 Session::next_return_id ()
3935 /* this doesn't really loop forever. just think about it */
3938 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3939 if (!return_bitset[n]) {
3940 return_bitset[n] = true;
3946 /* none available, so resize and try again */
3948 return_bitset.resize (return_bitset.size() + 16, false);
3953 Session::mark_send_id (uint32_t id)
3955 if (id >= send_bitset.size()) {
3956 send_bitset.resize (id+16, false);
3958 if (send_bitset[id]) {
3959 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3961 send_bitset[id] = true;
3965 Session::mark_aux_send_id (uint32_t id)
3967 if (id >= aux_send_bitset.size()) {
3968 aux_send_bitset.resize (id+16, false);
3970 if (aux_send_bitset[id]) {
3971 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
3973 aux_send_bitset[id] = true;
3977 Session::mark_return_id (uint32_t id)
3979 if (id >= return_bitset.size()) {
3980 return_bitset.resize (id+16, false);
3982 if (return_bitset[id]) {
3983 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3985 return_bitset[id] = true;
3989 Session::mark_insert_id (uint32_t id)
3991 if (id >= insert_bitset.size()) {
3992 insert_bitset.resize (id+16, false);
3994 if (insert_bitset[id]) {
3995 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3997 insert_bitset[id] = true;
4001 Session::unmark_send_id (uint32_t id)
4003 if (id < send_bitset.size()) {
4004 send_bitset[id] = false;
4009 Session::unmark_aux_send_id (uint32_t id)
4011 if (id < aux_send_bitset.size()) {
4012 aux_send_bitset[id] = false;
4017 Session::unmark_return_id (uint32_t id)
4019 if (id < return_bitset.size()) {
4020 return_bitset[id] = false;
4025 Session::unmark_insert_id (uint32_t id)
4027 if (id < insert_bitset.size()) {
4028 insert_bitset[id] = false;
4033 Session::reset_native_file_format ()
4035 boost::shared_ptr<RouteList> rl = routes.reader ();
4036 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4037 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4039 /* don't save state as we do this, there's no point
4042 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
4043 tr->reset_write_sources (false);
4044 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
4050 Session::route_name_unique (string n) const
4052 boost::shared_ptr<RouteList> r = routes.reader ();
4054 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4055 if ((*i)->name() == n) {
4064 Session::route_name_internal (string n) const
4066 if (auditioner && auditioner->name() == n) {
4070 if (_click_io && _click_io->name() == n) {
4078 Session::freeze_all (InterThreadInfo& itt)
4080 boost::shared_ptr<RouteList> r = routes.reader ();
4082 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4084 boost::shared_ptr<Track> t;
4086 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
4087 /* XXX this is wrong because itt.progress will keep returning to zero at the start
4097 boost::shared_ptr<Region>
4098 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
4099 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
4100 InterThreadInfo& itt,
4101 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
4104 boost::shared_ptr<Region> result;
4105 boost::shared_ptr<Playlist> playlist;
4106 boost::shared_ptr<AudioFileSource> fsource;
4108 char buf[PATH_MAX+1];
4109 ChanCount diskstream_channels (track.n_channels());
4110 framepos_t position;
4111 framecnt_t this_chunk;
4114 SessionDirectory sdir(get_best_session_directory_for_new_source ());
4115 const string sound_dir = sdir.sound_path();
4116 framepos_t len = end - start;
4117 bool need_block_size_reset = false;
4119 ChanCount const max_proc = track.max_processor_streams ();
4122 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
4123 end, start) << endmsg;
4127 const framecnt_t chunk_size = (256 * 1024)/4;
4129 // block all process callback handling
4131 block_processing ();
4133 /* call tree *MUST* hold route_lock */
4135 if ((playlist = track.playlist()) == 0) {
4139 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4141 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
4143 for (x = 0; x < 99999; ++x) {
4144 snprintf (buf, sizeof(buf), "%s/%s-%d-bounce-%" PRIu32 "%s", sound_dir.c_str(), playlist->name().c_str(), chan_n, x+1, ext.c_str());
4145 if (!Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
4151 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
4156 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
4157 SourceFactory::createWritable (DataType::AUDIO, *this, buf, false, frame_rate()));
4160 catch (failed_constructor& err) {
4161 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
4165 srcs.push_back (fsource);
4168 /* tell redirects that care that we are about to use a much larger
4169 * blocksize. this will flush all plugins too, so that they are ready
4170 * to be used for this process.
4173 need_block_size_reset = true;
4174 track.set_block_size (chunk_size);
4179 /* create a set of reasonably-sized buffers */
4180 buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
4181 buffers.set_count (max_proc);
4183 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4184 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4186 afs->prepare_for_peakfile_writes ();
4189 while (to_do && !itt.cancel) {
4191 this_chunk = min (to_do, chunk_size);
4193 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export)) {
4198 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4199 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4202 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
4208 start += this_chunk;
4209 to_do -= this_chunk;
4211 itt.progress = (float) (1.0 - ((double) to_do / len));
4220 xnow = localtime (&now);
4222 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
4223 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4226 afs->update_header (position, *xnow, now);
4227 afs->flush_header ();
4231 /* construct a region to represent the bounced material */
4235 plist.add (Properties::start, 0);
4236 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4237 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4239 result = RegionFactory::create (srcs, plist);
4245 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4246 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4249 afs->mark_for_remove ();
4252 (*src)->drop_references ();
4256 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4257 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4260 afs->done_with_peakfile_writes ();
4265 if (need_block_size_reset) {
4266 track.set_block_size (get_block_size());
4269 unblock_processing ();
4275 Session::gain_automation_buffer() const
4277 return ProcessThread::gain_automation_buffer ();
4281 Session::send_gain_automation_buffer() const
4283 return ProcessThread::send_gain_automation_buffer ();
4287 Session::pan_automation_buffer() const
4289 return ProcessThread::pan_automation_buffer ();
4293 Session::get_silent_buffers (ChanCount count)
4295 return ProcessThread::get_silent_buffers (count);
4299 Session::get_scratch_buffers (ChanCount count, bool silence)
4301 return ProcessThread::get_scratch_buffers (count, silence);
4305 Session::get_route_buffers (ChanCount count, bool silence)
4307 return ProcessThread::get_route_buffers (count, silence);
4312 Session::get_mix_buffers (ChanCount count)
4314 return ProcessThread::get_mix_buffers (count);
4318 Session::ntracks () const
4321 boost::shared_ptr<RouteList> r = routes.reader ();
4323 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4324 if (boost::dynamic_pointer_cast<Track> (*i)) {
4333 Session::nbusses () const
4336 boost::shared_ptr<RouteList> r = routes.reader ();
4338 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4339 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
4348 Session::add_automation_list(AutomationList *al)
4350 automation_lists[al->id()] = al;
4353 /** @return true if there is at least one record-enabled track, otherwise false */
4355 Session::have_rec_enabled_track () const
4357 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
4360 /** Update the state of our rec-enabled tracks flag */
4362 Session::update_have_rec_enabled_track ()
4364 boost::shared_ptr<RouteList> rl = routes.reader ();
4365 RouteList::iterator i = rl->begin();
4366 while (i != rl->end ()) {
4368 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4369 if (tr && tr->record_enabled ()) {
4376 int const old = g_atomic_int_get (&_have_rec_enabled_track);
4378 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4380 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4381 RecordStateChanged (); /* EMIT SIGNAL */
4386 Session::listen_position_changed ()
4388 boost::shared_ptr<RouteList> r = routes.reader ();
4390 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4391 (*i)->listen_position_changed ();
4396 Session::solo_control_mode_changed ()
4398 /* cancel all solo or all listen when solo control mode changes */
4401 set_solo (get_routes(), false);
4402 } else if (listening()) {
4403 set_listen (get_routes(), false);
4407 /** Called when a property of one of our route groups changes */
4409 Session::route_group_property_changed (RouteGroup* rg)
4411 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4414 /** Called when a route is added to one of our route groups */
4416 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4418 RouteAddedToRouteGroup (rg, r);
4421 /** Called when a route is removed from one of our route groups */
4423 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4425 RouteRemovedFromRouteGroup (rg, r);
4428 boost::shared_ptr<RouteList>
4429 Session::get_routes_with_regions_at (framepos_t const p) const
4431 boost::shared_ptr<RouteList> r = routes.reader ();
4432 boost::shared_ptr<RouteList> rl (new RouteList);
4434 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4435 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4440 boost::shared_ptr<Playlist> pl = tr->playlist ();
4445 if (pl->has_region_at (p)) {
4454 Session::goto_end ()
4456 if (_session_range_location) {
4457 request_locate (_session_range_location->end(), false);
4459 request_locate (0, false);
4464 Session::goto_start ()
4466 if (_session_range_location) {
4467 request_locate (_session_range_location->start(), false);
4469 request_locate (0, false);
4474 Session::current_start_frame () const
4476 return _session_range_location ? _session_range_location->start() : 0;
4480 Session::current_end_frame () const
4482 return _session_range_location ? _session_range_location->end() : 0;
4486 Session::add_session_range_location (framepos_t start, framepos_t end)
4488 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4489 _locations->add (_session_range_location);
4493 Session::step_edit_status_change (bool yn)
4499 send = (_step_editors == 0);
4504 send = (_step_editors == 1);
4507 if (_step_editors > 0) {
4513 StepEditStatusChange (val);
4519 Session::start_time_changed (framepos_t old)
4521 /* Update the auto loop range to match the session range
4522 (unless the auto loop range has been changed by the user)
4525 Location* s = _locations->session_range_location ();
4530 Location* l = _locations->auto_loop_location ();
4532 if (l && l->start() == old) {
4533 l->set_start (s->start(), true);
4538 Session::end_time_changed (framepos_t old)
4540 /* Update the auto loop range to match the session range
4541 (unless the auto loop range has been changed by the user)
4544 Location* s = _locations->session_range_location ();
4549 Location* l = _locations->auto_loop_location ();
4551 if (l && l->end() == old) {
4552 l->set_end (s->end(), true);
4556 std::vector<std::string>
4557 Session::source_search_path (DataType type) const
4561 if (session_dirs.size() == 1) {
4563 case DataType::AUDIO:
4564 sp.push_back (_session_dir->sound_path());
4566 case DataType::MIDI:
4567 sp.push_back (_session_dir->midi_path());
4571 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4572 SessionDirectory sdir (i->path);
4574 case DataType::AUDIO:
4575 sp.push_back (sdir.sound_path());
4577 case DataType::MIDI:
4578 sp.push_back (sdir.midi_path());
4584 if (type == DataType::AUDIO) {
4585 const string sound_path_2X = _session_dir->sound_path_2X();
4586 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
4587 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
4588 sp.push_back (sound_path_2X);
4593 // now check the explicit (possibly user-specified) search path
4596 case DataType::AUDIO:
4597 sp += Searchpath(config.get_audio_search_path ());
4599 case DataType::MIDI:
4600 sp += Searchpath(config.get_midi_search_path ());
4608 Session::ensure_search_path_includes (const string& path, DataType type)
4617 case DataType::AUDIO:
4618 sp += Searchpath(config.get_audio_search_path ());
4620 case DataType::MIDI:
4621 sp += Searchpath (config.get_midi_search_path ());
4625 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
4626 /* No need to add this new directory if it has the same inode as
4627 an existing one; checking inode rather than name prevents duplicated
4628 directories when we are using symlinks.
4630 On Windows, I think we could just do if (*i == path) here.
4632 if (PBD::equivalent_paths (*i, path)) {
4640 case DataType::AUDIO:
4641 config.set_audio_search_path (sp.to_string());
4643 case DataType::MIDI:
4644 config.set_midi_search_path (sp.to_string());
4649 boost::shared_ptr<Speakers>
4650 Session::get_speakers()
4656 Session::unknown_processors () const
4660 boost::shared_ptr<RouteList> r = routes.reader ();
4661 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4662 list<string> t = (*i)->unknown_processors ();
4663 copy (t.begin(), t.end(), back_inserter (p));
4673 Session::update_latency (bool playback)
4675 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
4677 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
4681 boost::shared_ptr<RouteList> r = routes.reader ();
4682 framecnt_t max_latency = 0;
4685 /* reverse the list so that we work backwards from the last route to run to the first */
4686 RouteList* rl = routes.reader().get();
4687 r.reset (new RouteList (*rl));
4688 reverse (r->begin(), r->end());
4691 /* compute actual latency values for the given direction and store them all in per-port
4692 structures. this will also publish the same values (to JACK) so that computation of latency
4693 for routes can consistently use public latency values.
4696 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4697 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
4700 /* because we latency compensate playback, our published playback latencies should
4701 be the same for all output ports - all material played back by ardour has
4702 the same latency, whether its caused by plugins or by latency compensation. since
4703 these may differ from the values computed above, reset all playback port latencies
4707 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
4709 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4710 (*i)->set_public_port_latencies (max_latency, playback);
4715 post_playback_latency ();
4719 post_capture_latency ();
4722 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
4726 Session::post_playback_latency ()
4728 set_worst_playback_latency ();
4730 boost::shared_ptr<RouteList> r = routes.reader ();
4732 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4733 if (!(*i)->is_auditioner() && ((*i)->active())) {
4734 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
4738 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4739 (*i)->set_latency_compensation (_worst_track_latency);
4744 Session::post_capture_latency ()
4746 set_worst_capture_latency ();
4748 /* reflect any changes in capture latencies into capture offsets
4751 boost::shared_ptr<RouteList> rl = routes.reader();
4752 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4753 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4755 tr->set_capture_offset ();
4761 Session::initialize_latencies ()
4764 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
4765 update_latency (false);
4766 update_latency (true);
4769 set_worst_io_latencies ();
4773 Session::set_worst_io_latencies ()
4775 set_worst_playback_latency ();
4776 set_worst_capture_latency ();
4780 Session::set_worst_playback_latency ()
4782 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4786 _worst_output_latency = 0;
4788 if (!_engine.connected()) {
4792 boost::shared_ptr<RouteList> r = routes.reader ();
4794 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4795 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
4798 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
4802 Session::set_worst_capture_latency ()
4804 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4808 _worst_input_latency = 0;
4810 if (!_engine.connected()) {
4814 boost::shared_ptr<RouteList> r = routes.reader ();
4816 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4817 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
4820 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
4824 Session::update_latency_compensation (bool force_whole_graph)
4826 bool some_track_latency_changed = false;
4828 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4832 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
4834 _worst_track_latency = 0;
4836 boost::shared_ptr<RouteList> r = routes.reader ();
4838 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4839 if (!(*i)->is_auditioner() && ((*i)->active())) {
4841 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
4842 some_track_latency_changed = true;
4844 _worst_track_latency = max (tl, _worst_track_latency);
4848 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
4849 (some_track_latency_changed ? "yes" : "no")));
4851 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
4853 if (some_track_latency_changed || force_whole_graph) {
4854 _engine.update_latencies ();
4858 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4859 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4863 tr->set_capture_offset ();
4868 Session::session_name_is_legal (const string& path)
4870 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
4872 for (int i = 0; illegal_chars[i]; ++i) {
4873 if (path.find (illegal_chars[i]) != string::npos) {
4874 return illegal_chars[i];
4882 Session::next_control_id () const
4886 /* the monitor bus remote ID is in a different
4887 * "namespace" than regular routes. its existence doesn't
4888 * affect normal (low) numbered routes.
4895 return nroutes() - subtract;
4899 Session::notify_remote_id_change ()
4901 if (deletion_in_progress()) {
4905 switch (Config->get_remote_model()) {
4908 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
4916 Session::sync_order_keys (RouteSortOrderKey sort_key_changed)
4918 if (deletion_in_progress()) {
4922 /* tell everyone that something has happened to the sort keys
4923 and let them sync up with the change(s)
4924 this will give objects that manage the sort order keys the
4925 opportunity to keep them in sync if they wish to.
4928 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("Sync Order Keys, based on %1\n", enum_2_string (sort_key_changed)));
4930 Route::SyncOrderKeys (sort_key_changed); /* EMIT SIGNAL */
4932 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
4936 Session::operation_in_progress (GQuark op) const
4938 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
4941 boost::shared_ptr<Port>
4942 Session::ltc_input_port () const
4944 return _ltc_input->nth (0);
4947 boost::shared_ptr<Port>
4948 Session::ltc_output_port () const
4950 return _ltc_output->nth (0);
4954 Session::reconnect_ltc_input ()
4958 string src = Config->get_ltc_source_port();
4960 _ltc_input->disconnect (this);
4962 if (src != _("None") && !src.empty()) {
4963 _ltc_input->nth (0)->connect (src);
4969 Session::reconnect_ltc_output ()
4974 string src = Config->get_ltc_sink_port();
4976 _ltc_output->disconnect (this);
4978 if (src != _("None") && !src.empty()) {
4979 _ltc_output->nth (0)->connect (src);