2 Copyright (C) 1999-2010 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #include <cstdio> /* sprintf(3) ... grrr */
33 #include <glibmm/threads.h>
34 #include <glibmm/miscutils.h>
35 #include <glibmm/fileutils.h>
37 #include <boost/algorithm/string/erase.hpp>
39 #include "pbd/error.h"
40 #include "pbd/boost_debug.h"
41 #include "pbd/pathscanner.h"
42 #include "pbd/stl_delete.h"
43 #include "pbd/basename.h"
44 #include "pbd/stacktrace.h"
45 #include "pbd/file_utils.h"
46 #include "pbd/convert.h"
47 #include "pbd/strsplit.h"
48 #include "pbd/unwind.h"
50 #include "ardour/amp.h"
51 #include "ardour/analyser.h"
52 #include "ardour/async_midi_port.h"
53 #include "ardour/audio_buffer.h"
54 #include "ardour/audio_diskstream.h"
55 #include "ardour/audio_port.h"
56 #include "ardour/audio_track.h"
57 #include "ardour/audioengine.h"
58 #include "ardour/audiofilesource.h"
59 #include "ardour/auditioner.h"
60 #include "ardour/buffer_manager.h"
61 #include "ardour/buffer_set.h"
62 #include "ardour/bundle.h"
63 #include "ardour/butler.h"
64 #include "ardour/click.h"
65 #include "ardour/control_protocol_manager.h"
66 #include "ardour/data_type.h"
67 #include "ardour/debug.h"
68 #include "ardour/filename_extensions.h"
69 #include "ardour/graph.h"
70 #include "ardour/midiport_manager.h"
71 #include "ardour/midi_track.h"
72 #include "ardour/midi_ui.h"
73 #include "ardour/operations.h"
74 #include "ardour/playlist.h"
75 #include "ardour/plugin.h"
76 #include "ardour/plugin_insert.h"
77 #include "ardour/process_thread.h"
78 #include "ardour/rc_configuration.h"
79 #include "ardour/recent_sessions.h"
80 #include "ardour/region.h"
81 #include "ardour/region_factory.h"
82 #include "ardour/route_graph.h"
83 #include "ardour/route_group.h"
84 #include "ardour/send.h"
85 #include "ardour/session.h"
86 #include "ardour/session_directory.h"
87 #include "ardour/session_playlists.h"
88 #include "ardour/smf_source.h"
89 #include "ardour/source_factory.h"
90 #include "ardour/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 ();
279 /* if a mix template was provided, then ::create() will
280 * have copied it into the session and we need to load it
281 * so that we have the state ready for ::set_state()
282 * after the engine is started.
284 * Note that we do NOT try to get the sample rate from
285 * the template at this time, though doing so would
286 * be easy if we decided this was an appropriate part
290 if (!mix_template.empty() && load_state (_current_snapshot_name)) {
291 throw failed_constructor ();
296 if (load_state (_current_snapshot_name)) {
297 throw failed_constructor ();
300 /* try to get sample rate from XML state so that we
301 * can influence the SR if we set up the audio
306 const XMLProperty* prop;
307 if ((prop = state_tree->root()->property (X_("sample-rate"))) != 0) {
308 sr = atoi (prop->value());
312 if (ensure_engine (sr)) {
314 throw failed_constructor ();
318 if (post_engine_init ()) {
320 throw failed_constructor ();
323 store_recent_sessions (_name, _path);
325 bool was_dirty = dirty();
327 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
329 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
330 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
333 DirtyChanged (); /* EMIT SIGNAL */
336 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
337 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
341 /* hook us up to the engine since we are now completely constructed */
343 BootMessage (_("Connect to engine"));
345 _engine.set_session (this);
346 _engine.reset_timebase ();
348 BootMessage (_("Session loading complete"));
361 Session::ensure_engine (uint32_t desired_sample_rate)
363 if (_engine.current_backend() == 0) {
364 /* backend is unknown ... */
365 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
366 if (r.get_value_or (-1) != 0) {
369 } else if (_engine.setup_required()) {
370 /* backend is known, but setup is needed */
371 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
372 if (r.get_value_or (-1) != 0) {
375 } else if (!_engine.running()) {
376 if (_engine.start()) {
381 /* at this point the engine should be running
384 if (!_engine.running()) {
388 return immediately_post_engine ();
393 Session::immediately_post_engine ()
395 /* Do various initializations that should take place directly after we
396 * know that the engine is running, but before we either create a
397 * session or set state for an existing one.
400 if (how_many_dsp_threads () > 1) {
401 /* For now, only create the graph if we are using >1 DSP threads, as
402 it is a bit slower than the old code with 1 thread.
404 _process_graph.reset (new Graph (*this));
407 /* every time we reconnect, recompute worst case output latencies */
409 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
411 if (synced_to_engine()) {
412 _engine.transport_stop ();
415 if (config.get_jack_time_master()) {
416 _engine.transport_locate (_transport_frame);
420 BootMessage (_("Set up LTC"));
422 BootMessage (_("Set up Click"));
424 BootMessage (_("Set up standard connections"));
428 catch (failed_constructor& err) {
438 vector<void*> debug_pointers;
440 /* if we got to here, leaving pending capture state around
444 remove_pending_capture_state ();
446 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
448 /* disconnect from any and all signals that we are connected to */
452 _engine.remove_session ();
454 /* deregister all ports - there will be no process or any other
455 * callbacks from the engine any more.
458 Port::PortDrop (); /* EMIT SIGNAL */
462 /* clear history so that no references to objects are held any more */
466 /* clear state tree so that no references to objects are held any more */
470 /* reset dynamic state version back to default */
472 Stateful::loading_state_version = 0;
474 _butler->drop_references ();
478 delete midi_control_ui;
479 delete _all_route_group;
481 if (click_data != default_click) {
482 delete [] click_data;
485 if (click_emphasis_data != default_click_emphasis) {
486 delete [] click_emphasis_data;
491 /* clear out any pending dead wood from RCU managed objects */
496 AudioDiskstream::free_working_buffers();
498 /* tell everyone who is still standing that we're about to die */
501 /* tell everyone to drop references and delete objects as we go */
503 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
504 RegionFactory::delete_all_regions ();
506 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
508 /* reset these three references to special routes before we do the usual route delete thing */
511 _master_out.reset ();
512 _monitor_out.reset ();
515 RCUWriter<RouteList> writer (routes);
516 boost::shared_ptr<RouteList> r = writer.get_copy ();
518 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
519 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
520 (*i)->drop_references ();
524 /* writer goes out of scope and updates master */
528 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
529 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
530 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
531 i->second->drop_references ();
536 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
537 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
542 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
545 delete _mmc; _mmc = 0;
546 delete _midi_ports; _midi_ports = 0;
547 delete _locations; _locations = 0;
549 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
551 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
552 boost_debug_list_ptrs ();
557 Session::setup_ltc ()
561 _ltc_input.reset (new IO (*this, _("LTC In"), IO::Input));
562 _ltc_output.reset (new IO (*this, _("LTC Out"), IO::Output));
564 if (state_tree && (child = find_named_node (*state_tree->root(), "LTC-In")) != 0) {
565 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
568 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
569 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
571 reconnect_ltc_input ();
574 if (state_tree && (child = find_named_node (*state_tree->root(), "LTC-Out")) != 0) {
575 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
578 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
579 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
581 reconnect_ltc_output ();
584 /* fix up names of LTC ports because we don't want the normal
585 * IO style of NAME/TYPE-{in,out}N
588 _ltc_input->nth (0)->set_name (_("LTC-in"));
589 _ltc_output->nth (0)->set_name (_("LTC-out"));
593 Session::setup_click ()
596 _click_io.reset (new ClickIO (*this, "click"));
597 _click_gain.reset (new Amp (*this));
598 _click_gain->activate ();
600 setup_click_state (state_tree->root());
602 setup_click_state (0);
607 Session::setup_click_state (const XMLNode* node)
609 const XMLNode* child = 0;
611 if (node && (child = find_named_node (*node, "Click")) != 0) {
613 /* existing state for Click */
616 if (Stateful::loading_state_version < 3000) {
617 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
619 const XMLNodeList& children (child->children());
620 XMLNodeList::const_iterator i = children.begin();
621 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
623 if (i != children.end()) {
624 c = _click_gain->set_state (**i, Stateful::loading_state_version);
630 _clicking = Config->get_clicking ();
634 error << _("could not setup Click I/O") << endmsg;
641 /* default state for Click: dual-mono to first 2 physical outputs */
644 _engine.get_physical_outputs (DataType::AUDIO, outs);
646 for (uint32_t physport = 0; physport < 2; ++physport) {
647 if (outs.size() > physport) {
648 if (_click_io->add_port (outs[physport], this)) {
649 // relax, even though its an error
654 if (_click_io->n_ports () > ChanCount::ZERO) {
655 _clicking = Config->get_clicking ();
661 Session::setup_bundles ()
663 vector<string> inputs[DataType::num_types];
664 vector<string> outputs[DataType::num_types];
665 for (uint32_t i = 0; i < DataType::num_types; ++i) {
666 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
667 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
670 /* Create a set of Bundle objects that map
671 to the physical I/O currently available. We create both
672 mono and stereo bundles, so that the common cases of mono
673 and stereo tracks get bundles to put in their mixer strip
674 in / out menus. There may be a nicer way of achieving that;
675 it doesn't really scale that well to higher channel counts
678 /* mono output bundles */
680 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
682 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
684 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
685 c->add_channel (_("mono"), DataType::AUDIO);
686 c->set_port (0, outputs[DataType::AUDIO][np]);
691 /* stereo output bundles */
693 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
694 if (np + 1 < outputs[DataType::AUDIO].size()) {
696 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
697 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
698 c->add_channel (_("L"), DataType::AUDIO);
699 c->set_port (0, outputs[DataType::AUDIO][np]);
700 c->add_channel (_("R"), DataType::AUDIO);
701 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
707 /* mono input bundles */
709 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
711 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
713 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
714 c->add_channel (_("mono"), DataType::AUDIO);
715 c->set_port (0, inputs[DataType::AUDIO][np]);
720 /* stereo input bundles */
722 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
723 if (np + 1 < inputs[DataType::AUDIO].size()) {
725 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
727 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
728 c->add_channel (_("L"), DataType::AUDIO);
729 c->set_port (0, inputs[DataType::AUDIO][np]);
730 c->add_channel (_("R"), DataType::AUDIO);
731 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
737 /* MIDI input bundles */
739 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
740 string n = inputs[DataType::MIDI][np];
741 boost::erase_first (n, X_("alsa_pcm:"));
743 boost::shared_ptr<Bundle> c (new Bundle (n, false));
744 c->add_channel ("", DataType::MIDI);
745 c->set_port (0, inputs[DataType::MIDI][np]);
749 /* MIDI output bundles */
751 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
752 string n = outputs[DataType::MIDI][np];
753 boost::erase_first (n, X_("alsa_pcm:"));
755 boost::shared_ptr<Bundle> c (new Bundle (n, true));
756 c->add_channel ("", DataType::MIDI);
757 c->set_port (0, outputs[DataType::MIDI][np]);
764 Session::auto_connect_master_bus ()
766 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
770 /* if requested auto-connect the outputs to the first N physical ports.
773 uint32_t limit = _master_out->n_outputs().n_total();
774 vector<string> outputs[DataType::num_types];
776 for (uint32_t i = 0; i < DataType::num_types; ++i) {
777 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
780 for (uint32_t n = 0; n < limit; ++n) {
781 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
783 if (outputs[p->type()].size() > n) {
784 connect_to = outputs[p->type()][n];
787 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
788 if (_master_out->output()->connect (p, connect_to, this)) {
789 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
798 Session::remove_monitor_section ()
804 /* force reversion to Solo-In-Place */
805 Config->set_solo_control_is_listen_control (false);
808 /* Hold process lock while doing this so that we don't hear bits and
809 * pieces of audio as we work on each route.
812 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
814 /* Connect tracks to monitor section. Note that in an
815 existing session, the internal sends will already exist, but we want the
816 routes to notice that they connect to the control out specifically.
820 boost::shared_ptr<RouteList> r = routes.reader ();
821 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
823 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
825 if ((*x)->is_monitor()) {
827 } else if ((*x)->is_master()) {
830 (*x)->remove_aux_or_listen (_monitor_out);
835 remove_route (_monitor_out);
836 auto_connect_master_bus ();
840 Session::add_monitor_section ()
844 if (_monitor_out || !_master_out) {
848 boost::shared_ptr<Route> r (new Route (*this, _("monitor"), Route::MonitorOut, DataType::AUDIO));
854 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
855 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
858 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
859 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
860 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
864 add_routes (rl, false, false, false);
866 assert (_monitor_out);
868 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
869 are undefined, at best.
872 uint32_t limit = _monitor_out->n_inputs().n_audio();
876 /* connect the inputs to the master bus outputs. this
877 * represents a separate data feed from the internal sends from
878 * each route. as of jan 2011, it allows the monitor section to
879 * conditionally ignore either the internal sends or the normal
880 * input feed, but we should really find a better way to do
884 _master_out->output()->disconnect (this);
886 for (uint32_t n = 0; n < limit; ++n) {
887 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
888 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
891 string connect_to = o->name();
892 if (_monitor_out->input()->connect (p, connect_to, this)) {
893 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
901 /* if monitor section is not connected, connect it to physical outs
904 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
906 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
908 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
911 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
913 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
914 Config->get_monitor_bus_preferred_bundle())
920 /* Monitor bus is audio only */
922 vector<string> outputs[DataType::num_types];
924 for (uint32_t i = 0; i < DataType::num_types; ++i) {
925 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
928 uint32_t mod = outputs[DataType::AUDIO].size();
929 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
933 for (uint32_t n = 0; n < limit; ++n) {
935 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
937 if (outputs[DataType::AUDIO].size() > (n % mod)) {
938 connect_to = outputs[DataType::AUDIO][n % mod];
941 if (!connect_to.empty()) {
942 if (_monitor_out->output()->connect (p, connect_to, this)) {
943 error << string_compose (
944 _("cannot connect control output %1 to %2"),
955 /* Hold process lock while doing this so that we don't hear bits and
956 * pieces of audio as we work on each route.
959 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
961 /* Connect tracks to monitor section. Note that in an
962 existing session, the internal sends will already exist, but we want the
963 routes to notice that they connect to the control out specifically.
967 boost::shared_ptr<RouteList> rls = routes.reader ();
969 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
971 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
973 if ((*x)->is_monitor()) {
975 } else if ((*x)->is_master()) {
978 (*x)->enable_monitor_send ();
984 Session::hookup_io ()
986 /* stop graph reordering notifications from
987 causing resorts, etc.
990 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
994 /* we delay creating the auditioner till now because
995 it makes its own connections to ports.
999 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
1001 throw failed_constructor ();
1003 a->use_new_diskstream ();
1007 catch (failed_constructor& err) {
1008 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
1012 /* load bundles, which we may have postponed earlier on */
1013 if (_bundle_xml_node) {
1014 load_bundles (*_bundle_xml_node);
1015 delete _bundle_xml_node;
1018 /* Tell all IO objects to connect themselves together */
1020 IO::enable_connecting ();
1022 /* Now tell all "floating" ports to connect to whatever
1023 they should be connected to.
1026 AudioEngine::instance()->reconnect_ports ();
1028 /* Anyone who cares about input state, wake up and do something */
1030 IOConnectionsComplete (); /* EMIT SIGNAL */
1032 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
1034 /* now handle the whole enchilada as if it was one
1035 graph reorder event.
1040 /* update the full solo state, which can't be
1041 correctly determined on a per-route basis, but
1042 needs the global overview that only the session
1046 update_route_solo_state ();
1050 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
1052 boost::shared_ptr<Track> track = wp.lock ();
1057 boost::shared_ptr<Playlist> playlist;
1059 if ((playlist = track->playlist()) != 0) {
1060 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
1061 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
1062 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
1067 Session::record_enabling_legal () const
1069 /* this used to be in here, but survey says.... we don't need to restrict it */
1070 // if (record_status() == Recording) {
1074 if (Config->get_all_safe()) {
1081 Session::set_track_monitor_input_status (bool yn)
1083 boost::shared_ptr<RouteList> rl = routes.reader ();
1084 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1085 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1086 if (tr && tr->record_enabled ()) {
1087 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1088 tr->request_input_monitoring (yn);
1094 Session::auto_punch_start_changed (Location* location)
1096 replace_event (SessionEvent::PunchIn, location->start());
1098 if (get_record_enabled() && config.get_punch_in()) {
1099 /* capture start has been changed, so save new pending state */
1100 save_state ("", true);
1105 Session::auto_punch_end_changed (Location* location)
1107 framepos_t when_to_stop = location->end();
1108 // when_to_stop += _worst_output_latency + _worst_input_latency;
1109 replace_event (SessionEvent::PunchOut, when_to_stop);
1113 Session::auto_punch_changed (Location* location)
1115 framepos_t when_to_stop = location->end();
1117 replace_event (SessionEvent::PunchIn, location->start());
1118 //when_to_stop += _worst_output_latency + _worst_input_latency;
1119 replace_event (SessionEvent::PunchOut, when_to_stop);
1122 /** @param loc A loop location.
1123 * @param pos Filled in with the start time of the required fade-out (in session frames).
1124 * @param length Filled in with the length of the required fade-out.
1127 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
1129 pos = max (loc->start(), loc->end() - 64);
1130 length = loc->end() - pos;
1134 Session::auto_loop_changed (Location* location)
1136 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1139 auto_loop_declick_range (location, dcp, dcl);
1140 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1142 if (transport_rolling() && play_loop) {
1145 // if (_transport_frame > location->end()) {
1147 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1148 // relocate to beginning of loop
1149 clear_events (SessionEvent::LocateRoll);
1151 request_locate (location->start(), true);
1154 else if (Config->get_seamless_loop() && !loop_changing) {
1156 // schedule a locate-roll to refill the diskstreams at the
1157 // previous loop end
1158 loop_changing = true;
1160 if (location->end() > last_loopend) {
1161 clear_events (SessionEvent::LocateRoll);
1162 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1169 last_loopend = location->end();
1173 Session::set_auto_punch_location (Location* location)
1177 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1178 punch_connections.drop_connections();
1179 existing->set_auto_punch (false, this);
1180 remove_event (existing->start(), SessionEvent::PunchIn);
1181 clear_events (SessionEvent::PunchOut);
1182 auto_punch_location_changed (0);
1187 if (location == 0) {
1191 if (location->end() <= location->start()) {
1192 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1196 punch_connections.drop_connections ();
1198 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
1199 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
1200 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
1202 location->set_auto_punch (true, this);
1204 auto_punch_changed (location);
1206 auto_punch_location_changed (location);
1210 Session::set_auto_loop_location (Location* location)
1214 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1215 loop_connections.drop_connections ();
1216 existing->set_auto_loop (false, this);
1217 remove_event (existing->end(), SessionEvent::AutoLoop);
1220 auto_loop_declick_range (existing, dcp, dcl);
1221 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1222 auto_loop_location_changed (0);
1227 if (location == 0) {
1231 if (location->end() <= location->start()) {
1232 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1236 last_loopend = location->end();
1238 loop_connections.drop_connections ();
1240 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1241 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1242 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1244 location->set_auto_loop (true, this);
1246 /* take care of our stuff first */
1248 auto_loop_changed (location);
1250 /* now tell everyone else */
1252 auto_loop_location_changed (location);
1256 Session::locations_added (Location *)
1262 Session::locations_changed ()
1264 _locations->apply (*this, &Session::handle_locations_changed);
1268 Session::handle_locations_changed (Locations::LocationList& locations)
1270 Locations::LocationList::iterator i;
1272 bool set_loop = false;
1273 bool set_punch = false;
1275 for (i = locations.begin(); i != locations.end(); ++i) {
1279 if (location->is_auto_punch()) {
1280 set_auto_punch_location (location);
1283 if (location->is_auto_loop()) {
1284 set_auto_loop_location (location);
1288 if (location->is_session_range()) {
1289 _session_range_location = location;
1294 set_auto_loop_location (0);
1297 set_auto_punch_location (0);
1304 Session::enable_record ()
1306 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1307 /* no recording at anything except normal speed */
1312 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1314 if (rs == Recording) {
1318 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1320 _last_record_location = _transport_frame;
1321 _mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1323 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1324 set_track_monitor_input_status (true);
1327 RecordStateChanged ();
1334 Session::disable_record (bool rt_context, bool force)
1338 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1340 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1341 g_atomic_int_set (&_record_status, Disabled);
1342 _mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1344 if (rs == Recording) {
1345 g_atomic_int_set (&_record_status, Enabled);
1349 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1350 set_track_monitor_input_status (false);
1353 RecordStateChanged (); /* emit signal */
1356 remove_pending_capture_state ();
1362 Session::step_back_from_record ()
1364 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1366 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1367 set_track_monitor_input_status (false);
1370 RecordStateChanged (); /* emit signal */
1375 Session::maybe_enable_record ()
1377 if (_step_editors > 0) {
1381 g_atomic_int_set (&_record_status, Enabled);
1383 /* This function is currently called from somewhere other than an RT thread.
1384 This save_state() call therefore doesn't impact anything. Doing it here
1385 means that we save pending state of which sources the next record will use,
1386 which gives us some chance of recovering from a crash during the record.
1389 save_state ("", true);
1391 if (_transport_speed) {
1392 if (!config.get_punch_in()) {
1396 _mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1397 RecordStateChanged (); /* EMIT SIGNAL */
1404 Session::audible_frame () const
1410 /* the first of these two possible settings for "offset"
1411 mean that the audible frame is stationary until
1412 audio emerges from the latency compensation
1415 the second means that the audible frame is stationary
1416 until audio would emerge from a physical port
1417 in the absence of any plugin latency compensation
1420 offset = worst_playback_latency ();
1422 if (offset > current_block_size) {
1423 offset -= current_block_size;
1425 /* XXX is this correct? if we have no external
1426 physical connections and everything is internal
1427 then surely this is zero? still, how
1428 likely is that anyway?
1430 offset = current_block_size;
1433 if (synced_to_engine()) {
1434 tf = _engine.transport_frame();
1436 tf = _transport_frame;
1441 if (!non_realtime_work_pending()) {
1445 /* Check to see if we have passed the first guaranteed
1446 audible frame past our last start position. if not,
1447 return that last start point because in terms
1448 of audible frames, we have not moved yet.
1450 `Start position' in this context means the time we last
1451 either started, located, or changed transport direction.
1454 if (_transport_speed > 0.0f) {
1456 if (!play_loop || !have_looped) {
1457 if (tf < _last_roll_or_reversal_location + offset) {
1458 return _last_roll_or_reversal_location;
1466 } else if (_transport_speed < 0.0f) {
1468 /* XXX wot? no backward looping? */
1470 if (tf > _last_roll_or_reversal_location - offset) {
1471 return _last_roll_or_reversal_location;
1483 Session::set_frame_rate (framecnt_t frames_per_second)
1485 /** \fn void Session::set_frame_size(framecnt_t)
1486 the AudioEngine object that calls this guarantees
1487 that it will not be called while we are also in
1488 ::process(). Its fine to do things that block
1492 _base_frame_rate = frames_per_second;
1493 _nominal_frame_rate = frames_per_second;
1499 // XXX we need some equivalent to this, somehow
1500 // SndFileSource::setup_standard_crossfades (frames_per_second);
1504 /* XXX need to reset/reinstantiate all LADSPA plugins */
1508 Session::set_block_size (pframes_t nframes)
1510 /* the AudioEngine guarantees
1511 that it will not be called while we are also in
1512 ::process(). It is therefore fine to do things that block
1517 current_block_size = nframes;
1521 boost::shared_ptr<RouteList> r = routes.reader ();
1523 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1524 (*i)->set_block_size (nframes);
1527 boost::shared_ptr<RouteList> rl = routes.reader ();
1528 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1529 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1531 tr->set_block_size (nframes);
1535 set_worst_io_latencies ();
1541 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1543 boost::shared_ptr<Route> r2;
1545 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1546 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1550 /* make a copy of the existing list of routes that feed r1 */
1552 Route::FedBy existing (r1->fed_by());
1554 /* for each route that feeds r1, recurse, marking it as feeding
1558 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1559 if (!(r2 = i->r.lock ())) {
1560 /* (*i) went away, ignore it */
1564 /* r2 is a route that feeds r1 which somehow feeds base. mark
1565 base as being fed by r2
1568 rbase->add_fed_by (r2, i->sends_only);
1572 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1576 if (r1->feeds (r2) && r2->feeds (r1)) {
1580 /* now recurse, so that we can mark base as being fed by
1581 all routes that feed r2
1584 trace_terminal (r2, rbase);
1591 Session::resort_routes ()
1593 /* don't do anything here with signals emitted
1594 by Routes during initial setup or while we
1595 are being destroyed.
1598 if (_state_of_the_state & (InitialConnecting | Deletion)) {
1603 RCUWriter<RouteList> writer (routes);
1604 boost::shared_ptr<RouteList> r = writer.get_copy ();
1605 resort_routes_using (r);
1606 /* writer goes out of scope and forces update */
1610 boost::shared_ptr<RouteList> rl = routes.reader ();
1611 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1612 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1614 const Route::FedBy& fb ((*i)->fed_by());
1616 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1617 boost::shared_ptr<Route> sf = f->r.lock();
1619 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1627 /** This is called whenever we need to rebuild the graph of how we will process
1629 * @param r List of routes, in any order.
1633 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1635 /* We are going to build a directed graph of our routes;
1636 this is where the edges of that graph are put.
1641 /* Go through all routes doing two things:
1643 * 1. Collect the edges of the route graph. Each of these edges
1644 * is a pair of routes, one of which directly feeds the other
1645 * either by a JACK connection or by an internal send.
1647 * 2. Begin the process of making routes aware of which other
1648 * routes directly or indirectly feed them. This information
1649 * is used by the solo code.
1652 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1654 /* Clear out the route's list of direct or indirect feeds */
1655 (*i)->clear_fed_by ();
1657 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
1659 bool via_sends_only;
1661 /* See if this *j feeds *i according to the current state of the JACK
1662 connections and internal sends.
1664 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
1665 /* add the edge to the graph (part #1) */
1666 edges.add (*j, *i, via_sends_only);
1667 /* tell the route (for part #2) */
1668 (*i)->add_fed_by (*j, via_sends_only);
1673 /* Attempt a topological sort of the route graph */
1674 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
1676 if (sorted_routes) {
1677 /* We got a satisfactory topological sort, so there is no feedback;
1680 Note: the process graph rechain does not require a
1681 topologically-sorted list, but hey ho.
1683 if (_process_graph) {
1684 _process_graph->rechain (sorted_routes, edges);
1687 _current_route_graph = edges;
1689 /* Complete the building of the routes' lists of what directly
1690 or indirectly feeds them.
1692 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1693 trace_terminal (*i, *i);
1696 *r = *sorted_routes;
1699 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1700 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1701 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1702 (*i)->name(), (*i)->order_key (MixerSort)));
1706 SuccessfulGraphSort (); /* EMIT SIGNAL */
1709 /* The topological sort failed, so we have a problem. Tell everyone
1710 and stick to the old graph; this will continue to be processed, so
1711 until the feedback is fixed, what is played back will not quite
1712 reflect what is actually connected. Note also that we do not
1713 do trace_terminal here, as it would fail due to an endless recursion,
1714 so the solo code will think that everything is still connected
1718 FeedbackDetected (); /* EMIT SIGNAL */
1723 /** Find a route name starting with \a base, maybe followed by the
1724 * lowest \a id. \a id will always be added if \a definitely_add_number
1725 * is true on entry; otherwise it will only be added if required
1726 * to make the name unique.
1728 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1729 * The available route name with the lowest ID will be used, and \a id
1730 * will be set to the ID.
1732 * \return false if a route name could not be found, and \a track_name
1733 * and \a id do not reflect a free route name.
1736 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1738 if (!definitely_add_number && route_by_name (base) == 0) {
1739 /* juse use the base */
1740 snprintf (name, name_len, "%s", base.c_str());
1745 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1747 if (route_by_name (name) == 0) {
1753 } while (id < (UINT_MAX-1));
1758 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
1760 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
1762 in = ChanCount::ZERO;
1763 out = ChanCount::ZERO;
1765 boost::shared_ptr<RouteList> r = routes.reader ();
1767 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1768 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1769 if (tr && !tr->is_auditioner()) {
1770 in += tr->n_inputs();
1771 out += tr->n_outputs();
1776 /** Caller must not hold process lock
1777 * @param name_template string to use for the start of the name, or "" to use "MIDI".
1778 * @param instrument plugin info for the instrument to insert pre-fader, if any
1780 list<boost::shared_ptr<MidiTrack> >
1781 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
1782 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1784 char track_name[32];
1785 uint32_t track_id = 0;
1787 RouteList new_routes;
1788 list<boost::shared_ptr<MidiTrack> > ret;
1790 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
1793 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1794 error << "cannot find name for new midi track" << endmsg;
1798 boost::shared_ptr<MidiTrack> track;
1801 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1803 if (track->init ()) {
1807 track->use_new_diskstream();
1809 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1810 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1813 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1814 if (track->input()->ensure_io (input, false, this)) {
1815 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
1819 if (track->output()->ensure_io (output, false, this)) {
1820 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
1825 track->non_realtime_input_change();
1828 route_group->add (track);
1831 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1833 if (Config->get_remote_model() == UserOrdered) {
1834 track->set_remote_control_id (next_control_id());
1837 new_routes.push_back (track);
1838 ret.push_back (track);
1841 catch (failed_constructor &err) {
1842 error << _("Session: could not create new midi track.") << endmsg;
1846 catch (AudioEngine::PortRegistrationFailure& pfe) {
1848 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;
1856 if (!new_routes.empty()) {
1857 add_routes (new_routes, true, true, true);
1860 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
1861 PluginPtr plugin = instrument->load (*this);
1862 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
1863 (*r)->add_processor (p, PreFader);
1873 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
1875 boost::shared_ptr<Route> midi_track (wmt.lock());
1881 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
1883 if (change.after.n_audio() <= change.before.n_audio()) {
1887 /* new audio ports: make sure the audio goes somewhere useful,
1888 unless the user has no-auto-connect selected.
1890 The existing ChanCounts don't matter for this call as they are only
1891 to do with matching input and output indices, and we are only changing
1897 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
1901 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1902 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1903 * @param output_start As \a input_start, but for outputs.
1906 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
1907 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
1909 if (!IO::connecting_legal) {
1913 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1919 /* If both inputs and outputs are auto-connected to physical ports,
1920 use the max of input and output offsets to ensure auto-connected
1921 port numbers always match up (e.g. the first audio input and the
1922 first audio output of the route will have the same physical
1923 port number). Otherwise just use the lowest input or output
1927 DEBUG_TRACE (DEBUG::Graph,
1928 string_compose("Auto-connect: existing in = %1 out = %2\n",
1929 existing_inputs, existing_outputs));
1931 const bool in_out_physical =
1932 (Config->get_input_auto_connect() & AutoConnectPhysical)
1933 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1936 const ChanCount in_offset = in_out_physical
1937 ? ChanCount::max(existing_inputs, existing_outputs)
1940 const ChanCount out_offset = in_out_physical
1941 ? ChanCount::max(existing_inputs, existing_outputs)
1944 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1945 vector<string> physinputs;
1946 vector<string> physoutputs;
1948 _engine.get_physical_outputs (*t, physoutputs);
1949 _engine.get_physical_inputs (*t, physinputs);
1951 if (!physinputs.empty() && connect_inputs) {
1952 uint32_t nphysical_in = physinputs.size();
1954 DEBUG_TRACE (DEBUG::Graph,
1955 string_compose("There are %1 physical inputs of type %2\n",
1958 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1961 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1962 DEBUG_TRACE (DEBUG::Graph,
1963 string_compose("Get index %1 + %2 % %3 = %4\n",
1964 in_offset.get(*t), i, nphysical_in,
1965 (in_offset.get(*t) + i) % nphysical_in));
1966 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1969 DEBUG_TRACE (DEBUG::Graph,
1970 string_compose("Connect route %1 IN to %2\n",
1971 route->name(), port));
1973 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
1977 ChanCount one_added (*t, 1);
1978 existing_inputs += one_added;
1982 if (!physoutputs.empty()) {
1983 uint32_t nphysical_out = physoutputs.size();
1984 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
1987 if ((*t) == DataType::MIDI || Config->get_output_auto_connect() & AutoConnectPhysical) {
1988 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1989 } else if ((*t) == DataType::AUDIO && Config->get_output_auto_connect() & AutoConnectMaster) {
1990 /* master bus is audio only */
1991 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1992 port = _master_out->input()->ports().port(*t,
1993 i % _master_out->input()->n_ports().get(*t))->name();
1997 DEBUG_TRACE (DEBUG::Graph,
1998 string_compose("Connect route %1 OUT to %2\n",
1999 route->name(), port));
2001 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
2005 ChanCount one_added (*t, 1);
2006 existing_outputs += one_added;
2012 /** Caller must not hold process lock
2013 * @param name_template string to use for the start of the name, or "" to use "Audio".
2015 list< boost::shared_ptr<AudioTrack> >
2016 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
2017 uint32_t how_many, string name_template)
2019 char track_name[32];
2020 uint32_t track_id = 0;
2022 RouteList new_routes;
2023 list<boost::shared_ptr<AudioTrack> > ret;
2025 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
2028 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
2029 error << "cannot find name for new audio track" << endmsg;
2033 boost::shared_ptr<AudioTrack> track;
2036 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
2038 if (track->init ()) {
2042 track->use_new_diskstream();
2044 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2045 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2048 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2050 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2051 error << string_compose (
2052 _("cannot configure %1 in/%2 out configuration for new audio track"),
2053 input_channels, output_channels)
2058 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2059 error << string_compose (
2060 _("cannot configure %1 in/%2 out configuration for new audio track"),
2061 input_channels, output_channels)
2068 route_group->add (track);
2071 track->non_realtime_input_change();
2073 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2074 if (Config->get_remote_model() == UserOrdered) {
2075 track->set_remote_control_id (next_control_id());
2078 new_routes.push_back (track);
2079 ret.push_back (track);
2082 catch (failed_constructor &err) {
2083 error << _("Session: could not create new audio track.") << endmsg;
2087 catch (AudioEngine::PortRegistrationFailure& pfe) {
2089 error << pfe.what() << endmsg;
2097 if (!new_routes.empty()) {
2098 add_routes (new_routes, true, true, true);
2104 /** Caller must not hold process lock.
2105 * @param name_template string to use for the start of the name, or "" to use "Bus".
2108 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
2111 uint32_t bus_id = 0;
2115 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
2118 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
2119 error << "cannot find name for new audio bus" << endmsg;
2124 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
2130 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2131 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
2134 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2136 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2137 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2138 input_channels, output_channels)
2144 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2145 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2146 input_channels, output_channels)
2153 route_group->add (bus);
2155 if (Config->get_remote_model() == UserOrdered) {
2156 bus->set_remote_control_id (next_control_id());
2159 bus->add_internal_return ();
2161 ret.push_back (bus);
2167 catch (failed_constructor &err) {
2168 error << _("Session: could not create new audio route.") << endmsg;
2172 catch (AudioEngine::PortRegistrationFailure& pfe) {
2173 error << pfe.what() << endmsg;
2183 add_routes (ret, false, true, true); // autoconnect outputs only
2191 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base)
2194 uint32_t control_id;
2196 uint32_t number = 0;
2197 const uint32_t being_added = how_many;
2199 if (!tree.read (template_path.c_str())) {
2203 XMLNode* node = tree.root();
2205 IO::disable_connecting ();
2207 control_id = next_control_id ();
2211 XMLNode node_copy (*node);
2213 /* Remove IDs of everything so that new ones are used */
2214 node_copy.remove_property_recursively (X_("id"));
2219 if (!name_base.empty()) {
2221 /* if we're adding more than one routes, force
2222 * all the names of the new routes to be
2223 * numbered, via the final parameter.
2226 if (!find_route_name (name_base.c_str(), ++number, name, sizeof(name), (being_added > 1))) {
2227 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2233 string const route_name = node_copy.property(X_("name"))->value ();
2235 /* generate a new name by adding a number to the end of the template name */
2236 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2237 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2242 /* set this name in the XML description that we are about to use */
2243 Route::set_name_in_state (node_copy, name);
2245 /* trim bitslots from listen sends so that new ones are used */
2246 XMLNodeList children = node_copy.children ();
2247 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2248 if ((*i)->name() == X_("Processor")) {
2249 XMLProperty* role = (*i)->property (X_("role"));
2250 if (role && role->value() == X_("Listen")) {
2251 (*i)->remove_property (X_("bitslot"));
2256 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2259 error << _("Session: cannot create track/bus from template description") << endmsg;
2263 if (boost::dynamic_pointer_cast<Track>(route)) {
2264 /* force input/output change signals so that the new diskstream
2265 picks up the configuration of the route. During session
2266 loading this normally happens in a different way.
2269 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2271 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2272 change.after = route->input()->n_ports();
2273 route->input()->changed (change, this);
2274 change.after = route->output()->n_ports();
2275 route->output()->changed (change, this);
2278 route->set_remote_control_id (control_id);
2281 ret.push_back (route);
2284 catch (failed_constructor &err) {
2285 error << _("Session: could not create new route from template") << endmsg;
2289 catch (AudioEngine::PortRegistrationFailure& pfe) {
2290 error << pfe.what() << endmsg;
2299 add_routes (ret, true, true, true);
2300 IO::enable_connecting ();
2307 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
2310 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
2311 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
2314 error << _("Adding new tracks/busses failed") << endmsg;
2319 update_latency (true);
2320 update_latency (false);
2325 save_state (_current_snapshot_name);
2328 RouteAdded (new_routes); /* EMIT SIGNAL */
2332 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
2334 ChanCount existing_inputs;
2335 ChanCount existing_outputs;
2336 uint32_t order = next_control_id();
2338 count_existing_track_channels (existing_inputs, existing_outputs);
2341 RCUWriter<RouteList> writer (routes);
2342 boost::shared_ptr<RouteList> r = writer.get_copy ();
2343 r->insert (r->end(), new_routes.begin(), new_routes.end());
2345 /* if there is no control out and we're not in the middle of loading,
2346 resort the graph here. if there is a control out, we will resort
2347 toward the end of this method. if we are in the middle of loading,
2348 we will resort when done.
2351 if (!_monitor_out && IO::connecting_legal) {
2352 resort_routes_using (r);
2356 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2358 boost::weak_ptr<Route> wpr (*x);
2359 boost::shared_ptr<Route> r (*x);
2361 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2362 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2363 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2364 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2365 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2366 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2368 if (r->is_master()) {
2372 if (r->is_monitor()) {
2376 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2378 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2379 track_playlist_changed (boost::weak_ptr<Track> (tr));
2380 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2382 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2384 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2385 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2390 if (input_auto_connect || output_auto_connect) {
2391 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
2394 /* order keys are a GUI responsibility but we need to set up
2395 reasonable defaults because they also affect the remote control
2396 ID in most situations.
2399 if (!r->has_order_key (EditorSort)) {
2400 if (r->is_auditioner()) {
2401 /* use an arbitrarily high value */
2402 r->set_order_key (EditorSort, UINT_MAX);
2403 r->set_order_key (MixerSort, UINT_MAX);
2405 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
2406 r->set_order_key (EditorSort, order);
2407 r->set_order_key (MixerSort, order);
2415 if (_monitor_out && IO::connecting_legal) {
2416 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
2418 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2419 if ((*x)->is_monitor()) {
2421 } else if ((*x)->is_master()) {
2424 (*x)->enable_monitor_send ();
2431 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2433 boost::shared_ptr<RouteList> r = routes.reader ();
2434 boost::shared_ptr<Send> s;
2436 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2437 if ((s = (*i)->internal_send_for (dest)) != 0) {
2438 s->amp()->gain_control()->set_value (0.0);
2444 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2446 boost::shared_ptr<RouteList> r = routes.reader ();
2447 boost::shared_ptr<Send> s;
2449 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2450 if ((s = (*i)->internal_send_for (dest)) != 0) {
2451 s->amp()->gain_control()->set_value (1.0);
2457 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2459 boost::shared_ptr<RouteList> r = routes.reader ();
2460 boost::shared_ptr<Send> s;
2462 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2463 if ((s = (*i)->internal_send_for (dest)) != 0) {
2464 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2469 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2471 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2473 boost::shared_ptr<RouteList> r = routes.reader ();
2474 boost::shared_ptr<RouteList> t (new RouteList);
2476 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2477 /* no MIDI sends because there are no MIDI busses yet */
2478 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2483 add_internal_sends (dest, p, t);
2487 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2489 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2490 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
2495 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
2497 add_internal_send (dest, sender->before_processor_for_index (index), sender);
2501 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
2503 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
2507 if (!dest->internal_return()) {
2508 dest->add_internal_return ();
2511 sender->add_aux_send (dest, before);
2517 Session::remove_route (boost::shared_ptr<Route> route)
2519 if (route == _master_out) {
2523 route->set_solo (false, this);
2526 RCUWriter<RouteList> writer (routes);
2527 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2531 /* deleting the master out seems like a dumb
2532 idea, but its more of a UI policy issue
2536 if (route == _master_out) {
2537 _master_out = boost::shared_ptr<Route> ();
2540 if (route == _monitor_out) {
2541 _monitor_out.reset ();
2544 /* writer goes out of scope, forces route list update */
2547 update_route_solo_state ();
2549 // We need to disconnect the route's inputs and outputs
2551 route->input()->disconnect (0);
2552 route->output()->disconnect (0);
2554 /* if the route had internal sends sending to it, remove them */
2555 if (route->internal_return()) {
2557 boost::shared_ptr<RouteList> r = routes.reader ();
2558 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2559 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2561 (*i)->remove_processor (s);
2566 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2567 if (mt && mt->step_editing()) {
2568 if (_step_editors > 0) {
2573 update_latency_compensation ();
2576 /* Re-sort routes to remove the graph's current references to the one that is
2577 * going away, then flush old references out of the graph.
2581 if (_process_graph) {
2582 _process_graph->clear_other_chain ();
2585 /* get rid of it from the dead wood collection in the route list manager */
2587 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2591 /* try to cause everyone to drop their references */
2593 route->drop_references ();
2595 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2597 /* save the new state of the world */
2599 if (save_state (_current_snapshot_name)) {
2600 save_history (_current_snapshot_name);
2605 Session::route_mute_changed (void* /*src*/)
2611 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2613 boost::shared_ptr<Route> route = wpr.lock();
2615 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2619 if (route->listening_via_monitor ()) {
2621 if (Config->get_exclusive_solo()) {
2622 /* new listen: disable all other listen */
2623 boost::shared_ptr<RouteList> r = routes.reader ();
2624 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2625 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
2628 (*i)->set_listen (false, this);
2634 } else if (_listen_cnt > 0) {
2639 update_route_solo_state ();
2642 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2644 boost::shared_ptr<Route> route = wpr.lock ();
2647 /* should not happen */
2648 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2652 bool send_changed = false;
2654 if (route->solo_isolated()) {
2655 if (_solo_isolated_cnt == 0) {
2656 send_changed = true;
2658 _solo_isolated_cnt++;
2659 } else if (_solo_isolated_cnt > 0) {
2660 _solo_isolated_cnt--;
2661 if (_solo_isolated_cnt == 0) {
2662 send_changed = true;
2667 IsolatedChanged (); /* EMIT SIGNAL */
2672 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2674 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
2676 if (!self_solo_change) {
2677 // session doesn't care about changes to soloed-by-others
2681 if (solo_update_disabled) {
2683 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
2687 boost::shared_ptr<Route> route = wpr.lock ();
2690 boost::shared_ptr<RouteList> r = routes.reader ();
2693 if (route->self_soloed()) {
2699 RouteGroup* rg = route->route_group ();
2700 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
2702 if (delta == 1 && Config->get_exclusive_solo()) {
2704 /* new solo: disable all other solos, but not the group if its solo-enabled */
2706 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2707 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
2708 (leave_group_alone && ((*i)->route_group() == rg))) {
2711 (*i)->set_solo (false, this);
2715 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
2717 solo_update_disabled = true;
2719 RouteList uninvolved;
2721 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
2723 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2724 bool via_sends_only;
2725 bool in_signal_flow;
2727 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
2728 (leave_group_alone && ((*i)->route_group() == rg))) {
2732 in_signal_flow = false;
2734 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
2736 if ((*i)->feeds (route, &via_sends_only)) {
2737 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
2738 if (!via_sends_only) {
2739 if (!route->soloed_by_others_upstream()) {
2740 (*i)->mod_solo_by_others_downstream (delta);
2743 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
2745 in_signal_flow = true;
2747 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
2750 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
2752 if (route->feeds (*i, &via_sends_only)) {
2753 /* propagate solo upstream only if routing other than
2754 sends is involved, but do consider the other route
2755 (*i) to be part of the signal flow even if only
2758 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
2762 route->soloed_by_others_downstream(),
2763 route->soloed_by_others_upstream()));
2764 if (!via_sends_only) {
2765 if (!route->soloed_by_others_downstream()) {
2766 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
2767 (*i)->mod_solo_by_others_upstream (delta);
2769 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
2772 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
2774 in_signal_flow = true;
2776 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
2779 if (!in_signal_flow) {
2780 uninvolved.push_back (*i);
2784 solo_update_disabled = false;
2785 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
2787 update_route_solo_state (r);
2789 /* now notify that the mute state of the routes not involved in the signal
2790 pathway of the just-solo-changed route may have altered.
2793 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2794 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
2795 (*i)->mute_changed (this);
2798 SoloChanged (); /* EMIT SIGNAL */
2803 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2805 /* now figure out if anything that matters is soloed (or is "listening")*/
2807 bool something_soloed = false;
2808 uint32_t listeners = 0;
2809 uint32_t isolated = 0;
2812 r = routes.reader();
2815 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2816 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
2817 something_soloed = true;
2820 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
2821 if (Config->get_solo_control_is_listen_control()) {
2824 (*i)->set_listen (false, this);
2828 if ((*i)->solo_isolated()) {
2833 if (something_soloed != _non_soloed_outs_muted) {
2834 _non_soloed_outs_muted = something_soloed;
2835 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2838 _listen_cnt = listeners;
2840 if (isolated != _solo_isolated_cnt) {
2841 _solo_isolated_cnt = isolated;
2842 IsolatedChanged (); /* EMIT SIGNAL */
2845 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
2846 something_soloed, listeners, isolated));
2849 boost::shared_ptr<RouteList>
2850 Session::get_routes_with_internal_returns() const
2852 boost::shared_ptr<RouteList> r = routes.reader ();
2853 boost::shared_ptr<RouteList> rl (new RouteList);
2855 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2856 if ((*i)->internal_return ()) {
2864 Session::io_name_is_legal (const std::string& name)
2866 boost::shared_ptr<RouteList> r = routes.reader ();
2868 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2869 if ((*i)->name() == name) {
2873 if ((*i)->has_io_processor_named (name)) {
2882 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
2885 vector<string> connections;
2887 /* if we are passed only a single route and we're not told to turn
2888 * others off, then just do the simple thing.
2891 if (flip_others == false && rl->size() == 1) {
2892 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
2894 mt->set_input_active (onoff);
2899 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
2901 PortSet& ps ((*rt)->input()->ports());
2903 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
2904 p->get_connections (connections);
2907 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
2908 routes_using_input_from (*s, rl2);
2911 /* scan all relevant routes to see if others are on or off */
2913 bool others_are_already_on = false;
2915 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
2917 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2923 if ((*r) != (*rt)) {
2924 if (mt->input_active()) {
2925 others_are_already_on = true;
2928 /* this one needs changing */
2929 mt->set_input_active (onoff);
2935 /* globally reverse other routes */
2937 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
2938 if ((*r) != (*rt)) {
2939 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2941 mt->set_input_active (!others_are_already_on);
2950 Session::routes_using_input_from (const string& str, RouteList& rl)
2952 boost::shared_ptr<RouteList> r = routes.reader();
2954 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2955 if ((*i)->input()->connected_to (str)) {
2961 boost::shared_ptr<Route>
2962 Session::route_by_name (string name)
2964 boost::shared_ptr<RouteList> r = routes.reader ();
2966 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2967 if ((*i)->name() == name) {
2972 return boost::shared_ptr<Route> ((Route*) 0);
2975 boost::shared_ptr<Route>
2976 Session::route_by_id (PBD::ID id)
2978 boost::shared_ptr<RouteList> r = routes.reader ();
2980 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2981 if ((*i)->id() == id) {
2986 return boost::shared_ptr<Route> ((Route*) 0);
2989 boost::shared_ptr<Track>
2990 Session::track_by_diskstream_id (PBD::ID id)
2992 boost::shared_ptr<RouteList> r = routes.reader ();
2994 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2995 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
2996 if (t && t->using_diskstream_id (id)) {
3001 return boost::shared_ptr<Track> ();
3004 boost::shared_ptr<Route>
3005 Session::route_by_remote_id (uint32_t id)
3007 boost::shared_ptr<RouteList> r = routes.reader ();
3009 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3010 if ((*i)->remote_control_id() == id) {
3015 return boost::shared_ptr<Route> ((Route*) 0);
3019 Session::playlist_region_added (boost::weak_ptr<Region> w)
3021 boost::shared_ptr<Region> r = w.lock ();
3026 /* These are the operations that are currently in progress... */
3027 list<GQuark> curr = _current_trans_quarks;
3030 /* ...and these are the operations during which we want to update
3031 the session range location markers.
3034 ops.push_back (Operations::capture);
3035 ops.push_back (Operations::paste);
3036 ops.push_back (Operations::duplicate_region);
3037 ops.push_back (Operations::insert_file);
3038 ops.push_back (Operations::insert_region);
3039 ops.push_back (Operations::drag_region_brush);
3040 ops.push_back (Operations::region_drag);
3041 ops.push_back (Operations::selection_grab);
3042 ops.push_back (Operations::region_fill);
3043 ops.push_back (Operations::fill_selection);
3044 ops.push_back (Operations::create_region);
3045 ops.push_back (Operations::region_copy);
3046 ops.push_back (Operations::fixed_time_region_copy);
3049 /* See if any of the current operations match the ones that we want */
3051 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
3053 /* If so, update the session range markers */
3055 maybe_update_session_range (r->position (), r->last_frame ());
3059 /** Update the session range markers if a is before the current start or
3060 * b is after the current end.
3063 Session::maybe_update_session_range (framepos_t a, framepos_t b)
3065 if (_state_of_the_state & Loading) {
3069 if (_session_range_location == 0) {
3071 add_session_range_location (a, b);
3075 if (a < _session_range_location->start()) {
3076 _session_range_location->set_start (a);
3079 if (b > _session_range_location->end()) {
3080 _session_range_location->set_end (b);
3086 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
3088 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3089 maybe_update_session_range (i->to, i->to + i->length);
3094 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
3096 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3097 maybe_update_session_range (i->from, i->to);
3101 /* Region management */
3103 boost::shared_ptr<Region>
3104 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
3106 const RegionFactory::RegionMap& regions (RegionFactory::regions());
3107 RegionFactory::RegionMap::const_iterator i;
3108 boost::shared_ptr<Region> region;
3110 Glib::Threads::Mutex::Lock lm (region_lock);
3112 for (i = regions.begin(); i != regions.end(); ++i) {
3116 if (region->whole_file()) {
3118 if (child->source_equivalent (region)) {
3124 return boost::shared_ptr<Region> ();
3128 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
3130 set<boost::shared_ptr<Region> > relevant_regions;
3132 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
3133 RegionFactory::get_regions_using_source (*s, relevant_regions);
3136 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
3137 set<boost::shared_ptr<Region> >::iterator tmp;
3142 playlists->destroy_region (*r);
3143 RegionFactory::map_remove (*r);
3145 (*r)->drop_sources ();
3146 (*r)->drop_references ();
3148 relevant_regions.erase (r);
3153 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
3156 Glib::Threads::Mutex::Lock ls (source_lock);
3157 /* remove from the main source list */
3158 sources.erase ((*s)->id());
3161 (*s)->mark_for_remove ();
3162 (*s)->drop_references ();
3171 Session::remove_last_capture ()
3173 list<boost::shared_ptr<Source> > srcs;
3175 boost::shared_ptr<RouteList> rl = routes.reader ();
3176 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3177 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3182 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
3185 srcs.insert (srcs.end(), l.begin(), l.end());
3190 destroy_sources (srcs);
3192 save_state (_current_snapshot_name);
3197 /* Source Management */
3200 Session::add_source (boost::shared_ptr<Source> source)
3202 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
3203 pair<SourceMap::iterator,bool> result;
3205 entry.first = source->id();
3206 entry.second = source;
3209 Glib::Threads::Mutex::Lock lm (source_lock);
3210 result = sources.insert (entry);
3213 if (result.second) {
3215 /* yay, new source */
3217 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
3220 if (!fs->within_session()) {
3221 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
3227 boost::shared_ptr<AudioFileSource> afs;
3229 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
3230 if (Config->get_auto_analyse_audio()) {
3231 Analyser::queue_source_for_analysis (source, false);
3235 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
3240 Session::remove_source (boost::weak_ptr<Source> src)
3242 if (_state_of_the_state & Deletion) {
3246 SourceMap::iterator i;
3247 boost::shared_ptr<Source> source = src.lock();
3254 Glib::Threads::Mutex::Lock lm (source_lock);
3256 if ((i = sources.find (source->id())) != sources.end()) {
3261 if (!(_state_of_the_state & InCleanup)) {
3263 /* save state so we don't end up with a session file
3264 referring to non-existent sources.
3267 save_state (_current_snapshot_name);
3271 boost::shared_ptr<Source>
3272 Session::source_by_id (const PBD::ID& id)
3274 Glib::Threads::Mutex::Lock lm (source_lock);
3275 SourceMap::iterator i;
3276 boost::shared_ptr<Source> source;
3278 if ((i = sources.find (id)) != sources.end()) {
3285 boost::shared_ptr<Source>
3286 Session::source_by_path_and_channel (const string& path, uint16_t chn)
3288 Glib::Threads::Mutex::Lock lm (source_lock);
3290 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3291 boost::shared_ptr<AudioFileSource> afs
3292 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
3294 if (afs && afs->path() == path && chn == afs->channel()) {
3298 return boost::shared_ptr<Source>();
3302 Session::count_sources_by_origin (const string& path)
3305 Glib::Threads::Mutex::Lock lm (source_lock);
3307 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3308 boost::shared_ptr<FileSource> fs
3309 = boost::dynamic_pointer_cast<FileSource>(i->second);
3311 if (fs && fs->origin() == path) {
3321 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
3324 string old_basename = PBD::basename_nosuffix (oldname);
3325 string new_legalized = legalize_for_path (newname);
3327 /* note: we know (or assume) the old path is already valid */
3331 /* destructive file sources have a name of the form:
3333 /path/to/Tnnnn-NAME(%[LR])?.wav
3335 the task here is to replace NAME with the new name.
3340 string::size_type dash;
3342 dir = Glib::path_get_dirname (path);
3343 path = Glib::path_get_basename (path);
3345 /* '-' is not a legal character for the NAME part of the path */
3347 if ((dash = path.find_last_of ('-')) == string::npos) {
3351 prefix = path.substr (0, dash);
3355 path += new_legalized;
3356 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3357 path = Glib::build_filename (dir, path);
3361 /* non-destructive file sources have a name of the form:
3363 /path/to/NAME-nnnnn(%[LR])?.ext
3365 the task here is to replace NAME with the new name.
3370 string::size_type dash;
3371 string::size_type postfix;
3373 dir = Glib::path_get_dirname (path);
3374 path = Glib::path_get_basename (path);
3376 /* '-' is not a legal character for the NAME part of the path */
3378 if ((dash = path.find_last_of ('-')) == string::npos) {
3382 suffix = path.substr (dash+1);
3384 // Suffix is now everything after the dash. Now we need to eliminate
3385 // the nnnnn part, which is done by either finding a '%' or a '.'
3387 postfix = suffix.find_last_of ("%");
3388 if (postfix == string::npos) {
3389 postfix = suffix.find_last_of ('.');
3392 if (postfix != string::npos) {
3393 suffix = suffix.substr (postfix);
3395 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
3399 const uint32_t limit = 10000;
3400 char buf[PATH_MAX+1];
3402 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
3404 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
3406 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
3407 path = Glib::build_filename (dir, buf);
3415 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
3424 /** Return the full path (in some session directory) for a new within-session source.
3425 * \a name must be a session-unique name that does not contain slashes
3426 * (e.g. as returned by new_*_source_name)
3429 Session::new_source_path_from_name (DataType type, const string& name)
3431 assert(name.find("/") == string::npos);
3433 SessionDirectory sdir(get_best_session_directory_for_new_source());
3436 if (type == DataType::AUDIO) {
3437 p = sdir.sound_path();
3438 } else if (type == DataType::MIDI) {
3439 p = sdir.midi_path();
3441 error << "Unknown source type, unable to create file path" << endmsg;
3445 return Glib::build_filename (p, name);
3449 Session::peak_path (string base) const
3451 return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
3454 /** Return a unique name based on \a base for a new internal audio source */
3456 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
3459 char buf[PATH_MAX+1];
3460 const uint32_t limit = 10000;
3462 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3465 legalized = legalize_for_path (base);
3467 // Find a "version" of the base name that doesn't exist in any of the possible directories.
3468 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3470 vector<space_and_path>::iterator i;
3471 uint32_t existing = 0;
3473 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3478 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3479 cnt, legalized.c_str(), ext.c_str());
3480 } else if (nchan == 2) {
3482 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
3483 cnt, legalized.c_str(), ext.c_str());
3485 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
3486 cnt, legalized.c_str(), ext.c_str());
3488 } else if (nchan < 26) {
3489 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
3490 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
3492 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3493 cnt, legalized.c_str(), ext.c_str());
3499 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3500 } else if (nchan == 2) {
3502 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
3504 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
3506 } else if (nchan < 26) {
3507 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
3509 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3513 SessionDirectory sdir((*i).path);
3515 string spath = sdir.sound_path();
3517 /* note that we search *without* the extension so that
3518 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3519 in the event that this new name is required for
3520 a file format change.
3523 if (matching_unsuffixed_filename_exists_in (spath, buf)) {
3529 if (existing == 0) {
3534 error << string_compose(
3535 _("There are already %1 recordings for %2, which I consider too many."),
3536 limit, base) << endmsg;
3538 throw failed_constructor();
3542 return Glib::path_get_basename (buf);
3545 /** Create a new within-session audio source */
3546 boost::shared_ptr<AudioFileSource>
3547 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
3549 const string name = new_audio_source_name (n, n_chans, chan, destructive);
3550 const string path = new_source_path_from_name(DataType::AUDIO, name);
3552 return boost::dynamic_pointer_cast<AudioFileSource> (
3553 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
3556 /** Return a unique name based on \a base for a new internal MIDI source */
3558 Session::new_midi_source_name (const string& base)
3561 char buf[PATH_MAX+1];
3562 const uint32_t limit = 10000;
3566 legalized = legalize_for_path (base);
3568 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3569 for (cnt = 1; cnt <= limit; ++cnt) {
3571 vector<space_and_path>::iterator i;
3572 uint32_t existing = 0;
3574 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3576 SessionDirectory sdir((*i).path);
3578 std::string p = Glib::build_filename (sdir.midi_path(), legalized);
3580 snprintf (buf, sizeof(buf), "%s-%u.mid", p.c_str(), cnt);
3582 if (Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
3587 if (existing == 0) {
3592 error << string_compose(
3593 _("There are already %1 recordings for %2, which I consider too many."),
3594 limit, base) << endmsg;
3596 throw failed_constructor();
3600 return Glib::path_get_basename(buf);
3604 /** Create a new within-session MIDI source */
3605 boost::shared_ptr<MidiSource>
3606 Session::create_midi_source_for_session (Track* track, string const & n)
3608 /* try to use the existing write source for the track, to keep numbering sane
3612 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3616 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3619 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3620 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3624 const string name = new_midi_source_name (n);
3625 const string path = new_source_path_from_name (DataType::MIDI, name);
3627 return boost::dynamic_pointer_cast<SMFSource> (
3628 SourceFactory::createWritable (
3629 DataType::MIDI, *this, path, false, frame_rate()));
3634 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3636 if (playlist->hidden()) {
3640 playlists->add (playlist);
3643 playlist->release();
3650 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3652 if (_state_of_the_state & Deletion) {
3656 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3662 playlists->remove (playlist);
3668 Session::set_audition (boost::shared_ptr<Region> r)
3670 pending_audition_region = r;
3671 add_post_transport_work (PostTransportAudition);
3672 _butler->schedule_transport_work ();
3676 Session::audition_playlist ()
3678 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3679 ev->region.reset ();
3684 Session::non_realtime_set_audition ()
3686 assert (pending_audition_region);
3687 auditioner->audition_region (pending_audition_region);
3688 pending_audition_region.reset ();
3689 AuditionActive (true); /* EMIT SIGNAL */
3693 Session::audition_region (boost::shared_ptr<Region> r)
3695 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3701 Session::cancel_audition ()
3703 if (auditioner->auditioning()) {
3704 auditioner->cancel_audition ();
3705 AuditionActive (false); /* EMIT SIGNAL */
3710 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3712 if (a->is_monitor()) {
3715 if (b->is_monitor()) {
3718 return a->order_key (MixerSort) < b->order_key (MixerSort);
3722 Session::is_auditioning () const
3724 /* can be called before we have an auditioner object */
3726 return auditioner->auditioning();
3733 Session::graph_reordered ()
3735 /* don't do this stuff if we are setting up connections
3736 from a set_state() call or creating new tracks. Ditto for deletion.
3739 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
3743 /* every track/bus asked for this to be handled but it was deferred because
3744 we were connecting. do it now.
3747 request_input_change_handling ();
3751 /* force all diskstreams to update their capture offset values to
3752 reflect any changes in latencies within the graph.
3755 boost::shared_ptr<RouteList> rl = routes.reader ();
3756 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3757 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3759 tr->set_capture_offset ();
3764 /** @return Number of frames that there is disk space available to write,
3767 boost::optional<framecnt_t>
3768 Session::available_capture_duration ()
3770 Glib::Threads::Mutex::Lock lm (space_lock);
3772 if (_total_free_4k_blocks_uncertain) {
3773 return boost::optional<framecnt_t> ();
3776 float sample_bytes_on_disk = 4.0; // keep gcc happy
3778 switch (config.get_native_file_data_format()) {
3780 sample_bytes_on_disk = 4.0;
3784 sample_bytes_on_disk = 3.0;
3788 sample_bytes_on_disk = 2.0;
3792 /* impossible, but keep some gcc versions happy */
3793 fatal << string_compose (_("programming error: %1"),
3794 X_("illegal native file data format"))
3799 double scale = 4096.0 / sample_bytes_on_disk;
3801 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3802 return max_framecnt;
3805 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3809 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3812 RCUWriter<BundleList> writer (_bundles);
3813 boost::shared_ptr<BundleList> b = writer.get_copy ();
3814 b->push_back (bundle);
3817 BundleAdded (bundle); /* EMIT SIGNAL */
3823 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3825 bool removed = false;
3828 RCUWriter<BundleList> writer (_bundles);
3829 boost::shared_ptr<BundleList> b = writer.get_copy ();
3830 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3832 if (i != b->end()) {
3839 BundleRemoved (bundle); /* EMIT SIGNAL */
3845 boost::shared_ptr<Bundle>
3846 Session::bundle_by_name (string name) const
3848 boost::shared_ptr<BundleList> b = _bundles.reader ();
3850 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3851 if ((*i)->name() == name) {
3856 return boost::shared_ptr<Bundle> ();
3860 Session::tempo_map_changed (const PropertyChange&)
3864 playlists->update_after_tempo_map_change ();
3866 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3872 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3874 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3875 (*i)->recompute_frames_from_bbt ();
3879 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3880 * the given count with the current block size.
3883 Session::ensure_buffers (ChanCount howmany)
3885 BufferManager::ensure_buffers (howmany);
3889 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3891 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3892 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3897 Session::next_insert_id ()
3899 /* this doesn't really loop forever. just think about it */
3902 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3903 if (!insert_bitset[n]) {
3904 insert_bitset[n] = true;
3910 /* none available, so resize and try again */
3912 insert_bitset.resize (insert_bitset.size() + 16, false);
3917 Session::next_send_id ()
3919 /* this doesn't really loop forever. just think about it */
3922 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3923 if (!send_bitset[n]) {
3924 send_bitset[n] = true;
3930 /* none available, so resize and try again */
3932 send_bitset.resize (send_bitset.size() + 16, false);
3937 Session::next_aux_send_id ()
3939 /* this doesn't really loop forever. just think about it */
3942 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
3943 if (!aux_send_bitset[n]) {
3944 aux_send_bitset[n] = true;
3950 /* none available, so resize and try again */
3952 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
3957 Session::next_return_id ()
3959 /* this doesn't really loop forever. just think about it */
3962 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3963 if (!return_bitset[n]) {
3964 return_bitset[n] = true;
3970 /* none available, so resize and try again */
3972 return_bitset.resize (return_bitset.size() + 16, false);
3977 Session::mark_send_id (uint32_t id)
3979 if (id >= send_bitset.size()) {
3980 send_bitset.resize (id+16, false);
3982 if (send_bitset[id]) {
3983 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3985 send_bitset[id] = true;
3989 Session::mark_aux_send_id (uint32_t id)
3991 if (id >= aux_send_bitset.size()) {
3992 aux_send_bitset.resize (id+16, false);
3994 if (aux_send_bitset[id]) {
3995 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
3997 aux_send_bitset[id] = true;
4001 Session::mark_return_id (uint32_t id)
4003 if (id >= return_bitset.size()) {
4004 return_bitset.resize (id+16, false);
4006 if (return_bitset[id]) {
4007 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
4009 return_bitset[id] = true;
4013 Session::mark_insert_id (uint32_t id)
4015 if (id >= insert_bitset.size()) {
4016 insert_bitset.resize (id+16, false);
4018 if (insert_bitset[id]) {
4019 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
4021 insert_bitset[id] = true;
4025 Session::unmark_send_id (uint32_t id)
4027 if (id < send_bitset.size()) {
4028 send_bitset[id] = false;
4033 Session::unmark_aux_send_id (uint32_t id)
4035 if (id < aux_send_bitset.size()) {
4036 aux_send_bitset[id] = false;
4041 Session::unmark_return_id (uint32_t id)
4043 if (id < return_bitset.size()) {
4044 return_bitset[id] = false;
4049 Session::unmark_insert_id (uint32_t id)
4051 if (id < insert_bitset.size()) {
4052 insert_bitset[id] = false;
4057 Session::reset_native_file_format ()
4059 boost::shared_ptr<RouteList> rl = routes.reader ();
4060 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4061 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4063 /* don't save state as we do this, there's no point
4066 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
4067 tr->reset_write_sources (false);
4068 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
4074 Session::route_name_unique (string n) const
4076 boost::shared_ptr<RouteList> r = routes.reader ();
4078 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4079 if ((*i)->name() == n) {
4088 Session::route_name_internal (string n) const
4090 if (auditioner && auditioner->name() == n) {
4094 if (_click_io && _click_io->name() == n) {
4102 Session::freeze_all (InterThreadInfo& itt)
4104 boost::shared_ptr<RouteList> r = routes.reader ();
4106 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4108 boost::shared_ptr<Track> t;
4110 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
4111 /* XXX this is wrong because itt.progress will keep returning to zero at the start
4121 boost::shared_ptr<Region>
4122 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
4123 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
4124 InterThreadInfo& itt,
4125 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
4128 boost::shared_ptr<Region> result;
4129 boost::shared_ptr<Playlist> playlist;
4130 boost::shared_ptr<AudioFileSource> fsource;
4132 char buf[PATH_MAX+1];
4133 ChanCount diskstream_channels (track.n_channels());
4134 framepos_t position;
4135 framecnt_t this_chunk;
4138 SessionDirectory sdir(get_best_session_directory_for_new_source ());
4139 const string sound_dir = sdir.sound_path();
4140 framepos_t len = end - start;
4141 bool need_block_size_reset = false;
4143 ChanCount const max_proc = track.max_processor_streams ();
4146 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
4147 end, start) << endmsg;
4151 const framecnt_t chunk_size = (256 * 1024)/4;
4153 // block all process callback handling
4155 block_processing ();
4157 /* call tree *MUST* hold route_lock */
4159 if ((playlist = track.playlist()) == 0) {
4163 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4165 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
4167 for (x = 0; x < 99999; ++x) {
4168 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());
4169 if (!Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
4175 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
4180 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
4181 SourceFactory::createWritable (DataType::AUDIO, *this, buf, false, frame_rate()));
4184 catch (failed_constructor& err) {
4185 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
4189 srcs.push_back (fsource);
4192 /* tell redirects that care that we are about to use a much larger
4193 * blocksize. this will flush all plugins too, so that they are ready
4194 * to be used for this process.
4197 need_block_size_reset = true;
4198 track.set_block_size (chunk_size);
4203 /* create a set of reasonably-sized buffers */
4204 buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
4205 buffers.set_count (max_proc);
4207 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4208 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4210 afs->prepare_for_peakfile_writes ();
4213 while (to_do && !itt.cancel) {
4215 this_chunk = min (to_do, chunk_size);
4217 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export)) {
4222 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4223 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4226 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
4232 start += this_chunk;
4233 to_do -= this_chunk;
4235 itt.progress = (float) (1.0 - ((double) to_do / len));
4244 xnow = localtime (&now);
4246 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
4247 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4250 afs->update_header (position, *xnow, now);
4251 afs->flush_header ();
4255 /* construct a region to represent the bounced material */
4259 plist.add (Properties::start, 0);
4260 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4261 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4263 result = RegionFactory::create (srcs, plist);
4269 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4270 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4273 afs->mark_for_remove ();
4276 (*src)->drop_references ();
4280 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4281 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4284 afs->done_with_peakfile_writes ();
4289 if (need_block_size_reset) {
4290 track.set_block_size (get_block_size());
4293 unblock_processing ();
4299 Session::gain_automation_buffer() const
4301 return ProcessThread::gain_automation_buffer ();
4305 Session::send_gain_automation_buffer() const
4307 return ProcessThread::send_gain_automation_buffer ();
4311 Session::pan_automation_buffer() const
4313 return ProcessThread::pan_automation_buffer ();
4317 Session::get_silent_buffers (ChanCount count)
4319 return ProcessThread::get_silent_buffers (count);
4323 Session::get_scratch_buffers (ChanCount count, bool silence)
4325 return ProcessThread::get_scratch_buffers (count, silence);
4329 Session::get_route_buffers (ChanCount count, bool silence)
4331 return ProcessThread::get_route_buffers (count, silence);
4336 Session::get_mix_buffers (ChanCount count)
4338 return ProcessThread::get_mix_buffers (count);
4342 Session::ntracks () const
4345 boost::shared_ptr<RouteList> r = routes.reader ();
4347 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4348 if (boost::dynamic_pointer_cast<Track> (*i)) {
4357 Session::nbusses () const
4360 boost::shared_ptr<RouteList> r = routes.reader ();
4362 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4363 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
4372 Session::add_automation_list(AutomationList *al)
4374 automation_lists[al->id()] = al;
4377 /** @return true if there is at least one record-enabled track, otherwise false */
4379 Session::have_rec_enabled_track () const
4381 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
4384 /** Update the state of our rec-enabled tracks flag */
4386 Session::update_have_rec_enabled_track ()
4388 boost::shared_ptr<RouteList> rl = routes.reader ();
4389 RouteList::iterator i = rl->begin();
4390 while (i != rl->end ()) {
4392 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4393 if (tr && tr->record_enabled ()) {
4400 int const old = g_atomic_int_get (&_have_rec_enabled_track);
4402 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4404 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4405 RecordStateChanged (); /* EMIT SIGNAL */
4410 Session::listen_position_changed ()
4412 boost::shared_ptr<RouteList> r = routes.reader ();
4414 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4415 (*i)->listen_position_changed ();
4420 Session::solo_control_mode_changed ()
4422 /* cancel all solo or all listen when solo control mode changes */
4425 set_solo (get_routes(), false);
4426 } else if (listening()) {
4427 set_listen (get_routes(), false);
4431 /** Called when a property of one of our route groups changes */
4433 Session::route_group_property_changed (RouteGroup* rg)
4435 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4438 /** Called when a route is added to one of our route groups */
4440 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4442 RouteAddedToRouteGroup (rg, r);
4445 /** Called when a route is removed from one of our route groups */
4447 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4449 RouteRemovedFromRouteGroup (rg, r);
4452 boost::shared_ptr<RouteList>
4453 Session::get_routes_with_regions_at (framepos_t const p) const
4455 boost::shared_ptr<RouteList> r = routes.reader ();
4456 boost::shared_ptr<RouteList> rl (new RouteList);
4458 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4459 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4464 boost::shared_ptr<Playlist> pl = tr->playlist ();
4469 if (pl->has_region_at (p)) {
4478 Session::goto_end ()
4480 if (_session_range_location) {
4481 request_locate (_session_range_location->end(), false);
4483 request_locate (0, false);
4488 Session::goto_start ()
4490 if (_session_range_location) {
4491 request_locate (_session_range_location->start(), false);
4493 request_locate (0, false);
4498 Session::current_start_frame () const
4500 return _session_range_location ? _session_range_location->start() : 0;
4504 Session::current_end_frame () const
4506 return _session_range_location ? _session_range_location->end() : 0;
4510 Session::add_session_range_location (framepos_t start, framepos_t end)
4512 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4513 _locations->add (_session_range_location);
4517 Session::step_edit_status_change (bool yn)
4523 send = (_step_editors == 0);
4528 send = (_step_editors == 1);
4531 if (_step_editors > 0) {
4537 StepEditStatusChange (val);
4543 Session::start_time_changed (framepos_t old)
4545 /* Update the auto loop range to match the session range
4546 (unless the auto loop range has been changed by the user)
4549 Location* s = _locations->session_range_location ();
4554 Location* l = _locations->auto_loop_location ();
4556 if (l && l->start() == old) {
4557 l->set_start (s->start(), true);
4562 Session::end_time_changed (framepos_t old)
4564 /* Update the auto loop range to match the session range
4565 (unless the auto loop range has been changed by the user)
4568 Location* s = _locations->session_range_location ();
4573 Location* l = _locations->auto_loop_location ();
4575 if (l && l->end() == old) {
4576 l->set_end (s->end(), true);
4581 Session::source_search_path (DataType type) const
4585 if (session_dirs.size() == 1) {
4587 case DataType::AUDIO:
4588 s.push_back (_session_dir->sound_path());
4590 case DataType::MIDI:
4591 s.push_back (_session_dir->midi_path());
4595 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4596 SessionDirectory sdir (i->path);
4598 case DataType::AUDIO:
4599 s.push_back (sdir.sound_path());
4601 case DataType::MIDI:
4602 s.push_back (sdir.midi_path());
4608 if (type == DataType::AUDIO) {
4609 const string sound_path_2X = _session_dir->sound_path_2X();
4610 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
4611 if (find (s.begin(), s.end(), sound_path_2X) == s.end()) {
4612 s.push_back (sound_path_2X);
4617 /* now check the explicit (possibly user-specified) search path
4620 vector<string> dirs;
4623 case DataType::AUDIO:
4624 split (config.get_audio_search_path (), dirs, ':');
4626 case DataType::MIDI:
4627 split (config.get_midi_search_path (), dirs, ':');
4631 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4632 if (find (s.begin(), s.end(), *i) == s.end()) {
4639 for (vector<string>::iterator si = s.begin(); si != s.end(); ++si) {
4640 if (!search_path.empty()) {
4650 Session::ensure_search_path_includes (const string& path, DataType type)
4653 vector<string> dirs;
4660 case DataType::AUDIO:
4661 search_path = config.get_audio_search_path ();
4663 case DataType::MIDI:
4664 search_path = config.get_midi_search_path ();
4668 split (search_path, dirs, ':');
4670 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4671 /* No need to add this new directory if it has the same inode as
4672 an existing one; checking inode rather than name prevents duplicated
4673 directories when we are using symlinks.
4675 On Windows, I think we could just do if (*i == path) here.
4677 if (PBD::equivalent_paths (*i, path)) {
4682 if (!search_path.empty()) {
4686 search_path += path;
4689 case DataType::AUDIO:
4690 config.set_audio_search_path (search_path);
4692 case DataType::MIDI:
4693 config.set_midi_search_path (search_path);
4698 boost::shared_ptr<Speakers>
4699 Session::get_speakers()
4705 Session::unknown_processors () const
4709 boost::shared_ptr<RouteList> r = routes.reader ();
4710 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4711 list<string> t = (*i)->unknown_processors ();
4712 copy (t.begin(), t.end(), back_inserter (p));
4722 Session::update_latency (bool playback)
4724 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
4726 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
4730 boost::shared_ptr<RouteList> r = routes.reader ();
4731 framecnt_t max_latency = 0;
4734 /* reverse the list so that we work backwards from the last route to run to the first */
4735 RouteList* rl = routes.reader().get();
4736 r.reset (new RouteList (*rl));
4737 reverse (r->begin(), r->end());
4740 /* compute actual latency values for the given direction and store them all in per-port
4741 structures. this will also publish the same values (to JACK) so that computation of latency
4742 for routes can consistently use public latency values.
4745 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4746 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
4749 /* because we latency compensate playback, our published playback latencies should
4750 be the same for all output ports - all material played back by ardour has
4751 the same latency, whether its caused by plugins or by latency compensation. since
4752 these may differ from the values computed above, reset all playback port latencies
4756 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
4758 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4759 (*i)->set_public_port_latencies (max_latency, playback);
4764 post_playback_latency ();
4768 post_capture_latency ();
4771 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
4775 Session::post_playback_latency ()
4777 set_worst_playback_latency ();
4779 boost::shared_ptr<RouteList> r = routes.reader ();
4781 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4782 if (!(*i)->is_auditioner() && ((*i)->active())) {
4783 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
4787 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4788 (*i)->set_latency_compensation (_worst_track_latency);
4793 Session::post_capture_latency ()
4795 set_worst_capture_latency ();
4797 /* reflect any changes in capture latencies into capture offsets
4800 boost::shared_ptr<RouteList> rl = routes.reader();
4801 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4802 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4804 tr->set_capture_offset ();
4810 Session::initialize_latencies ()
4813 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
4814 update_latency (false);
4815 update_latency (true);
4818 set_worst_io_latencies ();
4822 Session::set_worst_io_latencies ()
4824 set_worst_playback_latency ();
4825 set_worst_capture_latency ();
4829 Session::set_worst_playback_latency ()
4831 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4835 _worst_output_latency = 0;
4837 if (!_engine.connected()) {
4841 boost::shared_ptr<RouteList> r = routes.reader ();
4843 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4844 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
4847 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
4851 Session::set_worst_capture_latency ()
4853 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4857 _worst_input_latency = 0;
4859 if (!_engine.connected()) {
4863 boost::shared_ptr<RouteList> r = routes.reader ();
4865 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4866 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
4869 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
4873 Session::update_latency_compensation (bool force_whole_graph)
4875 bool some_track_latency_changed = false;
4877 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4881 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
4883 _worst_track_latency = 0;
4885 boost::shared_ptr<RouteList> r = routes.reader ();
4887 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4888 if (!(*i)->is_auditioner() && ((*i)->active())) {
4890 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
4891 some_track_latency_changed = true;
4893 _worst_track_latency = max (tl, _worst_track_latency);
4897 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
4898 (some_track_latency_changed ? "yes" : "no")));
4900 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
4902 if (some_track_latency_changed || force_whole_graph) {
4903 _engine.update_latencies ();
4907 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4908 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4912 tr->set_capture_offset ();
4917 Session::session_name_is_legal (const string& path)
4919 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
4921 for (int i = 0; illegal_chars[i]; ++i) {
4922 if (path.find (illegal_chars[i]) != string::npos) {
4923 return illegal_chars[i];
4931 Session::next_control_id () const
4935 /* the monitor bus remote ID is in a different
4936 * "namespace" than regular routes. its existence doesn't
4937 * affect normal (low) numbered routes.
4944 return nroutes() - subtract;
4948 Session::notify_remote_id_change ()
4950 if (deletion_in_progress()) {
4954 switch (Config->get_remote_model()) {
4957 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
4965 Session::sync_order_keys (RouteSortOrderKey sort_key_changed)
4967 if (deletion_in_progress()) {
4971 /* tell everyone that something has happened to the sort keys
4972 and let them sync up with the change(s)
4973 this will give objects that manage the sort order keys the
4974 opportunity to keep them in sync if they wish to.
4977 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("Sync Order Keys, based on %1\n", enum_2_string (sort_key_changed)));
4979 Route::SyncOrderKeys (sort_key_changed); /* EMIT SIGNAL */
4981 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
4985 Session::operation_in_progress (GQuark op) const
4987 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
4990 boost::shared_ptr<Port>
4991 Session::ltc_input_port () const
4993 return _ltc_input->nth (0);
4996 boost::shared_ptr<Port>
4997 Session::ltc_output_port () const
4999 return _ltc_output->nth (0);
5003 Session::reconnect_ltc_input ()
5007 string src = Config->get_ltc_source_port();
5009 _ltc_input->disconnect (this);
5011 if (src != _("None") && !src.empty()) {
5012 _ltc_input->nth (0)->connect (src);
5018 Session::reconnect_ltc_output ()
5023 string src = Config->get_ltc_sink_port();
5025 _ltc_output->disconnect (this);
5027 if (src != _("None") && !src.empty()) {
5028 _ltc_output->nth (0)->connect (src);