2 Copyright (C) 1999-2010 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #include <cstdio> /* sprintf(3) ... grrr */
33 #include <glibmm/threads.h>
34 #include <glibmm/miscutils.h>
35 #include <glibmm/fileutils.h>
37 #include <boost/algorithm/string/erase.hpp>
39 #include "pbd/basename.h"
40 #include "pbd/boost_debug.h"
41 #include "pbd/convert.h"
42 #include "pbd/convert.h"
43 #include "pbd/error.h"
44 #include "pbd/file_utils.h"
46 #include "pbd/search_path.h"
47 #include "pbd/stacktrace.h"
48 #include "pbd/stl_delete.h"
49 #include "pbd/unwind.h"
51 #include "ardour/amp.h"
52 #include "ardour/analyser.h"
53 #include "ardour/async_midi_port.h"
54 #include "ardour/audio_buffer.h"
55 #include "ardour/audio_diskstream.h"
56 #include "ardour/audio_port.h"
57 #include "ardour/audio_track.h"
58 #include "ardour/audioengine.h"
59 #include "ardour/audiofilesource.h"
60 #include "ardour/auditioner.h"
61 #include "ardour/buffer_manager.h"
62 #include "ardour/buffer_set.h"
63 #include "ardour/bundle.h"
64 #include "ardour/butler.h"
65 #include "ardour/click.h"
66 #include "ardour/control_protocol_manager.h"
67 #include "ardour/data_type.h"
68 #include "ardour/debug.h"
69 #include "ardour/directory_names.h"
70 #include "ardour/filename_extensions.h"
71 #include "ardour/graph.h"
72 #include "ardour/midiport_manager.h"
73 #include "ardour/scene_changer.h"
74 #include "ardour/midi_track.h"
75 #include "ardour/midi_ui.h"
76 #include "ardour/operations.h"
77 #include "ardour/playlist.h"
78 #include "ardour/plugin.h"
79 #include "ardour/plugin_insert.h"
80 #include "ardour/process_thread.h"
81 #include "ardour/profile.h"
82 #include "ardour/rc_configuration.h"
83 #include "ardour/recent_sessions.h"
84 #include "ardour/region.h"
85 #include "ardour/region_factory.h"
86 #include "ardour/route_graph.h"
87 #include "ardour/route_group.h"
88 #include "ardour/route_sorters.h"
89 #include "ardour/send.h"
90 #include "ardour/session.h"
91 #include "ardour/session_directory.h"
92 #include "ardour/session_playlists.h"
93 #include "ardour/smf_source.h"
94 #include "ardour/source_factory.h"
95 #include "ardour/speakers.h"
96 #include "ardour/tempo.h"
97 #include "ardour/track.h"
98 #include "ardour/user_bundle.h"
99 #include "ardour/utils.h"
101 #include "midi++/port.h"
102 #include "midi++/mmc.h"
113 using namespace ARDOUR;
116 bool Session::_disable_all_loaded_plugins = false;
118 PBD::Signal1<int,uint32_t> Session::AudioEngineSetupRequired;
119 PBD::Signal1<void,std::string> Session::Dialog;
120 PBD::Signal0<int> Session::AskAboutPendingState;
121 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
122 PBD::Signal0<void> Session::SendFeedback;
123 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
125 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
126 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
127 PBD::Signal2<void,std::string, std::string> Session::Exported;
128 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
129 PBD::Signal0<void> Session::Quit;
130 PBD::Signal0<void> Session::FeedbackDetected;
131 PBD::Signal0<void> Session::SuccessfulGraphSort;
132 PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
134 const framecnt_t Session::bounce_chunk_size = 65536;
135 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
136 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
138 /** @param snapshot_name Snapshot name, without .ardour suffix */
139 Session::Session (AudioEngine &eng,
140 const string& fullpath,
141 const string& snapshot_name,
142 BusProfile* bus_profile,
144 : playlists (new SessionPlaylists)
146 , process_function (&Session::process_with_events)
147 , _bounce_processing_active (false)
148 , waiting_for_sync_offset (false)
149 , _base_frame_rate (0)
150 , _current_frame_rate (0)
151 , _nominal_frame_rate (0)
152 , transport_sub_state (0)
153 , _record_status (Disabled)
154 , _transport_frame (0)
155 , _session_range_location (0)
158 , _transport_speed (0)
159 , _default_transport_speed (1.0)
160 , _last_transport_speed (0)
161 , _target_transport_speed (0.0)
162 , auto_play_legal (false)
163 , _last_slave_transport_frame (0)
164 , maximum_output_latency (0)
165 , _requested_return_frame (-1)
166 , current_block_size (0)
167 , _worst_output_latency (0)
168 , _worst_input_latency (0)
169 , _worst_track_latency (0)
170 , _have_captured (false)
171 , _non_soloed_outs_muted (false)
173 , _solo_isolated_cnt (0)
175 , _was_seamless (Config->get_seamless_loop ())
176 , _under_nsm_control (false)
178 , delta_accumulator_cnt (0)
179 , average_slave_delta (1800) // !!! why 1800 ???
181 , have_first_delta_accumulator (false)
182 , _slave_state (Stopped)
183 , post_export_sync (false)
184 , post_export_position (0)
186 , _export_started (false)
187 , _export_rolling (false)
188 , _pre_export_mmc_enabled (false)
189 , _name (snapshot_name)
191 , _send_qf_mtc (false)
192 , _pframes_since_last_mtc (0)
193 , session_midi_feedback (0)
195 , loop_changing (false)
197 , _session_dir (new SessionDirectory (fullpath))
198 , _current_snapshot_name (snapshot_name)
200 , state_was_pending (false)
201 , _state_of_the_state (StateOfTheState(CannotSave|InitialConnecting|Loading))
203 , _save_queued (false)
204 , _last_roll_location (0)
205 , _last_roll_or_reversal_location (0)
206 , _last_record_location (0)
207 , pending_locate_roll (false)
208 , pending_locate_frame (0)
209 , pending_locate_flush (false)
210 , pending_abort (false)
211 , pending_auto_loop (false)
212 , _butler (new Butler (*this))
213 , _post_transport_work (0)
214 , cumulative_rf_motion (0)
216 , _locations (new Locations (*this))
217 , _ignore_skips_updates (false)
218 , _rt_thread_active (false)
219 , _rt_emit_pending (false)
221 , outbound_mtc_timecode_frame (0)
222 , next_quarter_frame_to_send (-1)
223 , _frames_per_timecode_frame (0)
224 , _frames_per_hour (0)
225 , _timecode_frames_per_hour (0)
226 , last_timecode_valid (false)
227 , last_timecode_when (0)
228 , _send_timecode_update (false)
240 , ltc_timecode_offset (0)
241 , ltc_timecode_negative_offset (false)
242 , midi_control_ui (0)
244 , _all_route_group (new RouteGroup (*this, "all"))
245 , routes (new RouteList)
246 , _adding_routes_in_progress (false)
247 , _reconnecting_routes_in_progress (false)
248 , _route_deletion_in_progress (false)
249 , destructive_index (0)
250 , _track_number_decimals(1)
251 , solo_update_disabled (false)
252 , default_fade_steepness (0)
253 , default_fade_msecs (0)
254 , _total_free_4k_blocks (0)
255 , _total_free_4k_blocks_uncertain (false)
256 , no_questions_about_missing_files (false)
259 , _bundles (new BundleList)
260 , _bundle_xml_node (0)
264 , click_emphasis_data (0)
266 , click_emphasis_length (0)
267 , _clicks_cleared (0)
268 , _play_range (false)
270 , first_file_data_format_reset (true)
271 , first_file_header_format_reset (true)
272 , have_looped (false)
273 , _have_rec_enabled_track (false)
274 , _have_rec_disabled_track (true)
276 , _suspend_timecode_transmission (0)
277 , _speakers (new Speakers)
279 , ignore_route_processor_changes (false)
286 pthread_mutex_init (&_rt_emit_mutex, 0);
287 pthread_cond_init (&_rt_emit_cond, 0);
289 pre_engine_init (fullpath);
292 if (ensure_engine (sr)) {
294 throw failed_constructor ();
297 if (create (mix_template, bus_profile)) {
299 throw failed_constructor ();
302 /* if a mix template was provided, then ::create() will
303 * have copied it into the session and we need to load it
304 * so that we have the state ready for ::set_state()
305 * after the engine is started.
307 * Note that we do NOT try to get the sample rate from
308 * the template at this time, though doing so would
309 * be easy if we decided this was an appropriate part
313 if (!mix_template.empty()) {
314 if (load_state (_current_snapshot_name)) {
315 throw failed_constructor ();
317 store_recent_templates (mix_template);
320 /* load default session properties - if any */
325 if (load_state (_current_snapshot_name)) {
326 throw failed_constructor ();
329 /* try to get sample rate from XML state so that we
330 * can influence the SR if we set up the audio
335 const XMLProperty* prop;
336 if ((prop = state_tree->root()->property (X_("sample-rate"))) != 0) {
337 sr = atoi (prop->value());
341 if (ensure_engine (sr)) {
343 throw failed_constructor ();
347 if (post_engine_init ()) {
349 throw failed_constructor ();
352 store_recent_sessions (_name, _path);
354 bool was_dirty = dirty();
356 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
358 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
359 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
362 DirtyChanged (); /* EMIT SIGNAL */
365 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
366 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
370 emit_thread_start ();
372 /* hook us up to the engine since we are now completely constructed */
374 BootMessage (_("Connect to engine"));
376 _engine.set_session (this);
377 _engine.reset_timebase ();
379 BootMessage (_("Session loading complete"));
392 Session::ensure_engine (uint32_t desired_sample_rate)
394 if (_engine.current_backend() == 0) {
395 /* backend is unknown ... */
396 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
397 if (r.get_value_or (-1) != 0) {
400 } else if (_engine.setup_required()) {
401 /* backend is known, but setup is needed */
402 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
403 if (r.get_value_or (-1) != 0) {
406 } else if (!_engine.running()) {
407 if (_engine.start()) {
412 /* at this point the engine should be running
415 if (!_engine.running()) {
419 return immediately_post_engine ();
424 Session::immediately_post_engine ()
426 /* Do various initializations that should take place directly after we
427 * know that the engine is running, but before we either create a
428 * session or set state for an existing one.
431 if (how_many_dsp_threads () > 1) {
432 /* For now, only create the graph if we are using >1 DSP threads, as
433 it is a bit slower than the old code with 1 thread.
435 _process_graph.reset (new Graph (*this));
438 /* every time we reconnect, recompute worst case output latencies */
440 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
442 if (synced_to_engine()) {
443 _engine.transport_stop ();
446 if (config.get_jack_time_master()) {
447 _engine.transport_locate (_transport_frame);
451 BootMessage (_("Set up LTC"));
453 BootMessage (_("Set up Click"));
455 BootMessage (_("Set up standard connections"));
459 catch (failed_constructor& err) {
463 /* TODO, connect in different thread. (PortRegisteredOrUnregistered may be in RT context)
465 _engine.PortRegisteredOrUnregistered.connect_same_thread (*this, boost::bind (&Session::setup_bundles, this));
473 vector<void*> debug_pointers;
475 /* if we got to here, leaving pending capture state around
479 remove_pending_capture_state ();
481 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
483 /* disconnect from any and all signals that we are connected to */
487 _engine.remove_session ();
489 /* deregister all ports - there will be no process or any other
490 * callbacks from the engine any more.
493 Port::PortDrop (); /* EMIT SIGNAL */
497 /* clear history so that no references to objects are held any more */
501 /* clear state tree so that no references to objects are held any more */
506 /* reset dynamic state version back to default */
508 Stateful::loading_state_version = 0;
510 _butler->drop_references ();
514 delete _all_route_group;
516 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
517 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
521 if (click_data != default_click) {
522 delete [] click_data;
525 if (click_emphasis_data != default_click_emphasis) {
526 delete [] click_emphasis_data;
531 /* need to remove auditioner before monitoring section
532 * otherwise it is re-connected */
535 /* drop references to routes held by the monitoring section
536 * specifically _monitor_out aux/listen references */
537 remove_monitor_section();
539 /* clear out any pending dead wood from RCU managed objects */
544 AudioDiskstream::free_working_buffers();
546 /* tell everyone who is still standing that we're about to die */
549 /* tell everyone to drop references and delete objects as we go */
551 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
552 RegionFactory::delete_all_regions ();
554 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
556 /* reset these three references to special routes before we do the usual route delete thing */
558 _master_out.reset ();
559 _monitor_out.reset ();
562 RCUWriter<RouteList> writer (routes);
563 boost::shared_ptr<RouteList> r = writer.get_copy ();
565 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
566 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
567 (*i)->drop_references ();
571 /* writer goes out of scope and updates master */
576 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
577 Glib::Threads::Mutex::Lock lm (source_lock);
578 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
579 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
580 i->second->drop_references ();
586 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
589 emit_thread_terminate ();
591 pthread_cond_destroy (&_rt_emit_cond);
592 pthread_mutex_destroy (&_rt_emit_mutex);
594 delete _scene_changer; _scene_changer = 0;
595 delete midi_control_ui; midi_control_ui = 0;
597 delete _mmc; _mmc = 0;
598 delete _midi_ports; _midi_ports = 0;
599 delete _locations; _locations = 0;
603 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
605 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
606 boost_debug_list_ptrs ();
611 Session::setup_ltc ()
615 _ltc_input.reset (new IO (*this, X_("LTC In"), IO::Input));
616 _ltc_output.reset (new IO (*this, X_("LTC Out"), IO::Output));
618 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC In"))) != 0) {
619 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
622 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
623 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
625 reconnect_ltc_input ();
628 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC Out"))) != 0) {
629 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
632 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
633 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
635 reconnect_ltc_output ();
638 /* fix up names of LTC ports because we don't want the normal
639 * IO style of NAME/TYPE-{in,out}N
642 _ltc_input->nth (0)->set_name (X_("LTC-in"));
643 _ltc_output->nth (0)->set_name (X_("LTC-out"));
647 Session::setup_click ()
650 _click_io.reset (new ClickIO (*this, X_("Click")));
651 _click_gain.reset (new Amp (*this));
652 _click_gain->activate ();
654 setup_click_state (state_tree->root());
656 setup_click_state (0);
661 Session::setup_click_state (const XMLNode* node)
663 const XMLNode* child = 0;
665 if (node && (child = find_named_node (*node, "Click")) != 0) {
667 /* existing state for Click */
670 if (Stateful::loading_state_version < 3000) {
671 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
673 const XMLNodeList& children (child->children());
674 XMLNodeList::const_iterator i = children.begin();
675 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
677 if (i != children.end()) {
678 c = _click_gain->set_state (**i, Stateful::loading_state_version);
684 _clicking = Config->get_clicking ();
688 error << _("could not setup Click I/O") << endmsg;
695 /* default state for Click: dual-mono to first 2 physical outputs */
698 _engine.get_physical_outputs (DataType::AUDIO, outs);
700 for (uint32_t physport = 0; physport < 2; ++physport) {
701 if (outs.size() > physport) {
702 if (_click_io->add_port (outs[physport], this)) {
703 // relax, even though its an error
708 if (_click_io->n_ports () > ChanCount::ZERO) {
709 _clicking = Config->get_clicking ();
715 Session::setup_bundles ()
719 RCUWriter<BundleList> writer (_bundles);
720 boost::shared_ptr<BundleList> b = writer.get_copy ();
721 for (BundleList::iterator i = b->begin(); i != b->end();) {
722 if (boost::dynamic_pointer_cast<UserBundle>(*i)) {
730 vector<string> inputs[DataType::num_types];
731 vector<string> outputs[DataType::num_types];
732 for (uint32_t i = 0; i < DataType::num_types; ++i) {
733 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
734 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
737 /* Create a set of Bundle objects that map
738 to the physical I/O currently available. We create both
739 mono and stereo bundles, so that the common cases of mono
740 and stereo tracks get bundles to put in their mixer strip
741 in / out menus. There may be a nicer way of achieving that;
742 it doesn't really scale that well to higher channel counts
745 /* mono output bundles */
747 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
749 std::string pn = _engine.get_pretty_name_by_name (outputs[DataType::AUDIO][np]);
751 snprintf (buf, sizeof (buf), _("out %s"), pn.substr(0,12).c_str());
753 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
756 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
757 c->add_channel (_("mono"), DataType::AUDIO);
758 c->set_port (0, outputs[DataType::AUDIO][np]);
760 add_bundle (c, false);
763 /* stereo output bundles */
765 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
766 if (np + 1 < outputs[DataType::AUDIO].size()) {
768 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
769 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
770 c->add_channel (_("L"), DataType::AUDIO);
771 c->set_port (0, outputs[DataType::AUDIO][np]);
772 c->add_channel (_("R"), DataType::AUDIO);
773 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
775 add_bundle (c, false);
779 /* mono input bundles */
781 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
783 std::string pn = _engine.get_pretty_name_by_name (inputs[DataType::AUDIO][np]);
785 snprintf (buf, sizeof (buf), _("in %s"), pn.substr(0,12).c_str());
787 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
790 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
791 c->add_channel (_("mono"), DataType::AUDIO);
792 c->set_port (0, inputs[DataType::AUDIO][np]);
794 add_bundle (c, false);
797 /* stereo input bundles */
799 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
800 if (np + 1 < inputs[DataType::AUDIO].size()) {
802 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
804 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
805 c->add_channel (_("L"), DataType::AUDIO);
806 c->set_port (0, inputs[DataType::AUDIO][np]);
807 c->add_channel (_("R"), DataType::AUDIO);
808 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
810 add_bundle (c, false);
814 /* MIDI input bundles */
816 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
817 string n = inputs[DataType::MIDI][np];
818 std::string pn = _engine.get_pretty_name_by_name (n);
822 boost::erase_first (n, X_("alsa_pcm:"));
824 boost::shared_ptr<Bundle> c (new Bundle (n, false));
825 c->add_channel ("", DataType::MIDI);
826 c->set_port (0, inputs[DataType::MIDI][np]);
827 add_bundle (c, false);
830 /* MIDI output bundles */
832 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
833 string n = outputs[DataType::MIDI][np];
834 std::string pn = _engine.get_pretty_name_by_name (n);
838 boost::erase_first (n, X_("alsa_pcm:"));
840 boost::shared_ptr<Bundle> c (new Bundle (n, true));
841 c->add_channel ("", DataType::MIDI);
842 c->set_port (0, outputs[DataType::MIDI][np]);
843 add_bundle (c, false);
846 // we trust the backend to only calls us if there's a change
847 BundleAddedOrRemoved (); /* EMIT SIGNAL */
851 Session::auto_connect_master_bus ()
853 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
857 /* if requested auto-connect the outputs to the first N physical ports.
860 uint32_t limit = _master_out->n_outputs().n_total();
861 vector<string> outputs[DataType::num_types];
863 for (uint32_t i = 0; i < DataType::num_types; ++i) {
864 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
867 for (uint32_t n = 0; n < limit; ++n) {
868 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
870 if (outputs[p->type()].size() > n) {
871 connect_to = outputs[p->type()][n];
874 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
875 if (_master_out->output()->connect (p, connect_to, this)) {
876 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
885 Session::remove_monitor_section ()
887 if (!_monitor_out || Profile->get_trx()) {
891 /* force reversion to Solo-In-Place */
892 Config->set_solo_control_is_listen_control (false);
894 /* if we are auditioning, cancel it ... this is a workaround
895 to a problem (auditioning does not execute the process graph,
896 which is needed to remove routes when using >1 core for processing)
901 /* Hold process lock while doing this so that we don't hear bits and
902 * pieces of audio as we work on each route.
905 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
907 /* Connect tracks to monitor section. Note that in an
908 existing session, the internal sends will already exist, but we want the
909 routes to notice that they connect to the control out specifically.
913 boost::shared_ptr<RouteList> r = routes.reader ();
914 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
916 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
918 if ((*x)->is_monitor()) {
920 } else if ((*x)->is_master()) {
923 (*x)->remove_aux_or_listen (_monitor_out);
928 remove_route (_monitor_out);
929 auto_connect_master_bus ();
932 auditioner->connect ();
937 Session::add_monitor_section ()
941 if (_monitor_out || !_master_out || Profile->get_trx()) {
945 boost::shared_ptr<Route> r (new Route (*this, _("Monitor"), Route::MonitorOut, DataType::AUDIO));
951 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
952 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
955 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
956 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
957 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
961 add_routes (rl, false, false, false);
963 assert (_monitor_out);
965 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
966 are undefined, at best.
969 uint32_t limit = _monitor_out->n_inputs().n_audio();
973 /* connect the inputs to the master bus outputs. this
974 * represents a separate data feed from the internal sends from
975 * each route. as of jan 2011, it allows the monitor section to
976 * conditionally ignore either the internal sends or the normal
977 * input feed, but we should really find a better way to do
981 _master_out->output()->disconnect (this);
983 for (uint32_t n = 0; n < limit; ++n) {
984 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
985 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
988 string connect_to = o->name();
989 if (_monitor_out->input()->connect (p, connect_to, this)) {
990 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
998 /* if monitor section is not connected, connect it to physical outs
1001 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
1003 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1005 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1008 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1010 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1011 Config->get_monitor_bus_preferred_bundle())
1017 /* Monitor bus is audio only */
1019 vector<string> outputs[DataType::num_types];
1021 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1022 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1025 uint32_t mod = outputs[DataType::AUDIO].size();
1026 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1030 for (uint32_t n = 0; n < limit; ++n) {
1032 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1034 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1035 connect_to = outputs[DataType::AUDIO][n % mod];
1038 if (!connect_to.empty()) {
1039 if (_monitor_out->output()->connect (p, connect_to, this)) {
1040 error << string_compose (
1041 _("cannot connect control output %1 to %2"),
1052 /* Hold process lock while doing this so that we don't hear bits and
1053 * pieces of audio as we work on each route.
1056 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1058 /* Connect tracks to monitor section. Note that in an
1059 existing session, the internal sends will already exist, but we want the
1060 routes to notice that they connect to the control out specifically.
1064 boost::shared_ptr<RouteList> rls = routes.reader ();
1066 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1068 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1070 if ((*x)->is_monitor()) {
1072 } else if ((*x)->is_master()) {
1075 (*x)->enable_monitor_send ();
1080 auditioner->connect ();
1085 Session::reset_monitor_section ()
1087 /* Process lock should be held by the caller.*/
1089 if (!_monitor_out || Profile->get_trx()) {
1093 uint32_t limit = _master_out->n_outputs().n_audio();
1095 /* connect the inputs to the master bus outputs. this
1096 * represents a separate data feed from the internal sends from
1097 * each route. as of jan 2011, it allows the monitor section to
1098 * conditionally ignore either the internal sends or the normal
1099 * input feed, but we should really find a better way to do
1103 _master_out->output()->disconnect (this);
1104 _monitor_out->output()->disconnect (this);
1106 _monitor_out->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1107 _monitor_out->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1109 for (uint32_t n = 0; n < limit; ++n) {
1110 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1111 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1114 string connect_to = o->name();
1115 if (_monitor_out->input()->connect (p, connect_to, this)) {
1116 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1123 /* connect monitor section to physical outs
1126 if (Config->get_auto_connect_standard_busses()) {
1128 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1130 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1133 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1135 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1136 Config->get_monitor_bus_preferred_bundle())
1142 /* Monitor bus is audio only */
1144 vector<string> outputs[DataType::num_types];
1146 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1147 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1150 uint32_t mod = outputs[DataType::AUDIO].size();
1151 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1155 for (uint32_t n = 0; n < limit; ++n) {
1157 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1159 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1160 connect_to = outputs[DataType::AUDIO][n % mod];
1163 if (!connect_to.empty()) {
1164 if (_monitor_out->output()->connect (p, connect_to, this)) {
1165 error << string_compose (
1166 _("cannot connect control output %1 to %2"),
1177 /* Connect tracks to monitor section. Note that in an
1178 existing session, the internal sends will already exist, but we want the
1179 routes to notice that they connect to the control out specifically.
1183 boost::shared_ptr<RouteList> rls = routes.reader ();
1185 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1187 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1189 if ((*x)->is_monitor()) {
1191 } else if ((*x)->is_master()) {
1194 (*x)->enable_monitor_send ();
1200 Session::hookup_io ()
1202 /* stop graph reordering notifications from
1203 causing resorts, etc.
1206 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
1210 /* we delay creating the auditioner till now because
1211 it makes its own connections to ports.
1215 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
1217 throw failed_constructor ();
1219 a->use_new_diskstream ();
1223 catch (failed_constructor& err) {
1224 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
1228 /* load bundles, which we may have postponed earlier on */
1229 if (_bundle_xml_node) {
1230 load_bundles (*_bundle_xml_node);
1231 delete _bundle_xml_node;
1234 /* Tell all IO objects to connect themselves together */
1236 IO::enable_connecting ();
1238 /* Now tell all "floating" ports to connect to whatever
1239 they should be connected to.
1242 AudioEngine::instance()->reconnect_ports ();
1244 /* Anyone who cares about input state, wake up and do something */
1246 IOConnectionsComplete (); /* EMIT SIGNAL */
1248 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
1250 /* now handle the whole enchilada as if it was one
1251 graph reorder event.
1256 /* update the full solo state, which can't be
1257 correctly determined on a per-route basis, but
1258 needs the global overview that only the session
1262 update_route_solo_state ();
1266 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
1268 boost::shared_ptr<Track> track = wp.lock ();
1273 boost::shared_ptr<Playlist> playlist;
1275 if ((playlist = track->playlist()) != 0) {
1276 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
1277 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
1278 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
1283 Session::record_enabling_legal () const
1285 /* this used to be in here, but survey says.... we don't need to restrict it */
1286 // if (record_status() == Recording) {
1290 if (Config->get_all_safe()) {
1297 Session::set_track_monitor_input_status (bool yn)
1299 boost::shared_ptr<RouteList> rl = routes.reader ();
1300 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1301 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1302 if (tr && tr->record_enabled ()) {
1303 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1304 tr->request_input_monitoring (yn);
1310 Session::auto_punch_start_changed (Location* location)
1312 replace_event (SessionEvent::PunchIn, location->start());
1314 if (get_record_enabled() && config.get_punch_in()) {
1315 /* capture start has been changed, so save new pending state */
1316 save_state ("", true);
1321 Session::auto_punch_end_changed (Location* location)
1323 framepos_t when_to_stop = location->end();
1324 // when_to_stop += _worst_output_latency + _worst_input_latency;
1325 replace_event (SessionEvent::PunchOut, when_to_stop);
1329 Session::auto_punch_changed (Location* location)
1331 framepos_t when_to_stop = location->end();
1333 replace_event (SessionEvent::PunchIn, location->start());
1334 //when_to_stop += _worst_output_latency + _worst_input_latency;
1335 replace_event (SessionEvent::PunchOut, when_to_stop);
1338 /** @param loc A loop location.
1339 * @param pos Filled in with the start time of the required fade-out (in session frames).
1340 * @param length Filled in with the length of the required fade-out.
1343 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
1345 pos = max (loc->start(), loc->end() - 64);
1346 length = loc->end() - pos;
1350 Session::auto_loop_changed (Location* location)
1352 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1355 auto_loop_declick_range (location, dcp, dcl);
1357 if (transport_rolling() && play_loop) {
1359 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1361 // if (_transport_frame > location->end()) {
1363 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1364 // relocate to beginning of loop
1365 clear_events (SessionEvent::LocateRoll);
1367 request_locate (location->start(), true);
1370 else if (Config->get_seamless_loop() && !loop_changing) {
1372 // schedule a locate-roll to refill the diskstreams at the
1373 // previous loop end
1374 loop_changing = true;
1376 if (location->end() > last_loopend) {
1377 clear_events (SessionEvent::LocateRoll);
1378 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1384 clear_events (SessionEvent::AutoLoopDeclick);
1385 clear_events (SessionEvent::AutoLoop);
1388 last_loopend = location->end();
1393 Session::set_auto_punch_location (Location* location)
1397 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1398 punch_connections.drop_connections();
1399 existing->set_auto_punch (false, this);
1400 remove_event (existing->start(), SessionEvent::PunchIn);
1401 clear_events (SessionEvent::PunchOut);
1402 auto_punch_location_changed (0);
1407 if (location == 0) {
1411 if (location->end() <= location->start()) {
1412 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1416 punch_connections.drop_connections ();
1418 location->StartChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, location));
1419 location->EndChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, location));
1420 location->Changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, location));
1422 location->set_auto_punch (true, this);
1424 auto_punch_changed (location);
1426 auto_punch_location_changed (location);
1430 Session::set_session_extents (framepos_t start, framepos_t end)
1433 if ((existing = _locations->session_range_location()) == 0) {
1434 //if there is no existing session, we need to make a new session location (should never happen)
1435 existing = new Location (*this, 0, 0, _("session"), Location::IsSessionRange);
1439 error << _("Session: you can't use that location for session start/end)") << endmsg;
1443 existing->set( start, end );
1449 Session::set_auto_loop_location (Location* location)
1453 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1454 loop_connections.drop_connections ();
1455 existing->set_auto_loop (false, this);
1456 remove_event (existing->end(), SessionEvent::AutoLoop);
1459 auto_loop_declick_range (existing, dcp, dcl);
1460 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1461 auto_loop_location_changed (0);
1466 if (location == 0) {
1470 if (location->end() <= location->start()) {
1471 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1475 last_loopend = location->end();
1477 loop_connections.drop_connections ();
1479 location->StartChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1480 location->EndChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1481 location->Changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1483 location->set_auto_loop (true, this);
1485 /* take care of our stuff first */
1487 auto_loop_changed (location);
1489 /* now tell everyone else */
1491 auto_loop_location_changed (location);
1495 Session::update_loop (Location*)
1501 Session::update_marks (Location*)
1507 Session::update_skips (Location* loc, bool consolidate)
1509 if (_ignore_skips_updates) {
1513 Locations::LocationList skips;
1516 PBD::Unwinder<bool> uw (_ignore_skips_updates, true);
1517 consolidate_skips (loc);
1520 sync_locations_to_skips ();
1526 Session::consolidate_skips (Location* loc)
1528 Locations::LocationList all_locations = _locations->list ();
1530 for (Locations::LocationList::iterator l = all_locations.begin(); l != all_locations.end(); ) {
1532 if (!(*l)->is_skip ()) {
1537 /* don't test against self */
1544 switch (Evoral::coverage ((*l)->start(), (*l)->end(), loc->start(), loc->end())) {
1545 case Evoral::OverlapInternal:
1546 case Evoral::OverlapExternal:
1547 case Evoral::OverlapStart:
1548 case Evoral::OverlapEnd:
1549 /* adjust new location to cover existing one */
1550 loc->set_start (min (loc->start(), (*l)->start()));
1551 loc->set_end (max (loc->end(), (*l)->end()));
1552 /* we don't need this one any more */
1553 _locations->remove (*l);
1554 /* the location has been deleted, so remove reference to it in our local list */
1555 l = all_locations.erase (l);
1558 case Evoral::OverlapNone:
1566 Session::sync_locations_to_skips ()
1568 /* This happens asynchronously (in the audioengine thread). After the clear is done, we will call
1569 * Session::_sync_locations_to_skips() from the audioengine thread.
1571 clear_events (SessionEvent::Skip, boost::bind (&Session::_sync_locations_to_skips, this));
1575 Session::_sync_locations_to_skips ()
1577 /* called as a callback after existing Skip events have been cleared from a realtime audioengine thread */
1579 Locations::LocationList const & locs (_locations->list());
1581 for (Locations::LocationList::const_iterator i = locs.begin(); i != locs.end(); ++i) {
1583 Location* location = *i;
1585 if (location->is_skip() && location->is_skipping()) {
1586 SessionEvent* ev = new SessionEvent (SessionEvent::Skip, SessionEvent::Add, location->start(), location->end(), 1.0);
1594 Session::location_added (Location *location)
1596 if (location->is_auto_punch()) {
1597 set_auto_punch_location (location);
1600 if (location->is_auto_loop()) {
1601 set_auto_loop_location (location);
1604 if (location->is_session_range()) {
1605 /* no need for any signal handling or event setting with the session range,
1606 because we keep a direct reference to it and use its start/end directly.
1608 _session_range_location = location;
1611 if (location->is_mark()) {
1612 /* listen for per-location signals that require us to do any * global updates for marks */
1614 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1615 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1616 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1617 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1620 if (location->is_skip()) {
1621 /* listen for per-location signals that require us to update skip-locate events */
1623 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1624 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1625 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1626 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, false));
1628 update_skips (location, true);
1635 Session::location_removed (Location *location)
1637 if (location->is_auto_loop()) {
1638 set_auto_loop_location (0);
1639 set_track_loop (false);
1642 if (location->is_auto_punch()) {
1643 set_auto_punch_location (0);
1646 if (location->is_session_range()) {
1647 /* this is never supposed to happen */
1648 error << _("programming error: session range removed!") << endl;
1651 if (location->is_skip()) {
1653 update_skips (location, false);
1660 Session::locations_changed ()
1662 _locations->apply (*this, &Session::_locations_changed);
1666 Session::_locations_changed (const Locations::LocationList& locations)
1668 /* There was some mass-change in the Locations object.
1670 We might be re-adding a location here but it doesn't actually matter
1671 for all the locations that the Session takes an interest in.
1674 for (Locations::LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
1675 location_added (*i);
1680 Session::enable_record ()
1682 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1683 /* no recording at anything except normal speed */
1688 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1690 if (rs == Recording) {
1694 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1696 _last_record_location = _transport_frame;
1697 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1699 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1700 set_track_monitor_input_status (true);
1703 RecordStateChanged ();
1710 Session::disable_record (bool rt_context, bool force)
1714 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1716 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1717 g_atomic_int_set (&_record_status, Disabled);
1718 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1720 if (rs == Recording) {
1721 g_atomic_int_set (&_record_status, Enabled);
1725 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1726 set_track_monitor_input_status (false);
1729 RecordStateChanged (); /* emit signal */
1732 remove_pending_capture_state ();
1738 Session::step_back_from_record ()
1740 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1742 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1743 set_track_monitor_input_status (false);
1746 RecordStateChanged (); /* emit signal */
1751 Session::maybe_enable_record ()
1753 if (_step_editors > 0) {
1757 g_atomic_int_set (&_record_status, Enabled);
1759 /* This function is currently called from somewhere other than an RT thread.
1760 This save_state() call therefore doesn't impact anything. Doing it here
1761 means that we save pending state of which sources the next record will use,
1762 which gives us some chance of recovering from a crash during the record.
1765 save_state ("", true);
1767 if (_transport_speed) {
1768 if (!config.get_punch_in()) {
1772 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1773 RecordStateChanged (); /* EMIT SIGNAL */
1780 Session::audible_frame () const
1786 offset = worst_playback_latency ();
1788 if (synced_to_engine()) {
1789 /* Note: this is basically just sync-to-JACK */
1790 tf = _engine.transport_frame();
1792 tf = _transport_frame;
1797 if (!non_realtime_work_pending()) {
1801 /* Check to see if we have passed the first guaranteed
1802 audible frame past our last start position. if not,
1803 return that last start point because in terms
1804 of audible frames, we have not moved yet.
1806 `Start position' in this context means the time we last
1807 either started, located, or changed transport direction.
1810 if (_transport_speed > 0.0f) {
1812 if (!play_loop || !have_looped) {
1813 if (tf < _last_roll_or_reversal_location + offset) {
1814 return _last_roll_or_reversal_location;
1822 } else if (_transport_speed < 0.0f) {
1824 /* XXX wot? no backward looping? */
1826 if (tf > _last_roll_or_reversal_location - offset) {
1827 return _last_roll_or_reversal_location;
1839 Session::set_frame_rate (framecnt_t frames_per_second)
1841 /** \fn void Session::set_frame_size(framecnt_t)
1842 the AudioEngine object that calls this guarantees
1843 that it will not be called while we are also in
1844 ::process(). Its fine to do things that block
1848 _base_frame_rate = frames_per_second;
1849 _nominal_frame_rate = frames_per_second;
1855 // XXX we need some equivalent to this, somehow
1856 // SndFileSource::setup_standard_crossfades (frames_per_second);
1860 /* XXX need to reset/reinstantiate all LADSPA plugins */
1864 Session::set_block_size (pframes_t nframes)
1866 /* the AudioEngine guarantees
1867 that it will not be called while we are also in
1868 ::process(). It is therefore fine to do things that block
1873 current_block_size = nframes;
1877 boost::shared_ptr<RouteList> r = routes.reader ();
1879 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1880 (*i)->set_block_size (nframes);
1883 boost::shared_ptr<RouteList> rl = routes.reader ();
1884 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1885 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1887 tr->set_block_size (nframes);
1891 set_worst_io_latencies ();
1897 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1899 boost::shared_ptr<Route> r2;
1901 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1902 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1906 /* make a copy of the existing list of routes that feed r1 */
1908 Route::FedBy existing (r1->fed_by());
1910 /* for each route that feeds r1, recurse, marking it as feeding
1914 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1915 if (!(r2 = i->r.lock ())) {
1916 /* (*i) went away, ignore it */
1920 /* r2 is a route that feeds r1 which somehow feeds base. mark
1921 base as being fed by r2
1924 rbase->add_fed_by (r2, i->sends_only);
1928 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1932 if (r1->feeds (r2) && r2->feeds (r1)) {
1936 /* now recurse, so that we can mark base as being fed by
1937 all routes that feed r2
1940 trace_terminal (r2, rbase);
1947 Session::resort_routes ()
1949 /* don't do anything here with signals emitted
1950 by Routes during initial setup or while we
1951 are being destroyed.
1954 if (_state_of_the_state & (InitialConnecting | Deletion)) {
1959 RCUWriter<RouteList> writer (routes);
1960 boost::shared_ptr<RouteList> r = writer.get_copy ();
1961 resort_routes_using (r);
1962 /* writer goes out of scope and forces update */
1966 boost::shared_ptr<RouteList> rl = routes.reader ();
1967 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1968 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1970 const Route::FedBy& fb ((*i)->fed_by());
1972 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1973 boost::shared_ptr<Route> sf = f->r.lock();
1975 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1983 /** This is called whenever we need to rebuild the graph of how we will process
1985 * @param r List of routes, in any order.
1989 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1991 /* We are going to build a directed graph of our routes;
1992 this is where the edges of that graph are put.
1997 /* Go through all routes doing two things:
1999 * 1. Collect the edges of the route graph. Each of these edges
2000 * is a pair of routes, one of which directly feeds the other
2001 * either by a JACK connection or by an internal send.
2003 * 2. Begin the process of making routes aware of which other
2004 * routes directly or indirectly feed them. This information
2005 * is used by the solo code.
2008 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2010 /* Clear out the route's list of direct or indirect feeds */
2011 (*i)->clear_fed_by ();
2013 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
2015 bool via_sends_only;
2017 /* See if this *j feeds *i according to the current state of the JACK
2018 connections and internal sends.
2020 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
2021 /* add the edge to the graph (part #1) */
2022 edges.add (*j, *i, via_sends_only);
2023 /* tell the route (for part #2) */
2024 (*i)->add_fed_by (*j, via_sends_only);
2029 /* Attempt a topological sort of the route graph */
2030 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
2032 if (sorted_routes) {
2033 /* We got a satisfactory topological sort, so there is no feedback;
2036 Note: the process graph rechain does not require a
2037 topologically-sorted list, but hey ho.
2039 if (_process_graph) {
2040 _process_graph->rechain (sorted_routes, edges);
2043 _current_route_graph = edges;
2045 /* Complete the building of the routes' lists of what directly
2046 or indirectly feeds them.
2048 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2049 trace_terminal (*i, *i);
2052 *r = *sorted_routes;
2055 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
2056 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2057 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
2058 (*i)->name(), (*i)->order_key ()));
2062 SuccessfulGraphSort (); /* EMIT SIGNAL */
2065 /* The topological sort failed, so we have a problem. Tell everyone
2066 and stick to the old graph; this will continue to be processed, so
2067 until the feedback is fixed, what is played back will not quite
2068 reflect what is actually connected. Note also that we do not
2069 do trace_terminal here, as it would fail due to an endless recursion,
2070 so the solo code will think that everything is still connected
2074 FeedbackDetected (); /* EMIT SIGNAL */
2079 /** Find a route name starting with \a base, maybe followed by the
2080 * lowest \a id. \a id will always be added if \a definitely_add_number
2081 * is true on entry; otherwise it will only be added if required
2082 * to make the name unique.
2084 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
2085 * The available route name with the lowest ID will be used, and \a id
2086 * will be set to the ID.
2088 * \return false if a route name could not be found, and \a track_name
2089 * and \a id do not reflect a free route name.
2092 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
2094 if (!definitely_add_number && route_by_name (base) == 0) {
2095 /* juse use the base */
2096 snprintf (name, name_len, "%s", base.c_str());
2101 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
2103 if (route_by_name (name) == 0) {
2109 } while (id < (UINT_MAX-1));
2114 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
2116 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
2118 in = ChanCount::ZERO;
2119 out = ChanCount::ZERO;
2121 boost::shared_ptr<RouteList> r = routes.reader ();
2123 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2124 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2125 if (tr && !tr->is_auditioner()) {
2126 in += tr->n_inputs();
2127 out += tr->n_outputs();
2132 /** Caller must not hold process lock
2133 * @param name_template string to use for the start of the name, or "" to use "MIDI".
2134 * @param instrument plugin info for the instrument to insert pre-fader, if any
2136 list<boost::shared_ptr<MidiTrack> >
2137 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
2138 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
2140 char track_name[32];
2141 uint32_t track_id = 0;
2143 RouteList new_routes;
2144 list<boost::shared_ptr<MidiTrack> > ret;
2146 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
2149 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
2150 error << "cannot find name for new midi track" << endmsg;
2154 boost::shared_ptr<MidiTrack> track;
2157 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
2159 if (track->init ()) {
2163 track->use_new_diskstream();
2165 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2166 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2169 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2170 if (track->input()->ensure_io (input, false, this)) {
2171 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
2175 if (track->output()->ensure_io (output, false, this)) {
2176 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
2181 track->non_realtime_input_change();
2184 route_group->add (track);
2187 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2189 if (Config->get_remote_model() == UserOrdered) {
2190 track->set_remote_control_id (next_control_id());
2193 new_routes.push_back (track);
2194 ret.push_back (track);
2196 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2199 catch (failed_constructor &err) {
2200 error << _("Session: could not create new midi track.") << endmsg;
2204 catch (AudioEngine::PortRegistrationFailure& pfe) {
2206 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;
2214 if (!new_routes.empty()) {
2215 StateProtector sp (this);
2216 if (Profile->get_trx()) {
2217 add_routes (new_routes, false, false, false);
2219 add_routes (new_routes, true, true, false);
2223 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
2224 PluginPtr plugin = instrument->load (*this);
2225 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2226 (*r)->add_processor (p, PreFader);
2236 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2238 boost::shared_ptr<Route> midi_track (wmt.lock());
2244 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2246 if (change.after.n_audio() <= change.before.n_audio()) {
2250 /* new audio ports: make sure the audio goes somewhere useful,
2251 unless the user has no-auto-connect selected.
2253 The existing ChanCounts don't matter for this call as they are only
2254 to do with matching input and output indices, and we are only changing
2260 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
2264 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
2265 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
2266 * @param output_start As \a input_start, but for outputs.
2269 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
2270 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
2272 if (!IO::connecting_legal) {
2276 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2282 /* If both inputs and outputs are auto-connected to physical ports,
2283 use the max of input and output offsets to ensure auto-connected
2284 port numbers always match up (e.g. the first audio input and the
2285 first audio output of the route will have the same physical
2286 port number). Otherwise just use the lowest input or output
2290 DEBUG_TRACE (DEBUG::Graph,
2291 string_compose("Auto-connect: existing in = %1 out = %2\n",
2292 existing_inputs, existing_outputs));
2294 const bool in_out_physical =
2295 (Config->get_input_auto_connect() & AutoConnectPhysical)
2296 && (Config->get_output_auto_connect() & AutoConnectPhysical)
2299 const ChanCount in_offset = in_out_physical
2300 ? ChanCount::max(existing_inputs, existing_outputs)
2303 const ChanCount out_offset = in_out_physical
2304 ? ChanCount::max(existing_inputs, existing_outputs)
2307 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2308 vector<string> physinputs;
2309 vector<string> physoutputs;
2311 _engine.get_physical_outputs (*t, physoutputs);
2312 _engine.get_physical_inputs (*t, physinputs);
2314 if (!physinputs.empty() && connect_inputs) {
2315 uint32_t nphysical_in = physinputs.size();
2317 DEBUG_TRACE (DEBUG::Graph,
2318 string_compose("There are %1 physical inputs of type %2\n",
2321 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
2324 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
2325 DEBUG_TRACE (DEBUG::Graph,
2326 string_compose("Get index %1 + %2 % %3 = %4\n",
2327 in_offset.get(*t), i, nphysical_in,
2328 (in_offset.get(*t) + i) % nphysical_in));
2329 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
2332 DEBUG_TRACE (DEBUG::Graph,
2333 string_compose("Connect route %1 IN to %2\n",
2334 route->name(), port));
2336 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
2340 ChanCount one_added (*t, 1);
2341 existing_inputs += one_added;
2345 if (!physoutputs.empty()) {
2346 uint32_t nphysical_out = physoutputs.size();
2347 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
2351 * do not create new connections if we reached the limit of physical outputs
2355 if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
2356 ARDOUR::Profile->get_trx () &&
2357 existing_outputs.get(*t) == nphysical_out ) {
2361 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
2362 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
2363 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
2364 /* master bus is audio only */
2365 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
2366 port = _master_out->input()->ports().port(*t,
2367 i % _master_out->input()->n_ports().get(*t))->name();
2371 DEBUG_TRACE (DEBUG::Graph,
2372 string_compose("Connect route %1 OUT to %2\n",
2373 route->name(), port));
2375 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
2379 ChanCount one_added (*t, 1);
2380 existing_outputs += one_added;
2386 #ifdef USE_TRACKS_CODE_FEATURES
2389 compare_routes_by_remote_id (const boost::shared_ptr<Route>& route1, const boost::shared_ptr<Route>& route2)
2391 return route1->remote_control_id() < route2->remote_control_id();
2395 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2397 // it is not allowed to perform connection
2398 if (!IO::connecting_legal) {
2402 // if we are deleting routes we will call this once at the end
2403 if (_route_deletion_in_progress) {
2407 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2413 // We need to disconnect the route's inputs and outputs first
2414 // basing on autoconnect configuration
2415 bool reconnectIputs = !(Config->get_input_auto_connect() & ManualConnect) && reconnect_inputs;
2416 bool reconnectOutputs = !(Config->get_output_auto_connect() & ManualConnect) && reconnect_outputs;
2418 ChanCount existing_inputs;
2419 ChanCount existing_outputs;
2420 count_existing_track_channels (existing_inputs, existing_outputs);
2422 //ChanCount inputs = ChanCount::ZERO;
2423 //ChanCount outputs = ChanCount::ZERO;
2425 RouteList existing_routes = *routes.reader ();
2426 existing_routes.sort (compare_routes_by_remote_id);
2429 PBD::Unwinder<bool> protect_ignore_changes (_reconnecting_routes_in_progress, true);
2431 vector<string> physinputs;
2432 vector<string> physoutputs;
2434 EngineStateController::instance()->get_physical_audio_outputs(physoutputs);
2435 EngineStateController::instance()->get_physical_audio_inputs(physinputs);
2437 uint32_t input_n = 0;
2438 uint32_t output_n = 0;
2439 RouteList::iterator rIter = existing_routes.begin();
2440 const AutoConnectOption current_input_auto_connection (Config->get_input_auto_connect());
2441 const AutoConnectOption current_output_auto_connection (Config->get_output_auto_connect());
2442 for (; rIter != existing_routes.end(); ++rIter) {
2443 if (*rIter == _master_out || *rIter == _monitor_out ) {
2447 if (current_output_auto_connection == AutoConnectPhysical) {
2448 (*rIter)->amp()->deactivate();
2449 } else if (current_output_auto_connection == AutoConnectMaster) {
2450 (*rIter)->amp()->activate();
2453 if (reconnectIputs) {
2454 (*rIter)->input()->disconnect (this); //GZ: check this; could be heavy
2456 for (uint32_t route_input_n = 0; route_input_n < (*rIter)->n_inputs().get(DataType::AUDIO); ++route_input_n) {
2458 if (current_input_auto_connection & AutoConnectPhysical) {
2460 if ( input_n == physinputs.size() ) {
2464 string port = physinputs[input_n];
2466 if (port.empty() ) {
2467 error << "Physical Input number "<< input_n << " is unavailable and cannot be connected" << endmsg;
2470 //GZ: check this; could be heavy
2471 (*rIter)->input()->connect ((*rIter)->input()->ports().port(DataType::AUDIO, route_input_n), port, this);
2477 if (reconnectOutputs) {
2479 //normalize route ouptuts: reduce the amount outputs to be equal to the amount of inputs
2480 if (current_output_auto_connection & AutoConnectPhysical) {
2482 //GZ: check this; could be heavy
2483 (*rIter)->output()->disconnect (this);
2484 size_t route_inputs_count = (*rIter)->n_inputs().get(DataType::AUDIO);
2486 //GZ: check this; could be heavy
2487 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, route_inputs_count), false, this );
2489 } else if (current_output_auto_connection & AutoConnectMaster){
2491 if (!reconnect_master) {
2495 //GZ: check this; could be heavy
2496 (*rIter)->output()->disconnect (this);
2499 uint32_t master_inputs_count = _master_out->n_inputs().get(DataType::AUDIO);
2500 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, master_inputs_count), false, this );
2502 error << error << "Master bus is not available" << endmsg;
2507 for (uint32_t route_output_n = 0; route_output_n < (*rIter)->n_outputs().get(DataType::AUDIO); ++route_output_n) {
2508 if (current_output_auto_connection & AutoConnectPhysical) {
2510 if ( output_n == physoutputs.size() ) {
2514 string port = physoutputs[output_n];
2516 if (port.empty() ) {
2517 error << "Physical Output number "<< output_n << " is unavailable and cannot be connected" << endmsg;
2520 //GZ: check this; could be heavy
2521 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2524 } else if (current_output_auto_connection & AutoConnectMaster) {
2526 if ( route_output_n == _master_out->n_inputs().get(DataType::AUDIO) ) {
2530 // connect to master bus
2531 string port = _master_out->input()->ports().port(DataType::AUDIO, route_output_n)->name();
2533 if (port.empty() ) {
2534 error << "MasterBus Input number "<< route_output_n << " is unavailable and cannot be connected" << endmsg;
2538 //GZ: check this; could be heavy
2539 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2545 //auto_connect_route (*rIter, inputs, outputs, false, reconnectIputs);
2548 _master_out->output()->disconnect (this);
2549 auto_connect_master_bus ();
2554 session_routes_reconnected (); /* EMIT SIGNAL */
2558 Session::reconnect_midi_scene_ports(bool inputs)
2561 scene_in()->disconnect_all ();
2563 std::vector<EngineStateController::MidiPortState> midi_port_states;
2564 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2566 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2568 for (; state_iter != midi_port_states.end(); ++state_iter) {
2569 if (state_iter->active && state_iter->available && state_iter->connected) {
2570 scene_in()->connect (state_iter->name);
2575 scene_out()->disconnect_all ();
2577 std::vector<EngineStateController::MidiPortState> midi_port_states;
2578 EngineStateController::instance()->get_physical_midi_output_states (midi_port_states);
2580 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2582 for (; state_iter != midi_port_states.end(); ++state_iter) {
2583 if (state_iter->active && state_iter->available && state_iter->connected) {
2584 scene_out()->connect (state_iter->name);
2593 /** Caller must not hold process lock
2594 * @param name_template string to use for the start of the name, or "" to use "Audio".
2596 list< boost::shared_ptr<AudioTrack> >
2597 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
2598 uint32_t how_many, string name_template)
2600 char track_name[32];
2601 uint32_t track_id = 0;
2603 RouteList new_routes;
2604 list<boost::shared_ptr<AudioTrack> > ret;
2606 string name_pattern;
2608 if (Profile->get_trx() ) {
2609 name_pattern = "Track ";
2611 name_pattern = "Audio ";
2614 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _(name_pattern.c_str() );
2618 if (!find_route_name (name_template.empty() ? _(name_pattern.c_str()) : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
2619 error << "cannot find name for new audio track" << endmsg;
2623 boost::shared_ptr<AudioTrack> track;
2626 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
2628 if (track->init ()) {
2632 track->use_new_diskstream();
2634 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2635 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2638 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2640 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2641 error << string_compose (
2642 _("cannot configure %1 in/%2 out configuration for new audio track"),
2643 input_channels, output_channels)
2648 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2649 error << string_compose (
2650 _("cannot configure %1 in/%2 out configuration for new audio track"),
2651 input_channels, output_channels)
2658 route_group->add (track);
2661 track->non_realtime_input_change();
2663 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2664 if (Config->get_remote_model() == UserOrdered) {
2665 track->set_remote_control_id (next_control_id());
2668 new_routes.push_back (track);
2669 ret.push_back (track);
2671 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2674 catch (failed_constructor &err) {
2675 error << _("Session: could not create new audio track.") << endmsg;
2679 catch (AudioEngine::PortRegistrationFailure& pfe) {
2681 error << pfe.what() << endmsg;
2689 if (!new_routes.empty()) {
2690 StateProtector sp (this);
2691 if (Profile->get_trx()) {
2692 add_routes (new_routes, false, false, false);
2694 add_routes (new_routes, true, true, false);
2701 /** Caller must not hold process lock.
2702 * @param name_template string to use for the start of the name, or "" to use "Bus".
2705 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
2708 uint32_t bus_id = 0;
2712 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
2715 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
2716 error << "cannot find name for new audio bus" << endmsg;
2721 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
2727 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2728 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
2731 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2733 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2734 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2735 input_channels, output_channels)
2741 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2742 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2743 input_channels, output_channels)
2750 route_group->add (bus);
2752 if (Config->get_remote_model() == UserOrdered) {
2753 bus->set_remote_control_id (next_control_id());
2756 bus->add_internal_return ();
2758 ret.push_back (bus);
2760 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2766 catch (failed_constructor &err) {
2767 error << _("Session: could not create new audio route.") << endmsg;
2771 catch (AudioEngine::PortRegistrationFailure& pfe) {
2772 error << pfe.what() << endmsg;
2782 StateProtector sp (this);
2783 if (Profile->get_trx()) {
2784 add_routes (ret, false, false, false);
2786 add_routes (ret, false, true, true); // autoconnect // outputs only
2795 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base)
2798 uint32_t control_id;
2800 uint32_t number = 0;
2801 const uint32_t being_added = how_many;
2803 if (!tree.read (template_path.c_str())) {
2807 XMLNode* node = tree.root();
2809 IO::disable_connecting ();
2811 control_id = next_control_id ();
2815 XMLNode node_copy (*node);
2817 /* Remove IDs of everything so that new ones are used */
2818 node_copy.remove_property_recursively (X_("id"));
2823 if (!name_base.empty()) {
2825 /* if we're adding more than one routes, force
2826 * all the names of the new routes to be
2827 * numbered, via the final parameter.
2830 if (!find_route_name (name_base.c_str(), ++number, name, sizeof(name), (being_added > 1))) {
2831 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2837 string const route_name = node_copy.property(X_("name"))->value ();
2839 /* generate a new name by adding a number to the end of the template name */
2840 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2841 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2842 abort(); /*NOTREACHED*/
2846 /* set this name in the XML description that we are about to use */
2847 Route::set_name_in_state (node_copy, name);
2849 /* trim bitslots from listen sends so that new ones are used */
2850 XMLNodeList children = node_copy.children ();
2851 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2852 if ((*i)->name() == X_("Processor")) {
2853 XMLProperty* role = (*i)->property (X_("role"));
2854 if (role && role->value() == X_("Listen")) {
2855 (*i)->remove_property (X_("bitslot"));
2860 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2863 error << _("Session: cannot create track/bus from template description") << endmsg;
2867 if (boost::dynamic_pointer_cast<Track>(route)) {
2868 /* force input/output change signals so that the new diskstream
2869 picks up the configuration of the route. During session
2870 loading this normally happens in a different way.
2873 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2875 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2876 change.after = route->input()->n_ports();
2877 route->input()->changed (change, this);
2878 change.after = route->output()->n_ports();
2879 route->output()->changed (change, this);
2882 route->set_remote_control_id (control_id);
2885 ret.push_back (route);
2887 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2890 catch (failed_constructor &err) {
2891 error << _("Session: could not create new route from template") << endmsg;
2895 catch (AudioEngine::PortRegistrationFailure& pfe) {
2896 error << pfe.what() << endmsg;
2905 StateProtector sp (this);
2906 if (Profile->get_trx()) {
2907 add_routes (ret, false, false, false);
2909 add_routes (ret, true, true, false);
2911 IO::enable_connecting ();
2918 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
2921 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
2922 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
2925 error << _("Adding new tracks/busses failed") << endmsg;
2930 update_latency (true);
2931 update_latency (false);
2936 save_state (_current_snapshot_name);
2939 reassign_track_numbers();
2941 update_route_record_state ();
2943 RouteAdded (new_routes); /* EMIT SIGNAL */
2947 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
2949 ChanCount existing_inputs;
2950 ChanCount existing_outputs;
2951 uint32_t order = next_control_id();
2953 if (_order_hint > -1) {
2954 order = _order_hint;
2958 count_existing_track_channels (existing_inputs, existing_outputs);
2961 RCUWriter<RouteList> writer (routes);
2962 boost::shared_ptr<RouteList> r = writer.get_copy ();
2963 r->insert (r->end(), new_routes.begin(), new_routes.end());
2965 /* if there is no control out and we're not in the middle of loading,
2966 resort the graph here. if there is a control out, we will resort
2967 toward the end of this method. if we are in the middle of loading,
2968 we will resort when done.
2971 if (!_monitor_out && IO::connecting_legal) {
2972 resort_routes_using (r);
2976 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2978 boost::weak_ptr<Route> wpr (*x);
2979 boost::shared_ptr<Route> r (*x);
2981 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2982 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2983 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2984 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2985 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2986 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2988 if (r->is_master()) {
2992 if (r->is_monitor()) {
2996 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2998 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2999 track_playlist_changed (boost::weak_ptr<Track> (tr));
3000 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
3002 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
3004 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
3005 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
3010 if (input_auto_connect || output_auto_connect) {
3011 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
3014 /* order keys are a GUI responsibility but we need to set up
3015 reasonable defaults because they also affect the remote control
3016 ID in most situations.
3019 if (!r->has_order_key ()) {
3020 if (r->is_auditioner()) {
3021 /* use an arbitrarily high value */
3022 r->set_order_key (UINT_MAX);
3024 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
3025 r->set_order_key (order);
3033 if (_monitor_out && IO::connecting_legal) {
3034 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
3036 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3037 if ((*x)->is_monitor()) {
3039 } else if ((*x)->is_master()) {
3042 (*x)->enable_monitor_send ();
3049 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
3051 boost::shared_ptr<RouteList> r = routes.reader ();
3052 boost::shared_ptr<Send> s;
3054 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3055 if ((s = (*i)->internal_send_for (dest)) != 0) {
3056 s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO);
3062 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
3064 boost::shared_ptr<RouteList> r = routes.reader ();
3065 boost::shared_ptr<Send> s;
3067 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3068 if ((s = (*i)->internal_send_for (dest)) != 0) {
3069 s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY);
3075 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
3077 boost::shared_ptr<RouteList> r = routes.reader ();
3078 boost::shared_ptr<Send> s;
3080 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3081 if ((s = (*i)->internal_send_for (dest)) != 0) {
3082 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
3087 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
3089 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
3091 boost::shared_ptr<RouteList> r = routes.reader ();
3092 boost::shared_ptr<RouteList> t (new RouteList);
3094 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3095 /* no MIDI sends because there are no MIDI busses yet */
3096 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
3101 add_internal_sends (dest, p, t);
3105 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
3107 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
3108 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
3113 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
3115 add_internal_send (dest, sender->before_processor_for_index (index), sender);
3119 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
3121 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
3125 if (!dest->internal_return()) {
3126 dest->add_internal_return ();
3129 sender->add_aux_send (dest, before);
3136 Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
3138 { // RCU Writer scope
3139 RCUWriter<RouteList> writer (routes);
3140 boost::shared_ptr<RouteList> rs = writer.get_copy ();
3143 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3145 if (*iter == _master_out) {
3149 (*iter)->set_solo (false, this);
3153 /* deleting the master out seems like a dumb
3154 idea, but its more of a UI policy issue
3158 if (*iter == _master_out) {
3159 _master_out = boost::shared_ptr<Route> ();
3162 if (*iter == _monitor_out) {
3163 _monitor_out.reset ();
3166 update_route_solo_state ();
3168 // We need to disconnect the route's inputs and outputs
3170 (*iter)->input()->disconnect (0);
3171 (*iter)->output()->disconnect (0);
3173 /* if the route had internal sends sending to it, remove them */
3174 if ((*iter)->internal_return()) {
3176 boost::shared_ptr<RouteList> r = routes.reader ();
3177 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3178 boost::shared_ptr<Send> s = (*i)->internal_send_for (*iter);
3180 (*i)->remove_processor (s);
3185 /* if the monitoring section had a pointer to this route, remove it */
3186 if (_monitor_out && !(*iter)->is_master() && !(*iter)->is_monitor()) {
3187 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3188 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
3189 (*iter)->remove_aux_or_listen (_monitor_out);
3192 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*iter);
3193 if (mt && mt->step_editing()) {
3194 if (_step_editors > 0) {
3199 RouteAddedOrRemoved (false); /* EMIT SIGNAL */
3202 /* writer goes out of scope, forces route list update */
3204 } // end of RCU Writer scope
3206 update_latency_compensation ();
3209 /* Re-sort routes to remove the graph's current references to the one that is
3210 * going away, then flush old references out of the graph.
3211 * Wave Tracks: reconnect routes
3214 #ifdef USE_TRACKS_CODE_FEATURES
3215 reconnect_existing_routes(true, false);
3220 if (_process_graph) {
3221 _process_graph->clear_other_chain ();
3224 /* get rid of it from the dead wood collection in the route list manager */
3225 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
3229 /* try to cause everyone to drop their references
3230 * and unregister ports from the backend
3232 PBD::Unwinder<bool> uw_flag (_route_deletion_in_progress, true);
3234 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3235 (*iter)->drop_references ();
3238 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
3240 /* save the new state of the world */
3242 if (save_state (_current_snapshot_name)) {
3243 save_history (_current_snapshot_name);
3246 reassign_track_numbers();
3247 update_route_record_state ();
3251 Session::remove_route (boost::shared_ptr<Route> route)
3253 boost::shared_ptr<RouteList> rl (new RouteList);
3254 rl->push_back (route);
3259 Session::route_mute_changed (void* /*src*/)
3265 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3267 boost::shared_ptr<Route> route = wpr.lock();
3269 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
3273 if (route->listening_via_monitor ()) {
3275 if (Config->get_exclusive_solo()) {
3276 /* new listen: disable all other listen */
3277 boost::shared_ptr<RouteList> r = routes.reader ();
3278 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3279 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3282 (*i)->set_listen (false, this);
3288 } else if (_listen_cnt > 0) {
3293 update_route_solo_state ();
3296 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3298 boost::shared_ptr<Route> route = wpr.lock ();
3301 /* should not happen */
3302 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
3306 bool send_changed = false;
3308 if (route->solo_isolated()) {
3309 if (_solo_isolated_cnt == 0) {
3310 send_changed = true;
3312 _solo_isolated_cnt++;
3313 } else if (_solo_isolated_cnt > 0) {
3314 _solo_isolated_cnt--;
3315 if (_solo_isolated_cnt == 0) {
3316 send_changed = true;
3321 IsolatedChanged (); /* EMIT SIGNAL */
3326 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
3328 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
3330 if (!self_solo_change) {
3331 // session doesn't care about changes to soloed-by-others
3335 if (solo_update_disabled) {
3337 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
3341 boost::shared_ptr<Route> route = wpr.lock ();
3344 boost::shared_ptr<RouteList> r = routes.reader ();
3347 if (route->self_soloed()) {
3353 RouteGroup* rg = route->route_group ();
3354 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
3356 if (delta == 1 && Config->get_exclusive_solo()) {
3358 /* new solo: disable all other solos, but not the group if its solo-enabled */
3360 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3361 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3362 (leave_group_alone && ((*i)->route_group() == rg))) {
3365 (*i)->set_solo (false, this);
3369 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3371 solo_update_disabled = true;
3373 RouteList uninvolved;
3375 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
3377 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3378 bool via_sends_only;
3379 bool in_signal_flow;
3381 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3382 (leave_group_alone && ((*i)->route_group() == rg))) {
3386 in_signal_flow = false;
3388 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3390 if ((*i)->feeds (route, &via_sends_only)) {
3391 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3392 if (!via_sends_only) {
3393 if (!route->soloed_by_others_upstream()) {
3394 (*i)->mod_solo_by_others_downstream (delta);
3397 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3399 in_signal_flow = true;
3401 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3404 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3406 if (route->feeds (*i, &via_sends_only)) {
3407 /* propagate solo upstream only if routing other than
3408 sends is involved, but do consider the other route
3409 (*i) to be part of the signal flow even if only
3412 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3416 route->soloed_by_others_downstream(),
3417 route->soloed_by_others_upstream()));
3418 if (!via_sends_only) {
3419 if (!route->soloed_by_others_downstream()) {
3420 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3421 (*i)->mod_solo_by_others_upstream (delta);
3423 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
3426 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3428 in_signal_flow = true;
3430 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3433 if (!in_signal_flow) {
3434 uninvolved.push_back (*i);
3438 solo_update_disabled = false;
3439 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3441 update_route_solo_state (r);
3443 /* now notify that the mute state of the routes not involved in the signal
3444 pathway of the just-solo-changed route may have altered.
3447 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3448 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
3449 (*i)->act_on_mute ();
3450 (*i)->mute_changed (this);
3453 SoloChanged (); /* EMIT SIGNAL */
3458 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
3460 /* now figure out if anything that matters is soloed (or is "listening")*/
3462 bool something_soloed = false;
3463 uint32_t listeners = 0;
3464 uint32_t isolated = 0;
3467 r = routes.reader();
3470 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3471 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
3472 something_soloed = true;
3475 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
3476 if (Config->get_solo_control_is_listen_control()) {
3479 (*i)->set_listen (false, this);
3483 if ((*i)->solo_isolated()) {
3488 if (something_soloed != _non_soloed_outs_muted) {
3489 _non_soloed_outs_muted = something_soloed;
3490 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
3493 _listen_cnt = listeners;
3495 if (isolated != _solo_isolated_cnt) {
3496 _solo_isolated_cnt = isolated;
3497 IsolatedChanged (); /* EMIT SIGNAL */
3500 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
3501 something_soloed, listeners, isolated));
3504 boost::shared_ptr<RouteList>
3505 Session::get_routes_with_internal_returns() const
3507 boost::shared_ptr<RouteList> r = routes.reader ();
3508 boost::shared_ptr<RouteList> rl (new RouteList);
3510 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3511 if ((*i)->internal_return ()) {
3519 Session::io_name_is_legal (const std::string& name)
3521 boost::shared_ptr<RouteList> r = routes.reader ();
3523 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3524 if ((*i)->name() == name) {
3528 if ((*i)->has_io_processor_named (name)) {
3537 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
3540 vector<string> connections;
3542 /* if we are passed only a single route and we're not told to turn
3543 * others off, then just do the simple thing.
3546 if (flip_others == false && rl->size() == 1) {
3547 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
3549 mt->set_input_active (onoff);
3554 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
3556 PortSet& ps ((*rt)->input()->ports());
3558 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
3559 p->get_connections (connections);
3562 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
3563 routes_using_input_from (*s, rl2);
3566 /* scan all relevant routes to see if others are on or off */
3568 bool others_are_already_on = false;
3570 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3572 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3578 if ((*r) != (*rt)) {
3579 if (mt->input_active()) {
3580 others_are_already_on = true;
3583 /* this one needs changing */
3584 mt->set_input_active (onoff);
3590 /* globally reverse other routes */
3592 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3593 if ((*r) != (*rt)) {
3594 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3596 mt->set_input_active (!others_are_already_on);
3605 Session::routes_using_input_from (const string& str, RouteList& rl)
3607 boost::shared_ptr<RouteList> r = routes.reader();
3609 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3610 if ((*i)->input()->connected_to (str)) {
3616 boost::shared_ptr<Route>
3617 Session::route_by_name (string name)
3619 boost::shared_ptr<RouteList> r = routes.reader ();
3621 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3622 if ((*i)->name() == name) {
3627 return boost::shared_ptr<Route> ((Route*) 0);
3630 boost::shared_ptr<Route>
3631 Session::route_by_id (PBD::ID id)
3633 boost::shared_ptr<RouteList> r = routes.reader ();
3635 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3636 if ((*i)->id() == id) {
3641 return boost::shared_ptr<Route> ((Route*) 0);
3644 boost::shared_ptr<Track>
3645 Session::track_by_diskstream_id (PBD::ID id)
3647 boost::shared_ptr<RouteList> r = routes.reader ();
3649 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3650 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3651 if (t && t->using_diskstream_id (id)) {
3656 return boost::shared_ptr<Track> ();
3659 boost::shared_ptr<Route>
3660 Session::route_by_remote_id (uint32_t id)
3662 boost::shared_ptr<RouteList> r = routes.reader ();
3664 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3665 if ((*i)->remote_control_id() == id) {
3670 return boost::shared_ptr<Route> ((Route*) 0);
3675 Session::reassign_track_numbers ()
3679 RouteList r (*(routes.reader ()));
3680 SignalOrderRouteSorter sorter;
3683 StateProtector sp (this);
3685 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3686 if (boost::dynamic_pointer_cast<Track> (*i)) {
3687 (*i)->set_track_number(++tn);
3689 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
3690 (*i)->set_track_number(--bn);
3693 const uint32_t decimals = ceilf (log10f (tn + 1));
3694 const bool decimals_changed = _track_number_decimals != decimals;
3695 _track_number_decimals = decimals;
3697 if (decimals_changed && config.get_track_name_number ()) {
3698 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3699 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3701 t->resync_track_name();
3704 // trigger GUI re-layout
3705 config.ParameterChanged("track-name-number");
3710 Session::playlist_region_added (boost::weak_ptr<Region> w)
3712 boost::shared_ptr<Region> r = w.lock ();
3717 /* These are the operations that are currently in progress... */
3718 list<GQuark> curr = _current_trans_quarks;
3721 /* ...and these are the operations during which we want to update
3722 the session range location markers.
3725 ops.push_back (Operations::capture);
3726 ops.push_back (Operations::paste);
3727 ops.push_back (Operations::duplicate_region);
3728 ops.push_back (Operations::insert_file);
3729 ops.push_back (Operations::insert_region);
3730 ops.push_back (Operations::drag_region_brush);
3731 ops.push_back (Operations::region_drag);
3732 ops.push_back (Operations::selection_grab);
3733 ops.push_back (Operations::region_fill);
3734 ops.push_back (Operations::fill_selection);
3735 ops.push_back (Operations::create_region);
3736 ops.push_back (Operations::region_copy);
3737 ops.push_back (Operations::fixed_time_region_copy);
3740 /* See if any of the current operations match the ones that we want */
3742 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
3744 /* If so, update the session range markers */
3746 maybe_update_session_range (r->position (), r->last_frame ());
3750 /** Update the session range markers if a is before the current start or
3751 * b is after the current end.
3754 Session::maybe_update_session_range (framepos_t a, framepos_t b)
3756 if (_state_of_the_state & Loading) {
3760 if (_session_range_location == 0) {
3762 add_session_range_location (a, b);
3766 if (a < _session_range_location->start()) {
3767 _session_range_location->set_start (a);
3770 if (b > _session_range_location->end()) {
3771 _session_range_location->set_end (b);
3777 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
3779 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3780 maybe_update_session_range (i->to, i->to + i->length);
3785 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
3787 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3788 maybe_update_session_range (i->from, i->to);
3792 /* Region management */
3794 boost::shared_ptr<Region>
3795 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
3797 const RegionFactory::RegionMap& regions (RegionFactory::regions());
3798 RegionFactory::RegionMap::const_iterator i;
3799 boost::shared_ptr<Region> region;
3801 Glib::Threads::Mutex::Lock lm (region_lock);
3803 for (i = regions.begin(); i != regions.end(); ++i) {
3807 if (region->whole_file()) {
3809 if (child->source_equivalent (region)) {
3815 return boost::shared_ptr<Region> ();
3819 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
3821 set<boost::shared_ptr<Region> > relevant_regions;
3823 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
3824 RegionFactory::get_regions_using_source (*s, relevant_regions);
3827 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
3828 set<boost::shared_ptr<Region> >::iterator tmp;
3833 playlists->destroy_region (*r);
3834 RegionFactory::map_remove (*r);
3836 (*r)->drop_sources ();
3837 (*r)->drop_references ();
3839 relevant_regions.erase (r);
3844 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
3847 Glib::Threads::Mutex::Lock ls (source_lock);
3848 /* remove from the main source list */
3849 sources.erase ((*s)->id());
3852 (*s)->mark_for_remove ();
3853 (*s)->drop_references ();
3862 Session::remove_last_capture ()
3864 list<boost::shared_ptr<Source> > srcs;
3866 boost::shared_ptr<RouteList> rl = routes.reader ();
3867 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3868 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3873 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
3876 srcs.insert (srcs.end(), l.begin(), l.end());
3881 destroy_sources (srcs);
3883 save_state (_current_snapshot_name);
3888 /* Source Management */
3891 Session::add_source (boost::shared_ptr<Source> source)
3893 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
3894 pair<SourceMap::iterator,bool> result;
3896 entry.first = source->id();
3897 entry.second = source;
3900 Glib::Threads::Mutex::Lock lm (source_lock);
3901 result = sources.insert (entry);
3904 if (result.second) {
3906 /* yay, new source */
3908 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
3911 if (!fs->within_session()) {
3912 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
3918 boost::shared_ptr<AudioFileSource> afs;
3920 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
3921 if (Config->get_auto_analyse_audio()) {
3922 Analyser::queue_source_for_analysis (source, false);
3926 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
3931 Session::remove_source (boost::weak_ptr<Source> src)
3933 if (_state_of_the_state & Deletion) {
3937 SourceMap::iterator i;
3938 boost::shared_ptr<Source> source = src.lock();
3945 Glib::Threads::Mutex::Lock lm (source_lock);
3947 if ((i = sources.find (source->id())) != sources.end()) {
3952 if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
3954 /* save state so we don't end up with a session file
3955 referring to non-existent sources.
3958 save_state (_current_snapshot_name);
3962 boost::shared_ptr<Source>
3963 Session::source_by_id (const PBD::ID& id)
3965 Glib::Threads::Mutex::Lock lm (source_lock);
3966 SourceMap::iterator i;
3967 boost::shared_ptr<Source> source;
3969 if ((i = sources.find (id)) != sources.end()) {
3976 boost::shared_ptr<AudioFileSource>
3977 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
3979 /* Restricted to audio files because only audio sources have channel
3983 Glib::Threads::Mutex::Lock lm (source_lock);
3985 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
3986 boost::shared_ptr<AudioFileSource> afs
3987 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
3989 if (afs && afs->path() == path && chn == afs->channel()) {
3994 return boost::shared_ptr<AudioFileSource>();
3997 boost::shared_ptr<MidiSource>
3998 Session::midi_source_by_path (const std::string& path) const
4000 /* Restricted to MIDI files because audio sources require a channel
4001 for unique identification, in addition to a path.
4004 Glib::Threads::Mutex::Lock lm (source_lock);
4006 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
4007 boost::shared_ptr<MidiSource> ms
4008 = boost::dynamic_pointer_cast<MidiSource>(s->second);
4009 boost::shared_ptr<FileSource> fs
4010 = boost::dynamic_pointer_cast<FileSource>(s->second);
4012 if (ms && fs && fs->path() == path) {
4017 return boost::shared_ptr<MidiSource>();
4021 Session::count_sources_by_origin (const string& path)
4024 Glib::Threads::Mutex::Lock lm (source_lock);
4026 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
4027 boost::shared_ptr<FileSource> fs
4028 = boost::dynamic_pointer_cast<FileSource>(i->second);
4030 if (fs && fs->origin() == path) {
4039 Session::peak_path (string base) const
4041 if (Glib::path_is_absolute (base)) {
4043 /* rip the session dir from the audiofile source */
4045 string session_path;
4046 string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
4047 bool in_another_session = true;
4049 if (base.find (interchange_dir_string) != string::npos) {
4051 session_path = Glib::path_get_dirname (base); /* now ends in audiofiles */
4052 session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
4053 session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
4054 session_path = Glib::path_get_dirname (session_path); /* now has session path */
4056 /* see if it is within our session */
4058 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4059 if (i->path == session_path) {
4060 in_another_session = false;
4065 in_another_session = false;
4069 if (in_another_session) {
4070 SessionDirectory sd (session_path);
4071 return Glib::build_filename (sd.peak_path(), Glib::path_get_basename (base) + peakfile_suffix);
4075 base = Glib::path_get_basename (base);
4076 return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
4080 Session::new_audio_source_path_for_embedded (const std::string& path)
4084 * we know that the filename is already unique because it exists
4085 * out in the filesystem.
4087 * However, when we bring it into the session, we could get a
4090 * Eg. two embedded files:
4095 * When merged into session, these collide.
4097 * There will not be a conflict with in-memory sources
4098 * because when the source was created we already picked
4099 * a unique name for it.
4101 * This collision is not likely to be common, but we have to guard
4102 * against it. So, if there is a collision, take the md5 hash of the
4103 * the path, and use that as the filename instead.
4106 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4107 string base = Glib::path_get_basename (path);
4108 string newpath = Glib::build_filename (sdir.sound_path(), base);
4110 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4114 md5.digestString (path.c_str());
4115 md5.writeToString ();
4116 base = md5.digestChars;
4118 string ext = get_suffix (path);
4125 newpath = Glib::build_filename (sdir.sound_path(), base);
4127 /* if this collides, we're screwed */
4129 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4130 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
4139 /** Return true if there are no audio file sources that use @param name as
4140 * the filename component of their path.
4142 * Return false otherwise.
4144 * This method MUST ONLY be used to check in-session, mono files since it
4145 * hard-codes the channel of the audio file source we are looking for as zero.
4147 * If/when Ardour supports native files in non-mono formats, the logic here
4148 * will need to be revisited.
4151 Session::audio_source_name_is_unique (const string& name)
4153 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
4154 vector<space_and_path>::iterator i;
4155 uint32_t existing = 0;
4157 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4159 /* note that we search *without* the extension so that
4160 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
4161 in the event that this new name is required for
4162 a file format change.
4165 const string spath = *i;
4167 if (matching_unsuffixed_filename_exists_in (spath, name)) {
4172 /* it is possible that we have the path already
4173 * assigned to a source that has not yet been written
4174 * (ie. the write source for a diskstream). we have to
4175 * check this in order to make sure that our candidate
4176 * path isn't used again, because that can lead to
4177 * two Sources point to the same file with different
4178 * notions of their removability.
4182 string possible_path = Glib::build_filename (spath, name);
4184 if (audio_source_by_path_and_channel (possible_path, 0)) {
4190 return (existing == 0);
4194 Session::format_audio_source_name (const string& legalized_base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required, uint32_t cnt, bool related_exists)
4197 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4201 sstr << setfill ('0') << setw (4) << cnt;
4202 sstr << legalized_base;
4204 sstr << legalized_base;
4206 if (take_required || related_exists) {
4218 } else if (nchan > 2) {
4223 /* XXX what? more than 26 channels! */
4234 /** Return a unique name based on \a base for a new internal audio source */
4236 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
4239 string possible_name;
4240 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
4242 bool some_related_source_name_exists = false;
4244 legalized = legalize_for_path (base);
4246 // Find a "version" of the base name that doesn't exist in any of the possible directories.
4248 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
4250 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
4252 if (audio_source_name_is_unique (possible_name)) {
4256 some_related_source_name_exists = true;
4259 error << string_compose(
4260 _("There are already %1 recordings for %2, which I consider too many."),
4261 limit, base) << endmsg;
4263 throw failed_constructor();
4267 /* We've established that the new name does not exist in any session
4268 * directory, so now find out which one we should use for this new
4272 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4274 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
4279 /** Return a unique name based on `base` for a new internal MIDI source */
4281 Session::new_midi_source_path (const string& base)
4284 char buf[PATH_MAX+1];
4285 const uint32_t limit = 10000;
4287 string possible_path;
4288 string possible_name;
4291 legalized = legalize_for_path (base);
4293 // Find a "version" of the file name that doesn't exist in any of the possible directories.
4294 std::vector<string> sdirs = source_search_path(DataType::MIDI);
4296 /* - the main session folder is the first in the vector.
4297 * - after checking all locations for file-name uniqueness,
4298 * we keep the one from the last iteration as new file name
4299 * - midi files are small and should just be kept in the main session-folder
4301 * -> reverse the array, check main session folder last and use that as location
4304 std::reverse(sdirs.begin(), sdirs.end());
4306 for (cnt = 1; cnt <= limit; ++cnt) {
4308 vector<space_and_path>::iterator i;
4309 uint32_t existing = 0;
4311 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4313 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
4314 possible_name = buf;
4316 possible_path = Glib::build_filename (*i, possible_name);
4318 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
4322 if (midi_source_by_path (possible_path)) {
4327 if (existing == 0) {
4332 error << string_compose(
4333 _("There are already %1 recordings for %2, which I consider too many."),
4334 limit, base) << endmsg;
4340 /* No need to "find best location" for software/app-based RAID, because
4341 MIDI is so small that we always put it in the same place.
4344 return possible_path;
4348 /** Create a new within-session audio source */
4349 boost::shared_ptr<AudioFileSource>
4350 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
4352 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
4354 if (!path.empty()) {
4355 return boost::dynamic_pointer_cast<AudioFileSource> (
4356 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
4358 throw failed_constructor ();
4362 /** Create a new within-session MIDI source */
4363 boost::shared_ptr<MidiSource>
4364 Session::create_midi_source_for_session (string const & basic_name)
4366 const string path = new_midi_source_path (basic_name);
4368 if (!path.empty()) {
4369 return boost::dynamic_pointer_cast<SMFSource> (
4370 SourceFactory::createWritable (
4371 DataType::MIDI, *this, path, false, frame_rate()));
4373 throw failed_constructor ();
4377 /** Create a new within-session MIDI source */
4378 boost::shared_ptr<MidiSource>
4379 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
4381 /* the caller passes in the track the source will be used in,
4382 so that we can keep the numbering sane.
4384 Rationale: a track with the name "Foo" that has had N
4385 captures carried out so far will ALREADY have a write source
4386 named "Foo-N+1.mid" waiting to be used for the next capture.
4388 If we call new_midi_source_name() we will get "Foo-N+2". But
4389 there is no region corresponding to "Foo-N+1", so when
4390 "Foo-N+2" appears in the track, the gap presents the user
4391 with odd behaviour - why did it skip past Foo-N+1?
4393 We could explain this to the user in some odd way, but
4394 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
4397 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
4400 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
4402 std::string name = track->steal_write_source_name ();
4405 return boost::shared_ptr<MidiSource>();
4408 /* MIDI files are small, just put them in the first location of the
4409 session source search path.
4412 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
4414 return boost::dynamic_pointer_cast<SMFSource> (
4415 SourceFactory::createWritable (
4416 DataType::MIDI, *this, path, false, frame_rate()));
4421 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
4423 if (playlist->hidden()) {
4427 playlists->add (playlist);
4430 playlist->release();
4437 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
4439 if (_state_of_the_state & Deletion) {
4443 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
4449 playlists->remove (playlist);
4455 Session::set_audition (boost::shared_ptr<Region> r)
4457 pending_audition_region = r;
4458 add_post_transport_work (PostTransportAudition);
4459 _butler->schedule_transport_work ();
4463 Session::audition_playlist ()
4465 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4466 ev->region.reset ();
4471 Session::non_realtime_set_audition ()
4473 assert (pending_audition_region);
4474 auditioner->audition_region (pending_audition_region);
4475 pending_audition_region.reset ();
4476 AuditionActive (true); /* EMIT SIGNAL */
4480 Session::audition_region (boost::shared_ptr<Region> r)
4482 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4488 Session::cancel_audition ()
4493 if (auditioner->auditioning()) {
4494 auditioner->cancel_audition ();
4495 AuditionActive (false); /* EMIT SIGNAL */
4500 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
4502 if (a->is_monitor()) {
4505 if (b->is_monitor()) {
4508 return a->order_key () < b->order_key ();
4512 Session::is_auditioning () const
4514 /* can be called before we have an auditioner object */
4516 return auditioner->auditioning();
4523 Session::graph_reordered ()
4525 /* don't do this stuff if we are setting up connections
4526 from a set_state() call or creating new tracks. Ditto for deletion.
4529 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _reconnecting_routes_in_progress) {
4533 /* every track/bus asked for this to be handled but it was deferred because
4534 we were connecting. do it now.
4537 request_input_change_handling ();
4541 /* force all diskstreams to update their capture offset values to
4542 reflect any changes in latencies within the graph.
4545 boost::shared_ptr<RouteList> rl = routes.reader ();
4546 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4547 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4549 tr->set_capture_offset ();
4554 /** @return Number of frames that there is disk space available to write,
4557 boost::optional<framecnt_t>
4558 Session::available_capture_duration ()
4560 Glib::Threads::Mutex::Lock lm (space_lock);
4562 if (_total_free_4k_blocks_uncertain) {
4563 return boost::optional<framecnt_t> ();
4566 float sample_bytes_on_disk = 4.0; // keep gcc happy
4568 switch (config.get_native_file_data_format()) {
4570 sample_bytes_on_disk = 4.0;
4574 sample_bytes_on_disk = 3.0;
4578 sample_bytes_on_disk = 2.0;
4582 /* impossible, but keep some gcc versions happy */
4583 fatal << string_compose (_("programming error: %1"),
4584 X_("illegal native file data format"))
4586 abort(); /*NOTREACHED*/
4589 double scale = 4096.0 / sample_bytes_on_disk;
4591 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
4592 return max_framecnt;
4595 return (framecnt_t) floor (_total_free_4k_blocks * scale);
4599 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
4602 RCUWriter<BundleList> writer (_bundles);
4603 boost::shared_ptr<BundleList> b = writer.get_copy ();
4604 b->push_back (bundle);
4608 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4615 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
4617 bool removed = false;
4620 RCUWriter<BundleList> writer (_bundles);
4621 boost::shared_ptr<BundleList> b = writer.get_copy ();
4622 BundleList::iterator i = find (b->begin(), b->end(), bundle);
4624 if (i != b->end()) {
4631 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4637 boost::shared_ptr<Bundle>
4638 Session::bundle_by_name (string name) const
4640 boost::shared_ptr<BundleList> b = _bundles.reader ();
4642 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
4643 if ((*i)->name() == name) {
4648 return boost::shared_ptr<Bundle> ();
4652 Session::tempo_map_changed (const PropertyChange&)
4656 playlists->update_after_tempo_map_change ();
4658 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
4664 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
4666 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
4667 (*i)->recompute_frames_from_bbt ();
4671 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
4672 * the given count with the current block size.
4675 Session::ensure_buffers (ChanCount howmany)
4677 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
4681 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
4683 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4684 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
4689 Session::next_insert_id ()
4691 /* this doesn't really loop forever. just think about it */
4694 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
4695 if (!insert_bitset[n]) {
4696 insert_bitset[n] = true;
4702 /* none available, so resize and try again */
4704 insert_bitset.resize (insert_bitset.size() + 16, false);
4709 Session::next_send_id ()
4711 /* this doesn't really loop forever. just think about it */
4714 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
4715 if (!send_bitset[n]) {
4716 send_bitset[n] = true;
4722 /* none available, so resize and try again */
4724 send_bitset.resize (send_bitset.size() + 16, false);
4729 Session::next_aux_send_id ()
4731 /* this doesn't really loop forever. just think about it */
4734 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
4735 if (!aux_send_bitset[n]) {
4736 aux_send_bitset[n] = true;
4742 /* none available, so resize and try again */
4744 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
4749 Session::next_return_id ()
4751 /* this doesn't really loop forever. just think about it */
4754 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
4755 if (!return_bitset[n]) {
4756 return_bitset[n] = true;
4762 /* none available, so resize and try again */
4764 return_bitset.resize (return_bitset.size() + 16, false);
4769 Session::mark_send_id (uint32_t id)
4771 if (id >= send_bitset.size()) {
4772 send_bitset.resize (id+16, false);
4774 if (send_bitset[id]) {
4775 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
4777 send_bitset[id] = true;
4781 Session::mark_aux_send_id (uint32_t id)
4783 if (id >= aux_send_bitset.size()) {
4784 aux_send_bitset.resize (id+16, false);
4786 if (aux_send_bitset[id]) {
4787 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
4789 aux_send_bitset[id] = true;
4793 Session::mark_return_id (uint32_t id)
4795 if (id >= return_bitset.size()) {
4796 return_bitset.resize (id+16, false);
4798 if (return_bitset[id]) {
4799 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
4801 return_bitset[id] = true;
4805 Session::mark_insert_id (uint32_t id)
4807 if (id >= insert_bitset.size()) {
4808 insert_bitset.resize (id+16, false);
4810 if (insert_bitset[id]) {
4811 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
4813 insert_bitset[id] = true;
4817 Session::unmark_send_id (uint32_t id)
4819 if (id < send_bitset.size()) {
4820 send_bitset[id] = false;
4825 Session::unmark_aux_send_id (uint32_t id)
4827 if (id < aux_send_bitset.size()) {
4828 aux_send_bitset[id] = false;
4833 Session::unmark_return_id (uint32_t id)
4835 if (id < return_bitset.size()) {
4836 return_bitset[id] = false;
4841 Session::unmark_insert_id (uint32_t id)
4843 if (id < insert_bitset.size()) {
4844 insert_bitset[id] = false;
4849 Session::reset_native_file_format ()
4851 boost::shared_ptr<RouteList> rl = routes.reader ();
4852 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4853 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4855 /* don't save state as we do this, there's no point
4858 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
4859 tr->reset_write_sources (false);
4860 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
4866 Session::route_name_unique (string n) const
4868 boost::shared_ptr<RouteList> r = routes.reader ();
4870 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4871 if ((*i)->name() == n) {
4880 Session::route_name_internal (string n) const
4882 if (auditioner && auditioner->name() == n) {
4886 if (_click_io && _click_io->name() == n) {
4894 Session::freeze_all (InterThreadInfo& itt)
4896 boost::shared_ptr<RouteList> r = routes.reader ();
4898 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4900 boost::shared_ptr<Track> t;
4902 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
4903 /* XXX this is wrong because itt.progress will keep returning to zero at the start
4913 boost::shared_ptr<Region>
4914 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
4915 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
4916 InterThreadInfo& itt,
4917 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
4918 bool for_export, bool for_freeze)
4920 boost::shared_ptr<Region> result;
4921 boost::shared_ptr<Playlist> playlist;
4922 boost::shared_ptr<Source> source;
4923 ChanCount diskstream_channels (track.n_channels());
4924 framepos_t position;
4925 framecnt_t this_chunk;
4927 framepos_t latency_skip;
4929 framepos_t len = end - start;
4930 bool need_block_size_reset = false;
4931 ChanCount const max_proc = track.max_processor_streams ();
4932 string legal_playlist_name;
4933 string possible_path;
4936 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
4937 end, start) << endmsg;
4941 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
4942 include_endpoint, for_export, for_freeze);
4944 if (diskstream_channels.n(track.data_type()) < 1) {
4945 error << _("Cannot write a range with no data.") << endmsg;
4949 // block all process callback handling
4951 block_processing ();
4954 // synchronize with AudioEngine::process_callback()
4955 // make sure processing is not currently running
4956 // and processing_blocked() is honored before
4957 // acquiring thread buffers
4958 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
4961 _bounce_processing_active = true;
4963 /* call tree *MUST* hold route_lock */
4965 if ((playlist = track.playlist()) == 0) {
4969 legal_playlist_name = legalize_for_path (playlist->name());
4971 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
4973 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
4974 string path = ((track.data_type() == DataType::AUDIO)
4975 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
4976 : new_midi_source_path (legal_playlist_name));
4983 source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
4986 catch (failed_constructor& err) {
4987 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
4991 srcs.push_back (source);
4994 /* tell redirects that care that we are about to use a much larger
4995 * blocksize. this will flush all plugins too, so that they are ready
4996 * to be used for this process.
4999 need_block_size_reset = true;
5000 track.set_block_size (bounce_chunk_size);
5001 _engine.main_thread()->get_buffers ();
5005 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5007 /* create a set of reasonably-sized buffers */
5008 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5009 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
5011 buffers.set_count (max_proc);
5013 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5014 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5015 boost::shared_ptr<MidiSource> ms;
5017 afs->prepare_for_peakfile_writes ();
5018 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5019 Source::Lock lock(ms->mutex());
5020 ms->mark_streaming_write_started(lock);
5024 while (to_do && !itt.cancel) {
5026 this_chunk = min (to_do, bounce_chunk_size);
5028 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
5032 start += this_chunk;
5033 to_do -= this_chunk;
5034 itt.progress = (float) (1.0 - ((double) to_do / len));
5036 if (latency_skip >= bounce_chunk_size) {
5037 latency_skip -= bounce_chunk_size;
5041 const framecnt_t current_chunk = this_chunk - latency_skip;
5044 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5045 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5046 boost::shared_ptr<MidiSource> ms;
5049 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
5052 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5053 Source::Lock lock(ms->mutex());
5055 const MidiBuffer& buf = buffers.get_midi(0);
5056 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
5057 Evoral::Event<framepos_t> ev = *i;
5058 ev.set_time(ev.time() - position);
5059 ms->append_event_frames(lock, ev, ms->timeline_position());
5066 /* post-roll, pick up delayed processor output */
5067 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5069 while (latency_skip && !itt.cancel) {
5070 this_chunk = min (latency_skip, bounce_chunk_size);
5071 latency_skip -= this_chunk;
5073 buffers.silence (this_chunk, 0);
5074 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
5077 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5078 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5081 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
5093 xnow = localtime (&now);
5095 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
5096 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5097 boost::shared_ptr<MidiSource> ms;
5100 afs->update_header (position, *xnow, now);
5101 afs->flush_header ();
5102 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5103 Source::Lock lock(ms->mutex());
5104 ms->mark_streaming_write_completed(lock);
5108 /* construct a region to represent the bounced material */
5112 plist.add (Properties::start, 0);
5113 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
5114 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
5116 result = RegionFactory::create (srcs, plist);
5122 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5123 (*src)->mark_for_remove ();
5124 (*src)->drop_references ();
5128 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5129 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5132 afs->done_with_peakfile_writes ();
5136 _bounce_processing_active = false;
5138 if (need_block_size_reset) {
5139 _engine.main_thread()->drop_buffers ();
5140 track.set_block_size (get_block_size());
5143 unblock_processing ();
5149 Session::gain_automation_buffer() const
5151 return ProcessThread::gain_automation_buffer ();
5155 Session::trim_automation_buffer() const
5157 return ProcessThread::trim_automation_buffer ();
5161 Session::send_gain_automation_buffer() const
5163 return ProcessThread::send_gain_automation_buffer ();
5167 Session::pan_automation_buffer() const
5169 return ProcessThread::pan_automation_buffer ();
5173 Session::get_silent_buffers (ChanCount count)
5175 return ProcessThread::get_silent_buffers (count);
5179 Session::get_scratch_buffers (ChanCount count, bool silence)
5181 return ProcessThread::get_scratch_buffers (count, silence);
5185 Session::get_route_buffers (ChanCount count, bool silence)
5187 return ProcessThread::get_route_buffers (count, silence);
5192 Session::get_mix_buffers (ChanCount count)
5194 return ProcessThread::get_mix_buffers (count);
5198 Session::ntracks () const
5201 boost::shared_ptr<RouteList> r = routes.reader ();
5203 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5204 if (boost::dynamic_pointer_cast<Track> (*i)) {
5213 Session::nbusses () const
5216 boost::shared_ptr<RouteList> r = routes.reader ();
5218 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5219 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
5228 Session::add_automation_list(AutomationList *al)
5230 automation_lists[al->id()] = al;
5233 /** @return true if there is at least one record-enabled track, otherwise false */
5235 Session::have_rec_enabled_track () const
5237 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
5241 Session::have_rec_disabled_track () const
5243 return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
5246 /** Update the state of our rec-enabled tracks flag */
5248 Session::update_route_record_state ()
5250 boost::shared_ptr<RouteList> rl = routes.reader ();
5251 RouteList::iterator i = rl->begin();
5252 while (i != rl->end ()) {
5254 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5255 if (tr && tr->record_enabled ()) {
5262 int const old = g_atomic_int_get (&_have_rec_enabled_track);
5264 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
5266 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
5267 RecordStateChanged (); /* EMIT SIGNAL */
5270 for (i = rl->begin(); i != rl->end (); ++i) {
5271 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5272 if (tr && !tr->record_enabled ()) {
5277 g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
5279 bool record_arm_state_changed = (old != g_atomic_int_get (&_have_rec_enabled_track) );
5281 if (record_status() == Recording && record_arm_state_changed ) {
5282 RecordArmStateChanged ();
5288 Session::listen_position_changed ()
5290 boost::shared_ptr<RouteList> r = routes.reader ();
5292 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5293 (*i)->listen_position_changed ();
5298 Session::solo_control_mode_changed ()
5300 /* cancel all solo or all listen when solo control mode changes */
5303 set_solo (get_routes(), false);
5304 } else if (listening()) {
5305 set_listen (get_routes(), false);
5309 /** Called when a property of one of our route groups changes */
5311 Session::route_group_property_changed (RouteGroup* rg)
5313 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
5316 /** Called when a route is added to one of our route groups */
5318 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5320 RouteAddedToRouteGroup (rg, r);
5323 /** Called when a route is removed from one of our route groups */
5325 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5327 update_route_record_state ();
5328 RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
5331 boost::shared_ptr<RouteList>
5332 Session::get_tracks () const
5334 boost::shared_ptr<RouteList> rl = routes.reader ();
5335 boost::shared_ptr<RouteList> tl (new RouteList);
5337 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
5338 if (boost::dynamic_pointer_cast<Track> (*r)) {
5339 if (!(*r)->is_auditioner()) {
5347 boost::shared_ptr<RouteList>
5348 Session::get_routes_with_regions_at (framepos_t const p) const
5350 boost::shared_ptr<RouteList> r = routes.reader ();
5351 boost::shared_ptr<RouteList> rl (new RouteList);
5353 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5354 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5359 boost::shared_ptr<Playlist> pl = tr->playlist ();
5364 if (pl->has_region_at (p)) {
5373 Session::goto_end ()
5375 if (_session_range_location) {
5376 request_locate (_session_range_location->end(), false);
5378 request_locate (0, false);
5383 Session::goto_start ()
5385 if (_session_range_location) {
5386 request_locate (_session_range_location->start(), false);
5388 request_locate (0, false);
5393 Session::current_start_frame () const
5395 return _session_range_location ? _session_range_location->start() : 0;
5399 Session::current_end_frame () const
5401 return _session_range_location ? _session_range_location->end() : 0;
5405 Session::add_session_range_location (framepos_t start, framepos_t end)
5407 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
5408 _locations->add (_session_range_location);
5412 Session::step_edit_status_change (bool yn)
5418 send = (_step_editors == 0);
5423 send = (_step_editors == 1);
5426 if (_step_editors > 0) {
5432 StepEditStatusChange (val);
5438 Session::start_time_changed (framepos_t old)
5440 /* Update the auto loop range to match the session range
5441 (unless the auto loop range has been changed by the user)
5444 Location* s = _locations->session_range_location ();
5449 Location* l = _locations->auto_loop_location ();
5451 if (l && l->start() == old) {
5452 l->set_start (s->start(), true);
5457 Session::end_time_changed (framepos_t old)
5459 /* Update the auto loop range to match the session range
5460 (unless the auto loop range has been changed by the user)
5463 Location* s = _locations->session_range_location ();
5468 Location* l = _locations->auto_loop_location ();
5470 if (l && l->end() == old) {
5471 l->set_end (s->end(), true);
5475 std::vector<std::string>
5476 Session::source_search_path (DataType type) const
5480 if (session_dirs.size() == 1) {
5482 case DataType::AUDIO:
5483 sp.push_back (_session_dir->sound_path());
5485 case DataType::MIDI:
5486 sp.push_back (_session_dir->midi_path());
5490 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
5491 SessionDirectory sdir (i->path);
5493 case DataType::AUDIO:
5494 sp.push_back (sdir.sound_path());
5496 case DataType::MIDI:
5497 sp.push_back (sdir.midi_path());
5503 if (type == DataType::AUDIO) {
5504 const string sound_path_2X = _session_dir->sound_path_2X();
5505 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
5506 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
5507 sp.push_back (sound_path_2X);
5512 // now check the explicit (possibly user-specified) search path
5515 case DataType::AUDIO:
5516 sp += Searchpath(config.get_audio_search_path ());
5518 case DataType::MIDI:
5519 sp += Searchpath(config.get_midi_search_path ());
5527 Session::ensure_search_path_includes (const string& path, DataType type)
5536 case DataType::AUDIO:
5537 sp += Searchpath(config.get_audio_search_path ());
5539 case DataType::MIDI:
5540 sp += Searchpath (config.get_midi_search_path ());
5544 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
5545 /* No need to add this new directory if it has the same inode as
5546 an existing one; checking inode rather than name prevents duplicated
5547 directories when we are using symlinks.
5549 On Windows, I think we could just do if (*i == path) here.
5551 if (PBD::equivalent_paths (*i, path)) {
5559 case DataType::AUDIO:
5560 config.set_audio_search_path (sp.to_string());
5562 case DataType::MIDI:
5563 config.set_midi_search_path (sp.to_string());
5569 Session::remove_dir_from_search_path (const string& dir, DataType type)
5574 case DataType::AUDIO:
5575 sp = Searchpath(config.get_audio_search_path ());
5577 case DataType::MIDI:
5578 sp = Searchpath (config.get_midi_search_path ());
5585 case DataType::AUDIO:
5586 config.set_audio_search_path (sp.to_string());
5588 case DataType::MIDI:
5589 config.set_midi_search_path (sp.to_string());
5595 boost::shared_ptr<Speakers>
5596 Session::get_speakers()
5602 Session::unknown_processors () const
5606 boost::shared_ptr<RouteList> r = routes.reader ();
5607 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5608 list<string> t = (*i)->unknown_processors ();
5609 copy (t.begin(), t.end(), back_inserter (p));
5619 Session::update_latency (bool playback)
5621 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
5623 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
5627 boost::shared_ptr<RouteList> r = routes.reader ();
5628 framecnt_t max_latency = 0;
5631 /* reverse the list so that we work backwards from the last route to run to the first */
5632 RouteList* rl = routes.reader().get();
5633 r.reset (new RouteList (*rl));
5634 reverse (r->begin(), r->end());
5637 /* compute actual latency values for the given direction and store them all in per-port
5638 structures. this will also publish the same values (to JACK) so that computation of latency
5639 for routes can consistently use public latency values.
5642 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5643 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
5646 /* because we latency compensate playback, our published playback latencies should
5647 be the same for all output ports - all material played back by ardour has
5648 the same latency, whether its caused by plugins or by latency compensation. since
5649 these may differ from the values computed above, reset all playback port latencies
5653 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
5655 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5656 (*i)->set_public_port_latencies (max_latency, playback);
5661 post_playback_latency ();
5665 post_capture_latency ();
5668 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
5672 Session::post_playback_latency ()
5674 set_worst_playback_latency ();
5676 boost::shared_ptr<RouteList> r = routes.reader ();
5678 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5679 if (!(*i)->is_auditioner() && ((*i)->active())) {
5680 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
5684 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5685 (*i)->set_latency_compensation (_worst_track_latency);
5690 Session::post_capture_latency ()
5692 set_worst_capture_latency ();
5694 /* reflect any changes in capture latencies into capture offsets
5697 boost::shared_ptr<RouteList> rl = routes.reader();
5698 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5699 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5701 tr->set_capture_offset ();
5707 Session::initialize_latencies ()
5710 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5711 update_latency (false);
5712 update_latency (true);
5715 set_worst_io_latencies ();
5719 Session::set_worst_io_latencies ()
5721 set_worst_playback_latency ();
5722 set_worst_capture_latency ();
5726 Session::set_worst_playback_latency ()
5728 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5732 _worst_output_latency = 0;
5734 if (!_engine.connected()) {
5738 boost::shared_ptr<RouteList> r = routes.reader ();
5740 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5741 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
5744 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
5748 Session::set_worst_capture_latency ()
5750 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5754 _worst_input_latency = 0;
5756 if (!_engine.connected()) {
5760 boost::shared_ptr<RouteList> r = routes.reader ();
5762 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5763 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
5766 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
5770 Session::update_latency_compensation (bool force_whole_graph)
5772 bool some_track_latency_changed = false;
5774 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5778 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
5780 _worst_track_latency = 0;
5782 boost::shared_ptr<RouteList> r = routes.reader ();
5784 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5785 if (!(*i)->is_auditioner() && ((*i)->active())) {
5787 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
5788 some_track_latency_changed = true;
5790 _worst_track_latency = max (tl, _worst_track_latency);
5794 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
5795 (some_track_latency_changed ? "yes" : "no")));
5797 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
5799 if (some_track_latency_changed || force_whole_graph) {
5800 _engine.update_latencies ();
5804 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5805 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5809 tr->set_capture_offset ();
5814 Session::session_name_is_legal (const string& path)
5816 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
5818 for (int i = 0; illegal_chars[i]; ++i) {
5819 if (path.find (illegal_chars[i]) != string::npos) {
5820 return illegal_chars[i];
5828 Session::next_control_id () const
5832 /* the monitor bus remote ID is in a different
5833 * "namespace" than regular routes. its existence doesn't
5834 * affect normal (low) numbered routes.
5841 return nroutes() - subtract;
5845 Session::notify_remote_id_change ()
5847 if (deletion_in_progress()) {
5851 switch (Config->get_remote_model()) {
5853 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
5859 #ifdef USE_TRACKS_CODE_FEATURES
5860 /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
5861 * if track order has been changed by user
5863 reconnect_existing_routes(true, true);
5869 Session::sync_order_keys ()
5871 if (deletion_in_progress()) {
5875 /* tell everyone that something has happened to the sort keys
5876 and let them sync up with the change(s)
5877 this will give objects that manage the sort order keys the
5878 opportunity to keep them in sync if they wish to.
5881 DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
5883 reassign_track_numbers();
5885 Route::SyncOrderKeys (); /* EMIT SIGNAL */
5887 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
5891 Session::operation_in_progress (GQuark op) const
5893 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
5896 boost::shared_ptr<Port>
5897 Session::ltc_input_port () const
5899 return _ltc_input->nth (0);
5902 boost::shared_ptr<Port>
5903 Session::ltc_output_port () const
5905 return _ltc_output->nth (0);
5909 Session::reconnect_ltc_input ()
5913 string src = Config->get_ltc_source_port();
5915 _ltc_input->disconnect (this);
5917 if (src != _("None") && !src.empty()) {
5918 _ltc_input->nth (0)->connect (src);
5924 Session::reconnect_ltc_output ()
5929 string src = Config->get_ltc_sink_port();
5931 _ltc_output->disconnect (this);
5933 if (src != _("None") && !src.empty()) {
5934 _ltc_output->nth (0)->connect (src);