2 Copyright (C) 1999-2010 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #include <cstdio> /* sprintf(3) ... grrr */
33 #include <glibmm/threads.h>
34 #include <glibmm/miscutils.h>
35 #include <glibmm/fileutils.h>
37 #include <boost/algorithm/string/erase.hpp>
39 #include "pbd/error.h"
40 #include "pbd/boost_debug.h"
41 #include "pbd/pathscanner.h"
42 #include "pbd/stl_delete.h"
43 #include "pbd/basename.h"
44 #include "pbd/stacktrace.h"
45 #include "pbd/file_utils.h"
46 #include "pbd/convert.h"
47 #include "pbd/unwind.h"
48 #include "pbd/search_path.h"
50 #include "ardour/amp.h"
51 #include "ardour/analyser.h"
52 #include "ardour/async_midi_port.h"
53 #include "ardour/audio_buffer.h"
54 #include "ardour/audio_diskstream.h"
55 #include "ardour/audio_port.h"
56 #include "ardour/audio_track.h"
57 #include "ardour/audioengine.h"
58 #include "ardour/audiofilesource.h"
59 #include "ardour/auditioner.h"
60 #include "ardour/buffer_manager.h"
61 #include "ardour/buffer_set.h"
62 #include "ardour/bundle.h"
63 #include "ardour/butler.h"
64 #include "ardour/click.h"
65 #include "ardour/control_protocol_manager.h"
66 #include "ardour/data_type.h"
67 #include "ardour/debug.h"
68 #include "ardour/filename_extensions.h"
69 #include "ardour/graph.h"
70 #include "ardour/midiport_manager.h"
71 #include "ardour/midi_track.h"
72 #include "ardour/midi_ui.h"
73 #include "ardour/operations.h"
74 #include "ardour/playlist.h"
75 #include "ardour/plugin.h"
76 #include "ardour/plugin_insert.h"
77 #include "ardour/process_thread.h"
78 #include "ardour/rc_configuration.h"
79 #include "ardour/recent_sessions.h"
80 #include "ardour/region.h"
81 #include "ardour/region_factory.h"
82 #include "ardour/route_graph.h"
83 #include "ardour/route_group.h"
84 #include "ardour/send.h"
85 #include "ardour/session.h"
86 #include "ardour/session_directory.h"
87 #include "ardour/session_playlists.h"
88 #include "ardour/smf_source.h"
89 #include "ardour/source_factory.h"
90 #include "ardour/speakers.h"
91 #include "ardour/utils.h"
93 #include "midi++/port.h"
94 #include "midi++/mmc.h"
105 using namespace ARDOUR;
108 bool Session::_disable_all_loaded_plugins = false;
110 PBD::Signal1<int,uint32_t> Session::AudioEngineSetupRequired;
111 PBD::Signal1<void,std::string> Session::Dialog;
112 PBD::Signal0<int> Session::AskAboutPendingState;
113 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
114 PBD::Signal0<void> Session::SendFeedback;
115 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
117 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
118 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
119 PBD::Signal2<void,std::string, std::string> Session::Exported;
120 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
121 PBD::Signal0<void> Session::Quit;
122 PBD::Signal0<void> Session::FeedbackDetected;
123 PBD::Signal0<void> Session::SuccessfulGraphSort;
124 PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
126 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
127 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
129 /** @param snapshot_name Snapshot name, without .ardour suffix */
130 Session::Session (AudioEngine &eng,
131 const string& fullpath,
132 const string& snapshot_name,
133 BusProfile* bus_profile,
135 : playlists (new SessionPlaylists)
137 , process_function (&Session::process_with_events)
138 , waiting_for_sync_offset (false)
139 , _base_frame_rate (0)
140 , _current_frame_rate (0)
141 , _nominal_frame_rate (0)
142 , transport_sub_state (0)
143 , _record_status (Disabled)
144 , _transport_frame (0)
145 , _session_range_location (0)
148 , _transport_speed (0)
149 , _default_transport_speed (1.0)
150 , _last_transport_speed (0)
151 , _target_transport_speed (0.0)
152 , auto_play_legal (false)
153 , _last_slave_transport_frame (0)
154 , maximum_output_latency (0)
155 , _requested_return_frame (-1)
156 , current_block_size (0)
157 , _worst_output_latency (0)
158 , _worst_input_latency (0)
159 , _worst_track_latency (0)
160 , _have_captured (false)
163 , _non_soloed_outs_muted (false)
165 , _solo_isolated_cnt (0)
167 , _was_seamless (Config->get_seamless_loop ())
168 , _under_nsm_control (false)
169 , delta_accumulator_cnt (0)
170 , average_slave_delta (1800) // !!! why 1800 ???
172 , have_first_delta_accumulator (false)
173 , _slave_state (Stopped)
174 , post_export_sync (false)
175 , post_export_position (0)
177 , _export_started (false)
178 , _export_rolling (false)
179 , _pre_export_mmc_enabled (false)
180 , _name (snapshot_name)
182 , _send_qf_mtc (false)
183 , _pframes_since_last_mtc (0)
184 , session_midi_feedback (0)
186 , loop_changing (false)
188 , _session_dir (new SessionDirectory (fullpath))
189 , _current_snapshot_name (snapshot_name)
191 , state_was_pending (false)
192 , _state_of_the_state (StateOfTheState(CannotSave|InitialConnecting|Loading))
193 , _last_roll_location (0)
194 , _last_roll_or_reversal_location (0)
195 , _last_record_location (0)
196 , pending_locate_roll (false)
197 , pending_locate_frame (0)
198 , pending_locate_flush (false)
199 , pending_abort (false)
200 , pending_auto_loop (false)
201 , _butler (new Butler (*this))
202 , _post_transport_work (0)
203 , cumulative_rf_motion (0)
205 , _locations (new Locations (*this))
207 , outbound_mtc_timecode_frame (0)
208 , next_quarter_frame_to_send (-1)
209 , _frames_per_timecode_frame (0)
210 , _frames_per_hour (0)
211 , _timecode_frames_per_hour (0)
212 , last_timecode_valid (false)
213 , last_timecode_when (0)
214 , _send_timecode_update (false)
226 , ltc_timecode_offset (0)
227 , ltc_timecode_negative_offset (false)
228 , midi_control_ui (0)
230 , _all_route_group (new RouteGroup (*this, "all"))
231 , routes (new RouteList)
232 , _adding_routes_in_progress (false)
233 , destructive_index (0)
234 , solo_update_disabled (false)
235 , default_fade_steepness (0)
236 , default_fade_msecs (0)
237 , _total_free_4k_blocks (0)
238 , _total_free_4k_blocks_uncertain (false)
239 , no_questions_about_missing_files (false)
242 , _bundles (new BundleList)
243 , _bundle_xml_node (0)
247 , click_emphasis_data (0)
249 , click_emphasis_length (0)
250 , _clicks_cleared (0)
251 , _play_range (false)
253 , first_file_data_format_reset (true)
254 , first_file_header_format_reset (true)
255 , have_looped (false)
256 , _have_rec_enabled_track (false)
258 , _suspend_timecode_transmission (0)
259 , _speakers (new Speakers)
261 , ignore_route_processor_changes (false)
267 pre_engine_init (fullpath);
270 if (ensure_engine (sr)) {
272 throw failed_constructor ();
275 if (create (mix_template, bus_profile)) {
277 throw failed_constructor ();
280 /* if a mix template was provided, then ::create() will
281 * have copied it into the session and we need to load it
282 * so that we have the state ready for ::set_state()
283 * after the engine is started.
285 * Note that we do NOT try to get the sample rate from
286 * the template at this time, though doing so would
287 * be easy if we decided this was an appropriate part
291 if (!mix_template.empty() && load_state (_current_snapshot_name)) {
292 throw failed_constructor ();
297 if (load_state (_current_snapshot_name)) {
298 throw failed_constructor ();
301 /* try to get sample rate from XML state so that we
302 * can influence the SR if we set up the audio
307 const XMLProperty* prop;
308 if ((prop = state_tree->root()->property (X_("sample-rate"))) != 0) {
309 sr = atoi (prop->value());
313 if (ensure_engine (sr)) {
315 throw failed_constructor ();
319 if (post_engine_init ()) {
321 throw failed_constructor ();
324 store_recent_sessions (_name, _path);
326 bool was_dirty = dirty();
328 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
330 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
331 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
334 DirtyChanged (); /* EMIT SIGNAL */
337 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
338 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
342 /* hook us up to the engine since we are now completely constructed */
344 BootMessage (_("Connect to engine"));
346 _engine.set_session (this);
347 _engine.reset_timebase ();
349 BootMessage (_("Session loading complete"));
362 Session::ensure_engine (uint32_t desired_sample_rate)
364 if (_engine.current_backend() == 0) {
365 /* backend is unknown ... */
366 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
367 if (r.get_value_or (-1) != 0) {
370 } else if (_engine.setup_required()) {
371 /* backend is known, but setup is needed */
372 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
373 if (r.get_value_or (-1) != 0) {
376 } else if (!_engine.running()) {
377 if (_engine.start()) {
382 /* at this point the engine should be running
385 if (!_engine.running()) {
389 return immediately_post_engine ();
394 Session::immediately_post_engine ()
396 /* Do various initializations that should take place directly after we
397 * know that the engine is running, but before we either create a
398 * session or set state for an existing one.
401 if (how_many_dsp_threads () > 1) {
402 /* For now, only create the graph if we are using >1 DSP threads, as
403 it is a bit slower than the old code with 1 thread.
405 _process_graph.reset (new Graph (*this));
408 /* every time we reconnect, recompute worst case output latencies */
410 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
412 if (synced_to_engine()) {
413 _engine.transport_stop ();
416 if (config.get_jack_time_master()) {
417 _engine.transport_locate (_transport_frame);
421 BootMessage (_("Set up LTC"));
423 BootMessage (_("Set up Click"));
425 BootMessage (_("Set up standard connections"));
429 catch (failed_constructor& err) {
439 vector<void*> debug_pointers;
441 /* if we got to here, leaving pending capture state around
445 remove_pending_capture_state ();
447 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
449 /* disconnect from any and all signals that we are connected to */
453 _engine.remove_session ();
455 /* deregister all ports - there will be no process or any other
456 * callbacks from the engine any more.
459 Port::PortDrop (); /* EMIT SIGNAL */
463 /* clear history so that no references to objects are held any more */
467 /* clear state tree so that no references to objects are held any more */
471 /* reset dynamic state version back to default */
473 Stateful::loading_state_version = 0;
475 _butler->drop_references ();
479 delete midi_control_ui;
480 delete _all_route_group;
482 if (click_data != default_click) {
483 delete [] click_data;
486 if (click_emphasis_data != default_click_emphasis) {
487 delete [] click_emphasis_data;
492 /* clear out any pending dead wood from RCU managed objects */
497 AudioDiskstream::free_working_buffers();
499 /* tell everyone who is still standing that we're about to die */
502 /* tell everyone to drop references and delete objects as we go */
504 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
505 RegionFactory::delete_all_regions ();
507 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
509 /* reset these three references to special routes before we do the usual route delete thing */
512 _master_out.reset ();
513 _monitor_out.reset ();
516 RCUWriter<RouteList> writer (routes);
517 boost::shared_ptr<RouteList> r = writer.get_copy ();
519 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
520 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
521 (*i)->drop_references ();
525 /* writer goes out of scope and updates master */
529 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
530 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
531 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
532 i->second->drop_references ();
537 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
538 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
543 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
546 delete _mmc; _mmc = 0;
547 delete _midi_ports; _midi_ports = 0;
548 delete _locations; _locations = 0;
550 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
552 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
553 boost_debug_list_ptrs ();
558 Session::setup_ltc ()
562 _ltc_input.reset (new IO (*this, X_("LTC In"), IO::Input));
563 _ltc_output.reset (new IO (*this, X_("LTC Out"), IO::Output));
565 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC In"))) != 0) {
566 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
569 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
570 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
572 reconnect_ltc_input ();
575 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC Out"))) != 0) {
576 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
579 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
580 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
582 reconnect_ltc_output ();
585 /* fix up names of LTC ports because we don't want the normal
586 * IO style of NAME/TYPE-{in,out}N
589 _ltc_input->nth (0)->set_name (X_("LTC-in"));
590 _ltc_output->nth (0)->set_name (X_("LTC-out"));
594 Session::setup_click ()
597 _click_io.reset (new ClickIO (*this, X_("Click")));
598 _click_gain.reset (new Amp (*this));
599 _click_gain->activate ();
601 setup_click_state (state_tree->root());
603 setup_click_state (0);
608 Session::setup_click_state (const XMLNode* node)
610 const XMLNode* child = 0;
612 if (node && (child = find_named_node (*node, "Click")) != 0) {
614 /* existing state for Click */
617 if (Stateful::loading_state_version < 3000) {
618 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
620 const XMLNodeList& children (child->children());
621 XMLNodeList::const_iterator i = children.begin();
622 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
624 if (i != children.end()) {
625 c = _click_gain->set_state (**i, Stateful::loading_state_version);
631 _clicking = Config->get_clicking ();
635 error << _("could not setup Click I/O") << endmsg;
642 /* default state for Click: dual-mono to first 2 physical outputs */
645 _engine.get_physical_outputs (DataType::AUDIO, outs);
647 for (uint32_t physport = 0; physport < 2; ++physport) {
648 if (outs.size() > physport) {
649 if (_click_io->add_port (outs[physport], this)) {
650 // relax, even though its an error
655 if (_click_io->n_ports () > ChanCount::ZERO) {
656 _clicking = Config->get_clicking ();
662 Session::setup_bundles ()
664 vector<string> inputs[DataType::num_types];
665 vector<string> outputs[DataType::num_types];
666 for (uint32_t i = 0; i < DataType::num_types; ++i) {
667 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
668 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
671 /* Create a set of Bundle objects that map
672 to the physical I/O currently available. We create both
673 mono and stereo bundles, so that the common cases of mono
674 and stereo tracks get bundles to put in their mixer strip
675 in / out menus. There may be a nicer way of achieving that;
676 it doesn't really scale that well to higher channel counts
679 /* mono output bundles */
681 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
683 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
685 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
686 c->add_channel (_("mono"), DataType::AUDIO);
687 c->set_port (0, outputs[DataType::AUDIO][np]);
692 /* stereo output bundles */
694 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
695 if (np + 1 < outputs[DataType::AUDIO].size()) {
697 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
698 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
699 c->add_channel (_("L"), DataType::AUDIO);
700 c->set_port (0, outputs[DataType::AUDIO][np]);
701 c->add_channel (_("R"), DataType::AUDIO);
702 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
708 /* mono input bundles */
710 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
712 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
714 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
715 c->add_channel (_("mono"), DataType::AUDIO);
716 c->set_port (0, inputs[DataType::AUDIO][np]);
721 /* stereo input bundles */
723 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
724 if (np + 1 < inputs[DataType::AUDIO].size()) {
726 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
728 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
729 c->add_channel (_("L"), DataType::AUDIO);
730 c->set_port (0, inputs[DataType::AUDIO][np]);
731 c->add_channel (_("R"), DataType::AUDIO);
732 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
738 /* MIDI input bundles */
740 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
741 string n = inputs[DataType::MIDI][np];
742 boost::erase_first (n, X_("alsa_pcm:"));
744 boost::shared_ptr<Bundle> c (new Bundle (n, false));
745 c->add_channel ("", DataType::MIDI);
746 c->set_port (0, inputs[DataType::MIDI][np]);
750 /* MIDI output bundles */
752 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
753 string n = outputs[DataType::MIDI][np];
754 boost::erase_first (n, X_("alsa_pcm:"));
756 boost::shared_ptr<Bundle> c (new Bundle (n, true));
757 c->add_channel ("", DataType::MIDI);
758 c->set_port (0, outputs[DataType::MIDI][np]);
765 Session::auto_connect_master_bus ()
767 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
771 /* if requested auto-connect the outputs to the first N physical ports.
774 uint32_t limit = _master_out->n_outputs().n_total();
775 vector<string> outputs[DataType::num_types];
777 for (uint32_t i = 0; i < DataType::num_types; ++i) {
778 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
781 for (uint32_t n = 0; n < limit; ++n) {
782 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
784 if (outputs[p->type()].size() > n) {
785 connect_to = outputs[p->type()][n];
788 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
789 if (_master_out->output()->connect (p, connect_to, this)) {
790 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
799 Session::remove_monitor_section ()
805 /* force reversion to Solo-In-Place */
806 Config->set_solo_control_is_listen_control (false);
808 /* if we are auditioning, cancel it ... this is a workaround
809 to a problem (auditioning does not execute the process graph,
810 which is needed to remove routes when using >1 core for processing)
815 /* Hold process lock while doing this so that we don't hear bits and
816 * pieces of audio as we work on each route.
819 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
821 /* Connect tracks to monitor section. Note that in an
822 existing session, the internal sends will already exist, but we want the
823 routes to notice that they connect to the control out specifically.
827 boost::shared_ptr<RouteList> r = routes.reader ();
828 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
830 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
832 if ((*x)->is_monitor()) {
834 } else if ((*x)->is_master()) {
837 (*x)->remove_aux_or_listen (_monitor_out);
842 remove_route (_monitor_out);
843 auto_connect_master_bus ();
846 auditioner->connect ();
851 Session::add_monitor_section ()
855 if (_monitor_out || !_master_out) {
859 boost::shared_ptr<Route> r (new Route (*this, _("monitor"), Route::MonitorOut, DataType::AUDIO));
865 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
866 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
869 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
870 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
871 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
875 add_routes (rl, false, false, false);
877 assert (_monitor_out);
879 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
880 are undefined, at best.
883 uint32_t limit = _monitor_out->n_inputs().n_audio();
887 /* connect the inputs to the master bus outputs. this
888 * represents a separate data feed from the internal sends from
889 * each route. as of jan 2011, it allows the monitor section to
890 * conditionally ignore either the internal sends or the normal
891 * input feed, but we should really find a better way to do
895 _master_out->output()->disconnect (this);
897 for (uint32_t n = 0; n < limit; ++n) {
898 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
899 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
902 string connect_to = o->name();
903 if (_monitor_out->input()->connect (p, connect_to, this)) {
904 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
912 /* if monitor section is not connected, connect it to physical outs
915 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
917 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
919 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
922 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
924 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
925 Config->get_monitor_bus_preferred_bundle())
931 /* Monitor bus is audio only */
933 vector<string> outputs[DataType::num_types];
935 for (uint32_t i = 0; i < DataType::num_types; ++i) {
936 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
939 uint32_t mod = outputs[DataType::AUDIO].size();
940 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
944 for (uint32_t n = 0; n < limit; ++n) {
946 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
948 if (outputs[DataType::AUDIO].size() > (n % mod)) {
949 connect_to = outputs[DataType::AUDIO][n % mod];
952 if (!connect_to.empty()) {
953 if (_monitor_out->output()->connect (p, connect_to, this)) {
954 error << string_compose (
955 _("cannot connect control output %1 to %2"),
966 /* Hold process lock while doing this so that we don't hear bits and
967 * pieces of audio as we work on each route.
970 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
972 /* Connect tracks to monitor section. Note that in an
973 existing session, the internal sends will already exist, but we want the
974 routes to notice that they connect to the control out specifically.
978 boost::shared_ptr<RouteList> rls = routes.reader ();
980 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
982 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
984 if ((*x)->is_monitor()) {
986 } else if ((*x)->is_master()) {
989 (*x)->enable_monitor_send ();
994 auditioner->connect ();
999 Session::hookup_io ()
1001 /* stop graph reordering notifications from
1002 causing resorts, etc.
1005 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
1009 /* we delay creating the auditioner till now because
1010 it makes its own connections to ports.
1014 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
1016 throw failed_constructor ();
1018 a->use_new_diskstream ();
1022 catch (failed_constructor& err) {
1023 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
1027 /* load bundles, which we may have postponed earlier on */
1028 if (_bundle_xml_node) {
1029 load_bundles (*_bundle_xml_node);
1030 delete _bundle_xml_node;
1033 /* Tell all IO objects to connect themselves together */
1035 IO::enable_connecting ();
1037 /* Now tell all "floating" ports to connect to whatever
1038 they should be connected to.
1041 AudioEngine::instance()->reconnect_ports ();
1043 /* Anyone who cares about input state, wake up and do something */
1045 IOConnectionsComplete (); /* EMIT SIGNAL */
1047 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
1049 /* now handle the whole enchilada as if it was one
1050 graph reorder event.
1055 /* update the full solo state, which can't be
1056 correctly determined on a per-route basis, but
1057 needs the global overview that only the session
1061 update_route_solo_state ();
1065 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
1067 boost::shared_ptr<Track> track = wp.lock ();
1072 boost::shared_ptr<Playlist> playlist;
1074 if ((playlist = track->playlist()) != 0) {
1075 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
1076 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
1077 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
1082 Session::record_enabling_legal () const
1084 /* this used to be in here, but survey says.... we don't need to restrict it */
1085 // if (record_status() == Recording) {
1089 if (Config->get_all_safe()) {
1096 Session::set_track_monitor_input_status (bool yn)
1098 boost::shared_ptr<RouteList> rl = routes.reader ();
1099 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1100 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1101 if (tr && tr->record_enabled ()) {
1102 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1103 tr->request_input_monitoring (yn);
1109 Session::auto_punch_start_changed (Location* location)
1111 replace_event (SessionEvent::PunchIn, location->start());
1113 if (get_record_enabled() && config.get_punch_in()) {
1114 /* capture start has been changed, so save new pending state */
1115 save_state ("", true);
1120 Session::auto_punch_end_changed (Location* location)
1122 framepos_t when_to_stop = location->end();
1123 // when_to_stop += _worst_output_latency + _worst_input_latency;
1124 replace_event (SessionEvent::PunchOut, when_to_stop);
1128 Session::auto_punch_changed (Location* location)
1130 framepos_t when_to_stop = location->end();
1132 replace_event (SessionEvent::PunchIn, location->start());
1133 //when_to_stop += _worst_output_latency + _worst_input_latency;
1134 replace_event (SessionEvent::PunchOut, when_to_stop);
1137 /** @param loc A loop location.
1138 * @param pos Filled in with the start time of the required fade-out (in session frames).
1139 * @param length Filled in with the length of the required fade-out.
1142 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
1144 pos = max (loc->start(), loc->end() - 64);
1145 length = loc->end() - pos;
1149 Session::auto_loop_changed (Location* location)
1151 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1154 auto_loop_declick_range (location, dcp, dcl);
1155 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1157 if (transport_rolling() && play_loop) {
1160 // if (_transport_frame > location->end()) {
1162 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1163 // relocate to beginning of loop
1164 clear_events (SessionEvent::LocateRoll);
1166 request_locate (location->start(), true);
1169 else if (Config->get_seamless_loop() && !loop_changing) {
1171 // schedule a locate-roll to refill the diskstreams at the
1172 // previous loop end
1173 loop_changing = true;
1175 if (location->end() > last_loopend) {
1176 clear_events (SessionEvent::LocateRoll);
1177 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1184 last_loopend = location->end();
1188 Session::set_auto_punch_location (Location* location)
1192 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1193 punch_connections.drop_connections();
1194 existing->set_auto_punch (false, this);
1195 remove_event (existing->start(), SessionEvent::PunchIn);
1196 clear_events (SessionEvent::PunchOut);
1197 auto_punch_location_changed (0);
1202 if (location == 0) {
1206 if (location->end() <= location->start()) {
1207 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1211 punch_connections.drop_connections ();
1213 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
1214 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
1215 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
1217 location->set_auto_punch (true, this);
1219 auto_punch_changed (location);
1221 auto_punch_location_changed (location);
1225 Session::set_auto_loop_location (Location* location)
1229 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1230 loop_connections.drop_connections ();
1231 existing->set_auto_loop (false, this);
1232 remove_event (existing->end(), SessionEvent::AutoLoop);
1235 auto_loop_declick_range (existing, dcp, dcl);
1236 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1237 auto_loop_location_changed (0);
1242 if (location == 0) {
1246 if (location->end() <= location->start()) {
1247 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1251 last_loopend = location->end();
1253 loop_connections.drop_connections ();
1255 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1256 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1257 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1259 location->set_auto_loop (true, this);
1261 /* take care of our stuff first */
1263 auto_loop_changed (location);
1265 /* now tell everyone else */
1267 auto_loop_location_changed (location);
1271 Session::locations_added (Location *)
1277 Session::locations_changed ()
1279 _locations->apply (*this, &Session::handle_locations_changed);
1283 Session::handle_locations_changed (Locations::LocationList& locations)
1285 Locations::LocationList::iterator i;
1287 bool set_loop = false;
1288 bool set_punch = false;
1290 for (i = locations.begin(); i != locations.end(); ++i) {
1294 if (location->is_auto_punch()) {
1295 set_auto_punch_location (location);
1298 if (location->is_auto_loop()) {
1299 set_auto_loop_location (location);
1303 if (location->is_session_range()) {
1304 _session_range_location = location;
1309 set_auto_loop_location (0);
1312 set_auto_punch_location (0);
1319 Session::enable_record ()
1321 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1322 /* no recording at anything except normal speed */
1327 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1329 if (rs == Recording) {
1333 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1335 _last_record_location = _transport_frame;
1336 _mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1338 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1339 set_track_monitor_input_status (true);
1342 RecordStateChanged ();
1349 Session::disable_record (bool rt_context, bool force)
1353 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1355 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1356 g_atomic_int_set (&_record_status, Disabled);
1357 _mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1359 if (rs == Recording) {
1360 g_atomic_int_set (&_record_status, Enabled);
1364 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1365 set_track_monitor_input_status (false);
1368 RecordStateChanged (); /* emit signal */
1371 remove_pending_capture_state ();
1377 Session::step_back_from_record ()
1379 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1381 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1382 set_track_monitor_input_status (false);
1385 RecordStateChanged (); /* emit signal */
1390 Session::maybe_enable_record ()
1392 if (_step_editors > 0) {
1396 g_atomic_int_set (&_record_status, Enabled);
1398 /* This function is currently called from somewhere other than an RT thread.
1399 This save_state() call therefore doesn't impact anything. Doing it here
1400 means that we save pending state of which sources the next record will use,
1401 which gives us some chance of recovering from a crash during the record.
1404 save_state ("", true);
1406 if (_transport_speed) {
1407 if (!config.get_punch_in()) {
1411 _mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1412 RecordStateChanged (); /* EMIT SIGNAL */
1419 Session::audible_frame () const
1425 /* the first of these two possible settings for "offset"
1426 mean that the audible frame is stationary until
1427 audio emerges from the latency compensation
1430 the second means that the audible frame is stationary
1431 until audio would emerge from a physical port
1432 in the absence of any plugin latency compensation
1435 offset = worst_playback_latency ();
1437 if (offset > current_block_size) {
1438 offset -= current_block_size;
1440 /* XXX is this correct? if we have no external
1441 physical connections and everything is internal
1442 then surely this is zero? still, how
1443 likely is that anyway?
1445 offset = current_block_size;
1448 if (synced_to_engine()) {
1449 tf = _engine.transport_frame();
1451 tf = _transport_frame;
1456 if (!non_realtime_work_pending()) {
1460 /* Check to see if we have passed the first guaranteed
1461 audible frame past our last start position. if not,
1462 return that last start point because in terms
1463 of audible frames, we have not moved yet.
1465 `Start position' in this context means the time we last
1466 either started, located, or changed transport direction.
1469 if (_transport_speed > 0.0f) {
1471 if (!play_loop || !have_looped) {
1472 if (tf < _last_roll_or_reversal_location + offset) {
1473 return _last_roll_or_reversal_location;
1481 } else if (_transport_speed < 0.0f) {
1483 /* XXX wot? no backward looping? */
1485 if (tf > _last_roll_or_reversal_location - offset) {
1486 return _last_roll_or_reversal_location;
1498 Session::set_frame_rate (framecnt_t frames_per_second)
1500 /** \fn void Session::set_frame_size(framecnt_t)
1501 the AudioEngine object that calls this guarantees
1502 that it will not be called while we are also in
1503 ::process(). Its fine to do things that block
1507 _base_frame_rate = frames_per_second;
1508 _nominal_frame_rate = frames_per_second;
1514 // XXX we need some equivalent to this, somehow
1515 // SndFileSource::setup_standard_crossfades (frames_per_second);
1519 /* XXX need to reset/reinstantiate all LADSPA plugins */
1523 Session::set_block_size (pframes_t nframes)
1525 /* the AudioEngine guarantees
1526 that it will not be called while we are also in
1527 ::process(). It is therefore fine to do things that block
1532 current_block_size = nframes;
1536 boost::shared_ptr<RouteList> r = routes.reader ();
1538 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1539 (*i)->set_block_size (nframes);
1542 boost::shared_ptr<RouteList> rl = routes.reader ();
1543 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1544 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1546 tr->set_block_size (nframes);
1550 set_worst_io_latencies ();
1556 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1558 boost::shared_ptr<Route> r2;
1560 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1561 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1565 /* make a copy of the existing list of routes that feed r1 */
1567 Route::FedBy existing (r1->fed_by());
1569 /* for each route that feeds r1, recurse, marking it as feeding
1573 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1574 if (!(r2 = i->r.lock ())) {
1575 /* (*i) went away, ignore it */
1579 /* r2 is a route that feeds r1 which somehow feeds base. mark
1580 base as being fed by r2
1583 rbase->add_fed_by (r2, i->sends_only);
1587 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1591 if (r1->feeds (r2) && r2->feeds (r1)) {
1595 /* now recurse, so that we can mark base as being fed by
1596 all routes that feed r2
1599 trace_terminal (r2, rbase);
1606 Session::resort_routes ()
1608 /* don't do anything here with signals emitted
1609 by Routes during initial setup or while we
1610 are being destroyed.
1613 if (_state_of_the_state & (InitialConnecting | Deletion)) {
1618 RCUWriter<RouteList> writer (routes);
1619 boost::shared_ptr<RouteList> r = writer.get_copy ();
1620 resort_routes_using (r);
1621 /* writer goes out of scope and forces update */
1625 boost::shared_ptr<RouteList> rl = routes.reader ();
1626 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1627 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1629 const Route::FedBy& fb ((*i)->fed_by());
1631 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1632 boost::shared_ptr<Route> sf = f->r.lock();
1634 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1642 /** This is called whenever we need to rebuild the graph of how we will process
1644 * @param r List of routes, in any order.
1648 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1650 /* We are going to build a directed graph of our routes;
1651 this is where the edges of that graph are put.
1656 /* Go through all routes doing two things:
1658 * 1. Collect the edges of the route graph. Each of these edges
1659 * is a pair of routes, one of which directly feeds the other
1660 * either by a JACK connection or by an internal send.
1662 * 2. Begin the process of making routes aware of which other
1663 * routes directly or indirectly feed them. This information
1664 * is used by the solo code.
1667 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1669 /* Clear out the route's list of direct or indirect feeds */
1670 (*i)->clear_fed_by ();
1672 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
1674 bool via_sends_only;
1676 /* See if this *j feeds *i according to the current state of the JACK
1677 connections and internal sends.
1679 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
1680 /* add the edge to the graph (part #1) */
1681 edges.add (*j, *i, via_sends_only);
1682 /* tell the route (for part #2) */
1683 (*i)->add_fed_by (*j, via_sends_only);
1688 /* Attempt a topological sort of the route graph */
1689 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
1691 if (sorted_routes) {
1692 /* We got a satisfactory topological sort, so there is no feedback;
1695 Note: the process graph rechain does not require a
1696 topologically-sorted list, but hey ho.
1698 if (_process_graph) {
1699 _process_graph->rechain (sorted_routes, edges);
1702 _current_route_graph = edges;
1704 /* Complete the building of the routes' lists of what directly
1705 or indirectly feeds them.
1707 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1708 trace_terminal (*i, *i);
1711 *r = *sorted_routes;
1714 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1715 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1716 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1717 (*i)->name(), (*i)->order_key ()));
1721 SuccessfulGraphSort (); /* EMIT SIGNAL */
1724 /* The topological sort failed, so we have a problem. Tell everyone
1725 and stick to the old graph; this will continue to be processed, so
1726 until the feedback is fixed, what is played back will not quite
1727 reflect what is actually connected. Note also that we do not
1728 do trace_terminal here, as it would fail due to an endless recursion,
1729 so the solo code will think that everything is still connected
1733 FeedbackDetected (); /* EMIT SIGNAL */
1738 /** Find a route name starting with \a base, maybe followed by the
1739 * lowest \a id. \a id will always be added if \a definitely_add_number
1740 * is true on entry; otherwise it will only be added if required
1741 * to make the name unique.
1743 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1744 * The available route name with the lowest ID will be used, and \a id
1745 * will be set to the ID.
1747 * \return false if a route name could not be found, and \a track_name
1748 * and \a id do not reflect a free route name.
1751 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1753 if (!definitely_add_number && route_by_name (base) == 0) {
1754 /* juse use the base */
1755 snprintf (name, name_len, "%s", base.c_str());
1760 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1762 if (route_by_name (name) == 0) {
1768 } while (id < (UINT_MAX-1));
1773 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
1775 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
1777 in = ChanCount::ZERO;
1778 out = ChanCount::ZERO;
1780 boost::shared_ptr<RouteList> r = routes.reader ();
1782 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1783 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1784 if (tr && !tr->is_auditioner()) {
1785 in += tr->n_inputs();
1786 out += tr->n_outputs();
1791 /** Caller must not hold process lock
1792 * @param name_template string to use for the start of the name, or "" to use "MIDI".
1793 * @param instrument plugin info for the instrument to insert pre-fader, if any
1795 list<boost::shared_ptr<MidiTrack> >
1796 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
1797 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1799 char track_name[32];
1800 uint32_t track_id = 0;
1802 RouteList new_routes;
1803 list<boost::shared_ptr<MidiTrack> > ret;
1805 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
1808 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1809 error << "cannot find name for new midi track" << endmsg;
1813 boost::shared_ptr<MidiTrack> track;
1816 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1818 if (track->init ()) {
1822 track->use_new_diskstream();
1824 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1825 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1828 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1829 if (track->input()->ensure_io (input, false, this)) {
1830 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
1834 if (track->output()->ensure_io (output, false, this)) {
1835 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
1840 track->non_realtime_input_change();
1843 route_group->add (track);
1846 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1848 if (Config->get_remote_model() == UserOrdered) {
1849 track->set_remote_control_id (next_control_id());
1852 new_routes.push_back (track);
1853 ret.push_back (track);
1856 catch (failed_constructor &err) {
1857 error << _("Session: could not create new midi track.") << endmsg;
1861 catch (AudioEngine::PortRegistrationFailure& pfe) {
1863 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;
1871 if (!new_routes.empty()) {
1872 add_routes (new_routes, true, true, true);
1875 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
1876 PluginPtr plugin = instrument->load (*this);
1877 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
1878 (*r)->add_processor (p, PreFader);
1888 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
1890 boost::shared_ptr<Route> midi_track (wmt.lock());
1896 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
1898 if (change.after.n_audio() <= change.before.n_audio()) {
1902 /* new audio ports: make sure the audio goes somewhere useful,
1903 unless the user has no-auto-connect selected.
1905 The existing ChanCounts don't matter for this call as they are only
1906 to do with matching input and output indices, and we are only changing
1912 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
1916 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1917 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1918 * @param output_start As \a input_start, but for outputs.
1921 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
1922 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
1924 if (!IO::connecting_legal) {
1928 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1934 /* If both inputs and outputs are auto-connected to physical ports,
1935 use the max of input and output offsets to ensure auto-connected
1936 port numbers always match up (e.g. the first audio input and the
1937 first audio output of the route will have the same physical
1938 port number). Otherwise just use the lowest input or output
1942 DEBUG_TRACE (DEBUG::Graph,
1943 string_compose("Auto-connect: existing in = %1 out = %2\n",
1944 existing_inputs, existing_outputs));
1946 const bool in_out_physical =
1947 (Config->get_input_auto_connect() & AutoConnectPhysical)
1948 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1951 const ChanCount in_offset = in_out_physical
1952 ? ChanCount::max(existing_inputs, existing_outputs)
1955 const ChanCount out_offset = in_out_physical
1956 ? ChanCount::max(existing_inputs, existing_outputs)
1959 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1960 vector<string> physinputs;
1961 vector<string> physoutputs;
1963 _engine.get_physical_outputs (*t, physoutputs);
1964 _engine.get_physical_inputs (*t, physinputs);
1966 if (!physinputs.empty() && connect_inputs) {
1967 uint32_t nphysical_in = physinputs.size();
1969 DEBUG_TRACE (DEBUG::Graph,
1970 string_compose("There are %1 physical inputs of type %2\n",
1973 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1976 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1977 DEBUG_TRACE (DEBUG::Graph,
1978 string_compose("Get index %1 + %2 % %3 = %4\n",
1979 in_offset.get(*t), i, nphysical_in,
1980 (in_offset.get(*t) + i) % nphysical_in));
1981 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1984 DEBUG_TRACE (DEBUG::Graph,
1985 string_compose("Connect route %1 IN to %2\n",
1986 route->name(), port));
1988 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
1992 ChanCount one_added (*t, 1);
1993 existing_inputs += one_added;
1997 if (!physoutputs.empty()) {
1998 uint32_t nphysical_out = physoutputs.size();
1999 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
2002 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
2003 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
2004 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
2005 /* master bus is audio only */
2006 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
2007 port = _master_out->input()->ports().port(*t,
2008 i % _master_out->input()->n_ports().get(*t))->name();
2012 DEBUG_TRACE (DEBUG::Graph,
2013 string_compose("Connect route %1 OUT to %2\n",
2014 route->name(), port));
2016 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
2020 ChanCount one_added (*t, 1);
2021 existing_outputs += one_added;
2027 /** Caller must not hold process lock
2028 * @param name_template string to use for the start of the name, or "" to use "Audio".
2030 list< boost::shared_ptr<AudioTrack> >
2031 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
2032 uint32_t how_many, string name_template)
2034 char track_name[32];
2035 uint32_t track_id = 0;
2037 RouteList new_routes;
2038 list<boost::shared_ptr<AudioTrack> > ret;
2040 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
2043 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
2044 error << "cannot find name for new audio track" << endmsg;
2048 boost::shared_ptr<AudioTrack> track;
2051 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
2053 if (track->init ()) {
2057 track->use_new_diskstream();
2059 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2060 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2063 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2065 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2066 error << string_compose (
2067 _("cannot configure %1 in/%2 out configuration for new audio track"),
2068 input_channels, output_channels)
2073 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2074 error << string_compose (
2075 _("cannot configure %1 in/%2 out configuration for new audio track"),
2076 input_channels, output_channels)
2083 route_group->add (track);
2086 track->non_realtime_input_change();
2088 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2089 if (Config->get_remote_model() == UserOrdered) {
2090 track->set_remote_control_id (next_control_id());
2093 new_routes.push_back (track);
2094 ret.push_back (track);
2097 catch (failed_constructor &err) {
2098 error << _("Session: could not create new audio track.") << endmsg;
2102 catch (AudioEngine::PortRegistrationFailure& pfe) {
2104 error << pfe.what() << endmsg;
2112 if (!new_routes.empty()) {
2113 add_routes (new_routes, true, true, true);
2119 /** Caller must not hold process lock.
2120 * @param name_template string to use for the start of the name, or "" to use "Bus".
2123 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
2126 uint32_t bus_id = 0;
2130 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
2133 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
2134 error << "cannot find name for new audio bus" << endmsg;
2139 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
2145 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2146 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
2149 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2151 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2152 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2153 input_channels, output_channels)
2159 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2160 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2161 input_channels, output_channels)
2168 route_group->add (bus);
2170 if (Config->get_remote_model() == UserOrdered) {
2171 bus->set_remote_control_id (next_control_id());
2174 bus->add_internal_return ();
2176 ret.push_back (bus);
2182 catch (failed_constructor &err) {
2183 error << _("Session: could not create new audio route.") << endmsg;
2187 catch (AudioEngine::PortRegistrationFailure& pfe) {
2188 error << pfe.what() << endmsg;
2198 add_routes (ret, false, true, true); // autoconnect outputs only
2206 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base)
2209 uint32_t control_id;
2211 uint32_t number = 0;
2212 const uint32_t being_added = how_many;
2214 if (!tree.read (template_path.c_str())) {
2218 XMLNode* node = tree.root();
2220 IO::disable_connecting ();
2222 control_id = next_control_id ();
2226 XMLNode node_copy (*node);
2228 /* Remove IDs of everything so that new ones are used */
2229 node_copy.remove_property_recursively (X_("id"));
2234 if (!name_base.empty()) {
2236 /* if we're adding more than one routes, force
2237 * all the names of the new routes to be
2238 * numbered, via the final parameter.
2241 if (!find_route_name (name_base.c_str(), ++number, name, sizeof(name), (being_added > 1))) {
2242 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2248 string const route_name = node_copy.property(X_("name"))->value ();
2250 /* generate a new name by adding a number to the end of the template name */
2251 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2252 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2257 /* set this name in the XML description that we are about to use */
2258 Route::set_name_in_state (node_copy, name);
2260 /* trim bitslots from listen sends so that new ones are used */
2261 XMLNodeList children = node_copy.children ();
2262 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2263 if ((*i)->name() == X_("Processor")) {
2264 XMLProperty* role = (*i)->property (X_("role"));
2265 if (role && role->value() == X_("Listen")) {
2266 (*i)->remove_property (X_("bitslot"));
2271 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2274 error << _("Session: cannot create track/bus from template description") << endmsg;
2278 if (boost::dynamic_pointer_cast<Track>(route)) {
2279 /* force input/output change signals so that the new diskstream
2280 picks up the configuration of the route. During session
2281 loading this normally happens in a different way.
2284 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2286 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2287 change.after = route->input()->n_ports();
2288 route->input()->changed (change, this);
2289 change.after = route->output()->n_ports();
2290 route->output()->changed (change, this);
2293 route->set_remote_control_id (control_id);
2296 ret.push_back (route);
2299 catch (failed_constructor &err) {
2300 error << _("Session: could not create new route from template") << endmsg;
2304 catch (AudioEngine::PortRegistrationFailure& pfe) {
2305 error << pfe.what() << endmsg;
2314 add_routes (ret, true, true, true);
2315 IO::enable_connecting ();
2322 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
2325 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
2326 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
2329 error << _("Adding new tracks/busses failed") << endmsg;
2334 update_latency (true);
2335 update_latency (false);
2340 save_state (_current_snapshot_name);
2343 RouteAdded (new_routes); /* EMIT SIGNAL */
2347 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
2349 ChanCount existing_inputs;
2350 ChanCount existing_outputs;
2351 uint32_t order = next_control_id();
2353 if (_order_hint != 0) {
2354 order = _order_hint;
2358 count_existing_track_channels (existing_inputs, existing_outputs);
2361 RCUWriter<RouteList> writer (routes);
2362 boost::shared_ptr<RouteList> r = writer.get_copy ();
2363 r->insert (r->end(), new_routes.begin(), new_routes.end());
2365 /* if there is no control out and we're not in the middle of loading,
2366 resort the graph here. if there is a control out, we will resort
2367 toward the end of this method. if we are in the middle of loading,
2368 we will resort when done.
2371 if (!_monitor_out && IO::connecting_legal) {
2372 resort_routes_using (r);
2376 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2378 boost::weak_ptr<Route> wpr (*x);
2379 boost::shared_ptr<Route> r (*x);
2381 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2382 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2383 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2384 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2385 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2386 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2388 if (r->is_master()) {
2392 if (r->is_monitor()) {
2396 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2398 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2399 track_playlist_changed (boost::weak_ptr<Track> (tr));
2400 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2402 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2404 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2405 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2410 if (input_auto_connect || output_auto_connect) {
2411 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
2414 /* order keys are a GUI responsibility but we need to set up
2415 reasonable defaults because they also affect the remote control
2416 ID in most situations.
2419 if (!r->has_order_key ()) {
2420 if (r->is_auditioner()) {
2421 /* use an arbitrarily high value */
2422 r->set_order_key (UINT_MAX);
2424 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
2425 r->set_order_key (order);
2433 if (_monitor_out && IO::connecting_legal) {
2434 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
2436 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2437 if ((*x)->is_monitor()) {
2439 } else if ((*x)->is_master()) {
2442 (*x)->enable_monitor_send ();
2449 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2451 boost::shared_ptr<RouteList> r = routes.reader ();
2452 boost::shared_ptr<Send> s;
2454 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2455 if ((s = (*i)->internal_send_for (dest)) != 0) {
2456 s->amp()->gain_control()->set_value (0.0);
2462 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2464 boost::shared_ptr<RouteList> r = routes.reader ();
2465 boost::shared_ptr<Send> s;
2467 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2468 if ((s = (*i)->internal_send_for (dest)) != 0) {
2469 s->amp()->gain_control()->set_value (1.0);
2475 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2477 boost::shared_ptr<RouteList> r = routes.reader ();
2478 boost::shared_ptr<Send> s;
2480 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2481 if ((s = (*i)->internal_send_for (dest)) != 0) {
2482 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2487 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2489 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2491 boost::shared_ptr<RouteList> r = routes.reader ();
2492 boost::shared_ptr<RouteList> t (new RouteList);
2494 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2495 /* no MIDI sends because there are no MIDI busses yet */
2496 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2501 add_internal_sends (dest, p, t);
2505 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2507 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2508 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
2513 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
2515 add_internal_send (dest, sender->before_processor_for_index (index), sender);
2519 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
2521 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
2525 if (!dest->internal_return()) {
2526 dest->add_internal_return ();
2529 sender->add_aux_send (dest, before);
2535 Session::remove_route (boost::shared_ptr<Route> route)
2537 if (route == _master_out) {
2541 route->set_solo (false, this);
2544 RCUWriter<RouteList> writer (routes);
2545 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2549 /* deleting the master out seems like a dumb
2550 idea, but its more of a UI policy issue
2554 if (route == _master_out) {
2555 _master_out = boost::shared_ptr<Route> ();
2558 if (route == _monitor_out) {
2559 _monitor_out.reset ();
2562 /* writer goes out of scope, forces route list update */
2565 update_route_solo_state ();
2567 // We need to disconnect the route's inputs and outputs
2569 route->input()->disconnect (0);
2570 route->output()->disconnect (0);
2572 /* if the route had internal sends sending to it, remove them */
2573 if (route->internal_return()) {
2575 boost::shared_ptr<RouteList> r = routes.reader ();
2576 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2577 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2579 (*i)->remove_processor (s);
2584 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2585 if (mt && mt->step_editing()) {
2586 if (_step_editors > 0) {
2591 update_latency_compensation ();
2594 /* Re-sort routes to remove the graph's current references to the one that is
2595 * going away, then flush old references out of the graph.
2599 if (_process_graph) {
2600 _process_graph->clear_other_chain ();
2603 /* get rid of it from the dead wood collection in the route list manager */
2605 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2609 /* try to cause everyone to drop their references */
2611 route->drop_references ();
2613 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2615 /* save the new state of the world */
2617 if (save_state (_current_snapshot_name)) {
2618 save_history (_current_snapshot_name);
2623 Session::route_mute_changed (void* /*src*/)
2629 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2631 boost::shared_ptr<Route> route = wpr.lock();
2633 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2637 if (route->listening_via_monitor ()) {
2639 if (Config->get_exclusive_solo()) {
2640 /* new listen: disable all other listen */
2641 boost::shared_ptr<RouteList> r = routes.reader ();
2642 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2643 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
2646 (*i)->set_listen (false, this);
2652 } else if (_listen_cnt > 0) {
2657 update_route_solo_state ();
2660 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2662 boost::shared_ptr<Route> route = wpr.lock ();
2665 /* should not happen */
2666 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2670 bool send_changed = false;
2672 if (route->solo_isolated()) {
2673 if (_solo_isolated_cnt == 0) {
2674 send_changed = true;
2676 _solo_isolated_cnt++;
2677 } else if (_solo_isolated_cnt > 0) {
2678 _solo_isolated_cnt--;
2679 if (_solo_isolated_cnt == 0) {
2680 send_changed = true;
2685 IsolatedChanged (); /* EMIT SIGNAL */
2690 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2692 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
2694 if (!self_solo_change) {
2695 // session doesn't care about changes to soloed-by-others
2699 if (solo_update_disabled) {
2701 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
2705 boost::shared_ptr<Route> route = wpr.lock ();
2708 boost::shared_ptr<RouteList> r = routes.reader ();
2711 if (route->self_soloed()) {
2717 RouteGroup* rg = route->route_group ();
2718 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
2720 if (delta == 1 && Config->get_exclusive_solo()) {
2722 /* new solo: disable all other solos, but not the group if its solo-enabled */
2724 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2725 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
2726 (leave_group_alone && ((*i)->route_group() == rg))) {
2729 (*i)->set_solo (false, this);
2733 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
2735 solo_update_disabled = true;
2737 RouteList uninvolved;
2739 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
2741 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2742 bool via_sends_only;
2743 bool in_signal_flow;
2745 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
2746 (leave_group_alone && ((*i)->route_group() == rg))) {
2750 in_signal_flow = false;
2752 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
2754 if ((*i)->feeds (route, &via_sends_only)) {
2755 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
2756 if (!via_sends_only) {
2757 if (!route->soloed_by_others_upstream()) {
2758 (*i)->mod_solo_by_others_downstream (delta);
2761 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
2763 in_signal_flow = true;
2765 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
2768 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
2770 if (route->feeds (*i, &via_sends_only)) {
2771 /* propagate solo upstream only if routing other than
2772 sends is involved, but do consider the other route
2773 (*i) to be part of the signal flow even if only
2776 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
2780 route->soloed_by_others_downstream(),
2781 route->soloed_by_others_upstream()));
2782 if (!via_sends_only) {
2783 if (!route->soloed_by_others_downstream()) {
2784 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
2785 (*i)->mod_solo_by_others_upstream (delta);
2787 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
2790 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
2792 in_signal_flow = true;
2794 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
2797 if (!in_signal_flow) {
2798 uninvolved.push_back (*i);
2802 solo_update_disabled = false;
2803 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
2805 update_route_solo_state (r);
2807 /* now notify that the mute state of the routes not involved in the signal
2808 pathway of the just-solo-changed route may have altered.
2811 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2812 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
2813 (*i)->mute_changed (this);
2816 SoloChanged (); /* EMIT SIGNAL */
2821 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2823 /* now figure out if anything that matters is soloed (or is "listening")*/
2825 bool something_soloed = false;
2826 uint32_t listeners = 0;
2827 uint32_t isolated = 0;
2830 r = routes.reader();
2833 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2834 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
2835 something_soloed = true;
2838 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
2839 if (Config->get_solo_control_is_listen_control()) {
2842 (*i)->set_listen (false, this);
2846 if ((*i)->solo_isolated()) {
2851 if (something_soloed != _non_soloed_outs_muted) {
2852 _non_soloed_outs_muted = something_soloed;
2853 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2856 _listen_cnt = listeners;
2858 if (isolated != _solo_isolated_cnt) {
2859 _solo_isolated_cnt = isolated;
2860 IsolatedChanged (); /* EMIT SIGNAL */
2863 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
2864 something_soloed, listeners, isolated));
2867 boost::shared_ptr<RouteList>
2868 Session::get_routes_with_internal_returns() const
2870 boost::shared_ptr<RouteList> r = routes.reader ();
2871 boost::shared_ptr<RouteList> rl (new RouteList);
2873 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2874 if ((*i)->internal_return ()) {
2882 Session::io_name_is_legal (const std::string& name)
2884 boost::shared_ptr<RouteList> r = routes.reader ();
2886 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2887 if ((*i)->name() == name) {
2891 if ((*i)->has_io_processor_named (name)) {
2900 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
2903 vector<string> connections;
2905 /* if we are passed only a single route and we're not told to turn
2906 * others off, then just do the simple thing.
2909 if (flip_others == false && rl->size() == 1) {
2910 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
2912 mt->set_input_active (onoff);
2917 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
2919 PortSet& ps ((*rt)->input()->ports());
2921 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
2922 p->get_connections (connections);
2925 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
2926 routes_using_input_from (*s, rl2);
2929 /* scan all relevant routes to see if others are on or off */
2931 bool others_are_already_on = false;
2933 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
2935 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2941 if ((*r) != (*rt)) {
2942 if (mt->input_active()) {
2943 others_are_already_on = true;
2946 /* this one needs changing */
2947 mt->set_input_active (onoff);
2953 /* globally reverse other routes */
2955 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
2956 if ((*r) != (*rt)) {
2957 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2959 mt->set_input_active (!others_are_already_on);
2968 Session::routes_using_input_from (const string& str, RouteList& rl)
2970 boost::shared_ptr<RouteList> r = routes.reader();
2972 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2973 if ((*i)->input()->connected_to (str)) {
2979 boost::shared_ptr<Route>
2980 Session::route_by_name (string name)
2982 boost::shared_ptr<RouteList> r = routes.reader ();
2984 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2985 if ((*i)->name() == name) {
2990 return boost::shared_ptr<Route> ((Route*) 0);
2993 boost::shared_ptr<Route>
2994 Session::route_by_id (PBD::ID id)
2996 boost::shared_ptr<RouteList> r = routes.reader ();
2998 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2999 if ((*i)->id() == id) {
3004 return boost::shared_ptr<Route> ((Route*) 0);
3007 boost::shared_ptr<Track>
3008 Session::track_by_diskstream_id (PBD::ID id)
3010 boost::shared_ptr<RouteList> r = routes.reader ();
3012 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3013 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3014 if (t && t->using_diskstream_id (id)) {
3019 return boost::shared_ptr<Track> ();
3022 boost::shared_ptr<Route>
3023 Session::route_by_remote_id (uint32_t id)
3025 boost::shared_ptr<RouteList> r = routes.reader ();
3027 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3028 if ((*i)->remote_control_id() == id) {
3033 return boost::shared_ptr<Route> ((Route*) 0);
3037 Session::playlist_region_added (boost::weak_ptr<Region> w)
3039 boost::shared_ptr<Region> r = w.lock ();
3044 /* These are the operations that are currently in progress... */
3045 list<GQuark> curr = _current_trans_quarks;
3048 /* ...and these are the operations during which we want to update
3049 the session range location markers.
3052 ops.push_back (Operations::capture);
3053 ops.push_back (Operations::paste);
3054 ops.push_back (Operations::duplicate_region);
3055 ops.push_back (Operations::insert_file);
3056 ops.push_back (Operations::insert_region);
3057 ops.push_back (Operations::drag_region_brush);
3058 ops.push_back (Operations::region_drag);
3059 ops.push_back (Operations::selection_grab);
3060 ops.push_back (Operations::region_fill);
3061 ops.push_back (Operations::fill_selection);
3062 ops.push_back (Operations::create_region);
3063 ops.push_back (Operations::region_copy);
3064 ops.push_back (Operations::fixed_time_region_copy);
3067 /* See if any of the current operations match the ones that we want */
3069 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
3071 /* If so, update the session range markers */
3073 maybe_update_session_range (r->position (), r->last_frame ());
3077 /** Update the session range markers if a is before the current start or
3078 * b is after the current end.
3081 Session::maybe_update_session_range (framepos_t a, framepos_t b)
3083 if (_state_of_the_state & Loading) {
3087 if (_session_range_location == 0) {
3089 add_session_range_location (a, b);
3093 if (a < _session_range_location->start()) {
3094 _session_range_location->set_start (a);
3097 if (b > _session_range_location->end()) {
3098 _session_range_location->set_end (b);
3104 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
3106 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3107 maybe_update_session_range (i->to, i->to + i->length);
3112 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
3114 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3115 maybe_update_session_range (i->from, i->to);
3119 /* Region management */
3121 boost::shared_ptr<Region>
3122 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
3124 const RegionFactory::RegionMap& regions (RegionFactory::regions());
3125 RegionFactory::RegionMap::const_iterator i;
3126 boost::shared_ptr<Region> region;
3128 Glib::Threads::Mutex::Lock lm (region_lock);
3130 for (i = regions.begin(); i != regions.end(); ++i) {
3134 if (region->whole_file()) {
3136 if (child->source_equivalent (region)) {
3142 return boost::shared_ptr<Region> ();
3146 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
3148 set<boost::shared_ptr<Region> > relevant_regions;
3150 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
3151 RegionFactory::get_regions_using_source (*s, relevant_regions);
3154 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
3155 set<boost::shared_ptr<Region> >::iterator tmp;
3160 playlists->destroy_region (*r);
3161 RegionFactory::map_remove (*r);
3163 (*r)->drop_sources ();
3164 (*r)->drop_references ();
3166 relevant_regions.erase (r);
3171 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
3174 Glib::Threads::Mutex::Lock ls (source_lock);
3175 /* remove from the main source list */
3176 sources.erase ((*s)->id());
3179 (*s)->mark_for_remove ();
3180 (*s)->drop_references ();
3189 Session::remove_last_capture ()
3191 list<boost::shared_ptr<Source> > srcs;
3193 boost::shared_ptr<RouteList> rl = routes.reader ();
3194 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3195 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3200 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
3203 srcs.insert (srcs.end(), l.begin(), l.end());
3208 destroy_sources (srcs);
3210 save_state (_current_snapshot_name);
3215 /* Source Management */
3218 Session::add_source (boost::shared_ptr<Source> source)
3220 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
3221 pair<SourceMap::iterator,bool> result;
3223 entry.first = source->id();
3224 entry.second = source;
3227 Glib::Threads::Mutex::Lock lm (source_lock);
3228 result = sources.insert (entry);
3231 if (result.second) {
3233 /* yay, new source */
3235 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
3238 if (!fs->within_session()) {
3239 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
3245 boost::shared_ptr<AudioFileSource> afs;
3247 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
3248 if (Config->get_auto_analyse_audio()) {
3249 Analyser::queue_source_for_analysis (source, false);
3253 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
3258 Session::remove_source (boost::weak_ptr<Source> src)
3260 if (_state_of_the_state & Deletion) {
3264 SourceMap::iterator i;
3265 boost::shared_ptr<Source> source = src.lock();
3272 Glib::Threads::Mutex::Lock lm (source_lock);
3274 if ((i = sources.find (source->id())) != sources.end()) {
3279 if (!(_state_of_the_state & InCleanup)) {
3281 /* save state so we don't end up with a session file
3282 referring to non-existent sources.
3285 save_state (_current_snapshot_name);
3289 boost::shared_ptr<Source>
3290 Session::source_by_id (const PBD::ID& id)
3292 Glib::Threads::Mutex::Lock lm (source_lock);
3293 SourceMap::iterator i;
3294 boost::shared_ptr<Source> source;
3296 if ((i = sources.find (id)) != sources.end()) {
3303 boost::shared_ptr<Source>
3304 Session::source_by_path_and_channel (const string& path, uint16_t chn)
3306 Glib::Threads::Mutex::Lock lm (source_lock);
3308 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3309 boost::shared_ptr<AudioFileSource> afs
3310 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
3312 if (afs && afs->path() == path && chn == afs->channel()) {
3316 return boost::shared_ptr<Source>();
3320 Session::count_sources_by_origin (const string& path)
3323 Glib::Threads::Mutex::Lock lm (source_lock);
3325 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3326 boost::shared_ptr<FileSource> fs
3327 = boost::dynamic_pointer_cast<FileSource>(i->second);
3329 if (fs && fs->origin() == path) {
3339 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
3342 string old_basename = PBD::basename_nosuffix (oldname);
3343 string new_legalized = legalize_for_path (newname);
3345 /* note: we know (or assume) the old path is already valid */
3349 /* destructive file sources have a name of the form:
3351 /path/to/Tnnnn-NAME(%[LR])?.wav
3353 the task here is to replace NAME with the new name.
3358 string::size_type dash;
3360 dir = Glib::path_get_dirname (path);
3361 path = Glib::path_get_basename (path);
3363 /* '-' is not a legal character for the NAME part of the path */
3365 if ((dash = path.find_last_of ('-')) == string::npos) {
3369 prefix = path.substr (0, dash);
3373 path += new_legalized;
3374 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3375 path = Glib::build_filename (dir, path);
3379 /* non-destructive file sources have a name of the form:
3381 /path/to/NAME-nnnnn(%[LR])?.ext
3383 the task here is to replace NAME with the new name.
3388 string::size_type dash;
3389 string::size_type postfix;
3391 dir = Glib::path_get_dirname (path);
3392 path = Glib::path_get_basename (path);
3394 /* '-' is not a legal character for the NAME part of the path */
3396 if ((dash = path.find_last_of ('-')) == string::npos) {
3400 suffix = path.substr (dash+1);
3402 // Suffix is now everything after the dash. Now we need to eliminate
3403 // the nnnnn part, which is done by either finding a '%' or a '.'
3405 postfix = suffix.find_last_of ("%");
3406 if (postfix == string::npos) {
3407 postfix = suffix.find_last_of ('.');
3410 if (postfix != string::npos) {
3411 suffix = suffix.substr (postfix);
3413 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
3417 const uint32_t limit = 10000;
3418 char buf[PATH_MAX+1];
3420 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
3422 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
3424 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
3425 path = Glib::build_filename (dir, buf);
3433 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
3442 /** Return the full path (in some session directory) for a new within-session source.
3443 * \a name must be a session-unique name that does not contain slashes
3444 * (e.g. as returned by new_*_source_name)
3447 Session::new_source_path_from_name (DataType type, const string& name)
3449 assert(name.find("/") == string::npos);
3451 SessionDirectory sdir(get_best_session_directory_for_new_source());
3454 if (type == DataType::AUDIO) {
3455 p = sdir.sound_path();
3456 } else if (type == DataType::MIDI) {
3457 p = sdir.midi_path();
3459 error << "Unknown source type, unable to create file path" << endmsg;
3463 return Glib::build_filename (p, name);
3467 Session::peak_path (string base) const
3469 return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
3472 /** Return a unique name based on \a base for a new internal audio source */
3474 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
3477 char buf[PATH_MAX+1];
3478 const uint32_t limit = 10000;
3480 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3483 legalized = legalize_for_path (base);
3485 // Find a "version" of the base name that doesn't exist in any of the possible directories.
3486 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3488 vector<space_and_path>::iterator i;
3489 uint32_t existing = 0;
3491 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3496 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3497 cnt, legalized.c_str(), ext.c_str());
3498 } else if (nchan == 2) {
3500 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
3501 cnt, legalized.c_str(), ext.c_str());
3503 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
3504 cnt, legalized.c_str(), ext.c_str());
3506 } else if (nchan < 26) {
3507 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
3508 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
3510 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3511 cnt, legalized.c_str(), ext.c_str());
3517 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3518 } else if (nchan == 2) {
3520 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
3522 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
3524 } else if (nchan < 26) {
3525 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
3527 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3531 SessionDirectory sdir((*i).path);
3533 string spath = sdir.sound_path();
3535 /* note that we search *without* the extension so that
3536 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3537 in the event that this new name is required for
3538 a file format change.
3541 if (matching_unsuffixed_filename_exists_in (spath, buf)) {
3547 if (existing == 0) {
3552 error << string_compose(
3553 _("There are already %1 recordings for %2, which I consider too many."),
3554 limit, base) << endmsg;
3556 throw failed_constructor();
3560 return Glib::path_get_basename (buf);
3563 /** Create a new within-session audio source */
3564 boost::shared_ptr<AudioFileSource>
3565 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
3567 const string name = new_audio_source_name (n, n_chans, chan, destructive);
3568 const string path = new_source_path_from_name(DataType::AUDIO, name);
3570 return boost::dynamic_pointer_cast<AudioFileSource> (
3571 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
3574 /** Return a unique name based on \a base for a new internal MIDI source */
3576 Session::new_midi_source_name (const string& base)
3579 char buf[PATH_MAX+1];
3580 const uint32_t limit = 10000;
3584 legalized = legalize_for_path (base);
3586 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3587 for (cnt = 1; cnt <= limit; ++cnt) {
3589 vector<space_and_path>::iterator i;
3590 uint32_t existing = 0;
3592 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3594 SessionDirectory sdir((*i).path);
3596 std::string p = Glib::build_filename (sdir.midi_path(), legalized);
3598 snprintf (buf, sizeof(buf), "%s-%u.mid", p.c_str(), cnt);
3600 if (Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
3605 if (existing == 0) {
3610 error << string_compose(
3611 _("There are already %1 recordings for %2, which I consider too many."),
3612 limit, base) << endmsg;
3614 throw failed_constructor();
3618 return Glib::path_get_basename(buf);
3622 /** Create a new within-session MIDI source */
3623 boost::shared_ptr<MidiSource>
3624 Session::create_midi_source_for_session (Track* track, string const & n)
3626 /* try to use the existing write source for the track, to keep numbering sane
3630 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3634 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3637 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3638 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3642 const string name = new_midi_source_name (n);
3643 const string path = new_source_path_from_name (DataType::MIDI, name);
3645 return boost::dynamic_pointer_cast<SMFSource> (
3646 SourceFactory::createWritable (
3647 DataType::MIDI, *this, path, false, frame_rate()));
3652 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3654 if (playlist->hidden()) {
3658 playlists->add (playlist);
3661 playlist->release();
3668 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3670 if (_state_of_the_state & Deletion) {
3674 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3680 playlists->remove (playlist);
3686 Session::set_audition (boost::shared_ptr<Region> r)
3688 pending_audition_region = r;
3689 add_post_transport_work (PostTransportAudition);
3690 _butler->schedule_transport_work ();
3694 Session::audition_playlist ()
3696 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3697 ev->region.reset ();
3702 Session::non_realtime_set_audition ()
3704 assert (pending_audition_region);
3705 auditioner->audition_region (pending_audition_region);
3706 pending_audition_region.reset ();
3707 AuditionActive (true); /* EMIT SIGNAL */
3711 Session::audition_region (boost::shared_ptr<Region> r)
3713 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3719 Session::cancel_audition ()
3721 if (auditioner->auditioning()) {
3722 auditioner->cancel_audition ();
3723 AuditionActive (false); /* EMIT SIGNAL */
3728 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3730 if (a->is_monitor()) {
3733 if (b->is_monitor()) {
3736 return a->order_key () < b->order_key ();
3740 Session::is_auditioning () const
3742 /* can be called before we have an auditioner object */
3744 return auditioner->auditioning();
3751 Session::graph_reordered ()
3753 /* don't do this stuff if we are setting up connections
3754 from a set_state() call or creating new tracks. Ditto for deletion.
3757 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
3761 /* every track/bus asked for this to be handled but it was deferred because
3762 we were connecting. do it now.
3765 request_input_change_handling ();
3769 /* force all diskstreams to update their capture offset values to
3770 reflect any changes in latencies within the graph.
3773 boost::shared_ptr<RouteList> rl = routes.reader ();
3774 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3775 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3777 tr->set_capture_offset ();
3782 /** @return Number of frames that there is disk space available to write,
3785 boost::optional<framecnt_t>
3786 Session::available_capture_duration ()
3788 Glib::Threads::Mutex::Lock lm (space_lock);
3790 if (_total_free_4k_blocks_uncertain) {
3791 return boost::optional<framecnt_t> ();
3794 float sample_bytes_on_disk = 4.0; // keep gcc happy
3796 switch (config.get_native_file_data_format()) {
3798 sample_bytes_on_disk = 4.0;
3802 sample_bytes_on_disk = 3.0;
3806 sample_bytes_on_disk = 2.0;
3810 /* impossible, but keep some gcc versions happy */
3811 fatal << string_compose (_("programming error: %1"),
3812 X_("illegal native file data format"))
3817 double scale = 4096.0 / sample_bytes_on_disk;
3819 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3820 return max_framecnt;
3823 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3827 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3830 RCUWriter<BundleList> writer (_bundles);
3831 boost::shared_ptr<BundleList> b = writer.get_copy ();
3832 b->push_back (bundle);
3835 BundleAdded (bundle); /* EMIT SIGNAL */
3841 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3843 bool removed = false;
3846 RCUWriter<BundleList> writer (_bundles);
3847 boost::shared_ptr<BundleList> b = writer.get_copy ();
3848 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3850 if (i != b->end()) {
3857 BundleRemoved (bundle); /* EMIT SIGNAL */
3863 boost::shared_ptr<Bundle>
3864 Session::bundle_by_name (string name) const
3866 boost::shared_ptr<BundleList> b = _bundles.reader ();
3868 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3869 if ((*i)->name() == name) {
3874 return boost::shared_ptr<Bundle> ();
3878 Session::tempo_map_changed (const PropertyChange&)
3882 playlists->update_after_tempo_map_change ();
3884 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3890 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3892 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3893 (*i)->recompute_frames_from_bbt ();
3897 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3898 * the given count with the current block size.
3901 Session::ensure_buffers (ChanCount howmany)
3903 BufferManager::ensure_buffers (howmany);
3907 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3909 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3910 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3915 Session::next_insert_id ()
3917 /* this doesn't really loop forever. just think about it */
3920 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3921 if (!insert_bitset[n]) {
3922 insert_bitset[n] = true;
3928 /* none available, so resize and try again */
3930 insert_bitset.resize (insert_bitset.size() + 16, false);
3935 Session::next_send_id ()
3937 /* this doesn't really loop forever. just think about it */
3940 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3941 if (!send_bitset[n]) {
3942 send_bitset[n] = true;
3948 /* none available, so resize and try again */
3950 send_bitset.resize (send_bitset.size() + 16, false);
3955 Session::next_aux_send_id ()
3957 /* this doesn't really loop forever. just think about it */
3960 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
3961 if (!aux_send_bitset[n]) {
3962 aux_send_bitset[n] = true;
3968 /* none available, so resize and try again */
3970 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
3975 Session::next_return_id ()
3977 /* this doesn't really loop forever. just think about it */
3980 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3981 if (!return_bitset[n]) {
3982 return_bitset[n] = true;
3988 /* none available, so resize and try again */
3990 return_bitset.resize (return_bitset.size() + 16, false);
3995 Session::mark_send_id (uint32_t id)
3997 if (id >= send_bitset.size()) {
3998 send_bitset.resize (id+16, false);
4000 if (send_bitset[id]) {
4001 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
4003 send_bitset[id] = true;
4007 Session::mark_aux_send_id (uint32_t id)
4009 if (id >= aux_send_bitset.size()) {
4010 aux_send_bitset.resize (id+16, false);
4012 if (aux_send_bitset[id]) {
4013 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
4015 aux_send_bitset[id] = true;
4019 Session::mark_return_id (uint32_t id)
4021 if (id >= return_bitset.size()) {
4022 return_bitset.resize (id+16, false);
4024 if (return_bitset[id]) {
4025 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
4027 return_bitset[id] = true;
4031 Session::mark_insert_id (uint32_t id)
4033 if (id >= insert_bitset.size()) {
4034 insert_bitset.resize (id+16, false);
4036 if (insert_bitset[id]) {
4037 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
4039 insert_bitset[id] = true;
4043 Session::unmark_send_id (uint32_t id)
4045 if (id < send_bitset.size()) {
4046 send_bitset[id] = false;
4051 Session::unmark_aux_send_id (uint32_t id)
4053 if (id < aux_send_bitset.size()) {
4054 aux_send_bitset[id] = false;
4059 Session::unmark_return_id (uint32_t id)
4061 if (id < return_bitset.size()) {
4062 return_bitset[id] = false;
4067 Session::unmark_insert_id (uint32_t id)
4069 if (id < insert_bitset.size()) {
4070 insert_bitset[id] = false;
4075 Session::reset_native_file_format ()
4077 boost::shared_ptr<RouteList> rl = routes.reader ();
4078 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4079 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4081 /* don't save state as we do this, there's no point
4084 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
4085 tr->reset_write_sources (false);
4086 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
4092 Session::route_name_unique (string n) const
4094 boost::shared_ptr<RouteList> r = routes.reader ();
4096 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4097 if ((*i)->name() == n) {
4106 Session::route_name_internal (string n) const
4108 if (auditioner && auditioner->name() == n) {
4112 if (_click_io && _click_io->name() == n) {
4120 Session::freeze_all (InterThreadInfo& itt)
4122 boost::shared_ptr<RouteList> r = routes.reader ();
4124 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4126 boost::shared_ptr<Track> t;
4128 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
4129 /* XXX this is wrong because itt.progress will keep returning to zero at the start
4139 boost::shared_ptr<Region>
4140 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
4141 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
4142 InterThreadInfo& itt,
4143 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
4146 boost::shared_ptr<Region> result;
4147 boost::shared_ptr<Playlist> playlist;
4148 boost::shared_ptr<AudioFileSource> fsource;
4150 char buf[PATH_MAX+1];
4151 ChanCount diskstream_channels (track.n_channels());
4152 framepos_t position;
4153 framecnt_t this_chunk;
4156 SessionDirectory sdir(get_best_session_directory_for_new_source ());
4157 const string sound_dir = sdir.sound_path();
4158 framepos_t len = end - start;
4159 bool need_block_size_reset = false;
4161 ChanCount const max_proc = track.max_processor_streams ();
4164 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
4165 end, start) << endmsg;
4169 const framecnt_t chunk_size = (256 * 1024)/4;
4171 // block all process callback handling
4173 block_processing ();
4175 /* call tree *MUST* hold route_lock */
4177 if ((playlist = track.playlist()) == 0) {
4181 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4183 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
4185 for (x = 0; x < 99999; ++x) {
4186 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());
4187 if (!Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
4193 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
4198 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
4199 SourceFactory::createWritable (DataType::AUDIO, *this, buf, false, frame_rate()));
4202 catch (failed_constructor& err) {
4203 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
4207 srcs.push_back (fsource);
4210 /* tell redirects that care that we are about to use a much larger
4211 * blocksize. this will flush all plugins too, so that they are ready
4212 * to be used for this process.
4215 need_block_size_reset = true;
4216 track.set_block_size (chunk_size);
4221 /* create a set of reasonably-sized buffers */
4222 buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
4223 buffers.set_count (max_proc);
4225 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4226 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4228 afs->prepare_for_peakfile_writes ();
4231 while (to_do && !itt.cancel) {
4233 this_chunk = min (to_do, chunk_size);
4235 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export)) {
4240 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4241 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4244 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
4250 start += this_chunk;
4251 to_do -= this_chunk;
4253 itt.progress = (float) (1.0 - ((double) to_do / len));
4262 xnow = localtime (&now);
4264 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
4265 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4268 afs->update_header (position, *xnow, now);
4269 afs->flush_header ();
4273 /* construct a region to represent the bounced material */
4277 plist.add (Properties::start, 0);
4278 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4279 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4281 result = RegionFactory::create (srcs, plist);
4287 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4288 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4291 afs->mark_for_remove ();
4294 (*src)->drop_references ();
4298 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4299 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4302 afs->done_with_peakfile_writes ();
4307 if (need_block_size_reset) {
4308 track.set_block_size (get_block_size());
4311 unblock_processing ();
4317 Session::gain_automation_buffer() const
4319 return ProcessThread::gain_automation_buffer ();
4323 Session::send_gain_automation_buffer() const
4325 return ProcessThread::send_gain_automation_buffer ();
4329 Session::pan_automation_buffer() const
4331 return ProcessThread::pan_automation_buffer ();
4335 Session::get_silent_buffers (ChanCount count)
4337 return ProcessThread::get_silent_buffers (count);
4341 Session::get_scratch_buffers (ChanCount count, bool silence)
4343 return ProcessThread::get_scratch_buffers (count, silence);
4347 Session::get_route_buffers (ChanCount count, bool silence)
4349 return ProcessThread::get_route_buffers (count, silence);
4354 Session::get_mix_buffers (ChanCount count)
4356 return ProcessThread::get_mix_buffers (count);
4360 Session::ntracks () const
4363 boost::shared_ptr<RouteList> r = routes.reader ();
4365 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4366 if (boost::dynamic_pointer_cast<Track> (*i)) {
4375 Session::nbusses () const
4378 boost::shared_ptr<RouteList> r = routes.reader ();
4380 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4381 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
4390 Session::add_automation_list(AutomationList *al)
4392 automation_lists[al->id()] = al;
4395 /** @return true if there is at least one record-enabled track, otherwise false */
4397 Session::have_rec_enabled_track () const
4399 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
4402 /** Update the state of our rec-enabled tracks flag */
4404 Session::update_have_rec_enabled_track ()
4406 boost::shared_ptr<RouteList> rl = routes.reader ();
4407 RouteList::iterator i = rl->begin();
4408 while (i != rl->end ()) {
4410 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4411 if (tr && tr->record_enabled ()) {
4418 int const old = g_atomic_int_get (&_have_rec_enabled_track);
4420 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4422 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4423 RecordStateChanged (); /* EMIT SIGNAL */
4428 Session::listen_position_changed ()
4430 boost::shared_ptr<RouteList> r = routes.reader ();
4432 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4433 (*i)->listen_position_changed ();
4438 Session::solo_control_mode_changed ()
4440 /* cancel all solo or all listen when solo control mode changes */
4443 set_solo (get_routes(), false);
4444 } else if (listening()) {
4445 set_listen (get_routes(), false);
4449 /** Called when a property of one of our route groups changes */
4451 Session::route_group_property_changed (RouteGroup* rg)
4453 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4456 /** Called when a route is added to one of our route groups */
4458 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4460 RouteAddedToRouteGroup (rg, r);
4463 /** Called when a route is removed from one of our route groups */
4465 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4467 RouteRemovedFromRouteGroup (rg, r);
4470 boost::shared_ptr<RouteList>
4471 Session::get_routes_with_regions_at (framepos_t const p) const
4473 boost::shared_ptr<RouteList> r = routes.reader ();
4474 boost::shared_ptr<RouteList> rl (new RouteList);
4476 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4477 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4482 boost::shared_ptr<Playlist> pl = tr->playlist ();
4487 if (pl->has_region_at (p)) {
4496 Session::goto_end ()
4498 if (_session_range_location) {
4499 request_locate (_session_range_location->end(), false);
4501 request_locate (0, false);
4506 Session::goto_start ()
4508 if (_session_range_location) {
4509 request_locate (_session_range_location->start(), false);
4511 request_locate (0, false);
4516 Session::current_start_frame () const
4518 return _session_range_location ? _session_range_location->start() : 0;
4522 Session::current_end_frame () const
4524 return _session_range_location ? _session_range_location->end() : 0;
4528 Session::add_session_range_location (framepos_t start, framepos_t end)
4530 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4531 _locations->add (_session_range_location);
4535 Session::step_edit_status_change (bool yn)
4541 send = (_step_editors == 0);
4546 send = (_step_editors == 1);
4549 if (_step_editors > 0) {
4555 StepEditStatusChange (val);
4561 Session::start_time_changed (framepos_t old)
4563 /* Update the auto loop range to match the session range
4564 (unless the auto loop range has been changed by the user)
4567 Location* s = _locations->session_range_location ();
4572 Location* l = _locations->auto_loop_location ();
4574 if (l && l->start() == old) {
4575 l->set_start (s->start(), true);
4580 Session::end_time_changed (framepos_t old)
4582 /* Update the auto loop range to match the session range
4583 (unless the auto loop range has been changed by the user)
4586 Location* s = _locations->session_range_location ();
4591 Location* l = _locations->auto_loop_location ();
4593 if (l && l->end() == old) {
4594 l->set_end (s->end(), true);
4598 std::vector<std::string>
4599 Session::source_search_path (DataType type) const
4603 if (session_dirs.size() == 1) {
4605 case DataType::AUDIO:
4606 sp.push_back (_session_dir->sound_path());
4608 case DataType::MIDI:
4609 sp.push_back (_session_dir->midi_path());
4613 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4614 SessionDirectory sdir (i->path);
4616 case DataType::AUDIO:
4617 sp.push_back (sdir.sound_path());
4619 case DataType::MIDI:
4620 sp.push_back (sdir.midi_path());
4626 if (type == DataType::AUDIO) {
4627 const string sound_path_2X = _session_dir->sound_path_2X();
4628 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
4629 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
4630 sp.push_back (sound_path_2X);
4635 // now check the explicit (possibly user-specified) search path
4638 case DataType::AUDIO:
4639 sp += Searchpath(config.get_audio_search_path ());
4641 case DataType::MIDI:
4642 sp += Searchpath(config.get_midi_search_path ());
4650 Session::ensure_search_path_includes (const string& path, DataType type)
4659 case DataType::AUDIO:
4660 sp += Searchpath(config.get_audio_search_path ());
4662 case DataType::MIDI:
4663 sp += Searchpath (config.get_midi_search_path ());
4667 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
4668 /* No need to add this new directory if it has the same inode as
4669 an existing one; checking inode rather than name prevents duplicated
4670 directories when we are using symlinks.
4672 On Windows, I think we could just do if (*i == path) here.
4674 if (PBD::equivalent_paths (*i, path)) {
4682 case DataType::AUDIO:
4683 config.set_audio_search_path (sp.to_string());
4685 case DataType::MIDI:
4686 config.set_midi_search_path (sp.to_string());
4691 boost::shared_ptr<Speakers>
4692 Session::get_speakers()
4698 Session::unknown_processors () const
4702 boost::shared_ptr<RouteList> r = routes.reader ();
4703 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4704 list<string> t = (*i)->unknown_processors ();
4705 copy (t.begin(), t.end(), back_inserter (p));
4715 Session::update_latency (bool playback)
4717 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
4719 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
4723 boost::shared_ptr<RouteList> r = routes.reader ();
4724 framecnt_t max_latency = 0;
4727 /* reverse the list so that we work backwards from the last route to run to the first */
4728 RouteList* rl = routes.reader().get();
4729 r.reset (new RouteList (*rl));
4730 reverse (r->begin(), r->end());
4733 /* compute actual latency values for the given direction and store them all in per-port
4734 structures. this will also publish the same values (to JACK) so that computation of latency
4735 for routes can consistently use public latency values.
4738 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4739 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
4742 /* because we latency compensate playback, our published playback latencies should
4743 be the same for all output ports - all material played back by ardour has
4744 the same latency, whether its caused by plugins or by latency compensation. since
4745 these may differ from the values computed above, reset all playback port latencies
4749 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
4751 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4752 (*i)->set_public_port_latencies (max_latency, playback);
4757 post_playback_latency ();
4761 post_capture_latency ();
4764 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
4768 Session::post_playback_latency ()
4770 set_worst_playback_latency ();
4772 boost::shared_ptr<RouteList> r = routes.reader ();
4774 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4775 if (!(*i)->is_auditioner() && ((*i)->active())) {
4776 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
4780 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4781 (*i)->set_latency_compensation (_worst_track_latency);
4786 Session::post_capture_latency ()
4788 set_worst_capture_latency ();
4790 /* reflect any changes in capture latencies into capture offsets
4793 boost::shared_ptr<RouteList> rl = routes.reader();
4794 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4795 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4797 tr->set_capture_offset ();
4803 Session::initialize_latencies ()
4806 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
4807 update_latency (false);
4808 update_latency (true);
4811 set_worst_io_latencies ();
4815 Session::set_worst_io_latencies ()
4817 set_worst_playback_latency ();
4818 set_worst_capture_latency ();
4822 Session::set_worst_playback_latency ()
4824 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4828 _worst_output_latency = 0;
4830 if (!_engine.connected()) {
4834 boost::shared_ptr<RouteList> r = routes.reader ();
4836 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4837 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
4840 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
4844 Session::set_worst_capture_latency ()
4846 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4850 _worst_input_latency = 0;
4852 if (!_engine.connected()) {
4856 boost::shared_ptr<RouteList> r = routes.reader ();
4858 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4859 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
4862 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
4866 Session::update_latency_compensation (bool force_whole_graph)
4868 bool some_track_latency_changed = false;
4870 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4874 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
4876 _worst_track_latency = 0;
4878 boost::shared_ptr<RouteList> r = routes.reader ();
4880 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4881 if (!(*i)->is_auditioner() && ((*i)->active())) {
4883 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
4884 some_track_latency_changed = true;
4886 _worst_track_latency = max (tl, _worst_track_latency);
4890 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
4891 (some_track_latency_changed ? "yes" : "no")));
4893 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
4895 if (some_track_latency_changed || force_whole_graph) {
4896 _engine.update_latencies ();
4900 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4901 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4905 tr->set_capture_offset ();
4910 Session::session_name_is_legal (const string& path)
4912 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
4914 for (int i = 0; illegal_chars[i]; ++i) {
4915 if (path.find (illegal_chars[i]) != string::npos) {
4916 return illegal_chars[i];
4924 Session::next_control_id () const
4928 /* the monitor bus remote ID is in a different
4929 * "namespace" than regular routes. its existence doesn't
4930 * affect normal (low) numbered routes.
4937 return nroutes() - subtract;
4941 Session::notify_remote_id_change ()
4943 if (deletion_in_progress()) {
4947 switch (Config->get_remote_model()) {
4949 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
4957 Session::sync_order_keys ()
4959 if (deletion_in_progress()) {
4963 /* tell everyone that something has happened to the sort keys
4964 and let them sync up with the change(s)
4965 this will give objects that manage the sort order keys the
4966 opportunity to keep them in sync if they wish to.
4969 DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
4971 Route::SyncOrderKeys (); /* EMIT SIGNAL */
4973 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
4977 Session::operation_in_progress (GQuark op) const
4979 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
4982 boost::shared_ptr<Port>
4983 Session::ltc_input_port () const
4985 return _ltc_input->nth (0);
4988 boost::shared_ptr<Port>
4989 Session::ltc_output_port () const
4991 return _ltc_output->nth (0);
4995 Session::reconnect_ltc_input ()
4999 string src = Config->get_ltc_source_port();
5001 _ltc_input->disconnect (this);
5003 if (src != _("None") && !src.empty()) {
5004 _ltc_input->nth (0)->connect (src);
5010 Session::reconnect_ltc_output ()
5015 string src = Config->get_ltc_sink_port();
5017 _ltc_output->disconnect (this);
5019 if (src != _("None") && !src.empty()) {
5020 _ltc_output->nth (0)->connect (src);