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/filename_extensions.h"
70 #include "ardour/graph.h"
71 #include "ardour/midiport_manager.h"
72 #include "ardour/scene_changer.h"
73 #include "ardour/midi_track.h"
74 #include "ardour/midi_ui.h"
75 #include "ardour/operations.h"
76 #include "ardour/playlist.h"
77 #include "ardour/plugin.h"
78 #include "ardour/plugin_insert.h"
79 #include "ardour/process_thread.h"
80 #include "ardour/rc_configuration.h"
81 #include "ardour/recent_sessions.h"
82 #include "ardour/region.h"
83 #include "ardour/region_factory.h"
84 #include "ardour/route_graph.h"
85 #include "ardour/route_group.h"
86 #include "ardour/route_sorters.h"
87 #include "ardour/send.h"
88 #include "ardour/session.h"
89 #include "ardour/session_directory.h"
90 #include "ardour/session_playlists.h"
91 #include "ardour/smf_source.h"
92 #include "ardour/source_factory.h"
93 #include "ardour/speakers.h"
94 #include "ardour/track.h"
95 #include "ardour/utils.h"
97 #include "midi++/port.h"
98 #include "midi++/mmc.h"
109 using namespace ARDOUR;
112 bool Session::_disable_all_loaded_plugins = false;
114 PBD::Signal1<int,uint32_t> Session::AudioEngineSetupRequired;
115 PBD::Signal1<void,std::string> Session::Dialog;
116 PBD::Signal0<int> Session::AskAboutPendingState;
117 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
118 PBD::Signal0<void> Session::SendFeedback;
119 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
121 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
122 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
123 PBD::Signal2<void,std::string, std::string> Session::Exported;
124 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
125 PBD::Signal0<void> Session::Quit;
126 PBD::Signal0<void> Session::FeedbackDetected;
127 PBD::Signal0<void> Session::SuccessfulGraphSort;
128 PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
130 const framecnt_t Session::bounce_chunk_size = 65536;
131 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
132 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
134 /** @param snapshot_name Snapshot name, without .ardour suffix */
135 Session::Session (AudioEngine &eng,
136 const string& fullpath,
137 const string& snapshot_name,
138 BusProfile* bus_profile,
140 : playlists (new SessionPlaylists)
142 , process_function (&Session::process_with_events)
143 , _bounce_processing_active (false)
144 , waiting_for_sync_offset (false)
145 , _base_frame_rate (0)
146 , _current_frame_rate (0)
147 , _nominal_frame_rate (0)
148 , transport_sub_state (0)
149 , _record_status (Disabled)
150 , _transport_frame (0)
151 , _session_range_location (0)
154 , _transport_speed (0)
155 , _default_transport_speed (1.0)
156 , _last_transport_speed (0)
157 , _target_transport_speed (0.0)
158 , auto_play_legal (false)
159 , _last_slave_transport_frame (0)
160 , maximum_output_latency (0)
161 , _requested_return_frame (-1)
162 , current_block_size (0)
163 , _worst_output_latency (0)
164 , _worst_input_latency (0)
165 , _worst_track_latency (0)
166 , _have_captured (false)
167 , _non_soloed_outs_muted (false)
169 , _solo_isolated_cnt (0)
171 , _was_seamless (Config->get_seamless_loop ())
172 , _under_nsm_control (false)
173 , delta_accumulator_cnt (0)
174 , average_slave_delta (1800) // !!! why 1800 ???
176 , have_first_delta_accumulator (false)
177 , _slave_state (Stopped)
178 , post_export_sync (false)
179 , post_export_position (0)
181 , _export_started (false)
182 , _export_rolling (false)
183 , _pre_export_mmc_enabled (false)
184 , _name (snapshot_name)
186 , _send_qf_mtc (false)
187 , _pframes_since_last_mtc (0)
188 , session_midi_feedback (0)
190 , loop_changing (false)
192 , _session_dir (new SessionDirectory (fullpath))
193 , _current_snapshot_name (snapshot_name)
195 , state_was_pending (false)
196 , _state_of_the_state (StateOfTheState(CannotSave|InitialConnecting|Loading))
198 , _save_queued (false)
199 , _last_roll_location (0)
200 , _last_roll_or_reversal_location (0)
201 , _last_record_location (0)
202 , pending_locate_roll (false)
203 , pending_locate_frame (0)
204 , pending_locate_flush (false)
205 , pending_abort (false)
206 , pending_auto_loop (false)
207 , _butler (new Butler (*this))
208 , _post_transport_work (0)
209 , cumulative_rf_motion (0)
211 , _locations (new Locations (*this))
212 , _ignore_skips_updates (false)
214 , outbound_mtc_timecode_frame (0)
215 , next_quarter_frame_to_send (-1)
216 , _frames_per_timecode_frame (0)
217 , _frames_per_hour (0)
218 , _timecode_frames_per_hour (0)
219 , last_timecode_valid (false)
220 , last_timecode_when (0)
221 , _send_timecode_update (false)
233 , ltc_timecode_offset (0)
234 , ltc_timecode_negative_offset (false)
235 , midi_control_ui (0)
237 , _all_route_group (new RouteGroup (*this, "all"))
238 , routes (new RouteList)
239 , _adding_routes_in_progress (false)
240 , destructive_index (0)
241 , _track_number_decimals(1)
242 , solo_update_disabled (false)
243 , default_fade_steepness (0)
244 , default_fade_msecs (0)
245 , _total_free_4k_blocks (0)
246 , _total_free_4k_blocks_uncertain (false)
247 , no_questions_about_missing_files (false)
250 , _bundles (new BundleList)
251 , _bundle_xml_node (0)
255 , click_emphasis_data (0)
257 , click_emphasis_length (0)
258 , _clicks_cleared (0)
259 , _play_range (false)
261 , first_file_data_format_reset (true)
262 , first_file_header_format_reset (true)
263 , have_looped (false)
264 , _have_rec_enabled_track (false)
266 , _suspend_timecode_transmission (0)
267 , _speakers (new Speakers)
269 , ignore_route_processor_changes (false)
276 pre_engine_init (fullpath);
279 if (ensure_engine (sr)) {
281 throw failed_constructor ();
284 if (create (mix_template, bus_profile)) {
286 throw failed_constructor ();
289 /* if a mix template was provided, then ::create() will
290 * have copied it into the session and we need to load it
291 * so that we have the state ready for ::set_state()
292 * after the engine is started.
294 * Note that we do NOT try to get the sample rate from
295 * the template at this time, though doing so would
296 * be easy if we decided this was an appropriate part
300 if (!mix_template.empty() && load_state (_current_snapshot_name)) {
301 throw failed_constructor ();
304 /* load default session properties - if any */
309 if (load_state (_current_snapshot_name)) {
310 throw failed_constructor ();
313 /* try to get sample rate from XML state so that we
314 * can influence the SR if we set up the audio
319 const XMLProperty* prop;
320 if ((prop = state_tree->root()->property (X_("sample-rate"))) != 0) {
321 sr = atoi (prop->value());
325 if (ensure_engine (sr)) {
327 throw failed_constructor ();
331 if (post_engine_init ()) {
333 throw failed_constructor ();
336 store_recent_sessions (_name, _path);
338 bool was_dirty = dirty();
340 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
342 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
343 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
346 DirtyChanged (); /* EMIT SIGNAL */
349 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
350 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
354 /* hook us up to the engine since we are now completely constructed */
356 BootMessage (_("Connect to engine"));
358 _engine.set_session (this);
359 _engine.reset_timebase ();
361 BootMessage (_("Session loading complete"));
374 Session::ensure_engine (uint32_t desired_sample_rate)
376 if (_engine.current_backend() == 0) {
377 /* backend is unknown ... */
378 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
379 if (r.get_value_or (-1) != 0) {
382 } else if (_engine.setup_required()) {
383 /* backend is known, but setup is needed */
384 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
385 if (r.get_value_or (-1) != 0) {
388 } else if (!_engine.running()) {
389 if (_engine.start()) {
394 /* at this point the engine should be running
397 if (!_engine.running()) {
401 return immediately_post_engine ();
406 Session::immediately_post_engine ()
408 /* Do various initializations that should take place directly after we
409 * know that the engine is running, but before we either create a
410 * session or set state for an existing one.
413 if (how_many_dsp_threads () > 1) {
414 /* For now, only create the graph if we are using >1 DSP threads, as
415 it is a bit slower than the old code with 1 thread.
417 _process_graph.reset (new Graph (*this));
420 /* every time we reconnect, recompute worst case output latencies */
422 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
424 if (synced_to_engine()) {
425 _engine.transport_stop ();
428 if (config.get_jack_time_master()) {
429 _engine.transport_locate (_transport_frame);
433 BootMessage (_("Set up LTC"));
435 BootMessage (_("Set up Click"));
437 BootMessage (_("Set up standard connections"));
441 catch (failed_constructor& err) {
451 vector<void*> debug_pointers;
453 /* if we got to here, leaving pending capture state around
457 remove_pending_capture_state ();
459 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
461 /* disconnect from any and all signals that we are connected to */
465 _engine.remove_session ();
467 /* deregister all ports - there will be no process or any other
468 * callbacks from the engine any more.
471 Port::PortDrop (); /* EMIT SIGNAL */
475 /* clear history so that no references to objects are held any more */
479 /* clear state tree so that no references to objects are held any more */
484 /* reset dynamic state version back to default */
486 Stateful::loading_state_version = 0;
488 _butler->drop_references ();
492 delete _all_route_group;
494 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
495 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
499 if (click_data != default_click) {
500 delete [] click_data;
503 if (click_emphasis_data != default_click_emphasis) {
504 delete [] click_emphasis_data;
509 /* need to remove auditioner before monitoring section
510 * otherwise it is re-connected */
513 /* drop references to routes held by the monitoring section
514 * specifically _monitor_out aux/listen references */
515 remove_monitor_section();
517 /* clear out any pending dead wood from RCU managed objects */
522 AudioDiskstream::free_working_buffers();
524 /* tell everyone who is still standing that we're about to die */
527 /* tell everyone to drop references and delete objects as we go */
529 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
530 RegionFactory::delete_all_regions ();
532 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
534 /* reset these three references to special routes before we do the usual route delete thing */
536 _master_out.reset ();
537 _monitor_out.reset ();
540 RCUWriter<RouteList> writer (routes);
541 boost::shared_ptr<RouteList> r = writer.get_copy ();
543 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
544 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
545 (*i)->drop_references ();
549 /* writer goes out of scope and updates master */
554 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
555 Glib::Threads::Mutex::Lock lm (source_lock);
556 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
557 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
558 i->second->drop_references ();
564 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
567 delete _scene_changer; _scene_changer = 0;
568 delete midi_control_ui; midi_control_ui = 0;
570 delete _mmc; _mmc = 0;
571 delete _midi_ports; _midi_ports = 0;
572 delete _locations; _locations = 0;
574 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
576 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
577 boost_debug_list_ptrs ();
582 Session::setup_ltc ()
586 _ltc_input.reset (new IO (*this, X_("LTC In"), IO::Input));
587 _ltc_output.reset (new IO (*this, X_("LTC Out"), IO::Output));
589 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC In"))) != 0) {
590 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
593 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
594 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
596 reconnect_ltc_input ();
599 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC Out"))) != 0) {
600 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
603 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
604 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
606 reconnect_ltc_output ();
609 /* fix up names of LTC ports because we don't want the normal
610 * IO style of NAME/TYPE-{in,out}N
613 _ltc_input->nth (0)->set_name (X_("LTC-in"));
614 _ltc_output->nth (0)->set_name (X_("LTC-out"));
618 Session::setup_click ()
621 _click_io.reset (new ClickIO (*this, X_("Click")));
622 _click_gain.reset (new Amp (*this));
623 _click_gain->activate ();
625 setup_click_state (state_tree->root());
627 setup_click_state (0);
632 Session::setup_click_state (const XMLNode* node)
634 const XMLNode* child = 0;
636 if (node && (child = find_named_node (*node, "Click")) != 0) {
638 /* existing state for Click */
641 if (Stateful::loading_state_version < 3000) {
642 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
644 const XMLNodeList& children (child->children());
645 XMLNodeList::const_iterator i = children.begin();
646 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
648 if (i != children.end()) {
649 c = _click_gain->set_state (**i, Stateful::loading_state_version);
655 _clicking = Config->get_clicking ();
659 error << _("could not setup Click I/O") << endmsg;
666 /* default state for Click: dual-mono to first 2 physical outputs */
669 _engine.get_physical_outputs (DataType::AUDIO, outs);
671 for (uint32_t physport = 0; physport < 2; ++physport) {
672 if (outs.size() > physport) {
673 if (_click_io->add_port (outs[physport], this)) {
674 // relax, even though its an error
679 if (_click_io->n_ports () > ChanCount::ZERO) {
680 _clicking = Config->get_clicking ();
686 Session::setup_bundles ()
688 vector<string> inputs[DataType::num_types];
689 vector<string> outputs[DataType::num_types];
690 for (uint32_t i = 0; i < DataType::num_types; ++i) {
691 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
692 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
695 /* Create a set of Bundle objects that map
696 to the physical I/O currently available. We create both
697 mono and stereo bundles, so that the common cases of mono
698 and stereo tracks get bundles to put in their mixer strip
699 in / out menus. There may be a nicer way of achieving that;
700 it doesn't really scale that well to higher channel counts
703 /* mono output bundles */
705 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
707 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
709 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
710 c->add_channel (_("mono"), DataType::AUDIO);
711 c->set_port (0, outputs[DataType::AUDIO][np]);
716 /* stereo output bundles */
718 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
719 if (np + 1 < outputs[DataType::AUDIO].size()) {
721 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
722 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
723 c->add_channel (_("L"), DataType::AUDIO);
724 c->set_port (0, outputs[DataType::AUDIO][np]);
725 c->add_channel (_("R"), DataType::AUDIO);
726 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
732 /* mono input bundles */
734 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
736 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
738 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
739 c->add_channel (_("mono"), DataType::AUDIO);
740 c->set_port (0, inputs[DataType::AUDIO][np]);
745 /* stereo input bundles */
747 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
748 if (np + 1 < inputs[DataType::AUDIO].size()) {
750 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
752 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
753 c->add_channel (_("L"), DataType::AUDIO);
754 c->set_port (0, inputs[DataType::AUDIO][np]);
755 c->add_channel (_("R"), DataType::AUDIO);
756 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
762 /* MIDI input bundles */
764 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
765 string n = inputs[DataType::MIDI][np];
766 boost::erase_first (n, X_("alsa_pcm:"));
768 boost::shared_ptr<Bundle> c (new Bundle (n, false));
769 c->add_channel ("", DataType::MIDI);
770 c->set_port (0, inputs[DataType::MIDI][np]);
774 /* MIDI output bundles */
776 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
777 string n = outputs[DataType::MIDI][np];
778 boost::erase_first (n, X_("alsa_pcm:"));
780 boost::shared_ptr<Bundle> c (new Bundle (n, true));
781 c->add_channel ("", DataType::MIDI);
782 c->set_port (0, outputs[DataType::MIDI][np]);
789 Session::auto_connect_master_bus ()
791 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
795 /* if requested auto-connect the outputs to the first N physical ports.
798 uint32_t limit = _master_out->n_outputs().n_total();
799 vector<string> outputs[DataType::num_types];
801 for (uint32_t i = 0; i < DataType::num_types; ++i) {
802 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
805 for (uint32_t n = 0; n < limit; ++n) {
806 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
808 if (outputs[p->type()].size() > n) {
809 connect_to = outputs[p->type()][n];
812 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
813 if (_master_out->output()->connect (p, connect_to, this)) {
814 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
823 Session::remove_monitor_section ()
829 /* force reversion to Solo-In-Place */
830 Config->set_solo_control_is_listen_control (false);
832 /* if we are auditioning, cancel it ... this is a workaround
833 to a problem (auditioning does not execute the process graph,
834 which is needed to remove routes when using >1 core for processing)
839 /* Hold process lock while doing this so that we don't hear bits and
840 * pieces of audio as we work on each route.
843 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
845 /* Connect tracks to monitor section. Note that in an
846 existing session, the internal sends will already exist, but we want the
847 routes to notice that they connect to the control out specifically.
851 boost::shared_ptr<RouteList> r = routes.reader ();
852 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
854 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
856 if ((*x)->is_monitor()) {
858 } else if ((*x)->is_master()) {
861 (*x)->remove_aux_or_listen (_monitor_out);
866 remove_route (_monitor_out);
867 auto_connect_master_bus ();
870 auditioner->connect ();
875 Session::add_monitor_section ()
879 if (_monitor_out || !_master_out) {
883 boost::shared_ptr<Route> r (new Route (*this, _("Monitor"), Route::MonitorOut, DataType::AUDIO));
889 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
890 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
893 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
894 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
895 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
899 add_routes (rl, false, false, false);
901 assert (_monitor_out);
903 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
904 are undefined, at best.
907 uint32_t limit = _monitor_out->n_inputs().n_audio();
911 /* connect the inputs to the master bus outputs. this
912 * represents a separate data feed from the internal sends from
913 * each route. as of jan 2011, it allows the monitor section to
914 * conditionally ignore either the internal sends or the normal
915 * input feed, but we should really find a better way to do
919 _master_out->output()->disconnect (this);
921 for (uint32_t n = 0; n < limit; ++n) {
922 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
923 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
926 string connect_to = o->name();
927 if (_monitor_out->input()->connect (p, connect_to, this)) {
928 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
936 /* if monitor section is not connected, connect it to physical outs
939 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
941 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
943 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
946 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
948 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
949 Config->get_monitor_bus_preferred_bundle())
955 /* Monitor bus is audio only */
957 vector<string> outputs[DataType::num_types];
959 for (uint32_t i = 0; i < DataType::num_types; ++i) {
960 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
963 uint32_t mod = outputs[DataType::AUDIO].size();
964 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
968 for (uint32_t n = 0; n < limit; ++n) {
970 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
972 if (outputs[DataType::AUDIO].size() > (n % mod)) {
973 connect_to = outputs[DataType::AUDIO][n % mod];
976 if (!connect_to.empty()) {
977 if (_monitor_out->output()->connect (p, connect_to, this)) {
978 error << string_compose (
979 _("cannot connect control output %1 to %2"),
990 /* Hold process lock while doing this so that we don't hear bits and
991 * pieces of audio as we work on each route.
994 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
996 /* Connect tracks to monitor section. Note that in an
997 existing session, the internal sends will already exist, but we want the
998 routes to notice that they connect to the control out specifically.
1002 boost::shared_ptr<RouteList> rls = routes.reader ();
1004 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1006 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1008 if ((*x)->is_monitor()) {
1010 } else if ((*x)->is_master()) {
1013 (*x)->enable_monitor_send ();
1018 auditioner->connect ();
1023 Session::hookup_io ()
1025 /* stop graph reordering notifications from
1026 causing resorts, etc.
1029 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
1033 /* we delay creating the auditioner till now because
1034 it makes its own connections to ports.
1038 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
1040 throw failed_constructor ();
1042 a->use_new_diskstream ();
1046 catch (failed_constructor& err) {
1047 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
1051 /* load bundles, which we may have postponed earlier on */
1052 if (_bundle_xml_node) {
1053 load_bundles (*_bundle_xml_node);
1054 delete _bundle_xml_node;
1057 /* Tell all IO objects to connect themselves together */
1059 IO::enable_connecting ();
1061 /* Now tell all "floating" ports to connect to whatever
1062 they should be connected to.
1065 AudioEngine::instance()->reconnect_ports ();
1067 /* Anyone who cares about input state, wake up and do something */
1069 IOConnectionsComplete (); /* EMIT SIGNAL */
1071 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
1073 /* now handle the whole enchilada as if it was one
1074 graph reorder event.
1079 /* update the full solo state, which can't be
1080 correctly determined on a per-route basis, but
1081 needs the global overview that only the session
1085 update_route_solo_state ();
1089 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
1091 boost::shared_ptr<Track> track = wp.lock ();
1096 boost::shared_ptr<Playlist> playlist;
1098 if ((playlist = track->playlist()) != 0) {
1099 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
1100 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
1101 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
1106 Session::record_enabling_legal () const
1108 /* this used to be in here, but survey says.... we don't need to restrict it */
1109 // if (record_status() == Recording) {
1113 if (Config->get_all_safe()) {
1120 Session::set_track_monitor_input_status (bool yn)
1122 boost::shared_ptr<RouteList> rl = routes.reader ();
1123 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1124 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1125 if (tr && tr->record_enabled ()) {
1126 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1127 tr->request_input_monitoring (yn);
1133 Session::auto_punch_start_changed (Location* location)
1135 replace_event (SessionEvent::PunchIn, location->start());
1137 if (get_record_enabled() && config.get_punch_in()) {
1138 /* capture start has been changed, so save new pending state */
1139 save_state ("", true);
1144 Session::auto_punch_end_changed (Location* location)
1146 framepos_t when_to_stop = location->end();
1147 // when_to_stop += _worst_output_latency + _worst_input_latency;
1148 replace_event (SessionEvent::PunchOut, when_to_stop);
1152 Session::auto_punch_changed (Location* location)
1154 framepos_t when_to_stop = location->end();
1156 replace_event (SessionEvent::PunchIn, location->start());
1157 //when_to_stop += _worst_output_latency + _worst_input_latency;
1158 replace_event (SessionEvent::PunchOut, when_to_stop);
1161 /** @param loc A loop location.
1162 * @param pos Filled in with the start time of the required fade-out (in session frames).
1163 * @param length Filled in with the length of the required fade-out.
1166 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
1168 pos = max (loc->start(), loc->end() - 64);
1169 length = loc->end() - pos;
1173 Session::auto_loop_changed (Location* location)
1175 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1178 auto_loop_declick_range (location, dcp, dcl);
1179 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1181 if (transport_rolling() && play_loop) {
1184 // if (_transport_frame > location->end()) {
1186 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1187 // relocate to beginning of loop
1188 clear_events (SessionEvent::LocateRoll);
1190 request_locate (location->start(), true);
1193 else if (Config->get_seamless_loop() && !loop_changing) {
1195 // schedule a locate-roll to refill the diskstreams at the
1196 // previous loop end
1197 loop_changing = true;
1199 if (location->end() > last_loopend) {
1200 clear_events (SessionEvent::LocateRoll);
1201 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1208 last_loopend = location->end();
1213 Session::set_auto_punch_location (Location* location)
1217 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1218 punch_connections.drop_connections();
1219 existing->set_auto_punch (false, this);
1220 remove_event (existing->start(), SessionEvent::PunchIn);
1221 clear_events (SessionEvent::PunchOut);
1222 auto_punch_location_changed (0);
1227 if (location == 0) {
1231 if (location->end() <= location->start()) {
1232 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1236 punch_connections.drop_connections ();
1238 location->StartChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, location));
1239 location->EndChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, location));
1240 location->Changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, location));
1242 location->set_auto_punch (true, this);
1244 auto_punch_changed (location);
1246 auto_punch_location_changed (location);
1250 Session::set_session_extents (framepos_t start, framepos_t end)
1253 if ((existing = _locations->session_range_location()) == 0) {
1254 //if there is no existing session, we need to make a new session location (should never happen)
1255 existing = new Location (*this, 0, 0, _("session"), Location::IsSessionRange);
1259 error << _("Session: you can't use that location for session start/end)") << endmsg;
1263 existing->set( start, end );
1269 Session::set_auto_loop_location (Location* location)
1273 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1274 loop_connections.drop_connections ();
1275 existing->set_auto_loop (false, this);
1276 remove_event (existing->end(), SessionEvent::AutoLoop);
1279 auto_loop_declick_range (existing, dcp, dcl);
1280 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1281 auto_loop_location_changed (0);
1286 if (location == 0) {
1290 if (location->end() <= location->start()) {
1291 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1295 last_loopend = location->end();
1297 loop_connections.drop_connections ();
1299 location->StartChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1300 location->EndChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1301 location->Changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1303 location->set_auto_loop (true, this);
1305 /* take care of our stuff first */
1307 auto_loop_changed (location);
1309 /* now tell everyone else */
1311 auto_loop_location_changed (location);
1315 Session::update_loop (Location*)
1321 Session::update_marks (Location*)
1327 Session::update_skips (Location* loc, bool consolidate)
1329 if (_ignore_skips_updates) {
1333 Locations::LocationList skips;
1336 PBD::Unwinder<bool> uw (_ignore_skips_updates, true);
1337 consolidate_skips (loc);
1340 sync_locations_to_skips ();
1346 Session::consolidate_skips (Location* loc)
1348 Locations::LocationList all_locations = _locations->list ();
1350 for (Locations::LocationList::iterator l = all_locations.begin(); l != all_locations.end(); ) {
1352 if (!(*l)->is_skip ()) {
1357 /* don't test against self */
1364 switch (Evoral::coverage ((*l)->start(), (*l)->end(), loc->start(), loc->end())) {
1365 case Evoral::OverlapInternal:
1366 case Evoral::OverlapExternal:
1367 case Evoral::OverlapStart:
1368 case Evoral::OverlapEnd:
1369 /* adjust new location to cover existing one */
1370 loc->set_start (min (loc->start(), (*l)->start()));
1371 loc->set_end (max (loc->end(), (*l)->end()));
1372 /* we don't need this one any more */
1373 _locations->remove (*l);
1374 /* the location has been deleted, so remove reference to it in our local list */
1375 l = all_locations.erase (l);
1378 case Evoral::OverlapNone:
1386 Session::sync_locations_to_skips ()
1388 /* This happens asynchronously (in the audioengine thread). After the clear is done, we will call
1389 * Session::_sync_locations_to_skips() from the audioengine thread.
1391 clear_events (SessionEvent::Skip, boost::bind (&Session::_sync_locations_to_skips, this));
1395 Session::_sync_locations_to_skips ()
1397 /* called as a callback after existing Skip events have been cleared from a realtime audioengine thread */
1399 Locations::LocationList const & locs (_locations->list());
1401 for (Locations::LocationList::const_iterator i = locs.begin(); i != locs.end(); ++i) {
1403 Location* location = *i;
1405 if (location->is_skip() && location->is_skipping()) {
1406 SessionEvent* ev = new SessionEvent (SessionEvent::Skip, SessionEvent::Add, location->start(), location->end(), 1.0);
1414 Session::location_added (Location *location)
1416 if (location->is_auto_punch()) {
1417 set_auto_punch_location (location);
1420 if (location->is_auto_loop()) {
1421 set_auto_loop_location (location);
1424 if (location->is_session_range()) {
1425 /* no need for any signal handling or event setting with the session range,
1426 because we keep a direct reference to it and use its start/end directly.
1428 _session_range_location = location;
1431 if (location->is_skip()) {
1432 /* listen for per-location signals that require us to update skip-locate events */
1434 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1435 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1436 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1437 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, false));
1439 update_skips (location, true);
1446 Session::location_removed (Location *location)
1448 if (location->is_auto_loop()) {
1449 set_auto_loop_location (0);
1450 set_track_loop (false);
1453 if (location->is_auto_punch()) {
1454 set_auto_punch_location (0);
1457 if (location->is_session_range()) {
1458 /* this is never supposed to happen */
1459 error << _("programming error: session range removed!") << endl;
1462 if (location->is_skip()) {
1464 update_skips (location, false);
1471 Session::locations_changed ()
1473 _locations->apply (*this, &Session::_locations_changed);
1477 Session::_locations_changed (const Locations::LocationList& locations)
1479 /* There was some mass-change in the Locations object.
1481 We might be re-adding a location here but it doesn't actually matter
1482 for all the locations that the Session takes an interest in.
1485 for (Locations::LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
1486 location_added (*i);
1491 Session::enable_record ()
1493 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1494 /* no recording at anything except normal speed */
1499 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1501 if (rs == Recording) {
1505 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1507 _last_record_location = _transport_frame;
1508 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1510 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1511 set_track_monitor_input_status (true);
1514 RecordStateChanged ();
1521 Session::disable_record (bool rt_context, bool force)
1525 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1527 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1528 g_atomic_int_set (&_record_status, Disabled);
1529 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1531 if (rs == Recording) {
1532 g_atomic_int_set (&_record_status, Enabled);
1536 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1537 set_track_monitor_input_status (false);
1540 RecordStateChanged (); /* emit signal */
1543 remove_pending_capture_state ();
1549 Session::step_back_from_record ()
1551 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1553 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1554 set_track_monitor_input_status (false);
1557 RecordStateChanged (); /* emit signal */
1562 Session::maybe_enable_record ()
1564 if (_step_editors > 0) {
1568 g_atomic_int_set (&_record_status, Enabled);
1570 /* This function is currently called from somewhere other than an RT thread.
1571 This save_state() call therefore doesn't impact anything. Doing it here
1572 means that we save pending state of which sources the next record will use,
1573 which gives us some chance of recovering from a crash during the record.
1576 save_state ("", true);
1578 if (_transport_speed) {
1579 if (!config.get_punch_in()) {
1583 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1584 RecordStateChanged (); /* EMIT SIGNAL */
1591 Session::audible_frame () const
1597 offset = worst_playback_latency ();
1599 if (synced_to_engine()) {
1600 /* Note: this is basically just sync-to-JACK */
1601 tf = _engine.transport_frame();
1603 tf = _transport_frame;
1608 if (!non_realtime_work_pending()) {
1612 /* Check to see if we have passed the first guaranteed
1613 audible frame past our last start position. if not,
1614 return that last start point because in terms
1615 of audible frames, we have not moved yet.
1617 `Start position' in this context means the time we last
1618 either started, located, or changed transport direction.
1621 if (_transport_speed > 0.0f) {
1623 if (!play_loop || !have_looped) {
1624 if (tf < _last_roll_or_reversal_location + offset) {
1625 return _last_roll_or_reversal_location;
1633 } else if (_transport_speed < 0.0f) {
1635 /* XXX wot? no backward looping? */
1637 if (tf > _last_roll_or_reversal_location - offset) {
1638 return _last_roll_or_reversal_location;
1650 Session::set_frame_rate (framecnt_t frames_per_second)
1652 /** \fn void Session::set_frame_size(framecnt_t)
1653 the AudioEngine object that calls this guarantees
1654 that it will not be called while we are also in
1655 ::process(). Its fine to do things that block
1659 _base_frame_rate = frames_per_second;
1660 _nominal_frame_rate = frames_per_second;
1666 // XXX we need some equivalent to this, somehow
1667 // SndFileSource::setup_standard_crossfades (frames_per_second);
1671 /* XXX need to reset/reinstantiate all LADSPA plugins */
1675 Session::set_block_size (pframes_t nframes)
1677 /* the AudioEngine guarantees
1678 that it will not be called while we are also in
1679 ::process(). It is therefore fine to do things that block
1684 current_block_size = nframes;
1688 boost::shared_ptr<RouteList> r = routes.reader ();
1690 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1691 (*i)->set_block_size (nframes);
1694 boost::shared_ptr<RouteList> rl = routes.reader ();
1695 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1696 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1698 tr->set_block_size (nframes);
1702 set_worst_io_latencies ();
1708 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1710 boost::shared_ptr<Route> r2;
1712 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1713 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1717 /* make a copy of the existing list of routes that feed r1 */
1719 Route::FedBy existing (r1->fed_by());
1721 /* for each route that feeds r1, recurse, marking it as feeding
1725 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1726 if (!(r2 = i->r.lock ())) {
1727 /* (*i) went away, ignore it */
1731 /* r2 is a route that feeds r1 which somehow feeds base. mark
1732 base as being fed by r2
1735 rbase->add_fed_by (r2, i->sends_only);
1739 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1743 if (r1->feeds (r2) && r2->feeds (r1)) {
1747 /* now recurse, so that we can mark base as being fed by
1748 all routes that feed r2
1751 trace_terminal (r2, rbase);
1758 Session::resort_routes ()
1760 /* don't do anything here with signals emitted
1761 by Routes during initial setup or while we
1762 are being destroyed.
1765 if (_state_of_the_state & (InitialConnecting | Deletion)) {
1770 RCUWriter<RouteList> writer (routes);
1771 boost::shared_ptr<RouteList> r = writer.get_copy ();
1772 resort_routes_using (r);
1773 /* writer goes out of scope and forces update */
1777 boost::shared_ptr<RouteList> rl = routes.reader ();
1778 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1779 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1781 const Route::FedBy& fb ((*i)->fed_by());
1783 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1784 boost::shared_ptr<Route> sf = f->r.lock();
1786 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1794 /** This is called whenever we need to rebuild the graph of how we will process
1796 * @param r List of routes, in any order.
1800 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1802 /* We are going to build a directed graph of our routes;
1803 this is where the edges of that graph are put.
1808 /* Go through all routes doing two things:
1810 * 1. Collect the edges of the route graph. Each of these edges
1811 * is a pair of routes, one of which directly feeds the other
1812 * either by a JACK connection or by an internal send.
1814 * 2. Begin the process of making routes aware of which other
1815 * routes directly or indirectly feed them. This information
1816 * is used by the solo code.
1819 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1821 /* Clear out the route's list of direct or indirect feeds */
1822 (*i)->clear_fed_by ();
1824 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
1826 bool via_sends_only;
1828 /* See if this *j feeds *i according to the current state of the JACK
1829 connections and internal sends.
1831 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
1832 /* add the edge to the graph (part #1) */
1833 edges.add (*j, *i, via_sends_only);
1834 /* tell the route (for part #2) */
1835 (*i)->add_fed_by (*j, via_sends_only);
1840 /* Attempt a topological sort of the route graph */
1841 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
1843 if (sorted_routes) {
1844 /* We got a satisfactory topological sort, so there is no feedback;
1847 Note: the process graph rechain does not require a
1848 topologically-sorted list, but hey ho.
1850 if (_process_graph) {
1851 _process_graph->rechain (sorted_routes, edges);
1854 _current_route_graph = edges;
1856 /* Complete the building of the routes' lists of what directly
1857 or indirectly feeds them.
1859 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1860 trace_terminal (*i, *i);
1863 *r = *sorted_routes;
1866 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1867 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1868 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1869 (*i)->name(), (*i)->order_key ()));
1873 SuccessfulGraphSort (); /* EMIT SIGNAL */
1876 /* The topological sort failed, so we have a problem. Tell everyone
1877 and stick to the old graph; this will continue to be processed, so
1878 until the feedback is fixed, what is played back will not quite
1879 reflect what is actually connected. Note also that we do not
1880 do trace_terminal here, as it would fail due to an endless recursion,
1881 so the solo code will think that everything is still connected
1885 FeedbackDetected (); /* EMIT SIGNAL */
1890 /** Find a route name starting with \a base, maybe followed by the
1891 * lowest \a id. \a id will always be added if \a definitely_add_number
1892 * is true on entry; otherwise it will only be added if required
1893 * to make the name unique.
1895 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1896 * The available route name with the lowest ID will be used, and \a id
1897 * will be set to the ID.
1899 * \return false if a route name could not be found, and \a track_name
1900 * and \a id do not reflect a free route name.
1903 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1905 if (!definitely_add_number && route_by_name (base) == 0) {
1906 /* juse use the base */
1907 snprintf (name, name_len, "%s", base.c_str());
1912 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1914 if (route_by_name (name) == 0) {
1920 } while (id < (UINT_MAX-1));
1925 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
1927 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
1929 in = ChanCount::ZERO;
1930 out = ChanCount::ZERO;
1932 boost::shared_ptr<RouteList> r = routes.reader ();
1934 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1935 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1936 if (tr && !tr->is_auditioner()) {
1937 in += tr->n_inputs();
1938 out += tr->n_outputs();
1943 /** Caller must not hold process lock
1944 * @param name_template string to use for the start of the name, or "" to use "MIDI".
1945 * @param instrument plugin info for the instrument to insert pre-fader, if any
1947 list<boost::shared_ptr<MidiTrack> >
1948 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
1949 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1951 char track_name[32];
1952 uint32_t track_id = 0;
1954 RouteList new_routes;
1955 list<boost::shared_ptr<MidiTrack> > ret;
1957 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
1960 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1961 error << "cannot find name for new midi track" << endmsg;
1965 boost::shared_ptr<MidiTrack> track;
1968 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1970 if (track->init ()) {
1974 track->use_new_diskstream();
1976 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1977 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1980 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1981 if (track->input()->ensure_io (input, false, this)) {
1982 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
1986 if (track->output()->ensure_io (output, false, this)) {
1987 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
1992 track->non_realtime_input_change();
1995 route_group->add (track);
1998 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2000 if (Config->get_remote_model() == UserOrdered) {
2001 track->set_remote_control_id (next_control_id());
2004 new_routes.push_back (track);
2005 ret.push_back (track);
2008 catch (failed_constructor &err) {
2009 error << _("Session: could not create new midi track.") << endmsg;
2013 catch (AudioEngine::PortRegistrationFailure& pfe) {
2015 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;
2023 if (!new_routes.empty()) {
2024 StateProtector sp (this);
2025 add_routes (new_routes, true, true, true);
2028 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
2029 PluginPtr plugin = instrument->load (*this);
2030 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2031 (*r)->add_processor (p, PreFader);
2041 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2043 boost::shared_ptr<Route> midi_track (wmt.lock());
2049 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2051 if (change.after.n_audio() <= change.before.n_audio()) {
2055 /* new audio ports: make sure the audio goes somewhere useful,
2056 unless the user has no-auto-connect selected.
2058 The existing ChanCounts don't matter for this call as they are only
2059 to do with matching input and output indices, and we are only changing
2065 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
2069 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
2070 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
2071 * @param output_start As \a input_start, but for outputs.
2074 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
2075 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
2077 if (!IO::connecting_legal) {
2081 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2087 /* If both inputs and outputs are auto-connected to physical ports,
2088 use the max of input and output offsets to ensure auto-connected
2089 port numbers always match up (e.g. the first audio input and the
2090 first audio output of the route will have the same physical
2091 port number). Otherwise just use the lowest input or output
2095 DEBUG_TRACE (DEBUG::Graph,
2096 string_compose("Auto-connect: existing in = %1 out = %2\n",
2097 existing_inputs, existing_outputs));
2099 const bool in_out_physical =
2100 (Config->get_input_auto_connect() & AutoConnectPhysical)
2101 && (Config->get_output_auto_connect() & AutoConnectPhysical)
2104 const ChanCount in_offset = in_out_physical
2105 ? ChanCount::max(existing_inputs, existing_outputs)
2108 const ChanCount out_offset = in_out_physical
2109 ? ChanCount::max(existing_inputs, existing_outputs)
2112 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2113 vector<string> physinputs;
2114 vector<string> physoutputs;
2116 _engine.get_physical_outputs (*t, physoutputs);
2117 _engine.get_physical_inputs (*t, physinputs);
2119 if (!physinputs.empty() && connect_inputs) {
2120 uint32_t nphysical_in = physinputs.size();
2122 DEBUG_TRACE (DEBUG::Graph,
2123 string_compose("There are %1 physical inputs of type %2\n",
2126 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
2129 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
2130 DEBUG_TRACE (DEBUG::Graph,
2131 string_compose("Get index %1 + %2 % %3 = %4\n",
2132 in_offset.get(*t), i, nphysical_in,
2133 (in_offset.get(*t) + i) % nphysical_in));
2134 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
2137 DEBUG_TRACE (DEBUG::Graph,
2138 string_compose("Connect route %1 IN to %2\n",
2139 route->name(), port));
2141 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
2145 ChanCount one_added (*t, 1);
2146 existing_inputs += one_added;
2150 if (!physoutputs.empty()) {
2151 uint32_t nphysical_out = physoutputs.size();
2152 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
2155 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
2156 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
2157 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
2158 /* master bus is audio only */
2159 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
2160 port = _master_out->input()->ports().port(*t,
2161 i % _master_out->input()->n_ports().get(*t))->name();
2165 DEBUG_TRACE (DEBUG::Graph,
2166 string_compose("Connect route %1 OUT to %2\n",
2167 route->name(), port));
2169 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
2173 ChanCount one_added (*t, 1);
2174 existing_outputs += one_added;
2181 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2183 /* TRX does stuff here, ardour does not (but probably should). This is called after an engine reset (in particular).
2188 /** Caller must not hold process lock
2189 * @param name_template string to use for the start of the name, or "" to use "Audio".
2191 list< boost::shared_ptr<AudioTrack> >
2192 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
2193 uint32_t how_many, string name_template)
2195 char track_name[32];
2196 uint32_t track_id = 0;
2198 RouteList new_routes;
2199 list<boost::shared_ptr<AudioTrack> > ret;
2201 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
2204 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
2205 error << "cannot find name for new audio track" << endmsg;
2209 boost::shared_ptr<AudioTrack> track;
2212 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
2214 if (track->init ()) {
2218 track->use_new_diskstream();
2220 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2221 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2224 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2226 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2227 error << string_compose (
2228 _("cannot configure %1 in/%2 out configuration for new audio track"),
2229 input_channels, output_channels)
2234 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2235 error << string_compose (
2236 _("cannot configure %1 in/%2 out configuration for new audio track"),
2237 input_channels, output_channels)
2244 route_group->add (track);
2247 track->non_realtime_input_change();
2249 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2250 if (Config->get_remote_model() == UserOrdered) {
2251 track->set_remote_control_id (next_control_id());
2254 new_routes.push_back (track);
2255 ret.push_back (track);
2258 catch (failed_constructor &err) {
2259 error << _("Session: could not create new audio track.") << endmsg;
2263 catch (AudioEngine::PortRegistrationFailure& pfe) {
2265 error << pfe.what() << endmsg;
2273 if (!new_routes.empty()) {
2274 StateProtector sp (this);
2275 add_routes (new_routes, true, true, true);
2281 /** Caller must not hold process lock.
2282 * @param name_template string to use for the start of the name, or "" to use "Bus".
2285 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
2288 uint32_t bus_id = 0;
2292 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
2295 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
2296 error << "cannot find name for new audio bus" << endmsg;
2301 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
2307 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2308 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
2311 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2313 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2314 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2315 input_channels, output_channels)
2321 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2322 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2323 input_channels, output_channels)
2330 route_group->add (bus);
2332 if (Config->get_remote_model() == UserOrdered) {
2333 bus->set_remote_control_id (next_control_id());
2336 bus->add_internal_return ();
2338 ret.push_back (bus);
2344 catch (failed_constructor &err) {
2345 error << _("Session: could not create new audio route.") << endmsg;
2349 catch (AudioEngine::PortRegistrationFailure& pfe) {
2350 error << pfe.what() << endmsg;
2360 StateProtector sp (this);
2361 add_routes (ret, false, true, true); // autoconnect outputs only
2369 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base)
2372 uint32_t control_id;
2374 uint32_t number = 0;
2375 const uint32_t being_added = how_many;
2377 if (!tree.read (template_path.c_str())) {
2381 XMLNode* node = tree.root();
2383 IO::disable_connecting ();
2385 control_id = next_control_id ();
2389 XMLNode node_copy (*node);
2391 /* Remove IDs of everything so that new ones are used */
2392 node_copy.remove_property_recursively (X_("id"));
2397 if (!name_base.empty()) {
2399 /* if we're adding more than one routes, force
2400 * all the names of the new routes to be
2401 * numbered, via the final parameter.
2404 if (!find_route_name (name_base.c_str(), ++number, name, sizeof(name), (being_added > 1))) {
2405 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2411 string const route_name = node_copy.property(X_("name"))->value ();
2413 /* generate a new name by adding a number to the end of the template name */
2414 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2415 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2416 abort(); /*NOTREACHED*/
2420 /* set this name in the XML description that we are about to use */
2421 Route::set_name_in_state (node_copy, name);
2423 /* trim bitslots from listen sends so that new ones are used */
2424 XMLNodeList children = node_copy.children ();
2425 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2426 if ((*i)->name() == X_("Processor")) {
2427 XMLProperty* role = (*i)->property (X_("role"));
2428 if (role && role->value() == X_("Listen")) {
2429 (*i)->remove_property (X_("bitslot"));
2434 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2437 error << _("Session: cannot create track/bus from template description") << endmsg;
2441 if (boost::dynamic_pointer_cast<Track>(route)) {
2442 /* force input/output change signals so that the new diskstream
2443 picks up the configuration of the route. During session
2444 loading this normally happens in a different way.
2447 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2449 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2450 change.after = route->input()->n_ports();
2451 route->input()->changed (change, this);
2452 change.after = route->output()->n_ports();
2453 route->output()->changed (change, this);
2456 route->set_remote_control_id (control_id);
2459 ret.push_back (route);
2462 catch (failed_constructor &err) {
2463 error << _("Session: could not create new route from template") << endmsg;
2467 catch (AudioEngine::PortRegistrationFailure& pfe) {
2468 error << pfe.what() << endmsg;
2477 StateProtector sp (this);
2478 add_routes (ret, true, true, true);
2479 IO::enable_connecting ();
2486 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
2489 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
2490 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
2493 error << _("Adding new tracks/busses failed") << endmsg;
2498 update_latency (true);
2499 update_latency (false);
2504 save_state (_current_snapshot_name);
2507 reassign_track_numbers();
2509 RouteAdded (new_routes); /* EMIT SIGNAL */
2513 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
2515 ChanCount existing_inputs;
2516 ChanCount existing_outputs;
2517 uint32_t order = next_control_id();
2519 if (_order_hint != 0) {
2520 order = _order_hint;
2524 count_existing_track_channels (existing_inputs, existing_outputs);
2527 RCUWriter<RouteList> writer (routes);
2528 boost::shared_ptr<RouteList> r = writer.get_copy ();
2529 r->insert (r->end(), new_routes.begin(), new_routes.end());
2531 /* if there is no control out and we're not in the middle of loading,
2532 resort the graph here. if there is a control out, we will resort
2533 toward the end of this method. if we are in the middle of loading,
2534 we will resort when done.
2537 if (!_monitor_out && IO::connecting_legal) {
2538 resort_routes_using (r);
2542 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2544 boost::weak_ptr<Route> wpr (*x);
2545 boost::shared_ptr<Route> r (*x);
2547 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2548 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2549 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2550 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2551 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2552 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2554 if (r->is_master()) {
2558 if (r->is_monitor()) {
2562 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2564 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2565 track_playlist_changed (boost::weak_ptr<Track> (tr));
2566 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2568 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2570 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2571 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2576 if (input_auto_connect || output_auto_connect) {
2577 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
2580 /* order keys are a GUI responsibility but we need to set up
2581 reasonable defaults because they also affect the remote control
2582 ID in most situations.
2585 if (!r->has_order_key ()) {
2586 if (r->is_auditioner()) {
2587 /* use an arbitrarily high value */
2588 r->set_order_key (UINT_MAX);
2590 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
2591 r->set_order_key (order);
2599 if (_monitor_out && IO::connecting_legal) {
2600 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
2602 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2603 if ((*x)->is_monitor()) {
2605 } else if ((*x)->is_master()) {
2608 (*x)->enable_monitor_send ();
2615 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2617 boost::shared_ptr<RouteList> r = routes.reader ();
2618 boost::shared_ptr<Send> s;
2620 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2621 if ((s = (*i)->internal_send_for (dest)) != 0) {
2622 s->amp()->gain_control()->set_value (0.0);
2628 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2630 boost::shared_ptr<RouteList> r = routes.reader ();
2631 boost::shared_ptr<Send> s;
2633 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2634 if ((s = (*i)->internal_send_for (dest)) != 0) {
2635 s->amp()->gain_control()->set_value (1.0);
2641 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2643 boost::shared_ptr<RouteList> r = routes.reader ();
2644 boost::shared_ptr<Send> s;
2646 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2647 if ((s = (*i)->internal_send_for (dest)) != 0) {
2648 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2653 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2655 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2657 boost::shared_ptr<RouteList> r = routes.reader ();
2658 boost::shared_ptr<RouteList> t (new RouteList);
2660 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2661 /* no MIDI sends because there are no MIDI busses yet */
2662 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2667 add_internal_sends (dest, p, t);
2671 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2673 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2674 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
2679 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
2681 add_internal_send (dest, sender->before_processor_for_index (index), sender);
2685 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
2687 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
2691 if (!dest->internal_return()) {
2692 dest->add_internal_return ();
2695 sender->add_aux_send (dest, before);
2701 Session::remove_route (boost::shared_ptr<Route> route)
2703 if (route == _master_out) {
2707 route->set_solo (false, this);
2710 RCUWriter<RouteList> writer (routes);
2711 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2715 /* deleting the master out seems like a dumb
2716 idea, but its more of a UI policy issue
2720 if (route == _master_out) {
2721 _master_out = boost::shared_ptr<Route> ();
2724 if (route == _monitor_out) {
2725 _monitor_out.reset ();
2728 /* writer goes out of scope, forces route list update */
2731 update_route_solo_state ();
2733 // We need to disconnect the route's inputs and outputs
2735 route->input()->disconnect (0);
2736 route->output()->disconnect (0);
2738 /* if the route had internal sends sending to it, remove them */
2739 if (route->internal_return()) {
2741 boost::shared_ptr<RouteList> r = routes.reader ();
2742 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2743 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2745 (*i)->remove_processor (s);
2750 /* if the monitoring section had a pointer to this route, remove it */
2751 if (_monitor_out && !route->is_master() && !route->is_monitor()) {
2752 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2753 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
2754 route->remove_aux_or_listen (_monitor_out);
2757 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2758 if (mt && mt->step_editing()) {
2759 if (_step_editors > 0) {
2764 update_latency_compensation ();
2767 /* Re-sort routes to remove the graph's current references to the one that is
2768 * going away, then flush old references out of the graph.
2772 if (_process_graph) {
2773 _process_graph->clear_other_chain ();
2776 /* get rid of it from the dead wood collection in the route list manager */
2778 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2782 /* try to cause everyone to drop their references */
2784 route->drop_references ();
2786 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2788 /* save the new state of the world */
2790 if (save_state (_current_snapshot_name)) {
2791 save_history (_current_snapshot_name);
2793 reassign_track_numbers();
2797 Session::route_mute_changed (void* /*src*/)
2803 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2805 boost::shared_ptr<Route> route = wpr.lock();
2807 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2811 if (route->listening_via_monitor ()) {
2813 if (Config->get_exclusive_solo()) {
2814 /* new listen: disable all other listen */
2815 boost::shared_ptr<RouteList> r = routes.reader ();
2816 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2817 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
2820 (*i)->set_listen (false, this);
2826 } else if (_listen_cnt > 0) {
2831 update_route_solo_state ();
2834 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2836 boost::shared_ptr<Route> route = wpr.lock ();
2839 /* should not happen */
2840 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2844 bool send_changed = false;
2846 if (route->solo_isolated()) {
2847 if (_solo_isolated_cnt == 0) {
2848 send_changed = true;
2850 _solo_isolated_cnt++;
2851 } else if (_solo_isolated_cnt > 0) {
2852 _solo_isolated_cnt--;
2853 if (_solo_isolated_cnt == 0) {
2854 send_changed = true;
2859 IsolatedChanged (); /* EMIT SIGNAL */
2864 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2866 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
2868 if (!self_solo_change) {
2869 // session doesn't care about changes to soloed-by-others
2873 if (solo_update_disabled) {
2875 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
2879 boost::shared_ptr<Route> route = wpr.lock ();
2882 boost::shared_ptr<RouteList> r = routes.reader ();
2885 if (route->self_soloed()) {
2891 RouteGroup* rg = route->route_group ();
2892 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
2894 if (delta == 1 && Config->get_exclusive_solo()) {
2896 /* new solo: disable all other solos, but not the group if its solo-enabled */
2898 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2899 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
2900 (leave_group_alone && ((*i)->route_group() == rg))) {
2903 (*i)->set_solo (false, this);
2907 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
2909 solo_update_disabled = true;
2911 RouteList uninvolved;
2913 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
2915 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2916 bool via_sends_only;
2917 bool in_signal_flow;
2919 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
2920 (leave_group_alone && ((*i)->route_group() == rg))) {
2924 in_signal_flow = false;
2926 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
2928 if ((*i)->feeds (route, &via_sends_only)) {
2929 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
2930 if (!via_sends_only) {
2931 if (!route->soloed_by_others_upstream()) {
2932 (*i)->mod_solo_by_others_downstream (delta);
2935 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
2937 in_signal_flow = true;
2939 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
2942 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
2944 if (route->feeds (*i, &via_sends_only)) {
2945 /* propagate solo upstream only if routing other than
2946 sends is involved, but do consider the other route
2947 (*i) to be part of the signal flow even if only
2950 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
2954 route->soloed_by_others_downstream(),
2955 route->soloed_by_others_upstream()));
2956 if (!via_sends_only) {
2957 if (!route->soloed_by_others_downstream()) {
2958 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
2959 (*i)->mod_solo_by_others_upstream (delta);
2961 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
2964 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
2966 in_signal_flow = true;
2968 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
2971 if (!in_signal_flow) {
2972 uninvolved.push_back (*i);
2976 solo_update_disabled = false;
2977 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
2979 update_route_solo_state (r);
2981 /* now notify that the mute state of the routes not involved in the signal
2982 pathway of the just-solo-changed route may have altered.
2985 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2986 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
2987 (*i)->mute_changed (this);
2990 SoloChanged (); /* EMIT SIGNAL */
2995 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2997 /* now figure out if anything that matters is soloed (or is "listening")*/
2999 bool something_soloed = false;
3000 uint32_t listeners = 0;
3001 uint32_t isolated = 0;
3004 r = routes.reader();
3007 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3008 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
3009 something_soloed = true;
3012 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
3013 if (Config->get_solo_control_is_listen_control()) {
3016 (*i)->set_listen (false, this);
3020 if ((*i)->solo_isolated()) {
3025 if (something_soloed != _non_soloed_outs_muted) {
3026 _non_soloed_outs_muted = something_soloed;
3027 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
3030 _listen_cnt = listeners;
3032 if (isolated != _solo_isolated_cnt) {
3033 _solo_isolated_cnt = isolated;
3034 IsolatedChanged (); /* EMIT SIGNAL */
3037 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
3038 something_soloed, listeners, isolated));
3041 boost::shared_ptr<RouteList>
3042 Session::get_routes_with_internal_returns() const
3044 boost::shared_ptr<RouteList> r = routes.reader ();
3045 boost::shared_ptr<RouteList> rl (new RouteList);
3047 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3048 if ((*i)->internal_return ()) {
3056 Session::io_name_is_legal (const std::string& name)
3058 boost::shared_ptr<RouteList> r = routes.reader ();
3060 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3061 if ((*i)->name() == name) {
3065 if ((*i)->has_io_processor_named (name)) {
3074 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
3077 vector<string> connections;
3079 /* if we are passed only a single route and we're not told to turn
3080 * others off, then just do the simple thing.
3083 if (flip_others == false && rl->size() == 1) {
3084 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
3086 mt->set_input_active (onoff);
3091 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
3093 PortSet& ps ((*rt)->input()->ports());
3095 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
3096 p->get_connections (connections);
3099 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
3100 routes_using_input_from (*s, rl2);
3103 /* scan all relevant routes to see if others are on or off */
3105 bool others_are_already_on = false;
3107 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3109 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3115 if ((*r) != (*rt)) {
3116 if (mt->input_active()) {
3117 others_are_already_on = true;
3120 /* this one needs changing */
3121 mt->set_input_active (onoff);
3127 /* globally reverse other routes */
3129 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3130 if ((*r) != (*rt)) {
3131 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3133 mt->set_input_active (!others_are_already_on);
3142 Session::routes_using_input_from (const string& str, RouteList& rl)
3144 boost::shared_ptr<RouteList> r = routes.reader();
3146 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3147 if ((*i)->input()->connected_to (str)) {
3153 boost::shared_ptr<Route>
3154 Session::route_by_name (string name)
3156 boost::shared_ptr<RouteList> r = routes.reader ();
3158 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3159 if ((*i)->name() == name) {
3164 return boost::shared_ptr<Route> ((Route*) 0);
3167 boost::shared_ptr<Route>
3168 Session::route_by_id (PBD::ID id)
3170 boost::shared_ptr<RouteList> r = routes.reader ();
3172 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3173 if ((*i)->id() == id) {
3178 return boost::shared_ptr<Route> ((Route*) 0);
3181 boost::shared_ptr<Track>
3182 Session::track_by_diskstream_id (PBD::ID id)
3184 boost::shared_ptr<RouteList> r = routes.reader ();
3186 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3187 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3188 if (t && t->using_diskstream_id (id)) {
3193 return boost::shared_ptr<Track> ();
3196 boost::shared_ptr<Route>
3197 Session::route_by_remote_id (uint32_t id)
3199 boost::shared_ptr<RouteList> r = routes.reader ();
3201 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3202 if ((*i)->remote_control_id() == id) {
3207 return boost::shared_ptr<Route> ((Route*) 0);
3212 Session::reassign_track_numbers ()
3216 RouteList r (*(routes.reader ()));
3217 SignalOrderRouteSorter sorter;
3220 StateProtector sp (this);
3222 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3223 if (boost::dynamic_pointer_cast<Track> (*i)) {
3224 (*i)->set_track_number(++tn);
3226 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
3227 (*i)->set_track_number(--bn);
3230 const uint32_t decimals = ceilf (log10f (tn + 1));
3231 const bool decimals_changed = _track_number_decimals != decimals;
3232 _track_number_decimals = decimals;
3234 if (decimals_changed && config.get_track_name_number ()) {
3235 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3236 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3238 t->resync_track_name();
3241 // trigger GUI re-layout
3242 config.ParameterChanged("track-name-number");
3247 Session::playlist_region_added (boost::weak_ptr<Region> w)
3249 boost::shared_ptr<Region> r = w.lock ();
3254 /* These are the operations that are currently in progress... */
3255 list<GQuark> curr = _current_trans_quarks;
3258 /* ...and these are the operations during which we want to update
3259 the session range location markers.
3262 ops.push_back (Operations::capture);
3263 ops.push_back (Operations::paste);
3264 ops.push_back (Operations::duplicate_region);
3265 ops.push_back (Operations::insert_file);
3266 ops.push_back (Operations::insert_region);
3267 ops.push_back (Operations::drag_region_brush);
3268 ops.push_back (Operations::region_drag);
3269 ops.push_back (Operations::selection_grab);
3270 ops.push_back (Operations::region_fill);
3271 ops.push_back (Operations::fill_selection);
3272 ops.push_back (Operations::create_region);
3273 ops.push_back (Operations::region_copy);
3274 ops.push_back (Operations::fixed_time_region_copy);
3277 /* See if any of the current operations match the ones that we want */
3279 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
3281 /* If so, update the session range markers */
3283 maybe_update_session_range (r->position (), r->last_frame ());
3287 /** Update the session range markers if a is before the current start or
3288 * b is after the current end.
3291 Session::maybe_update_session_range (framepos_t a, framepos_t b)
3293 if (_state_of_the_state & Loading) {
3297 if (_session_range_location == 0) {
3299 add_session_range_location (a, b);
3303 if (a < _session_range_location->start()) {
3304 _session_range_location->set_start (a);
3307 if (b > _session_range_location->end()) {
3308 _session_range_location->set_end (b);
3314 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
3316 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3317 maybe_update_session_range (i->to, i->to + i->length);
3322 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
3324 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3325 maybe_update_session_range (i->from, i->to);
3329 /* Region management */
3331 boost::shared_ptr<Region>
3332 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
3334 const RegionFactory::RegionMap& regions (RegionFactory::regions());
3335 RegionFactory::RegionMap::const_iterator i;
3336 boost::shared_ptr<Region> region;
3338 Glib::Threads::Mutex::Lock lm (region_lock);
3340 for (i = regions.begin(); i != regions.end(); ++i) {
3344 if (region->whole_file()) {
3346 if (child->source_equivalent (region)) {
3352 return boost::shared_ptr<Region> ();
3356 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
3358 set<boost::shared_ptr<Region> > relevant_regions;
3360 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
3361 RegionFactory::get_regions_using_source (*s, relevant_regions);
3364 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
3365 set<boost::shared_ptr<Region> >::iterator tmp;
3370 playlists->destroy_region (*r);
3371 RegionFactory::map_remove (*r);
3373 (*r)->drop_sources ();
3374 (*r)->drop_references ();
3376 relevant_regions.erase (r);
3381 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
3384 Glib::Threads::Mutex::Lock ls (source_lock);
3385 /* remove from the main source list */
3386 sources.erase ((*s)->id());
3389 (*s)->mark_for_remove ();
3390 (*s)->drop_references ();
3399 Session::remove_last_capture ()
3401 list<boost::shared_ptr<Source> > srcs;
3403 boost::shared_ptr<RouteList> rl = routes.reader ();
3404 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3405 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3410 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
3413 srcs.insert (srcs.end(), l.begin(), l.end());
3418 destroy_sources (srcs);
3420 save_state (_current_snapshot_name);
3425 /* Source Management */
3428 Session::add_source (boost::shared_ptr<Source> source)
3430 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
3431 pair<SourceMap::iterator,bool> result;
3433 entry.first = source->id();
3434 entry.second = source;
3437 Glib::Threads::Mutex::Lock lm (source_lock);
3438 result = sources.insert (entry);
3441 if (result.second) {
3443 /* yay, new source */
3445 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
3448 if (!fs->within_session()) {
3449 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
3455 boost::shared_ptr<AudioFileSource> afs;
3457 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
3458 if (Config->get_auto_analyse_audio()) {
3459 Analyser::queue_source_for_analysis (source, false);
3463 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
3468 Session::remove_source (boost::weak_ptr<Source> src)
3470 if (_state_of_the_state & Deletion) {
3474 SourceMap::iterator i;
3475 boost::shared_ptr<Source> source = src.lock();
3482 Glib::Threads::Mutex::Lock lm (source_lock);
3484 if ((i = sources.find (source->id())) != sources.end()) {
3489 if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
3491 /* save state so we don't end up with a session file
3492 referring to non-existent sources.
3495 save_state (_current_snapshot_name);
3499 boost::shared_ptr<Source>
3500 Session::source_by_id (const PBD::ID& id)
3502 Glib::Threads::Mutex::Lock lm (source_lock);
3503 SourceMap::iterator i;
3504 boost::shared_ptr<Source> source;
3506 if ((i = sources.find (id)) != sources.end()) {
3513 boost::shared_ptr<AudioFileSource>
3514 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
3516 /* Restricted to audio files because only audio sources have channel
3520 Glib::Threads::Mutex::Lock lm (source_lock);
3522 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
3523 boost::shared_ptr<AudioFileSource> afs
3524 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
3526 if (afs && afs->path() == path && chn == afs->channel()) {
3531 return boost::shared_ptr<AudioFileSource>();
3534 boost::shared_ptr<MidiSource>
3535 Session::midi_source_by_path (const std::string& path) const
3537 /* Restricted to MIDI files because audio sources require a channel
3538 for unique identification, in addition to a path.
3541 Glib::Threads::Mutex::Lock lm (source_lock);
3543 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
3544 boost::shared_ptr<MidiSource> ms
3545 = boost::dynamic_pointer_cast<MidiSource>(s->second);
3546 boost::shared_ptr<FileSource> fs
3547 = boost::dynamic_pointer_cast<FileSource>(s->second);
3549 if (ms && fs && fs->path() == path) {
3554 return boost::shared_ptr<MidiSource>();
3558 Session::count_sources_by_origin (const string& path)
3561 Glib::Threads::Mutex::Lock lm (source_lock);
3563 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3564 boost::shared_ptr<FileSource> fs
3565 = boost::dynamic_pointer_cast<FileSource>(i->second);
3567 if (fs && fs->origin() == path) {
3576 Session::peak_path (string base) const
3578 return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
3582 Session::new_audio_source_path_for_embedded (const std::string& path)
3586 * we know that the filename is already unique because it exists
3587 * out in the filesystem.
3589 * However, when we bring it into the session, we could get a
3592 * Eg. two embedded files:
3597 * When merged into session, these collide.
3599 * There will not be a conflict with in-memory sources
3600 * because when the source was created we already picked
3601 * a unique name for it.
3603 * This collision is not likely to be common, but we have to guard
3604 * against it. So, if there is a collision, take the md5 hash of the
3605 * the path, and use that as the filename instead.
3608 SessionDirectory sdir (get_best_session_directory_for_new_audio());
3609 string base = Glib::path_get_basename (path);
3610 string newpath = Glib::build_filename (sdir.sound_path(), base);
3612 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
3616 md5.digestString (path.c_str());
3617 md5.writeToString ();
3618 base = md5.digestChars;
3620 string ext = get_suffix (path);
3627 newpath = Glib::build_filename (sdir.sound_path(), base);
3629 /* if this collides, we're screwed */
3631 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
3632 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
3641 /** Return true if there are no audio file sources that use @param name as
3642 * the filename component of their path.
3644 * Return false otherwise.
3646 * This method MUST ONLY be used to check in-session, mono files since it
3647 * hard-codes the channel of the audio file source we are looking for as zero.
3649 * If/when Ardour supports native files in non-mono formats, the logic here
3650 * will need to be revisited.
3653 Session::audio_source_name_is_unique (const string& name)
3655 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
3656 vector<space_and_path>::iterator i;
3657 uint32_t existing = 0;
3659 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
3661 /* note that we search *without* the extension so that
3662 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3663 in the event that this new name is required for
3664 a file format change.
3667 const string spath = *i;
3669 if (matching_unsuffixed_filename_exists_in (spath, name)) {
3674 /* it is possible that we have the path already
3675 * assigned to a source that has not yet been written
3676 * (ie. the write source for a diskstream). we have to
3677 * check this in order to make sure that our candidate
3678 * path isn't used again, because that can lead to
3679 * two Sources point to the same file with different
3680 * notions of their removability.
3684 string possible_path = Glib::build_filename (spath, name);
3686 if (audio_source_by_path_and_channel (possible_path, 0)) {
3692 return (existing == 0);
3696 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)
3699 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3703 sstr << setfill ('0') << setw (4) << cnt;
3704 sstr << legalized_base;
3706 sstr << legalized_base;
3708 if (take_required || related_exists) {
3720 } else if (nchan > 2) {
3725 /* XXX what? more than 26 channels! */
3736 /** Return a unique name based on \a base for a new internal audio source */
3738 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
3741 string possible_name;
3742 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
3744 bool some_related_source_name_exists = false;
3746 legalized = legalize_for_path (base);
3748 // Find a "version" of the base name that doesn't exist in any of the possible directories.
3750 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3752 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
3754 if (audio_source_name_is_unique (possible_name)) {
3758 some_related_source_name_exists = true;
3761 error << string_compose(
3762 _("There are already %1 recordings for %2, which I consider too many."),
3763 limit, base) << endmsg;
3765 throw failed_constructor();
3769 /* We've established that the new name does not exist in any session
3770 * directory, so now find out which one we should use for this new
3774 SessionDirectory sdir (get_best_session_directory_for_new_audio());
3776 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
3781 /** Return a unique name based on `base` for a new internal MIDI source */
3783 Session::new_midi_source_path (const string& base)
3786 char buf[PATH_MAX+1];
3787 const uint32_t limit = 10000;
3789 string possible_path;
3790 string possible_name;
3793 legalized = legalize_for_path (base);
3795 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3796 std::vector<string> sdirs = source_search_path(DataType::MIDI);
3798 /* - the main session folder is the first in the vector.
3799 * - after checking all locations for file-name uniqueness,
3800 * we keep the one from the last iteration as new file name
3801 * - midi files are small and should just be kept in the main session-folder
3803 * -> reverse the array, check main session folder last and use that as location
3806 std::reverse(sdirs.begin(), sdirs.end());
3808 for (cnt = 1; cnt <= limit; ++cnt) {
3810 vector<space_and_path>::iterator i;
3811 uint32_t existing = 0;
3813 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
3815 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
3816 possible_name = buf;
3818 possible_path = Glib::build_filename (*i, possible_name);
3820 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
3824 if (midi_source_by_path (possible_path)) {
3829 if (existing == 0) {
3834 error << string_compose(
3835 _("There are already %1 recordings for %2, which I consider too many."),
3836 limit, base) << endmsg;
3842 /* No need to "find best location" for software/app-based RAID, because
3843 MIDI is so small that we always put it in the same place.
3846 return possible_path;
3850 /** Create a new within-session audio source */
3851 boost::shared_ptr<AudioFileSource>
3852 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
3854 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
3856 if (!path.empty()) {
3857 return boost::dynamic_pointer_cast<AudioFileSource> (
3858 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
3860 throw failed_constructor ();
3864 /** Create a new within-session MIDI source */
3865 boost::shared_ptr<MidiSource>
3866 Session::create_midi_source_for_session (string const & basic_name)
3868 const string path = new_midi_source_path (basic_name);
3870 if (!path.empty()) {
3871 return boost::dynamic_pointer_cast<SMFSource> (
3872 SourceFactory::createWritable (
3873 DataType::MIDI, *this, path, false, frame_rate()));
3875 throw failed_constructor ();
3879 /** Create a new within-session MIDI source */
3880 boost::shared_ptr<MidiSource>
3881 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
3883 /* the caller passes in the track the source will be used in,
3884 so that we can keep the numbering sane.
3886 Rationale: a track with the name "Foo" that has had N
3887 captures carried out so far will ALREADY have a write source
3888 named "Foo-N+1.mid" waiting to be used for the next capture.
3890 If we call new_midi_source_name() we will get "Foo-N+2". But
3891 there is no region corresponding to "Foo-N+1", so when
3892 "Foo-N+2" appears in the track, the gap presents the user
3893 with odd behaviour - why did it skip past Foo-N+1?
3895 We could explain this to the user in some odd way, but
3896 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
3899 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
3902 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
3904 std::string name = track->steal_write_source_name ();
3907 return boost::shared_ptr<MidiSource>();
3910 /* MIDI files are small, just put them in the first location of the
3911 session source search path.
3914 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
3916 return boost::dynamic_pointer_cast<SMFSource> (
3917 SourceFactory::createWritable (
3918 DataType::MIDI, *this, path, false, frame_rate()));
3923 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3925 if (playlist->hidden()) {
3929 playlists->add (playlist);
3932 playlist->release();
3939 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3941 if (_state_of_the_state & Deletion) {
3945 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3951 playlists->remove (playlist);
3957 Session::set_audition (boost::shared_ptr<Region> r)
3959 pending_audition_region = r;
3960 add_post_transport_work (PostTransportAudition);
3961 _butler->schedule_transport_work ();
3965 Session::audition_playlist ()
3967 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3968 ev->region.reset ();
3973 Session::non_realtime_set_audition ()
3975 assert (pending_audition_region);
3976 auditioner->audition_region (pending_audition_region);
3977 pending_audition_region.reset ();
3978 AuditionActive (true); /* EMIT SIGNAL */
3982 Session::audition_region (boost::shared_ptr<Region> r)
3984 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3990 Session::cancel_audition ()
3995 if (auditioner->auditioning()) {
3996 auditioner->cancel_audition ();
3997 AuditionActive (false); /* EMIT SIGNAL */
4002 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
4004 if (a->is_monitor()) {
4007 if (b->is_monitor()) {
4010 return a->order_key () < b->order_key ();
4014 Session::is_auditioning () const
4016 /* can be called before we have an auditioner object */
4018 return auditioner->auditioning();
4025 Session::graph_reordered ()
4027 /* don't do this stuff if we are setting up connections
4028 from a set_state() call or creating new tracks. Ditto for deletion.
4031 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
4035 /* every track/bus asked for this to be handled but it was deferred because
4036 we were connecting. do it now.
4039 request_input_change_handling ();
4043 /* force all diskstreams to update their capture offset values to
4044 reflect any changes in latencies within the graph.
4047 boost::shared_ptr<RouteList> rl = routes.reader ();
4048 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4049 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4051 tr->set_capture_offset ();
4056 /** @return Number of frames that there is disk space available to write,
4059 boost::optional<framecnt_t>
4060 Session::available_capture_duration ()
4062 Glib::Threads::Mutex::Lock lm (space_lock);
4064 if (_total_free_4k_blocks_uncertain) {
4065 return boost::optional<framecnt_t> ();
4068 float sample_bytes_on_disk = 4.0; // keep gcc happy
4070 switch (config.get_native_file_data_format()) {
4072 sample_bytes_on_disk = 4.0;
4076 sample_bytes_on_disk = 3.0;
4080 sample_bytes_on_disk = 2.0;
4084 /* impossible, but keep some gcc versions happy */
4085 fatal << string_compose (_("programming error: %1"),
4086 X_("illegal native file data format"))
4088 abort(); /*NOTREACHED*/
4091 double scale = 4096.0 / sample_bytes_on_disk;
4093 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
4094 return max_framecnt;
4097 return (framecnt_t) floor (_total_free_4k_blocks * scale);
4101 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
4104 RCUWriter<BundleList> writer (_bundles);
4105 boost::shared_ptr<BundleList> b = writer.get_copy ();
4106 b->push_back (bundle);
4109 BundleAdded (bundle); /* EMIT SIGNAL */
4115 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
4117 bool removed = false;
4120 RCUWriter<BundleList> writer (_bundles);
4121 boost::shared_ptr<BundleList> b = writer.get_copy ();
4122 BundleList::iterator i = find (b->begin(), b->end(), bundle);
4124 if (i != b->end()) {
4131 BundleRemoved (bundle); /* EMIT SIGNAL */
4137 boost::shared_ptr<Bundle>
4138 Session::bundle_by_name (string name) const
4140 boost::shared_ptr<BundleList> b = _bundles.reader ();
4142 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
4143 if ((*i)->name() == name) {
4148 return boost::shared_ptr<Bundle> ();
4152 Session::tempo_map_changed (const PropertyChange&)
4156 playlists->update_after_tempo_map_change ();
4158 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
4164 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
4166 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
4167 (*i)->recompute_frames_from_bbt ();
4171 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
4172 * the given count with the current block size.
4175 Session::ensure_buffers (ChanCount howmany)
4177 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
4181 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
4183 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4184 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
4189 Session::next_insert_id ()
4191 /* this doesn't really loop forever. just think about it */
4194 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
4195 if (!insert_bitset[n]) {
4196 insert_bitset[n] = true;
4202 /* none available, so resize and try again */
4204 insert_bitset.resize (insert_bitset.size() + 16, false);
4209 Session::next_send_id ()
4211 /* this doesn't really loop forever. just think about it */
4214 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
4215 if (!send_bitset[n]) {
4216 send_bitset[n] = true;
4222 /* none available, so resize and try again */
4224 send_bitset.resize (send_bitset.size() + 16, false);
4229 Session::next_aux_send_id ()
4231 /* this doesn't really loop forever. just think about it */
4234 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
4235 if (!aux_send_bitset[n]) {
4236 aux_send_bitset[n] = true;
4242 /* none available, so resize and try again */
4244 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
4249 Session::next_return_id ()
4251 /* this doesn't really loop forever. just think about it */
4254 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
4255 if (!return_bitset[n]) {
4256 return_bitset[n] = true;
4262 /* none available, so resize and try again */
4264 return_bitset.resize (return_bitset.size() + 16, false);
4269 Session::mark_send_id (uint32_t id)
4271 if (id >= send_bitset.size()) {
4272 send_bitset.resize (id+16, false);
4274 if (send_bitset[id]) {
4275 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
4277 send_bitset[id] = true;
4281 Session::mark_aux_send_id (uint32_t id)
4283 if (id >= aux_send_bitset.size()) {
4284 aux_send_bitset.resize (id+16, false);
4286 if (aux_send_bitset[id]) {
4287 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
4289 aux_send_bitset[id] = true;
4293 Session::mark_return_id (uint32_t id)
4295 if (id >= return_bitset.size()) {
4296 return_bitset.resize (id+16, false);
4298 if (return_bitset[id]) {
4299 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
4301 return_bitset[id] = true;
4305 Session::mark_insert_id (uint32_t id)
4307 if (id >= insert_bitset.size()) {
4308 insert_bitset.resize (id+16, false);
4310 if (insert_bitset[id]) {
4311 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
4313 insert_bitset[id] = true;
4317 Session::unmark_send_id (uint32_t id)
4319 if (id < send_bitset.size()) {
4320 send_bitset[id] = false;
4325 Session::unmark_aux_send_id (uint32_t id)
4327 if (id < aux_send_bitset.size()) {
4328 aux_send_bitset[id] = false;
4333 Session::unmark_return_id (uint32_t id)
4335 if (id < return_bitset.size()) {
4336 return_bitset[id] = false;
4341 Session::unmark_insert_id (uint32_t id)
4343 if (id < insert_bitset.size()) {
4344 insert_bitset[id] = false;
4349 Session::reset_native_file_format ()
4351 boost::shared_ptr<RouteList> rl = routes.reader ();
4352 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4353 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4355 /* don't save state as we do this, there's no point
4358 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
4359 tr->reset_write_sources (false);
4360 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
4366 Session::route_name_unique (string n) const
4368 boost::shared_ptr<RouteList> r = routes.reader ();
4370 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4371 if ((*i)->name() == n) {
4380 Session::route_name_internal (string n) const
4382 if (auditioner && auditioner->name() == n) {
4386 if (_click_io && _click_io->name() == n) {
4394 Session::freeze_all (InterThreadInfo& itt)
4396 boost::shared_ptr<RouteList> r = routes.reader ();
4398 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4400 boost::shared_ptr<Track> t;
4402 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
4403 /* XXX this is wrong because itt.progress will keep returning to zero at the start
4413 boost::shared_ptr<Region>
4414 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
4415 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
4416 InterThreadInfo& itt,
4417 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
4418 bool for_export, bool for_freeze)
4420 boost::shared_ptr<Region> result;
4421 boost::shared_ptr<Playlist> playlist;
4422 boost::shared_ptr<Source> source;
4423 ChanCount diskstream_channels (track.n_channels());
4424 framepos_t position;
4425 framecnt_t this_chunk;
4427 framepos_t latency_skip;
4429 framepos_t len = end - start;
4430 bool need_block_size_reset = false;
4431 ChanCount const max_proc = track.max_processor_streams ();
4432 string legal_playlist_name;
4433 string possible_path;
4436 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
4437 end, start) << endmsg;
4441 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
4442 include_endpoint, for_export, for_freeze);
4444 if (diskstream_channels.n(track.data_type()) < 1) {
4445 error << _("Cannot write a range with no data.") << endmsg;
4449 // block all process callback handling
4451 block_processing ();
4454 // synchronize with AudioEngine::process_callback()
4455 // make sure processing is not currently running
4456 // and processing_blocked() is honored before
4457 // acquiring thread buffers
4458 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
4461 _bounce_processing_active = true;
4463 /* call tree *MUST* hold route_lock */
4465 if ((playlist = track.playlist()) == 0) {
4469 legal_playlist_name = legalize_for_path (playlist->name());
4471 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
4473 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
4474 string path = ((track.data_type() == DataType::AUDIO)
4475 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
4476 : new_midi_source_path (legal_playlist_name));
4483 source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
4486 catch (failed_constructor& err) {
4487 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
4491 srcs.push_back (source);
4494 /* tell redirects that care that we are about to use a much larger
4495 * blocksize. this will flush all plugins too, so that they are ready
4496 * to be used for this process.
4499 need_block_size_reset = true;
4500 track.set_block_size (bounce_chunk_size);
4501 _engine.main_thread()->get_buffers ();
4505 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
4507 /* create a set of reasonably-sized buffers */
4508 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4509 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
4511 buffers.set_count (max_proc);
4513 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4514 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4515 boost::shared_ptr<MidiSource> ms;
4517 afs->prepare_for_peakfile_writes ();
4518 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
4519 Source::Lock lock(ms->mutex());
4520 ms->mark_streaming_write_started(lock);
4524 while (to_do && !itt.cancel) {
4526 this_chunk = min (to_do, bounce_chunk_size);
4528 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
4532 start += this_chunk;
4533 to_do -= this_chunk;
4534 itt.progress = (float) (1.0 - ((double) to_do / len));
4536 if (latency_skip >= bounce_chunk_size) {
4537 latency_skip -= bounce_chunk_size;
4541 const framecnt_t current_chunk = this_chunk - latency_skip;
4544 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4545 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4546 boost::shared_ptr<MidiSource> ms;
4549 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
4552 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
4553 Source::Lock lock(ms->mutex());
4555 const MidiBuffer& buf = buffers.get_midi(0);
4556 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
4557 Evoral::Event<framepos_t> ev = *i;
4558 ev.set_time(ev.time() - position);
4559 ms->append_event_frames(lock, ev, ms->timeline_position());
4566 /* post-roll, pick up delayed processor output */
4567 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
4569 while (latency_skip && !itt.cancel) {
4570 this_chunk = min (latency_skip, bounce_chunk_size);
4571 latency_skip -= this_chunk;
4573 buffers.silence (this_chunk, 0);
4574 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
4577 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4578 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4581 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
4593 xnow = localtime (&now);
4595 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
4596 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4597 boost::shared_ptr<MidiSource> ms;
4600 afs->update_header (position, *xnow, now);
4601 afs->flush_header ();
4602 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
4603 Source::Lock lock(ms->mutex());
4604 ms->mark_streaming_write_completed(lock);
4608 /* construct a region to represent the bounced material */
4612 plist.add (Properties::start, 0);
4613 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4614 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4616 result = RegionFactory::create (srcs, plist);
4622 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4623 (*src)->mark_for_remove ();
4624 (*src)->drop_references ();
4628 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4629 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4632 afs->done_with_peakfile_writes ();
4636 _bounce_processing_active = false;
4638 if (need_block_size_reset) {
4639 _engine.main_thread()->drop_buffers ();
4640 track.set_block_size (get_block_size());
4643 unblock_processing ();
4649 Session::gain_automation_buffer() const
4651 return ProcessThread::gain_automation_buffer ();
4655 Session::send_gain_automation_buffer() const
4657 return ProcessThread::send_gain_automation_buffer ();
4661 Session::pan_automation_buffer() const
4663 return ProcessThread::pan_automation_buffer ();
4667 Session::get_silent_buffers (ChanCount count)
4669 return ProcessThread::get_silent_buffers (count);
4673 Session::get_scratch_buffers (ChanCount count, bool silence)
4675 return ProcessThread::get_scratch_buffers (count, silence);
4679 Session::get_route_buffers (ChanCount count, bool silence)
4681 return ProcessThread::get_route_buffers (count, silence);
4686 Session::get_mix_buffers (ChanCount count)
4688 return ProcessThread::get_mix_buffers (count);
4692 Session::ntracks () const
4695 boost::shared_ptr<RouteList> r = routes.reader ();
4697 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4698 if (boost::dynamic_pointer_cast<Track> (*i)) {
4707 Session::nbusses () const
4710 boost::shared_ptr<RouteList> r = routes.reader ();
4712 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4713 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
4722 Session::add_automation_list(AutomationList *al)
4724 automation_lists[al->id()] = al;
4727 /** @return true if there is at least one record-enabled track, otherwise false */
4729 Session::have_rec_enabled_track () const
4731 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
4734 /** Update the state of our rec-enabled tracks flag */
4736 Session::update_have_rec_enabled_track ()
4738 boost::shared_ptr<RouteList> rl = routes.reader ();
4739 RouteList::iterator i = rl->begin();
4740 while (i != rl->end ()) {
4742 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4743 if (tr && tr->record_enabled ()) {
4750 int const old = g_atomic_int_get (&_have_rec_enabled_track);
4752 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4754 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4755 RecordStateChanged (); /* EMIT SIGNAL */
4760 Session::listen_position_changed ()
4762 boost::shared_ptr<RouteList> r = routes.reader ();
4764 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4765 (*i)->listen_position_changed ();
4770 Session::solo_control_mode_changed ()
4772 /* cancel all solo or all listen when solo control mode changes */
4775 set_solo (get_routes(), false);
4776 } else if (listening()) {
4777 set_listen (get_routes(), false);
4781 /** Called when a property of one of our route groups changes */
4783 Session::route_group_property_changed (RouteGroup* rg)
4785 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4788 /** Called when a route is added to one of our route groups */
4790 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4792 RouteAddedToRouteGroup (rg, r);
4795 /** Called when a route is removed from one of our route groups */
4797 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4799 RouteRemovedFromRouteGroup (rg, r);
4802 boost::shared_ptr<RouteList>
4803 Session::get_tracks () const
4805 boost::shared_ptr<RouteList> rl = routes.reader ();
4806 boost::shared_ptr<RouteList> tl (new RouteList);
4808 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
4809 if (boost::dynamic_pointer_cast<Track> (*r)) {
4810 if (!(*r)->is_auditioner()) {
4818 boost::shared_ptr<RouteList>
4819 Session::get_routes_with_regions_at (framepos_t const p) const
4821 boost::shared_ptr<RouteList> r = routes.reader ();
4822 boost::shared_ptr<RouteList> rl (new RouteList);
4824 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4825 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4830 boost::shared_ptr<Playlist> pl = tr->playlist ();
4835 if (pl->has_region_at (p)) {
4844 Session::goto_end ()
4846 if (_session_range_location) {
4847 request_locate (_session_range_location->end(), false);
4849 request_locate (0, false);
4854 Session::goto_start ()
4856 if (_session_range_location) {
4857 request_locate (_session_range_location->start(), false);
4859 request_locate (0, false);
4864 Session::current_start_frame () const
4866 return _session_range_location ? _session_range_location->start() : 0;
4870 Session::current_end_frame () const
4872 return _session_range_location ? _session_range_location->end() : 0;
4876 Session::add_session_range_location (framepos_t start, framepos_t end)
4878 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4879 _locations->add (_session_range_location);
4883 Session::step_edit_status_change (bool yn)
4889 send = (_step_editors == 0);
4894 send = (_step_editors == 1);
4897 if (_step_editors > 0) {
4903 StepEditStatusChange (val);
4909 Session::start_time_changed (framepos_t old)
4911 /* Update the auto loop range to match the session range
4912 (unless the auto loop range has been changed by the user)
4915 Location* s = _locations->session_range_location ();
4920 Location* l = _locations->auto_loop_location ();
4922 if (l && l->start() == old) {
4923 l->set_start (s->start(), true);
4928 Session::end_time_changed (framepos_t old)
4930 /* Update the auto loop range to match the session range
4931 (unless the auto loop range has been changed by the user)
4934 Location* s = _locations->session_range_location ();
4939 Location* l = _locations->auto_loop_location ();
4941 if (l && l->end() == old) {
4942 l->set_end (s->end(), true);
4946 std::vector<std::string>
4947 Session::source_search_path (DataType type) const
4951 if (session_dirs.size() == 1) {
4953 case DataType::AUDIO:
4954 sp.push_back (_session_dir->sound_path());
4956 case DataType::MIDI:
4957 sp.push_back (_session_dir->midi_path());
4961 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4962 SessionDirectory sdir (i->path);
4964 case DataType::AUDIO:
4965 sp.push_back (sdir.sound_path());
4967 case DataType::MIDI:
4968 sp.push_back (sdir.midi_path());
4974 if (type == DataType::AUDIO) {
4975 const string sound_path_2X = _session_dir->sound_path_2X();
4976 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
4977 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
4978 sp.push_back (sound_path_2X);
4983 // now check the explicit (possibly user-specified) search path
4986 case DataType::AUDIO:
4987 sp += Searchpath(config.get_audio_search_path ());
4989 case DataType::MIDI:
4990 sp += Searchpath(config.get_midi_search_path ());
4998 Session::ensure_search_path_includes (const string& path, DataType type)
5007 case DataType::AUDIO:
5008 sp += Searchpath(config.get_audio_search_path ());
5010 case DataType::MIDI:
5011 sp += Searchpath (config.get_midi_search_path ());
5015 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
5016 /* No need to add this new directory if it has the same inode as
5017 an existing one; checking inode rather than name prevents duplicated
5018 directories when we are using symlinks.
5020 On Windows, I think we could just do if (*i == path) here.
5022 if (PBD::equivalent_paths (*i, path)) {
5030 case DataType::AUDIO:
5031 config.set_audio_search_path (sp.to_string());
5033 case DataType::MIDI:
5034 config.set_midi_search_path (sp.to_string());
5040 Session::remove_dir_from_search_path (const string& dir, DataType type)
5045 case DataType::AUDIO:
5046 sp = Searchpath(config.get_audio_search_path ());
5048 case DataType::MIDI:
5049 sp = Searchpath (config.get_midi_search_path ());
5056 case DataType::AUDIO:
5057 config.set_audio_search_path (sp.to_string());
5059 case DataType::MIDI:
5060 config.set_midi_search_path (sp.to_string());
5066 boost::shared_ptr<Speakers>
5067 Session::get_speakers()
5073 Session::unknown_processors () const
5077 boost::shared_ptr<RouteList> r = routes.reader ();
5078 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5079 list<string> t = (*i)->unknown_processors ();
5080 copy (t.begin(), t.end(), back_inserter (p));
5090 Session::update_latency (bool playback)
5092 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
5094 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
5098 boost::shared_ptr<RouteList> r = routes.reader ();
5099 framecnt_t max_latency = 0;
5102 /* reverse the list so that we work backwards from the last route to run to the first */
5103 RouteList* rl = routes.reader().get();
5104 r.reset (new RouteList (*rl));
5105 reverse (r->begin(), r->end());
5108 /* compute actual latency values for the given direction and store them all in per-port
5109 structures. this will also publish the same values (to JACK) so that computation of latency
5110 for routes can consistently use public latency values.
5113 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5114 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
5117 /* because we latency compensate playback, our published playback latencies should
5118 be the same for all output ports - all material played back by ardour has
5119 the same latency, whether its caused by plugins or by latency compensation. since
5120 these may differ from the values computed above, reset all playback port latencies
5124 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
5126 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5127 (*i)->set_public_port_latencies (max_latency, playback);
5132 post_playback_latency ();
5136 post_capture_latency ();
5139 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
5143 Session::post_playback_latency ()
5145 set_worst_playback_latency ();
5147 boost::shared_ptr<RouteList> r = routes.reader ();
5149 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5150 if (!(*i)->is_auditioner() && ((*i)->active())) {
5151 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
5155 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5156 (*i)->set_latency_compensation (_worst_track_latency);
5161 Session::post_capture_latency ()
5163 set_worst_capture_latency ();
5165 /* reflect any changes in capture latencies into capture offsets
5168 boost::shared_ptr<RouteList> rl = routes.reader();
5169 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5170 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5172 tr->set_capture_offset ();
5178 Session::initialize_latencies ()
5181 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5182 update_latency (false);
5183 update_latency (true);
5186 set_worst_io_latencies ();
5190 Session::set_worst_io_latencies ()
5192 set_worst_playback_latency ();
5193 set_worst_capture_latency ();
5197 Session::set_worst_playback_latency ()
5199 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5203 _worst_output_latency = 0;
5205 if (!_engine.connected()) {
5209 boost::shared_ptr<RouteList> r = routes.reader ();
5211 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5212 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
5215 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
5219 Session::set_worst_capture_latency ()
5221 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5225 _worst_input_latency = 0;
5227 if (!_engine.connected()) {
5231 boost::shared_ptr<RouteList> r = routes.reader ();
5233 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5234 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
5237 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
5241 Session::update_latency_compensation (bool force_whole_graph)
5243 bool some_track_latency_changed = false;
5245 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5249 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
5251 _worst_track_latency = 0;
5253 boost::shared_ptr<RouteList> r = routes.reader ();
5255 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5256 if (!(*i)->is_auditioner() && ((*i)->active())) {
5258 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
5259 some_track_latency_changed = true;
5261 _worst_track_latency = max (tl, _worst_track_latency);
5265 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
5266 (some_track_latency_changed ? "yes" : "no")));
5268 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
5270 if (some_track_latency_changed || force_whole_graph) {
5271 _engine.update_latencies ();
5275 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5276 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5280 tr->set_capture_offset ();
5285 Session::session_name_is_legal (const string& path)
5287 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
5289 for (int i = 0; illegal_chars[i]; ++i) {
5290 if (path.find (illegal_chars[i]) != string::npos) {
5291 return illegal_chars[i];
5299 Session::next_control_id () const
5303 /* the monitor bus remote ID is in a different
5304 * "namespace" than regular routes. its existence doesn't
5305 * affect normal (low) numbered routes.
5312 return nroutes() - subtract;
5316 Session::notify_remote_id_change ()
5318 if (deletion_in_progress()) {
5322 switch (Config->get_remote_model()) {
5324 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
5332 Session::sync_order_keys ()
5334 if (deletion_in_progress()) {
5338 /* tell everyone that something has happened to the sort keys
5339 and let them sync up with the change(s)
5340 this will give objects that manage the sort order keys the
5341 opportunity to keep them in sync if they wish to.
5344 DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
5346 reassign_track_numbers();
5348 Route::SyncOrderKeys (); /* EMIT SIGNAL */
5350 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
5354 Session::operation_in_progress (GQuark op) const
5356 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
5359 boost::shared_ptr<Port>
5360 Session::ltc_input_port () const
5362 return _ltc_input->nth (0);
5365 boost::shared_ptr<Port>
5366 Session::ltc_output_port () const
5368 return _ltc_output->nth (0);
5372 Session::reconnect_ltc_input ()
5376 string src = Config->get_ltc_source_port();
5378 _ltc_input->disconnect (this);
5380 if (src != _("None") && !src.empty()) {
5381 _ltc_input->nth (0)->connect (src);
5387 Session::reconnect_ltc_output ()
5392 string src = Config->get_ltc_sink_port();
5394 _ltc_output->disconnect (this);
5396 if (src != _("None") && !src.empty()) {
5397 _ltc_output->nth (0)->connect (src);