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;
3642 Session::audio_source_name_is_unique (const string& name, uint32_t chan)
3644 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
3645 vector<space_and_path>::iterator i;
3646 uint32_t existing = 0;
3648 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
3650 /* note that we search *without* the extension so that
3651 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3652 in the event that this new name is required for
3653 a file format change.
3656 const string spath = *i;
3658 if (matching_unsuffixed_filename_exists_in (spath, name)) {
3663 /* it is possible that we have the path already
3664 * assigned to a source that has not yet been written
3665 * (ie. the write source for a diskstream). we have to
3666 * check this in order to make sure that our candidate
3667 * path isn't used again, because that can lead to
3668 * two Sources point to the same file with different
3669 * notions of their removability.
3673 string possible_path = Glib::build_filename (spath, name);
3675 if (audio_source_by_path_and_channel (possible_path, chan)) {
3681 return (existing == 0);
3685 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)
3688 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3692 sstr << setfill ('0') << setw (4) << cnt;
3693 sstr << legalized_base;
3695 sstr << legalized_base;
3697 if (take_required || related_exists) {
3709 } else if (nchan > 2) {
3714 /* XXX what? more than 26 channels! */
3725 /** Return a unique name based on \a base for a new internal audio source */
3727 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
3730 string possible_name;
3731 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
3733 bool some_related_source_name_exists = false;
3735 legalized = legalize_for_path (base);
3737 // Find a "version" of the base name that doesn't exist in any of the possible directories.
3739 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3741 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
3743 if (audio_source_name_is_unique (possible_name, chan)) {
3747 some_related_source_name_exists = true;
3750 error << string_compose(
3751 _("There are already %1 recordings for %2, which I consider too many."),
3752 limit, base) << endmsg;
3754 throw failed_constructor();
3758 /* We've established that the new name does not exist in any session
3759 * directory, so now find out which one we should use for this new
3763 SessionDirectory sdir (get_best_session_directory_for_new_audio());
3765 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
3770 /** Return a unique name based on `base` for a new internal MIDI source */
3772 Session::new_midi_source_path (const string& base)
3775 char buf[PATH_MAX+1];
3776 const uint32_t limit = 10000;
3778 string possible_path;
3779 string possible_name;
3782 legalized = legalize_for_path (base);
3784 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3785 std::vector<string> sdirs = source_search_path(DataType::MIDI);
3787 /* - the main session folder is the first in the vector.
3788 * - after checking all locations for file-name uniqueness,
3789 * we keep the one from the last iteration as new file name
3790 * - midi files are small and should just be kept in the main session-folder
3792 * -> reverse the array, check main session folder last and use that as location
3795 std::reverse(sdirs.begin(), sdirs.end());
3797 for (cnt = 1; cnt <= limit; ++cnt) {
3799 vector<space_and_path>::iterator i;
3800 uint32_t existing = 0;
3802 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
3804 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
3805 possible_name = buf;
3807 possible_path = Glib::build_filename (*i, possible_name);
3809 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
3813 if (midi_source_by_path (possible_path)) {
3818 if (existing == 0) {
3823 error << string_compose(
3824 _("There are already %1 recordings for %2, which I consider too many."),
3825 limit, base) << endmsg;
3831 /* No need to "find best location" for software/app-based RAID, because
3832 MIDI is so small that we always put it in the same place.
3835 return possible_path;
3839 /** Create a new within-session audio source */
3840 boost::shared_ptr<AudioFileSource>
3841 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
3843 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
3845 if (!path.empty()) {
3846 return boost::dynamic_pointer_cast<AudioFileSource> (
3847 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
3849 throw failed_constructor ();
3853 /** Create a new within-session MIDI source */
3854 boost::shared_ptr<MidiSource>
3855 Session::create_midi_source_for_session (string const & basic_name)
3857 const string path = new_midi_source_path (basic_name);
3859 if (!path.empty()) {
3860 return boost::dynamic_pointer_cast<SMFSource> (
3861 SourceFactory::createWritable (
3862 DataType::MIDI, *this, path, false, frame_rate()));
3864 throw failed_constructor ();
3868 /** Create a new within-session MIDI source */
3869 boost::shared_ptr<MidiSource>
3870 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
3872 /* the caller passes in the track the source will be used in,
3873 so that we can keep the numbering sane.
3875 Rationale: a track with the name "Foo" that has had N
3876 captures carried out so far will ALREADY have a write source
3877 named "Foo-N+1.mid" waiting to be used for the next capture.
3879 If we call new_midi_source_name() we will get "Foo-N+2". But
3880 there is no region corresponding to "Foo-N+1", so when
3881 "Foo-N+2" appears in the track, the gap presents the user
3882 with odd behaviour - why did it skip past Foo-N+1?
3884 We could explain this to the user in some odd way, but
3885 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
3888 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
3891 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
3893 std::string name = track->steal_write_source_name ();
3896 return boost::shared_ptr<MidiSource>();
3899 /* MIDI files are small, just put them in the first location of the
3900 session source search path.
3903 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
3905 return boost::dynamic_pointer_cast<SMFSource> (
3906 SourceFactory::createWritable (
3907 DataType::MIDI, *this, path, false, frame_rate()));
3912 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3914 if (playlist->hidden()) {
3918 playlists->add (playlist);
3921 playlist->release();
3928 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3930 if (_state_of_the_state & Deletion) {
3934 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3940 playlists->remove (playlist);
3946 Session::set_audition (boost::shared_ptr<Region> r)
3948 pending_audition_region = r;
3949 add_post_transport_work (PostTransportAudition);
3950 _butler->schedule_transport_work ();
3954 Session::audition_playlist ()
3956 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3957 ev->region.reset ();
3962 Session::non_realtime_set_audition ()
3964 assert (pending_audition_region);
3965 auditioner->audition_region (pending_audition_region);
3966 pending_audition_region.reset ();
3967 AuditionActive (true); /* EMIT SIGNAL */
3971 Session::audition_region (boost::shared_ptr<Region> r)
3973 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3979 Session::cancel_audition ()
3984 if (auditioner->auditioning()) {
3985 auditioner->cancel_audition ();
3986 AuditionActive (false); /* EMIT SIGNAL */
3991 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3993 if (a->is_monitor()) {
3996 if (b->is_monitor()) {
3999 return a->order_key () < b->order_key ();
4003 Session::is_auditioning () const
4005 /* can be called before we have an auditioner object */
4007 return auditioner->auditioning();
4014 Session::graph_reordered ()
4016 /* don't do this stuff if we are setting up connections
4017 from a set_state() call or creating new tracks. Ditto for deletion.
4020 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
4024 /* every track/bus asked for this to be handled but it was deferred because
4025 we were connecting. do it now.
4028 request_input_change_handling ();
4032 /* force all diskstreams to update their capture offset values to
4033 reflect any changes in latencies within the graph.
4036 boost::shared_ptr<RouteList> rl = routes.reader ();
4037 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4038 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4040 tr->set_capture_offset ();
4045 /** @return Number of frames that there is disk space available to write,
4048 boost::optional<framecnt_t>
4049 Session::available_capture_duration ()
4051 Glib::Threads::Mutex::Lock lm (space_lock);
4053 if (_total_free_4k_blocks_uncertain) {
4054 return boost::optional<framecnt_t> ();
4057 float sample_bytes_on_disk = 4.0; // keep gcc happy
4059 switch (config.get_native_file_data_format()) {
4061 sample_bytes_on_disk = 4.0;
4065 sample_bytes_on_disk = 3.0;
4069 sample_bytes_on_disk = 2.0;
4073 /* impossible, but keep some gcc versions happy */
4074 fatal << string_compose (_("programming error: %1"),
4075 X_("illegal native file data format"))
4077 abort(); /*NOTREACHED*/
4080 double scale = 4096.0 / sample_bytes_on_disk;
4082 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
4083 return max_framecnt;
4086 return (framecnt_t) floor (_total_free_4k_blocks * scale);
4090 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
4093 RCUWriter<BundleList> writer (_bundles);
4094 boost::shared_ptr<BundleList> b = writer.get_copy ();
4095 b->push_back (bundle);
4098 BundleAdded (bundle); /* EMIT SIGNAL */
4104 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
4106 bool removed = false;
4109 RCUWriter<BundleList> writer (_bundles);
4110 boost::shared_ptr<BundleList> b = writer.get_copy ();
4111 BundleList::iterator i = find (b->begin(), b->end(), bundle);
4113 if (i != b->end()) {
4120 BundleRemoved (bundle); /* EMIT SIGNAL */
4126 boost::shared_ptr<Bundle>
4127 Session::bundle_by_name (string name) const
4129 boost::shared_ptr<BundleList> b = _bundles.reader ();
4131 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
4132 if ((*i)->name() == name) {
4137 return boost::shared_ptr<Bundle> ();
4141 Session::tempo_map_changed (const PropertyChange&)
4145 playlists->update_after_tempo_map_change ();
4147 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
4153 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
4155 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
4156 (*i)->recompute_frames_from_bbt ();
4160 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
4161 * the given count with the current block size.
4164 Session::ensure_buffers (ChanCount howmany)
4166 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
4170 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
4172 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4173 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
4178 Session::next_insert_id ()
4180 /* this doesn't really loop forever. just think about it */
4183 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
4184 if (!insert_bitset[n]) {
4185 insert_bitset[n] = true;
4191 /* none available, so resize and try again */
4193 insert_bitset.resize (insert_bitset.size() + 16, false);
4198 Session::next_send_id ()
4200 /* this doesn't really loop forever. just think about it */
4203 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
4204 if (!send_bitset[n]) {
4205 send_bitset[n] = true;
4211 /* none available, so resize and try again */
4213 send_bitset.resize (send_bitset.size() + 16, false);
4218 Session::next_aux_send_id ()
4220 /* this doesn't really loop forever. just think about it */
4223 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
4224 if (!aux_send_bitset[n]) {
4225 aux_send_bitset[n] = true;
4231 /* none available, so resize and try again */
4233 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
4238 Session::next_return_id ()
4240 /* this doesn't really loop forever. just think about it */
4243 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
4244 if (!return_bitset[n]) {
4245 return_bitset[n] = true;
4251 /* none available, so resize and try again */
4253 return_bitset.resize (return_bitset.size() + 16, false);
4258 Session::mark_send_id (uint32_t id)
4260 if (id >= send_bitset.size()) {
4261 send_bitset.resize (id+16, false);
4263 if (send_bitset[id]) {
4264 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
4266 send_bitset[id] = true;
4270 Session::mark_aux_send_id (uint32_t id)
4272 if (id >= aux_send_bitset.size()) {
4273 aux_send_bitset.resize (id+16, false);
4275 if (aux_send_bitset[id]) {
4276 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
4278 aux_send_bitset[id] = true;
4282 Session::mark_return_id (uint32_t id)
4284 if (id >= return_bitset.size()) {
4285 return_bitset.resize (id+16, false);
4287 if (return_bitset[id]) {
4288 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
4290 return_bitset[id] = true;
4294 Session::mark_insert_id (uint32_t id)
4296 if (id >= insert_bitset.size()) {
4297 insert_bitset.resize (id+16, false);
4299 if (insert_bitset[id]) {
4300 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
4302 insert_bitset[id] = true;
4306 Session::unmark_send_id (uint32_t id)
4308 if (id < send_bitset.size()) {
4309 send_bitset[id] = false;
4314 Session::unmark_aux_send_id (uint32_t id)
4316 if (id < aux_send_bitset.size()) {
4317 aux_send_bitset[id] = false;
4322 Session::unmark_return_id (uint32_t id)
4324 if (id < return_bitset.size()) {
4325 return_bitset[id] = false;
4330 Session::unmark_insert_id (uint32_t id)
4332 if (id < insert_bitset.size()) {
4333 insert_bitset[id] = false;
4338 Session::reset_native_file_format ()
4340 boost::shared_ptr<RouteList> rl = routes.reader ();
4341 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4342 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4344 /* don't save state as we do this, there's no point
4347 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
4348 tr->reset_write_sources (false);
4349 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
4355 Session::route_name_unique (string n) const
4357 boost::shared_ptr<RouteList> r = routes.reader ();
4359 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4360 if ((*i)->name() == n) {
4369 Session::route_name_internal (string n) const
4371 if (auditioner && auditioner->name() == n) {
4375 if (_click_io && _click_io->name() == n) {
4383 Session::freeze_all (InterThreadInfo& itt)
4385 boost::shared_ptr<RouteList> r = routes.reader ();
4387 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4389 boost::shared_ptr<Track> t;
4391 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
4392 /* XXX this is wrong because itt.progress will keep returning to zero at the start
4402 boost::shared_ptr<Region>
4403 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
4404 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
4405 InterThreadInfo& itt,
4406 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
4407 bool for_export, bool for_freeze)
4409 boost::shared_ptr<Region> result;
4410 boost::shared_ptr<Playlist> playlist;
4411 boost::shared_ptr<Source> source;
4412 ChanCount diskstream_channels (track.n_channels());
4413 framepos_t position;
4414 framecnt_t this_chunk;
4416 framepos_t latency_skip;
4418 framepos_t len = end - start;
4419 bool need_block_size_reset = false;
4420 ChanCount const max_proc = track.max_processor_streams ();
4421 string legal_playlist_name;
4422 string possible_path;
4425 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
4426 end, start) << endmsg;
4430 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
4431 include_endpoint, for_export, for_freeze);
4433 if (diskstream_channels.n(track.data_type()) < 1) {
4434 error << _("Cannot write a range with no data.") << endmsg;
4438 // block all process callback handling
4440 block_processing ();
4443 // synchronize with AudioEngine::process_callback()
4444 // make sure processing is not currently running
4445 // and processing_blocked() is honored before
4446 // acquiring thread buffers
4447 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
4450 _bounce_processing_active = true;
4452 /* call tree *MUST* hold route_lock */
4454 if ((playlist = track.playlist()) == 0) {
4458 legal_playlist_name = legalize_for_path (playlist->name());
4460 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
4462 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
4463 string path = ((track.data_type() == DataType::AUDIO)
4464 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
4465 : new_midi_source_path (legal_playlist_name));
4472 source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
4475 catch (failed_constructor& err) {
4476 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
4480 srcs.push_back (source);
4483 /* tell redirects that care that we are about to use a much larger
4484 * blocksize. this will flush all plugins too, so that they are ready
4485 * to be used for this process.
4488 need_block_size_reset = true;
4489 track.set_block_size (bounce_chunk_size);
4490 _engine.main_thread()->get_buffers ();
4494 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
4496 /* create a set of reasonably-sized buffers */
4497 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4498 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
4500 buffers.set_count (max_proc);
4502 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4503 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4504 boost::shared_ptr<MidiSource> ms;
4506 afs->prepare_for_peakfile_writes ();
4507 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
4508 Source::Lock lock(ms->mutex());
4509 ms->mark_streaming_write_started(lock);
4513 while (to_do && !itt.cancel) {
4515 this_chunk = min (to_do, bounce_chunk_size);
4517 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
4521 start += this_chunk;
4522 to_do -= this_chunk;
4523 itt.progress = (float) (1.0 - ((double) to_do / len));
4525 if (latency_skip >= bounce_chunk_size) {
4526 latency_skip -= bounce_chunk_size;
4530 const framecnt_t current_chunk = this_chunk - latency_skip;
4533 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4534 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4535 boost::shared_ptr<MidiSource> ms;
4538 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
4541 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
4542 Source::Lock lock(ms->mutex());
4544 const MidiBuffer& buf = buffers.get_midi(0);
4545 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
4546 Evoral::Event<framepos_t> ev = *i;
4547 ev.set_time(ev.time() - position);
4548 ms->append_event_frames(lock, ev, ms->timeline_position());
4555 /* post-roll, pick up delayed processor output */
4556 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
4558 while (latency_skip && !itt.cancel) {
4559 this_chunk = min (latency_skip, bounce_chunk_size);
4560 latency_skip -= this_chunk;
4562 buffers.silence (this_chunk, 0);
4563 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
4566 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4567 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4570 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
4582 xnow = localtime (&now);
4584 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
4585 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4586 boost::shared_ptr<MidiSource> ms;
4589 afs->update_header (position, *xnow, now);
4590 afs->flush_header ();
4591 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
4592 Source::Lock lock(ms->mutex());
4593 ms->mark_streaming_write_completed(lock);
4597 /* construct a region to represent the bounced material */
4601 plist.add (Properties::start, 0);
4602 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4603 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4605 result = RegionFactory::create (srcs, plist);
4611 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4612 (*src)->mark_for_remove ();
4613 (*src)->drop_references ();
4617 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4618 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4621 afs->done_with_peakfile_writes ();
4625 _bounce_processing_active = false;
4627 if (need_block_size_reset) {
4628 _engine.main_thread()->drop_buffers ();
4629 track.set_block_size (get_block_size());
4632 unblock_processing ();
4638 Session::gain_automation_buffer() const
4640 return ProcessThread::gain_automation_buffer ();
4644 Session::send_gain_automation_buffer() const
4646 return ProcessThread::send_gain_automation_buffer ();
4650 Session::pan_automation_buffer() const
4652 return ProcessThread::pan_automation_buffer ();
4656 Session::get_silent_buffers (ChanCount count)
4658 return ProcessThread::get_silent_buffers (count);
4662 Session::get_scratch_buffers (ChanCount count, bool silence)
4664 return ProcessThread::get_scratch_buffers (count, silence);
4668 Session::get_route_buffers (ChanCount count, bool silence)
4670 return ProcessThread::get_route_buffers (count, silence);
4675 Session::get_mix_buffers (ChanCount count)
4677 return ProcessThread::get_mix_buffers (count);
4681 Session::ntracks () const
4684 boost::shared_ptr<RouteList> r = routes.reader ();
4686 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4687 if (boost::dynamic_pointer_cast<Track> (*i)) {
4696 Session::nbusses () const
4699 boost::shared_ptr<RouteList> r = routes.reader ();
4701 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4702 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
4711 Session::add_automation_list(AutomationList *al)
4713 automation_lists[al->id()] = al;
4716 /** @return true if there is at least one record-enabled track, otherwise false */
4718 Session::have_rec_enabled_track () const
4720 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
4723 /** Update the state of our rec-enabled tracks flag */
4725 Session::update_have_rec_enabled_track ()
4727 boost::shared_ptr<RouteList> rl = routes.reader ();
4728 RouteList::iterator i = rl->begin();
4729 while (i != rl->end ()) {
4731 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4732 if (tr && tr->record_enabled ()) {
4739 int const old = g_atomic_int_get (&_have_rec_enabled_track);
4741 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4743 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4744 RecordStateChanged (); /* EMIT SIGNAL */
4749 Session::listen_position_changed ()
4751 boost::shared_ptr<RouteList> r = routes.reader ();
4753 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4754 (*i)->listen_position_changed ();
4759 Session::solo_control_mode_changed ()
4761 /* cancel all solo or all listen when solo control mode changes */
4764 set_solo (get_routes(), false);
4765 } else if (listening()) {
4766 set_listen (get_routes(), false);
4770 /** Called when a property of one of our route groups changes */
4772 Session::route_group_property_changed (RouteGroup* rg)
4774 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4777 /** Called when a route is added to one of our route groups */
4779 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4781 RouteAddedToRouteGroup (rg, r);
4784 /** Called when a route is removed from one of our route groups */
4786 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4788 RouteRemovedFromRouteGroup (rg, r);
4791 boost::shared_ptr<RouteList>
4792 Session::get_tracks () const
4794 boost::shared_ptr<RouteList> rl = routes.reader ();
4795 boost::shared_ptr<RouteList> tl (new RouteList);
4797 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
4798 if (boost::dynamic_pointer_cast<Track> (*r)) {
4799 if (!(*r)->is_auditioner()) {
4807 boost::shared_ptr<RouteList>
4808 Session::get_routes_with_regions_at (framepos_t const p) const
4810 boost::shared_ptr<RouteList> r = routes.reader ();
4811 boost::shared_ptr<RouteList> rl (new RouteList);
4813 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4814 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4819 boost::shared_ptr<Playlist> pl = tr->playlist ();
4824 if (pl->has_region_at (p)) {
4833 Session::goto_end ()
4835 if (_session_range_location) {
4836 request_locate (_session_range_location->end(), false);
4838 request_locate (0, false);
4843 Session::goto_start ()
4845 if (_session_range_location) {
4846 request_locate (_session_range_location->start(), false);
4848 request_locate (0, false);
4853 Session::current_start_frame () const
4855 return _session_range_location ? _session_range_location->start() : 0;
4859 Session::current_end_frame () const
4861 return _session_range_location ? _session_range_location->end() : 0;
4865 Session::add_session_range_location (framepos_t start, framepos_t end)
4867 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4868 _locations->add (_session_range_location);
4872 Session::step_edit_status_change (bool yn)
4878 send = (_step_editors == 0);
4883 send = (_step_editors == 1);
4886 if (_step_editors > 0) {
4892 StepEditStatusChange (val);
4898 Session::start_time_changed (framepos_t old)
4900 /* Update the auto loop range to match the session range
4901 (unless the auto loop range has been changed by the user)
4904 Location* s = _locations->session_range_location ();
4909 Location* l = _locations->auto_loop_location ();
4911 if (l && l->start() == old) {
4912 l->set_start (s->start(), true);
4917 Session::end_time_changed (framepos_t old)
4919 /* Update the auto loop range to match the session range
4920 (unless the auto loop range has been changed by the user)
4923 Location* s = _locations->session_range_location ();
4928 Location* l = _locations->auto_loop_location ();
4930 if (l && l->end() == old) {
4931 l->set_end (s->end(), true);
4935 std::vector<std::string>
4936 Session::source_search_path (DataType type) const
4940 if (session_dirs.size() == 1) {
4942 case DataType::AUDIO:
4943 sp.push_back (_session_dir->sound_path());
4945 case DataType::MIDI:
4946 sp.push_back (_session_dir->midi_path());
4950 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4951 SessionDirectory sdir (i->path);
4953 case DataType::AUDIO:
4954 sp.push_back (sdir.sound_path());
4956 case DataType::MIDI:
4957 sp.push_back (sdir.midi_path());
4963 if (type == DataType::AUDIO) {
4964 const string sound_path_2X = _session_dir->sound_path_2X();
4965 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
4966 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
4967 sp.push_back (sound_path_2X);
4972 // now check the explicit (possibly user-specified) search path
4975 case DataType::AUDIO:
4976 sp += Searchpath(config.get_audio_search_path ());
4978 case DataType::MIDI:
4979 sp += Searchpath(config.get_midi_search_path ());
4987 Session::ensure_search_path_includes (const string& path, DataType type)
4996 case DataType::AUDIO:
4997 sp += Searchpath(config.get_audio_search_path ());
4999 case DataType::MIDI:
5000 sp += Searchpath (config.get_midi_search_path ());
5004 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
5005 /* No need to add this new directory if it has the same inode as
5006 an existing one; checking inode rather than name prevents duplicated
5007 directories when we are using symlinks.
5009 On Windows, I think we could just do if (*i == path) here.
5011 if (PBD::equivalent_paths (*i, path)) {
5019 case DataType::AUDIO:
5020 config.set_audio_search_path (sp.to_string());
5022 case DataType::MIDI:
5023 config.set_midi_search_path (sp.to_string());
5029 Session::remove_dir_from_search_path (const string& dir, DataType type)
5034 case DataType::AUDIO:
5035 sp = Searchpath(config.get_audio_search_path ());
5037 case DataType::MIDI:
5038 sp = Searchpath (config.get_midi_search_path ());
5045 case DataType::AUDIO:
5046 config.set_audio_search_path (sp.to_string());
5048 case DataType::MIDI:
5049 config.set_midi_search_path (sp.to_string());
5055 boost::shared_ptr<Speakers>
5056 Session::get_speakers()
5062 Session::unknown_processors () const
5066 boost::shared_ptr<RouteList> r = routes.reader ();
5067 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5068 list<string> t = (*i)->unknown_processors ();
5069 copy (t.begin(), t.end(), back_inserter (p));
5079 Session::update_latency (bool playback)
5081 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
5083 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
5087 boost::shared_ptr<RouteList> r = routes.reader ();
5088 framecnt_t max_latency = 0;
5091 /* reverse the list so that we work backwards from the last route to run to the first */
5092 RouteList* rl = routes.reader().get();
5093 r.reset (new RouteList (*rl));
5094 reverse (r->begin(), r->end());
5097 /* compute actual latency values for the given direction and store them all in per-port
5098 structures. this will also publish the same values (to JACK) so that computation of latency
5099 for routes can consistently use public latency values.
5102 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5103 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
5106 /* because we latency compensate playback, our published playback latencies should
5107 be the same for all output ports - all material played back by ardour has
5108 the same latency, whether its caused by plugins or by latency compensation. since
5109 these may differ from the values computed above, reset all playback port latencies
5113 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
5115 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5116 (*i)->set_public_port_latencies (max_latency, playback);
5121 post_playback_latency ();
5125 post_capture_latency ();
5128 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
5132 Session::post_playback_latency ()
5134 set_worst_playback_latency ();
5136 boost::shared_ptr<RouteList> r = routes.reader ();
5138 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5139 if (!(*i)->is_auditioner() && ((*i)->active())) {
5140 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
5144 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5145 (*i)->set_latency_compensation (_worst_track_latency);
5150 Session::post_capture_latency ()
5152 set_worst_capture_latency ();
5154 /* reflect any changes in capture latencies into capture offsets
5157 boost::shared_ptr<RouteList> rl = routes.reader();
5158 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5159 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5161 tr->set_capture_offset ();
5167 Session::initialize_latencies ()
5170 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5171 update_latency (false);
5172 update_latency (true);
5175 set_worst_io_latencies ();
5179 Session::set_worst_io_latencies ()
5181 set_worst_playback_latency ();
5182 set_worst_capture_latency ();
5186 Session::set_worst_playback_latency ()
5188 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5192 _worst_output_latency = 0;
5194 if (!_engine.connected()) {
5198 boost::shared_ptr<RouteList> r = routes.reader ();
5200 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5201 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
5204 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
5208 Session::set_worst_capture_latency ()
5210 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5214 _worst_input_latency = 0;
5216 if (!_engine.connected()) {
5220 boost::shared_ptr<RouteList> r = routes.reader ();
5222 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5223 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
5226 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
5230 Session::update_latency_compensation (bool force_whole_graph)
5232 bool some_track_latency_changed = false;
5234 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5238 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
5240 _worst_track_latency = 0;
5242 boost::shared_ptr<RouteList> r = routes.reader ();
5244 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5245 if (!(*i)->is_auditioner() && ((*i)->active())) {
5247 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
5248 some_track_latency_changed = true;
5250 _worst_track_latency = max (tl, _worst_track_latency);
5254 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
5255 (some_track_latency_changed ? "yes" : "no")));
5257 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
5259 if (some_track_latency_changed || force_whole_graph) {
5260 _engine.update_latencies ();
5264 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5265 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5269 tr->set_capture_offset ();
5274 Session::session_name_is_legal (const string& path)
5276 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
5278 for (int i = 0; illegal_chars[i]; ++i) {
5279 if (path.find (illegal_chars[i]) != string::npos) {
5280 return illegal_chars[i];
5288 Session::next_control_id () const
5292 /* the monitor bus remote ID is in a different
5293 * "namespace" than regular routes. its existence doesn't
5294 * affect normal (low) numbered routes.
5301 return nroutes() - subtract;
5305 Session::notify_remote_id_change ()
5307 if (deletion_in_progress()) {
5311 switch (Config->get_remote_model()) {
5313 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
5321 Session::sync_order_keys ()
5323 if (deletion_in_progress()) {
5327 /* tell everyone that something has happened to the sort keys
5328 and let them sync up with the change(s)
5329 this will give objects that manage the sort order keys the
5330 opportunity to keep them in sync if they wish to.
5333 DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
5335 reassign_track_numbers();
5337 Route::SyncOrderKeys (); /* EMIT SIGNAL */
5339 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
5343 Session::operation_in_progress (GQuark op) const
5345 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
5348 boost::shared_ptr<Port>
5349 Session::ltc_input_port () const
5351 return _ltc_input->nth (0);
5354 boost::shared_ptr<Port>
5355 Session::ltc_output_port () const
5357 return _ltc_output->nth (0);
5361 Session::reconnect_ltc_input ()
5365 string src = Config->get_ltc_source_port();
5367 _ltc_input->disconnect (this);
5369 if (src != _("None") && !src.empty()) {
5370 _ltc_input->nth (0)->connect (src);
5376 Session::reconnect_ltc_output ()
5381 string src = Config->get_ltc_sink_port();
5383 _ltc_output->disconnect (this);
5385 if (src != _("None") && !src.empty()) {
5386 _ltc_output->nth (0)->connect (src);