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.
26 #include <cstdio> /* sprintf(3) ... grrr */
32 #include <glibmm/threads.h>
33 #include <glibmm/miscutils.h>
34 #include <glibmm/fileutils.h>
36 #include <boost/algorithm/string/erase.hpp>
38 #include "pbd/basename.h"
39 #include "pbd/boost_debug.h"
40 #include "pbd/convert.h"
41 #include "pbd/convert.h"
42 #include "pbd/error.h"
43 #include "pbd/file_utils.h"
45 #include "pbd/search_path.h"
46 #include "pbd/stacktrace.h"
47 #include "pbd/stl_delete.h"
48 #include "pbd/replace_all.h"
49 #include "pbd/unwind.h"
51 #include "ardour/amp.h"
52 #include "ardour/analyser.h"
53 #include "ardour/async_midi_port.h"
54 #include "ardour/audio_buffer.h"
55 #include "ardour/audio_diskstream.h"
56 #include "ardour/audio_port.h"
57 #include "ardour/audio_track.h"
58 #include "ardour/audioengine.h"
59 #include "ardour/audiofilesource.h"
60 #include "ardour/auditioner.h"
61 #include "ardour/buffer_manager.h"
62 #include "ardour/buffer_set.h"
63 #include "ardour/bundle.h"
64 #include "ardour/butler.h"
65 #include "ardour/click.h"
66 #include "ardour/control_protocol_manager.h"
67 #include "ardour/data_type.h"
68 #include "ardour/debug.h"
69 #include "ardour/directory_names.h"
70 #ifdef USE_TRACKS_CODE_FEATURES
71 #include "ardour/engine_state_controller.h"
73 #include "ardour/filename_extensions.h"
74 #include "ardour/gain_control.h"
75 #include "ardour/graph.h"
76 #include "ardour/luabindings.h"
77 #include "ardour/midiport_manager.h"
78 #include "ardour/scene_changer.h"
79 #include "ardour/midi_patch_manager.h"
80 #include "ardour/midi_track.h"
81 #include "ardour/midi_ui.h"
82 #include "ardour/operations.h"
83 #include "ardour/playlist.h"
84 #include "ardour/plugin.h"
85 #include "ardour/plugin_insert.h"
86 #include "ardour/process_thread.h"
87 #include "ardour/profile.h"
88 #include "ardour/rc_configuration.h"
89 #include "ardour/recent_sessions.h"
90 #include "ardour/region.h"
91 #include "ardour/region_factory.h"
92 #include "ardour/route_graph.h"
93 #include "ardour/route_group.h"
94 #include "ardour/route_sorters.h"
95 #include "ardour/send.h"
96 #include "ardour/session.h"
97 #include "ardour/session_directory.h"
98 #include "ardour/session_playlists.h"
99 #include "ardour/smf_source.h"
100 #include "ardour/source_factory.h"
101 #include "ardour/speakers.h"
102 #include "ardour/tempo.h"
103 #include "ardour/track.h"
104 #include "ardour/user_bundle.h"
105 #include "ardour/utils.h"
107 #include "midi++/port.h"
108 #include "midi++/mmc.h"
110 #include "LuaBridge/LuaBridge.h"
114 #include <glibmm/checksum.h>
123 using namespace ARDOUR;
126 bool Session::_disable_all_loaded_plugins = false;
127 bool Session::_bypass_all_loaded_plugins = false;
128 guint Session::_name_id_counter = 0;
130 PBD::Signal1<int,uint32_t> Session::AudioEngineSetupRequired;
131 PBD::Signal1<void,std::string> Session::Dialog;
132 PBD::Signal0<int> Session::AskAboutPendingState;
133 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
134 PBD::Signal2<void, framecnt_t, framecnt_t> Session::NotifyAboutSampleRateMismatch;
135 PBD::Signal0<void> Session::SendFeedback;
136 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
138 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
139 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
140 PBD::Signal2<void,std::string, std::string> Session::Exported;
141 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
142 PBD::Signal0<void> Session::Quit;
143 PBD::Signal0<void> Session::FeedbackDetected;
144 PBD::Signal0<void> Session::SuccessfulGraphSort;
145 PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
147 const framecnt_t Session::bounce_chunk_size = 8192;
148 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
149 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
151 // seconds should be added after the region exceeds end marker
152 #ifdef USE_TRACKS_CODE_FEATURES
153 const uint32_t Session::session_end_shift = 5;
155 const uint32_t Session::session_end_shift = 0;
158 /** @param snapshot_name Snapshot name, without .ardour suffix */
159 Session::Session (AudioEngine &eng,
160 const string& fullpath,
161 const string& snapshot_name,
162 BusProfile* bus_profile,
164 : playlists (new SessionPlaylists)
166 , process_function (&Session::process_with_events)
167 , _bounce_processing_active (false)
168 , waiting_for_sync_offset (false)
169 , _base_frame_rate (0)
170 , _nominal_frame_rate (0)
171 , _current_frame_rate (0)
172 , transport_sub_state (0)
173 , _record_status (Disabled)
174 , _transport_frame (0)
175 , _session_range_location (0)
178 , _transport_speed (0)
179 , _default_transport_speed (1.0)
180 , _last_transport_speed (0)
181 , _target_transport_speed (0.0)
182 , auto_play_legal (false)
183 , _last_slave_transport_frame (0)
184 , maximum_output_latency (0)
185 , _requested_return_frame (-1)
186 , current_block_size (0)
187 , _worst_output_latency (0)
188 , _worst_input_latency (0)
189 , _worst_track_latency (0)
190 , _have_captured (false)
191 , _non_soloed_outs_muted (false)
194 , _solo_isolated_cnt (0)
196 , _was_seamless (Config->get_seamless_loop ())
197 , _under_nsm_control (false)
199 , delta_accumulator_cnt (0)
200 , average_slave_delta (1800) // !!! why 1800 ???
202 , have_first_delta_accumulator (false)
203 , _slave_state (Stopped)
204 , _mtc_active (false)
205 , _ltc_active (false)
206 , post_export_sync (false)
207 , post_export_position (0)
209 , _export_rolling (false)
210 , _export_preroll (0)
211 , _pre_export_mmc_enabled (false)
212 , _name (snapshot_name)
214 , _send_qf_mtc (false)
215 , _pframes_since_last_mtc (0)
216 , session_midi_feedback (0)
218 , loop_changing (false)
220 , _session_dir (new SessionDirectory (fullpath))
221 , _current_snapshot_name (snapshot_name)
223 , state_was_pending (false)
224 , _state_of_the_state (StateOfTheState(CannotSave|InitialConnecting|Loading))
226 , _save_queued (false)
227 , _last_roll_location (0)
228 , _last_roll_or_reversal_location (0)
229 , _last_record_location (0)
230 , pending_locate_roll (false)
231 , pending_locate_frame (0)
232 , pending_locate_flush (false)
233 , pending_abort (false)
234 , pending_auto_loop (false)
235 , _mempool ("Session", 1048576)
236 , lua (lua_newstate (&PBD::ReallocPool::lalloc, &_mempool))
238 , _butler (new Butler (*this))
239 , _post_transport_work (0)
240 , cumulative_rf_motion (0)
242 , _locations (new Locations (*this))
243 , _ignore_skips_updates (false)
244 , _rt_thread_active (false)
245 , _rt_emit_pending (false)
247 , outbound_mtc_timecode_frame (0)
248 , next_quarter_frame_to_send (-1)
249 , _frames_per_timecode_frame (0)
250 , _frames_per_hour (0)
251 , _timecode_frames_per_hour (0)
252 , last_timecode_valid (false)
253 , last_timecode_when (0)
254 , _send_timecode_update (false)
266 , ltc_timecode_offset (0)
267 , ltc_timecode_negative_offset (false)
268 , midi_control_ui (0)
270 , _all_route_group (new RouteGroup (*this, "all"))
271 , routes (new RouteList)
272 , _adding_routes_in_progress (false)
273 , _reconnecting_routes_in_progress (false)
274 , _route_deletion_in_progress (false)
275 , destructive_index (0)
276 , _track_number_decimals(1)
277 , default_fade_steepness (0)
278 , default_fade_msecs (0)
279 , _total_free_4k_blocks (0)
280 , _total_free_4k_blocks_uncertain (false)
281 , no_questions_about_missing_files (false)
284 , _bundles (new BundleList)
285 , _bundle_xml_node (0)
289 , click_emphasis_data (0)
291 , click_emphasis_length (0)
292 , _clicks_cleared (0)
293 , _play_range (false)
294 , _range_selection (-1,-1)
295 , _object_selection (-1,-1)
297 , first_file_data_format_reset (true)
298 , first_file_header_format_reset (true)
299 , have_looped (false)
300 , _have_rec_enabled_track (false)
301 , _have_rec_disabled_track (true)
303 , _suspend_timecode_transmission (0)
304 , _speakers (new Speakers)
306 , ignore_route_processor_changes (false)
313 pthread_mutex_init (&_rt_emit_mutex, 0);
314 pthread_cond_init (&_rt_emit_cond, 0);
316 init_name_id_counter (1); // reset for new sessions, start at 1
318 pre_engine_init (fullpath);
324 Stateful::loading_state_version = CURRENT_SESSION_FILE_VERSION;
326 #ifdef USE_TRACKS_CODE_FEATURES
327 sr = EngineStateController::instance()->get_current_sample_rate();
329 if (ensure_engine (sr)) {
331 throw SessionException (_("Cannot connect to audio/midi engine"));
334 // set samplerate for plugins added early
335 // e.g from templates or MB channelstrip
336 set_block_size (_engine.samples_per_cycle());
337 set_frame_rate (_engine.sample_rate());
339 if (create (mix_template, bus_profile)) {
341 throw SessionException (_("Session initialization failed"));
344 /* if a mix template was provided, then ::create() will
345 * have copied it into the session and we need to load it
346 * so that we have the state ready for ::set_state()
347 * after the engine is started.
349 * Note that we do NOT try to get the sample rate from
350 * the template at this time, though doing so would
351 * be easy if we decided this was an appropriate part
355 if (!mix_template.empty()) {
356 if (load_state (_current_snapshot_name)) {
357 throw SessionException (_("Failed to load template/snapshot state"));
359 store_recent_templates (mix_template);
362 /* load default session properties - if any */
367 if (load_state (_current_snapshot_name)) {
368 throw SessionException (_("Failed to load state"));
371 /* try to get sample rate from XML state so that we
372 * can influence the SR if we set up the audio
377 const XMLProperty* prop;
378 if ((prop = state_tree->root()->property (X_("sample-rate"))) != 0) {
379 sr = atoi (prop->value());
383 if (ensure_engine (sr)) {
385 throw SessionException (_("Cannot connect to audio/midi engine"));
389 if (post_engine_init ()) {
391 throw SessionException (_("Cannot configure audio/midi engine with session parameters"));
394 store_recent_sessions (_name, _path);
396 bool was_dirty = dirty();
398 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
400 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
401 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
404 DirtyChanged (); /* EMIT SIGNAL */
407 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
408 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
410 emit_thread_start ();
412 /* hook us up to the engine since we are now completely constructed */
414 BootMessage (_("Connect to engine"));
416 _engine.set_session (this);
417 _engine.reset_timebase ();
419 #ifdef USE_TRACKS_CODE_FEATURES
421 EngineStateController::instance()->set_session(this);
424 if ( ARDOUR::Profile->get_trx () ) {
426 /* Waves Tracks: fill session with tracks basing on the amount of inputs.
427 * each available input must have corresponding track when session starts.
430 uint32_t how_many (0);
432 std::vector<std::string> inputs;
433 EngineStateController::instance()->get_physical_audio_inputs(inputs);
435 how_many = inputs.size();
437 list<boost::shared_ptr<AudioTrack> > tracks;
439 // Track names after driver
440 if (Config->get_tracks_auto_naming() == NameAfterDriver) {
441 string track_name = "";
442 for (std::vector<string>::size_type i = 0; i < inputs.size(); ++i) {
444 track_name = inputs[i];
445 replace_all (track_name, "system:capture", "");
447 list<boost::shared_ptr<AudioTrack> > single_track = new_audio_track (1, 1, Normal, 0, 1, track_name);
448 tracks.insert(tracks.begin(), single_track.front());
450 } else { // Default track names
451 tracks = new_audio_track (1, 1, Normal, 0, how_many, string());
454 if (tracks.size() != how_many) {
456 throw failed_constructor ();
465 BootMessage (_("Session loading complete"));
477 Session::next_name_id ()
479 return g_atomic_int_add (&_name_id_counter, 1);
483 Session::name_id_counter ()
485 return g_atomic_int_get (&_name_id_counter);
489 Session::init_name_id_counter (guint n)
491 g_atomic_int_set (&_name_id_counter, n);
495 Session::ensure_engine (uint32_t desired_sample_rate)
497 if (_engine.current_backend() == 0) {
498 /* backend is unknown ... */
499 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
500 if (r.get_value_or (-1) != 0) {
503 } else if (_engine.setup_required()) {
504 /* backend is known, but setup is needed */
505 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
506 if (r.get_value_or (-1) != 0) {
509 } else if (!_engine.running()) {
510 if (_engine.start()) {
515 /* at this point the engine should be running
518 if (!_engine.running()) {
522 return immediately_post_engine ();
527 Session::immediately_post_engine ()
529 /* Do various initializations that should take place directly after we
530 * know that the engine is running, but before we either create a
531 * session or set state for an existing one.
534 if (how_many_dsp_threads () > 1) {
535 /* For now, only create the graph if we are using >1 DSP threads, as
536 it is a bit slower than the old code with 1 thread.
538 _process_graph.reset (new Graph (*this));
541 /* every time we reconnect, recompute worst case output latencies */
543 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
545 if (synced_to_engine()) {
546 _engine.transport_stop ();
549 if (config.get_jack_time_master()) {
550 _engine.transport_locate (_transport_frame);
554 BootMessage (_("Set up LTC"));
556 BootMessage (_("Set up Click"));
558 BootMessage (_("Set up standard connections"));
562 catch (failed_constructor& err) {
566 /* TODO, connect in different thread. (PortRegisteredOrUnregistered may be in RT context)
568 _engine.PortRegisteredOrUnregistered.connect_same_thread (*this, boost::bind (&Session::setup_bundles, this));
576 vector<void*> debug_pointers;
578 /* if we got to here, leaving pending capture state around
582 remove_pending_capture_state ();
586 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
588 /* disconnect from any and all signals that we are connected to */
592 /* shutdown control surface protocols while we still have ports
593 and the engine to move data to any devices.
596 ControlProtocolManager::instance().drop_protocols ();
598 MIDI::Name::MidiPatchManager::instance().remove_search_path(session_directory().midi_patch_path());
600 _engine.remove_session ();
602 #ifdef USE_TRACKS_CODE_FEATURES
603 EngineStateController::instance()->remove_session();
606 /* deregister all ports - there will be no process or any other
607 * callbacks from the engine any more.
610 Port::PortDrop (); /* EMIT SIGNAL */
614 /* clear history so that no references to objects are held any more */
618 /* clear state tree so that no references to objects are held any more */
623 // unregister all lua functions, drop held references (if any)
625 lua.do_command ("Session = nil");
633 lua.collect_garbage ();
635 /* reset dynamic state version back to default */
636 Stateful::loading_state_version = 0;
638 _butler->drop_references ();
642 delete _all_route_group;
644 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
645 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
649 if (click_data != default_click) {
650 delete [] click_data;
653 if (click_emphasis_data != default_click_emphasis) {
654 delete [] click_emphasis_data;
659 /* need to remove auditioner before monitoring section
660 * otherwise it is re-connected */
663 /* drop references to routes held by the monitoring section
664 * specifically _monitor_out aux/listen references */
665 remove_monitor_section();
667 /* clear out any pending dead wood from RCU managed objects */
672 AudioDiskstream::free_working_buffers();
674 /* tell everyone who is still standing that we're about to die */
677 /* tell everyone to drop references and delete objects as we go */
679 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
680 RegionFactory::delete_all_regions ();
682 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
684 /* reset these three references to special routes before we do the usual route delete thing */
686 _master_out.reset ();
687 _monitor_out.reset ();
690 RCUWriter<RouteList> writer (routes);
691 boost::shared_ptr<RouteList> r = writer.get_copy ();
693 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
694 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
695 (*i)->drop_references ();
699 /* writer goes out of scope and updates master */
704 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
705 Glib::Threads::Mutex::Lock lm (source_lock);
706 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
707 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
708 i->second->drop_references ();
714 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
717 emit_thread_terminate ();
719 pthread_cond_destroy (&_rt_emit_cond);
720 pthread_mutex_destroy (&_rt_emit_mutex);
722 delete _scene_changer; _scene_changer = 0;
723 delete midi_control_ui; midi_control_ui = 0;
725 delete _mmc; _mmc = 0;
726 delete _midi_ports; _midi_ports = 0;
727 delete _locations; _locations = 0;
731 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
733 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
734 boost_debug_list_ptrs ();
739 Session::setup_ltc ()
743 _ltc_input.reset (new IO (*this, X_("LTC In"), IO::Input));
744 _ltc_output.reset (new IO (*this, X_("LTC Out"), IO::Output));
746 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC In"))) != 0) {
747 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
750 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
751 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
753 reconnect_ltc_input ();
756 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC Out"))) != 0) {
757 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
760 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
761 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
763 reconnect_ltc_output ();
766 /* fix up names of LTC ports because we don't want the normal
767 * IO style of NAME/TYPE-{in,out}N
770 _ltc_input->nth (0)->set_name (X_("LTC-in"));
771 _ltc_output->nth (0)->set_name (X_("LTC-out"));
775 Session::setup_click ()
779 boost::shared_ptr<AutomationList> gl (new AutomationList (Evoral::Parameter (GainAutomation)));
780 boost::shared_ptr<GainControl> gain_control = boost::shared_ptr<GainControl> (new GainControl (*this, Evoral::Parameter(GainAutomation), gl));
782 _click_io.reset (new ClickIO (*this, X_("Click")));
783 _click_gain.reset (new Amp (*this, _("Fader"), gain_control, true));
784 _click_gain->activate ();
786 setup_click_state (state_tree->root());
788 setup_click_state (0);
793 Session::setup_click_state (const XMLNode* node)
795 const XMLNode* child = 0;
797 if (node && (child = find_named_node (*node, "Click")) != 0) {
799 /* existing state for Click */
802 if (Stateful::loading_state_version < 3000) {
803 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
805 const XMLNodeList& children (child->children());
806 XMLNodeList::const_iterator i = children.begin();
807 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
809 if (i != children.end()) {
810 c = _click_gain->set_state (**i, Stateful::loading_state_version);
816 _clicking = Config->get_clicking ();
820 error << _("could not setup Click I/O") << endmsg;
827 /* default state for Click: dual-mono to first 2 physical outputs */
830 _engine.get_physical_outputs (DataType::AUDIO, outs);
832 for (uint32_t physport = 0; physport < 2; ++physport) {
833 if (outs.size() > physport) {
834 if (_click_io->add_port (outs[physport], this)) {
835 // relax, even though its an error
840 if (_click_io->n_ports () > ChanCount::ZERO) {
841 _clicking = Config->get_clicking ();
847 Session::setup_bundles ()
851 RCUWriter<BundleList> writer (_bundles);
852 boost::shared_ptr<BundleList> b = writer.get_copy ();
853 for (BundleList::iterator i = b->begin(); i != b->end();) {
854 if (boost::dynamic_pointer_cast<UserBundle>(*i)) {
862 vector<string> inputs[DataType::num_types];
863 vector<string> outputs[DataType::num_types];
864 for (uint32_t i = 0; i < DataType::num_types; ++i) {
865 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
866 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
869 /* Create a set of Bundle objects that map
870 to the physical I/O currently available. We create both
871 mono and stereo bundles, so that the common cases of mono
872 and stereo tracks get bundles to put in their mixer strip
873 in / out menus. There may be a nicer way of achieving that;
874 it doesn't really scale that well to higher channel counts
877 /* mono output bundles */
879 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
881 std::string pn = _engine.get_pretty_name_by_name (outputs[DataType::AUDIO][np]);
883 snprintf (buf, sizeof (buf), _("out %s"), pn.c_str());
885 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
888 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
889 c->add_channel (_("mono"), DataType::AUDIO);
890 c->set_port (0, outputs[DataType::AUDIO][np]);
892 add_bundle (c, false);
895 /* stereo output bundles */
897 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
898 if (np + 1 < outputs[DataType::AUDIO].size()) {
900 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
901 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
902 c->add_channel (_("L"), DataType::AUDIO);
903 c->set_port (0, outputs[DataType::AUDIO][np]);
904 c->add_channel (_("R"), DataType::AUDIO);
905 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
907 add_bundle (c, false);
911 /* mono input bundles */
913 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
915 std::string pn = _engine.get_pretty_name_by_name (inputs[DataType::AUDIO][np]);
917 snprintf (buf, sizeof (buf), _("in %s"), pn.c_str());
919 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
922 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
923 c->add_channel (_("mono"), DataType::AUDIO);
924 c->set_port (0, inputs[DataType::AUDIO][np]);
926 add_bundle (c, false);
929 /* stereo input bundles */
931 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
932 if (np + 1 < inputs[DataType::AUDIO].size()) {
934 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
936 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
937 c->add_channel (_("L"), DataType::AUDIO);
938 c->set_port (0, inputs[DataType::AUDIO][np]);
939 c->add_channel (_("R"), DataType::AUDIO);
940 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
942 add_bundle (c, false);
946 /* MIDI input bundles */
948 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
949 string n = inputs[DataType::MIDI][np];
950 std::string pn = _engine.get_pretty_name_by_name (n);
954 boost::erase_first (n, X_("alsa_pcm:"));
956 boost::shared_ptr<Bundle> c (new Bundle (n, false));
957 c->add_channel ("", DataType::MIDI);
958 c->set_port (0, inputs[DataType::MIDI][np]);
959 add_bundle (c, false);
962 /* MIDI output bundles */
964 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
965 string n = outputs[DataType::MIDI][np];
966 std::string pn = _engine.get_pretty_name_by_name (n);
970 boost::erase_first (n, X_("alsa_pcm:"));
972 boost::shared_ptr<Bundle> c (new Bundle (n, true));
973 c->add_channel ("", DataType::MIDI);
974 c->set_port (0, outputs[DataType::MIDI][np]);
975 add_bundle (c, false);
978 // we trust the backend to only calls us if there's a change
979 BundleAddedOrRemoved (); /* EMIT SIGNAL */
983 Session::auto_connect_master_bus ()
985 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
989 // Waves Tracks: Do not connect master bas for Tracks if AutoConnectMaster option is not set
990 // In this case it means "Multi Out" output mode
991 if (ARDOUR::Profile->get_trx() && !(Config->get_output_auto_connect() & AutoConnectMaster) ) {
995 /* if requested auto-connect the outputs to the first N physical ports.
998 uint32_t limit = _master_out->n_outputs().n_total();
999 vector<string> outputs[DataType::num_types];
1001 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1002 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1005 for (uint32_t n = 0; n < limit; ++n) {
1006 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
1008 if (outputs[p->type()].size() > n) {
1009 connect_to = outputs[p->type()][n];
1012 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
1013 if (_master_out->output()->connect (p, connect_to, this)) {
1014 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
1023 Session::remove_monitor_section ()
1025 if (!_monitor_out || Profile->get_trx()) {
1029 /* force reversion to Solo-In-Place */
1030 Config->set_solo_control_is_listen_control (false);
1032 /* if we are auditioning, cancel it ... this is a workaround
1033 to a problem (auditioning does not execute the process graph,
1034 which is needed to remove routes when using >1 core for processing)
1039 /* Hold process lock while doing this so that we don't hear bits and
1040 * pieces of audio as we work on each route.
1043 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1045 /* Connect tracks to monitor section. Note that in an
1046 existing session, the internal sends will already exist, but we want the
1047 routes to notice that they connect to the control out specifically.
1051 boost::shared_ptr<RouteList> r = routes.reader ();
1052 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1054 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
1056 if ((*x)->is_monitor()) {
1058 } else if ((*x)->is_master()) {
1061 (*x)->remove_aux_or_listen (_monitor_out);
1066 remove_route (_monitor_out);
1067 auto_connect_master_bus ();
1070 auditioner->connect ();
1072 Config->ParameterChanged ("use-monitor-bus");
1076 Session::add_monitor_section ()
1080 if (_monitor_out || !_master_out || Profile->get_trx()) {
1084 boost::shared_ptr<Route> r (new Route (*this, _("Monitor"), Route::MonitorOut, DataType::AUDIO));
1090 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1091 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
1094 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1095 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1096 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1098 error << _("Cannot create monitor section. 'Monitor' Port name is not unique.") << endmsg;
1103 add_routes (rl, false, false, false);
1105 assert (_monitor_out);
1107 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
1108 are undefined, at best.
1111 uint32_t limit = _monitor_out->n_inputs().n_audio();
1115 /* connect the inputs to the master bus outputs. this
1116 * represents a separate data feed from the internal sends from
1117 * each route. as of jan 2011, it allows the monitor section to
1118 * conditionally ignore either the internal sends or the normal
1119 * input feed, but we should really find a better way to do
1123 _master_out->output()->disconnect (this);
1125 for (uint32_t n = 0; n < limit; ++n) {
1126 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1127 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1130 string connect_to = o->name();
1131 if (_monitor_out->input()->connect (p, connect_to, this)) {
1132 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1140 /* if monitor section is not connected, connect it to physical outs
1143 if ((Config->get_auto_connect_standard_busses () || Profile->get_mixbus ()) && !_monitor_out->output()->connected ()) {
1145 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1147 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1150 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1152 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1153 Config->get_monitor_bus_preferred_bundle())
1159 /* Monitor bus is audio only */
1161 vector<string> outputs[DataType::num_types];
1163 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1164 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1167 uint32_t mod = outputs[DataType::AUDIO].size();
1168 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1172 for (uint32_t n = 0; n < limit; ++n) {
1174 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1176 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1177 connect_to = outputs[DataType::AUDIO][n % mod];
1180 if (!connect_to.empty()) {
1181 if (_monitor_out->output()->connect (p, connect_to, this)) {
1182 error << string_compose (
1183 _("cannot connect control output %1 to %2"),
1194 /* Hold process lock while doing this so that we don't hear bits and
1195 * pieces of audio as we work on each route.
1198 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1200 /* Connect tracks to monitor section. Note that in an
1201 existing session, the internal sends will already exist, but we want the
1202 routes to notice that they connect to the control out specifically.
1206 boost::shared_ptr<RouteList> rls = routes.reader ();
1208 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1210 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1212 if ((*x)->is_monitor()) {
1214 } else if ((*x)->is_master()) {
1217 (*x)->enable_monitor_send ();
1222 auditioner->connect ();
1224 Config->ParameterChanged ("use-monitor-bus");
1228 Session::reset_monitor_section ()
1230 /* Process lock should be held by the caller.*/
1232 if (!_monitor_out || Profile->get_trx()) {
1236 uint32_t limit = _master_out->n_outputs().n_audio();
1238 /* connect the inputs to the master bus outputs. this
1239 * represents a separate data feed from the internal sends from
1240 * each route. as of jan 2011, it allows the monitor section to
1241 * conditionally ignore either the internal sends or the normal
1242 * input feed, but we should really find a better way to do
1246 _master_out->output()->disconnect (this);
1247 _monitor_out->output()->disconnect (this);
1249 _monitor_out->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1250 _monitor_out->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1252 for (uint32_t n = 0; n < limit; ++n) {
1253 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1254 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1257 string connect_to = o->name();
1258 if (_monitor_out->input()->connect (p, connect_to, this)) {
1259 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1266 /* connect monitor section to physical outs
1269 if (Config->get_auto_connect_standard_busses()) {
1271 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1273 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1276 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1278 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1279 Config->get_monitor_bus_preferred_bundle())
1285 /* Monitor bus is audio only */
1287 vector<string> outputs[DataType::num_types];
1289 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1290 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1293 uint32_t mod = outputs[DataType::AUDIO].size();
1294 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1298 for (uint32_t n = 0; n < limit; ++n) {
1300 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1302 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1303 connect_to = outputs[DataType::AUDIO][n % mod];
1306 if (!connect_to.empty()) {
1307 if (_monitor_out->output()->connect (p, connect_to, this)) {
1308 error << string_compose (
1309 _("cannot connect control output %1 to %2"),
1320 /* Connect tracks to monitor section. Note that in an
1321 existing session, the internal sends will already exist, but we want the
1322 routes to notice that they connect to the control out specifically.
1326 boost::shared_ptr<RouteList> rls = routes.reader ();
1328 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1330 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1332 if ((*x)->is_monitor()) {
1334 } else if ((*x)->is_master()) {
1337 (*x)->enable_monitor_send ();
1343 Session::hookup_io ()
1345 /* stop graph reordering notifications from
1346 causing resorts, etc.
1349 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
1353 /* we delay creating the auditioner till now because
1354 it makes its own connections to ports.
1358 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
1360 throw failed_constructor ();
1362 a->use_new_diskstream ();
1366 catch (failed_constructor& err) {
1367 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
1371 /* load bundles, which we may have postponed earlier on */
1372 if (_bundle_xml_node) {
1373 load_bundles (*_bundle_xml_node);
1374 delete _bundle_xml_node;
1377 /* Tell all IO objects to connect themselves together */
1379 IO::enable_connecting ();
1381 /* Now tell all "floating" ports to connect to whatever
1382 they should be connected to.
1385 AudioEngine::instance()->reconnect_ports ();
1387 /* Anyone who cares about input state, wake up and do something */
1389 IOConnectionsComplete (); /* EMIT SIGNAL */
1391 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
1393 /* now handle the whole enchilada as if it was one
1394 graph reorder event.
1399 /* update the full solo state, which can't be
1400 correctly determined on a per-route basis, but
1401 needs the global overview that only the session
1405 update_route_solo_state ();
1409 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
1411 boost::shared_ptr<Track> track = wp.lock ();
1416 boost::shared_ptr<Playlist> playlist;
1418 if ((playlist = track->playlist()) != 0) {
1419 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
1420 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
1421 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
1426 Session::record_enabling_legal () const
1428 /* this used to be in here, but survey says.... we don't need to restrict it */
1429 // if (record_status() == Recording) {
1433 if (Config->get_all_safe()) {
1440 Session::set_track_monitor_input_status (bool yn)
1442 boost::shared_ptr<RouteList> rl = routes.reader ();
1443 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1444 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1445 if (tr && tr->record_enabled ()) {
1446 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1447 tr->request_input_monitoring (yn);
1453 Session::auto_punch_start_changed (Location* location)
1455 replace_event (SessionEvent::PunchIn, location->start());
1457 if (get_record_enabled() && config.get_punch_in()) {
1458 /* capture start has been changed, so save new pending state */
1459 save_state ("", true);
1464 Session::auto_punch_end_changed (Location* location)
1466 framepos_t when_to_stop = location->end();
1467 // when_to_stop += _worst_output_latency + _worst_input_latency;
1468 replace_event (SessionEvent::PunchOut, when_to_stop);
1472 Session::auto_punch_changed (Location* location)
1474 framepos_t when_to_stop = location->end();
1476 replace_event (SessionEvent::PunchIn, location->start());
1477 //when_to_stop += _worst_output_latency + _worst_input_latency;
1478 replace_event (SessionEvent::PunchOut, when_to_stop);
1481 /** @param loc A loop location.
1482 * @param pos Filled in with the start time of the required fade-out (in session frames).
1483 * @param length Filled in with the length of the required fade-out.
1486 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
1488 pos = max (loc->start(), loc->end() - 64);
1489 length = loc->end() - pos;
1493 Session::auto_loop_changed (Location* location)
1495 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1498 auto_loop_declick_range (location, dcp, dcl);
1500 if (transport_rolling() && play_loop) {
1502 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1504 // if (_transport_frame > location->end()) {
1506 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1507 // relocate to beginning of loop
1508 clear_events (SessionEvent::LocateRoll);
1510 request_locate (location->start(), true);
1513 else if (Config->get_seamless_loop() && !loop_changing) {
1515 // schedule a locate-roll to refill the diskstreams at the
1516 // previous loop end
1517 loop_changing = true;
1519 if (location->end() > last_loopend) {
1520 clear_events (SessionEvent::LocateRoll);
1521 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1527 clear_events (SessionEvent::AutoLoopDeclick);
1528 clear_events (SessionEvent::AutoLoop);
1531 /* possibly move playhead if not rolling; if we are rolling we'll move
1532 to the loop start on stop if that is appropriate.
1537 if (!transport_rolling() && select_playhead_priority_target (pos)) {
1538 if (pos == location->start()) {
1539 request_locate (pos);
1544 last_loopend = location->end();
1549 Session::set_auto_punch_location (Location* location)
1553 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1554 punch_connections.drop_connections();
1555 existing->set_auto_punch (false, this);
1556 remove_event (existing->start(), SessionEvent::PunchIn);
1557 clear_events (SessionEvent::PunchOut);
1558 auto_punch_location_changed (0);
1563 if (location == 0) {
1567 if (location->end() <= location->start()) {
1568 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1572 punch_connections.drop_connections ();
1574 location->StartChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, location));
1575 location->EndChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, location));
1576 location->Changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, location));
1578 location->set_auto_punch (true, this);
1580 auto_punch_changed (location);
1582 auto_punch_location_changed (location);
1586 Session::set_session_extents (framepos_t start, framepos_t end)
1589 if ((existing = _locations->session_range_location()) == 0) {
1590 //if there is no existing session, we need to make a new session location (should never happen)
1591 existing = new Location (*this, 0, 0, _("session"), Location::IsSessionRange);
1595 error << _("Session: you can't use that location for session start/end)") << endmsg;
1599 existing->set( start, end );
1605 Session::set_auto_loop_location (Location* location)
1609 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1610 loop_connections.drop_connections ();
1611 existing->set_auto_loop (false, this);
1612 remove_event (existing->end(), SessionEvent::AutoLoop);
1615 auto_loop_declick_range (existing, dcp, dcl);
1616 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1617 auto_loop_location_changed (0);
1622 if (location == 0) {
1626 if (location->end() <= location->start()) {
1627 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1631 last_loopend = location->end();
1633 loop_connections.drop_connections ();
1635 location->StartChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1636 location->EndChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1637 location->Changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1638 location->FlagsChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1640 location->set_auto_loop (true, this);
1642 if (Config->get_loop_is_mode() && play_loop && Config->get_seamless_loop()) {
1643 // set all tracks to use internal looping
1644 boost::shared_ptr<RouteList> rl = routes.reader ();
1645 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1646 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1647 if (tr && !tr->hidden()) {
1648 tr->set_loop (location);
1653 /* take care of our stuff first */
1655 auto_loop_changed (location);
1657 /* now tell everyone else */
1659 auto_loop_location_changed (location);
1663 Session::update_marks (Location*)
1669 Session::update_skips (Location* loc, bool consolidate)
1671 if (_ignore_skips_updates) {
1675 Locations::LocationList skips;
1678 PBD::Unwinder<bool> uw (_ignore_skips_updates, true);
1679 consolidate_skips (loc);
1682 sync_locations_to_skips ();
1688 Session::consolidate_skips (Location* loc)
1690 Locations::LocationList all_locations = _locations->list ();
1692 for (Locations::LocationList::iterator l = all_locations.begin(); l != all_locations.end(); ) {
1694 if (!(*l)->is_skip ()) {
1699 /* don't test against self */
1706 switch (Evoral::coverage ((*l)->start(), (*l)->end(), loc->start(), loc->end())) {
1707 case Evoral::OverlapInternal:
1708 case Evoral::OverlapExternal:
1709 case Evoral::OverlapStart:
1710 case Evoral::OverlapEnd:
1711 /* adjust new location to cover existing one */
1712 loc->set_start (min (loc->start(), (*l)->start()));
1713 loc->set_end (max (loc->end(), (*l)->end()));
1714 /* we don't need this one any more */
1715 _locations->remove (*l);
1716 /* the location has been deleted, so remove reference to it in our local list */
1717 l = all_locations.erase (l);
1720 case Evoral::OverlapNone:
1728 Session::sync_locations_to_skips ()
1730 /* This happens asynchronously (in the audioengine thread). After the clear is done, we will call
1731 * Session::_sync_locations_to_skips() from the audioengine thread.
1733 clear_events (SessionEvent::Skip, boost::bind (&Session::_sync_locations_to_skips, this));
1737 Session::_sync_locations_to_skips ()
1739 /* called as a callback after existing Skip events have been cleared from a realtime audioengine thread */
1741 Locations::LocationList const & locs (_locations->list());
1743 for (Locations::LocationList::const_iterator i = locs.begin(); i != locs.end(); ++i) {
1745 Location* location = *i;
1747 if (location->is_skip() && location->is_skipping()) {
1748 SessionEvent* ev = new SessionEvent (SessionEvent::Skip, SessionEvent::Add, location->start(), location->end(), 1.0);
1756 Session::location_added (Location *location)
1758 if (location->is_auto_punch()) {
1759 set_auto_punch_location (location);
1762 if (location->is_auto_loop()) {
1763 set_auto_loop_location (location);
1766 if (location->is_session_range()) {
1767 /* no need for any signal handling or event setting with the session range,
1768 because we keep a direct reference to it and use its start/end directly.
1770 _session_range_location = location;
1773 if (location->is_mark()) {
1774 /* listen for per-location signals that require us to do any * global updates for marks */
1776 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1777 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1778 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1779 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1782 if (location->is_skip()) {
1783 /* listen for per-location signals that require us to update skip-locate events */
1785 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1786 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1787 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1788 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, false));
1790 update_skips (location, true);
1797 Session::location_removed (Location *location)
1799 if (location->is_auto_loop()) {
1800 set_auto_loop_location (0);
1801 set_track_loop (false);
1804 if (location->is_auto_punch()) {
1805 set_auto_punch_location (0);
1808 if (location->is_session_range()) {
1809 /* this is never supposed to happen */
1810 error << _("programming error: session range removed!") << endl;
1813 if (location->is_skip()) {
1815 update_skips (location, false);
1822 Session::locations_changed ()
1824 _locations->apply (*this, &Session::_locations_changed);
1828 Session::_locations_changed (const Locations::LocationList& locations)
1830 /* There was some mass-change in the Locations object.
1832 We might be re-adding a location here but it doesn't actually matter
1833 for all the locations that the Session takes an interest in.
1837 PBD::Unwinder<bool> protect_ignore_skip_updates (_ignore_skips_updates, true);
1838 for (Locations::LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
1839 location_added (*i);
1843 update_skips (NULL, false);
1847 Session::enable_record ()
1849 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1850 /* no recording at anything except normal speed */
1855 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1857 if (rs == Recording) {
1861 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1863 _last_record_location = _transport_frame;
1864 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1866 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1867 set_track_monitor_input_status (true);
1870 RecordStateChanged ();
1877 Session::set_all_tracks_record_enabled (bool enable )
1879 boost::shared_ptr<RouteList> rl = routes.reader();
1880 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1881 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1883 tr->set_record_enabled (enable, Controllable::NoGroup);
1890 Session::disable_record (bool rt_context, bool force)
1894 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1896 if (!Config->get_latched_record_enable () || force) {
1897 g_atomic_int_set (&_record_status, Disabled);
1898 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1900 if (rs == Recording) {
1901 g_atomic_int_set (&_record_status, Enabled);
1905 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1906 set_track_monitor_input_status (false);
1909 RecordStateChanged (); /* emit signal */
1912 remove_pending_capture_state ();
1918 Session::step_back_from_record ()
1920 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1922 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1923 set_track_monitor_input_status (false);
1926 RecordStateChanged (); /* emit signal */
1931 Session::maybe_enable_record ()
1933 if (_step_editors > 0) {
1937 g_atomic_int_set (&_record_status, Enabled);
1939 /* This function is currently called from somewhere other than an RT thread.
1940 This save_state() call therefore doesn't impact anything. Doing it here
1941 means that we save pending state of which sources the next record will use,
1942 which gives us some chance of recovering from a crash during the record.
1945 save_state ("", true);
1947 if (_transport_speed) {
1948 if (!config.get_punch_in()) {
1952 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1953 RecordStateChanged (); /* EMIT SIGNAL */
1960 Session::audible_frame () const
1966 offset = worst_playback_latency ();
1968 if (synced_to_engine()) {
1969 /* Note: this is basically just sync-to-JACK */
1970 tf = _engine.transport_frame();
1972 tf = _transport_frame;
1977 if (!non_realtime_work_pending()) {
1981 /* Check to see if we have passed the first guaranteed
1982 audible frame past our last start position. if not,
1983 return that last start point because in terms
1984 of audible frames, we have not moved yet.
1986 `Start position' in this context means the time we last
1987 either started, located, or changed transport direction.
1990 if (_transport_speed > 0.0f) {
1992 if (!play_loop || !have_looped) {
1993 if (tf < _last_roll_or_reversal_location + offset) {
1994 return _last_roll_or_reversal_location;
2002 } else if (_transport_speed < 0.0f) {
2004 /* XXX wot? no backward looping? */
2006 if (tf > _last_roll_or_reversal_location - offset) {
2007 return _last_roll_or_reversal_location;
2019 Session::set_frame_rate (framecnt_t frames_per_second)
2021 /** \fn void Session::set_frame_size(framecnt_t)
2022 the AudioEngine object that calls this guarantees
2023 that it will not be called while we are also in
2024 ::process(). Its fine to do things that block
2028 if (_base_frame_rate == 0) {
2029 _base_frame_rate = frames_per_second;
2031 else if (_base_frame_rate != frames_per_second && frames_per_second != _nominal_frame_rate) {
2032 NotifyAboutSampleRateMismatch (_base_frame_rate, frames_per_second);
2034 _nominal_frame_rate = frames_per_second;
2039 reset_write_sources (false);
2041 // XXX we need some equivalent to this, somehow
2042 // SndFileSource::setup_standard_crossfades (frames_per_second);
2046 /* XXX need to reset/reinstantiate all LADSPA plugins */
2050 Session::set_block_size (pframes_t nframes)
2052 /* the AudioEngine guarantees
2053 that it will not be called while we are also in
2054 ::process(). It is therefore fine to do things that block
2059 current_block_size = nframes;
2063 boost::shared_ptr<RouteList> r = routes.reader ();
2065 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2066 (*i)->set_block_size (nframes);
2069 boost::shared_ptr<RouteList> rl = routes.reader ();
2070 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2071 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2073 tr->set_block_size (nframes);
2077 set_worst_io_latencies ();
2083 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
2085 boost::shared_ptr<Route> r2;
2087 if (r1->feeds (rbase) && rbase->feeds (r1)) {
2088 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
2092 /* make a copy of the existing list of routes that feed r1 */
2094 Route::FedBy existing (r1->fed_by());
2096 /* for each route that feeds r1, recurse, marking it as feeding
2100 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
2101 if (!(r2 = i->r.lock ())) {
2102 /* (*i) went away, ignore it */
2106 /* r2 is a route that feeds r1 which somehow feeds base. mark
2107 base as being fed by r2
2110 rbase->add_fed_by (r2, i->sends_only);
2114 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
2118 if (r1->feeds (r2) && r2->feeds (r1)) {
2122 /* now recurse, so that we can mark base as being fed by
2123 all routes that feed r2
2126 trace_terminal (r2, rbase);
2133 Session::resort_routes ()
2135 /* don't do anything here with signals emitted
2136 by Routes during initial setup or while we
2137 are being destroyed.
2140 if (_state_of_the_state & (InitialConnecting | Deletion)) {
2144 if (_route_deletion_in_progress) {
2149 RCUWriter<RouteList> writer (routes);
2150 boost::shared_ptr<RouteList> r = writer.get_copy ();
2151 resort_routes_using (r);
2152 /* writer goes out of scope and forces update */
2156 boost::shared_ptr<RouteList> rl = routes.reader ();
2157 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2158 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
2160 const Route::FedBy& fb ((*i)->fed_by());
2162 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
2163 boost::shared_ptr<Route> sf = f->r.lock();
2165 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
2173 /** This is called whenever we need to rebuild the graph of how we will process
2175 * @param r List of routes, in any order.
2179 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
2181 /* We are going to build a directed graph of our routes;
2182 this is where the edges of that graph are put.
2187 /* Go through all routes doing two things:
2189 * 1. Collect the edges of the route graph. Each of these edges
2190 * is a pair of routes, one of which directly feeds the other
2191 * either by a JACK connection or by an internal send.
2193 * 2. Begin the process of making routes aware of which other
2194 * routes directly or indirectly feed them. This information
2195 * is used by the solo code.
2198 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2200 /* Clear out the route's list of direct or indirect feeds */
2201 (*i)->clear_fed_by ();
2203 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
2205 bool via_sends_only;
2207 /* See if this *j feeds *i according to the current state of the JACK
2208 connections and internal sends.
2210 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
2211 /* add the edge to the graph (part #1) */
2212 edges.add (*j, *i, via_sends_only);
2213 /* tell the route (for part #2) */
2214 (*i)->add_fed_by (*j, via_sends_only);
2219 /* Attempt a topological sort of the route graph */
2220 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
2222 if (sorted_routes) {
2223 /* We got a satisfactory topological sort, so there is no feedback;
2226 Note: the process graph rechain does not require a
2227 topologically-sorted list, but hey ho.
2229 if (_process_graph) {
2230 _process_graph->rechain (sorted_routes, edges);
2233 _current_route_graph = edges;
2235 /* Complete the building of the routes' lists of what directly
2236 or indirectly feeds them.
2238 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2239 trace_terminal (*i, *i);
2242 *r = *sorted_routes;
2245 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
2246 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2247 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
2248 (*i)->name(), (*i)->order_key ()));
2252 SuccessfulGraphSort (); /* EMIT SIGNAL */
2255 /* The topological sort failed, so we have a problem. Tell everyone
2256 and stick to the old graph; this will continue to be processed, so
2257 until the feedback is fixed, what is played back will not quite
2258 reflect what is actually connected. Note also that we do not
2259 do trace_terminal here, as it would fail due to an endless recursion,
2260 so the solo code will think that everything is still connected
2264 FeedbackDetected (); /* EMIT SIGNAL */
2269 /** Find a route name starting with \a base, maybe followed by the
2270 * lowest \a id. \a id will always be added if \a definitely_add_number
2271 * is true on entry; otherwise it will only be added if required
2272 * to make the name unique.
2274 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
2275 * The available route name with the lowest ID will be used, and \a id
2276 * will be set to the ID.
2278 * \return false if a route name could not be found, and \a track_name
2279 * and \a id do not reflect a free route name.
2282 Session::find_route_name (string const & base, uint32_t& id, string& name, bool definitely_add_number)
2284 /* the base may conflict with ports that do not belong to existing
2285 routes, but hidden objects like the click track. So check port names
2286 before anything else.
2289 for (vector<string>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
2290 if (base == *reserved) {
2291 /* Check if this reserved name already exists, and if
2292 so, disallow it without a numeric suffix.
2294 if (route_by_name (*reserved)) {
2295 definitely_add_number = true;
2304 if (!definitely_add_number && route_by_name (base) == 0) {
2305 /* juse use the base */
2311 name = string_compose ("%1 %2", base, id);
2313 if (route_by_name (name) == 0) {
2319 } while (id < (UINT_MAX-1));
2324 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
2326 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
2328 in = ChanCount::ZERO;
2329 out = ChanCount::ZERO;
2331 boost::shared_ptr<RouteList> r = routes.reader ();
2333 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2334 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2335 if (tr && !tr->is_auditioner()) {
2336 in += tr->n_inputs();
2337 out += tr->n_outputs();
2343 Session::default_track_name_pattern (DataType t)
2346 case DataType::AUDIO:
2347 if (Profile->get_trx()) {
2354 case DataType::MIDI:
2361 /** Caller must not hold process lock
2362 * @param name_template string to use for the start of the name, or "" to use "MIDI".
2363 * @param instrument plugin info for the instrument to insert pre-fader, if any
2365 list<boost::shared_ptr<MidiTrack> >
2366 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
2367 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
2370 uint32_t track_id = 0;
2372 RouteList new_routes;
2373 list<boost::shared_ptr<MidiTrack> > ret;
2375 const string name_pattern = default_track_name_pattern (DataType::MIDI);
2376 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
2379 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, use_number)) {
2380 error << "cannot find name for new midi track" << endmsg;
2384 boost::shared_ptr<MidiTrack> track;
2387 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
2389 if (track->init ()) {
2393 if (Profile->get_mixbus ()) {
2394 track->set_strict_io (true);
2397 track->use_new_diskstream();
2399 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2400 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2403 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2404 if (track->input()->ensure_io (input, false, this)) {
2405 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
2409 if (track->output()->ensure_io (output, false, this)) {
2410 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
2415 track->non_realtime_input_change();
2418 route_group->add (track);
2421 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2423 if (Config->get_remote_model() == UserOrdered) {
2424 track->set_remote_control_id (next_control_id());
2427 new_routes.push_back (track);
2428 ret.push_back (track);
2430 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2433 catch (failed_constructor &err) {
2434 error << _("Session: could not create new midi track.") << endmsg;
2438 catch (AudioEngine::PortRegistrationFailure& pfe) {
2440 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;
2448 if (!new_routes.empty()) {
2449 StateProtector sp (this);
2450 if (Profile->get_trx()) {
2451 add_routes (new_routes, false, false, false);
2453 add_routes (new_routes, true, true, false);
2457 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
2458 PluginPtr plugin = instrument->load (*this);
2459 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2460 (*r)->add_processor (p, PreFader);
2470 Session::new_midi_route (RouteGroup* route_group, uint32_t how_many, string name_template, boost::shared_ptr<PluginInfo> instrument)
2473 uint32_t bus_id = 0;
2477 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Midi Bus");
2480 if (!find_route_name (name_template.empty () ? _("Midi Bus") : name_template, ++bus_id, bus_name, use_number)) {
2481 error << "cannot find name for new midi bus" << endmsg;
2486 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO)); // XXX Editor::add_routes is not ready for ARDOUR::DataType::MIDI
2492 if (Profile->get_mixbus ()) {
2493 bus->set_strict_io (true);
2496 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2497 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
2500 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2502 if (bus->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
2503 error << _("cannot configure new midi bus input") << endmsg;
2508 if (bus->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
2509 error << _("cannot configure new midi bus output") << endmsg;
2515 route_group->add (bus);
2517 if (Config->get_remote_model() == UserOrdered) {
2518 bus->set_remote_control_id (next_control_id());
2521 ret.push_back (bus);
2522 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2526 catch (failed_constructor &err) {
2527 error << _("Session: could not create new audio route.") << endmsg;
2531 catch (AudioEngine::PortRegistrationFailure& pfe) {
2532 error << pfe.what() << endmsg;
2542 StateProtector sp (this);
2543 add_routes (ret, false, false, false);
2546 for (RouteList::iterator r = ret.begin(); r != ret.end(); ++r) {
2547 PluginPtr plugin = instrument->load (*this);
2548 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2549 (*r)->add_processor (p, PreFader);
2560 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2562 boost::shared_ptr<Route> midi_track (wmt.lock());
2568 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2570 if (change.after.n_audio() <= change.before.n_audio()) {
2574 /* new audio ports: make sure the audio goes somewhere useful,
2575 unless the user has no-auto-connect selected.
2577 The existing ChanCounts don't matter for this call as they are only
2578 to do with matching input and output indices, and we are only changing
2584 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
2588 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
2589 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
2590 * @param output_start As \a input_start, but for outputs.
2593 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
2594 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
2596 if (!IO::connecting_legal) {
2600 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2606 /* If both inputs and outputs are auto-connected to physical ports,
2607 use the max of input and output offsets to ensure auto-connected
2608 port numbers always match up (e.g. the first audio input and the
2609 first audio output of the route will have the same physical
2610 port number). Otherwise just use the lowest input or output
2614 DEBUG_TRACE (DEBUG::Graph,
2615 string_compose("Auto-connect: existing in = %1 out = %2\n",
2616 existing_inputs, existing_outputs));
2618 const bool in_out_physical =
2619 (Config->get_input_auto_connect() & AutoConnectPhysical)
2620 && (Config->get_output_auto_connect() & AutoConnectPhysical)
2623 const ChanCount in_offset = in_out_physical
2624 ? ChanCount::max(existing_inputs, existing_outputs)
2627 const ChanCount out_offset = in_out_physical
2628 ? ChanCount::max(existing_inputs, existing_outputs)
2631 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2632 vector<string> physinputs;
2633 vector<string> physoutputs;
2635 _engine.get_physical_outputs (*t, physoutputs);
2636 _engine.get_physical_inputs (*t, physinputs);
2638 if (!physinputs.empty() && connect_inputs) {
2639 uint32_t nphysical_in = physinputs.size();
2641 DEBUG_TRACE (DEBUG::Graph,
2642 string_compose("There are %1 physical inputs of type %2\n",
2645 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
2648 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
2649 DEBUG_TRACE (DEBUG::Graph,
2650 string_compose("Get index %1 + %2 % %3 = %4\n",
2651 in_offset.get(*t), i, nphysical_in,
2652 (in_offset.get(*t) + i) % nphysical_in));
2653 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
2656 DEBUG_TRACE (DEBUG::Graph,
2657 string_compose("Connect route %1 IN to %2\n",
2658 route->name(), port));
2660 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
2664 ChanCount one_added (*t, 1);
2665 existing_inputs += one_added;
2669 if (!physoutputs.empty()) {
2670 uint32_t nphysical_out = physoutputs.size();
2671 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
2675 * do not create new connections if we reached the limit of physical outputs
2679 if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
2680 ARDOUR::Profile->get_trx () &&
2681 existing_outputs.get(*t) == nphysical_out ) {
2685 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
2686 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
2687 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
2688 /* master bus is audio only */
2689 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
2690 port = _master_out->input()->ports().port(*t,
2691 i % _master_out->input()->n_ports().get(*t))->name();
2695 DEBUG_TRACE (DEBUG::Graph,
2696 string_compose("Connect route %1 OUT to %2\n",
2697 route->name(), port));
2699 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
2703 ChanCount one_added (*t, 1);
2704 existing_outputs += one_added;
2710 #ifdef USE_TRACKS_CODE_FEATURES
2713 compare_routes_by_remote_id (const boost::shared_ptr<Route>& route1, const boost::shared_ptr<Route>& route2)
2715 return route1->remote_control_id() < route2->remote_control_id();
2719 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2721 // it is not allowed to perform connection
2722 if (!IO::connecting_legal) {
2726 // if we are deleting routes we will call this once at the end
2727 if (_route_deletion_in_progress) {
2731 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2737 // We need to disconnect the route's inputs and outputs first
2738 // basing on autoconnect configuration
2739 bool reconnectIputs = !(Config->get_input_auto_connect() & ManualConnect) && reconnect_inputs;
2740 bool reconnectOutputs = !(Config->get_output_auto_connect() & ManualConnect) && reconnect_outputs;
2742 ChanCount existing_inputs;
2743 ChanCount existing_outputs;
2744 count_existing_track_channels (existing_inputs, existing_outputs);
2746 //ChanCount inputs = ChanCount::ZERO;
2747 //ChanCount outputs = ChanCount::ZERO;
2749 RouteList existing_routes = *routes.reader ();
2750 existing_routes.sort (compare_routes_by_remote_id);
2753 PBD::Unwinder<bool> protect_ignore_changes (_reconnecting_routes_in_progress, true);
2755 vector<string> physinputs;
2756 vector<string> physoutputs;
2758 EngineStateController::instance()->get_physical_audio_outputs(physoutputs);
2759 EngineStateController::instance()->get_physical_audio_inputs(physinputs);
2761 uint32_t input_n = 0;
2762 uint32_t output_n = 0;
2763 RouteList::iterator rIter = existing_routes.begin();
2764 const AutoConnectOption current_input_auto_connection (Config->get_input_auto_connect());
2765 const AutoConnectOption current_output_auto_connection (Config->get_output_auto_connect());
2766 for (; rIter != existing_routes.end(); ++rIter) {
2767 if (*rIter == _master_out || *rIter == _monitor_out ) {
2771 if (current_output_auto_connection == AutoConnectPhysical) {
2772 (*rIter)->amp()->deactivate();
2773 } else if (current_output_auto_connection == AutoConnectMaster) {
2774 (*rIter)->amp()->activate();
2777 if (reconnectIputs) {
2778 (*rIter)->input()->disconnect (this); //GZ: check this; could be heavy
2780 for (uint32_t route_input_n = 0; route_input_n < (*rIter)->n_inputs().get(DataType::AUDIO); ++route_input_n) {
2782 if (current_input_auto_connection & AutoConnectPhysical) {
2784 if ( input_n == physinputs.size() ) {
2788 string port = physinputs[input_n];
2790 if (port.empty() ) {
2791 error << "Physical Input number "<< input_n << " is unavailable and cannot be connected" << endmsg;
2794 //GZ: check this; could be heavy
2795 (*rIter)->input()->connect ((*rIter)->input()->ports().port(DataType::AUDIO, route_input_n), port, this);
2801 if (reconnectOutputs) {
2803 //normalize route ouptuts: reduce the amount outputs to be equal to the amount of inputs
2804 if (current_output_auto_connection & AutoConnectPhysical) {
2806 //GZ: check this; could be heavy
2807 (*rIter)->output()->disconnect (this);
2808 size_t route_inputs_count = (*rIter)->n_inputs().get(DataType::AUDIO);
2810 //GZ: check this; could be heavy
2811 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, route_inputs_count), false, this );
2813 } else if (current_output_auto_connection & AutoConnectMaster){
2815 if (!reconnect_master) {
2819 //GZ: check this; could be heavy
2820 (*rIter)->output()->disconnect (this);
2823 uint32_t master_inputs_count = _master_out->n_inputs().get(DataType::AUDIO);
2824 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, master_inputs_count), false, this );
2826 error << error << "Master bus is not available" << endmsg;
2831 for (uint32_t route_output_n = 0; route_output_n < (*rIter)->n_outputs().get(DataType::AUDIO); ++route_output_n) {
2832 if (current_output_auto_connection & AutoConnectPhysical) {
2834 if ( output_n == physoutputs.size() ) {
2838 string port = physoutputs[output_n];
2840 if (port.empty() ) {
2841 error << "Physical Output number "<< output_n << " is unavailable and cannot be connected" << endmsg;
2844 //GZ: check this; could be heavy
2845 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2848 } else if (current_output_auto_connection & AutoConnectMaster) {
2850 if ( route_output_n == _master_out->n_inputs().get(DataType::AUDIO) ) {
2854 // connect to master bus
2855 string port = _master_out->input()->ports().port(DataType::AUDIO, route_output_n)->name();
2857 if (port.empty() ) {
2858 error << "MasterBus Input number "<< route_output_n << " is unavailable and cannot be connected" << endmsg;
2862 //GZ: check this; could be heavy
2863 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2869 //auto_connect_route (*rIter, inputs, outputs, false, reconnectIputs);
2872 _master_out->output()->disconnect (this);
2873 auto_connect_master_bus ();
2878 session_routes_reconnected (); /* EMIT SIGNAL */
2882 Session::reconnect_midi_scene_ports(bool inputs)
2886 boost::shared_ptr<MidiPort> scene_in_ptr = scene_in();
2888 scene_in_ptr->disconnect_all ();
2890 std::vector<EngineStateController::MidiPortState> midi_port_states;
2891 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2893 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2895 for (; state_iter != midi_port_states.end(); ++state_iter) {
2896 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2897 scene_in_ptr->connect (state_iter->name);
2904 boost::shared_ptr<MidiPort> scene_out_ptr = scene_out();
2906 if (scene_out_ptr ) {
2907 scene_out_ptr->disconnect_all ();
2909 std::vector<EngineStateController::MidiPortState> midi_port_states;
2910 EngineStateController::instance()->get_physical_midi_output_states (midi_port_states);
2912 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2914 for (; state_iter != midi_port_states.end(); ++state_iter) {
2915 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2916 scene_out_ptr->connect (state_iter->name);
2924 Session::reconnect_mtc_ports ()
2926 boost::shared_ptr<MidiPort> mtc_in_ptr = _midi_ports->mtc_input_port();
2932 mtc_in_ptr->disconnect_all ();
2934 std::vector<EngineStateController::MidiPortState> midi_port_states;
2935 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2937 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2939 for (; state_iter != midi_port_states.end(); ++state_iter) {
2940 if (state_iter->available && state_iter->mtc_in) {
2941 mtc_in_ptr->connect (state_iter->name);
2945 if (!_midi_ports->mtc_input_port ()->connected () &&
2946 config.get_external_sync () &&
2947 (Config->get_sync_source () == MTC) ) {
2948 config.set_external_sync (false);
2951 if ( ARDOUR::Profile->get_trx () ) {
2952 // Tracks need this signal to update timecode_source_dropdown
2953 MtcOrLtcInputPortChanged (); //emit signal
2958 Session::reconnect_mmc_ports(bool inputs)
2960 if (inputs ) { // get all enabled midi input ports
2962 boost::shared_ptr<MidiPort> mmc_in_ptr = _midi_ports->mmc_in();
2964 mmc_in_ptr->disconnect_all ();
2965 std::vector<std::string> enabled_midi_inputs;
2966 EngineStateController::instance()->get_physical_midi_inputs (enabled_midi_inputs);
2968 std::vector<std::string>::iterator port_iter = enabled_midi_inputs.begin();
2970 for (; port_iter != enabled_midi_inputs.end(); ++port_iter) {
2971 mmc_in_ptr->connect (*port_iter);
2975 } else { // get all enabled midi output ports
2977 boost::shared_ptr<MidiPort> mmc_out_ptr = _midi_ports->mmc_out();
2979 mmc_out_ptr->disconnect_all ();
2980 std::vector<std::string> enabled_midi_outputs;
2981 EngineStateController::instance()->get_physical_midi_outputs (enabled_midi_outputs);
2983 std::vector<std::string>::iterator port_iter = enabled_midi_outputs.begin();
2985 for (; port_iter != enabled_midi_outputs.end(); ++port_iter) {
2986 mmc_out_ptr->connect (*port_iter);
2994 /** Caller must not hold process lock
2995 * @param name_template string to use for the start of the name, or "" to use "Audio".
2997 list< boost::shared_ptr<AudioTrack> >
2998 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
2999 uint32_t how_many, string name_template)
3002 uint32_t track_id = 0;
3004 RouteList new_routes;
3005 list<boost::shared_ptr<AudioTrack> > ret;
3007 const string name_pattern = default_track_name_pattern (DataType::AUDIO);
3008 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
3012 if (!find_route_name (name_template.empty() ? _(name_pattern.c_str()) : name_template, ++track_id, track_name, use_number)) {
3013 error << "cannot find name for new audio track" << endmsg;
3017 boost::shared_ptr<AudioTrack> track;
3020 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
3022 if (track->init ()) {
3026 if (Profile->get_mixbus ()) {
3027 track->set_strict_io (true);
3031 if (ARDOUR::Profile->get_trx ()) {
3032 // TRACKS considers it's not a USE CASE, it's
3033 // a piece of behavior of the session model:
3035 // Gain for a newly created route depends on
3036 // the current output_auto_connect mode:
3038 // 0 for Stereo Out mode
3040 if (Config->get_output_auto_connect() & AutoConnectMaster) {
3041 track->set_gain (dB_to_coefficient (0), Controllable::NoGroup);
3045 track->use_new_diskstream();
3047 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
3048 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
3051 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3053 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
3054 error << string_compose (
3055 _("cannot configure %1 in/%2 out configuration for new audio track"),
3056 input_channels, output_channels)
3061 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
3062 error << string_compose (
3063 _("cannot configure %1 in/%2 out configuration for new audio track"),
3064 input_channels, output_channels)
3071 route_group->add (track);
3074 track->non_realtime_input_change();
3076 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
3077 if (Config->get_remote_model() == UserOrdered) {
3078 track->set_remote_control_id (next_control_id());
3081 new_routes.push_back (track);
3082 ret.push_back (track);
3084 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
3087 catch (failed_constructor &err) {
3088 error << _("Session: could not create new audio track.") << endmsg;
3092 catch (AudioEngine::PortRegistrationFailure& pfe) {
3094 error << pfe.what() << endmsg;
3102 if (!new_routes.empty()) {
3103 StateProtector sp (this);
3104 if (Profile->get_trx()) {
3105 add_routes (new_routes, false, false, false);
3107 add_routes (new_routes, true, true, false);
3114 /** Caller must not hold process lock.
3115 * @param name_template string to use for the start of the name, or "" to use "Bus".
3118 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
3121 uint32_t bus_id = 0;
3125 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
3128 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, use_number)) {
3129 error << "cannot find name for new audio bus" << endmsg;
3134 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
3140 if (Profile->get_mixbus ()) {
3141 bus->set_strict_io (true);
3144 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
3145 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
3148 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3150 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
3151 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
3152 input_channels, output_channels)
3158 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
3159 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
3160 input_channels, output_channels)
3167 route_group->add (bus);
3169 if (Config->get_remote_model() == UserOrdered) {
3170 bus->set_remote_control_id (next_control_id());
3173 bus->add_internal_return ();
3175 ret.push_back (bus);
3177 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
3183 catch (failed_constructor &err) {
3184 error << _("Session: could not create new audio route.") << endmsg;
3188 catch (AudioEngine::PortRegistrationFailure& pfe) {
3189 error << pfe.what() << endmsg;
3199 StateProtector sp (this);
3200 if (Profile->get_trx()) {
3201 add_routes (ret, false, false, false);
3203 add_routes (ret, false, true, true); // autoconnect // outputs only
3212 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base, PlaylistDisposition pd)
3216 if (!tree.read (template_path.c_str())) {
3220 return new_route_from_template (how_many, *tree.root(), name_base, pd);
3224 Session::new_route_from_template (uint32_t how_many, XMLNode& node, const std::string& name_base, PlaylistDisposition pd)
3227 uint32_t control_id;
3228 uint32_t number = 0;
3229 const uint32_t being_added = how_many;
3230 /* This will prevent the use of any existing XML-provided PBD::ID
3233 Stateful::ForceIDRegeneration force_ids;
3234 IO::disable_connecting ();
3236 control_id = next_control_id ();
3240 /* We're going to modify the node contents a bit so take a
3241 * copy. The node may be re-used when duplicating more than once.
3244 XMLNode node_copy (node);
3249 if (!name_base.empty()) {
3251 /* if we're adding more than one routes, force
3252 * all the names of the new routes to be
3253 * numbered, via the final parameter.
3256 if (!find_route_name (name_base.c_str(), ++number, name, (being_added > 1))) {
3257 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3263 string const route_name = node_copy.property(X_("name"))->value ();
3265 /* generate a new name by adding a number to the end of the template name */
3266 if (!find_route_name (route_name.c_str(), ++number, name, true)) {
3267 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3268 abort(); /*NOTREACHED*/
3272 /* set this name in the XML description that we are about to use */
3274 bool rename_playlist;
3277 rename_playlist = true;
3281 rename_playlist = false;
3284 Route::set_name_in_state (node_copy, name, rename_playlist);
3286 /* trim bitslots from listen sends so that new ones are used */
3287 XMLNodeList children = node_copy.children ();
3288 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
3289 if ((*i)->name() == X_("Processor")) {
3290 XMLProperty* role = (*i)->property (X_("role"));
3291 if (role && role->value() == X_("Listen")) {
3292 (*i)->remove_property (X_("bitslot"));
3297 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
3300 error << _("Session: cannot create track/bus from template description") << endmsg;
3304 if (boost::dynamic_pointer_cast<Track>(route)) {
3305 /* force input/output change signals so that the new diskstream
3306 picks up the configuration of the route. During session
3307 loading this normally happens in a different way.
3310 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3312 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
3313 change.after = route->input()->n_ports();
3314 route->input()->changed (change, this);
3315 change.after = route->output()->n_ports();
3316 route->output()->changed (change, this);
3319 route->set_remote_control_id (control_id);
3322 boost::shared_ptr<Track> track;
3324 if ((track = boost::dynamic_pointer_cast<Track> (route))) {
3327 track->use_new_playlist ();
3330 track->use_copy_playlist ();
3337 ret.push_back (route);
3339 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
3342 catch (failed_constructor &err) {
3343 error << _("Session: could not create new route from template") << endmsg;
3347 catch (AudioEngine::PortRegistrationFailure& pfe) {
3348 error << pfe.what() << endmsg;
3357 StateProtector sp (this);
3358 if (Profile->get_trx()) {
3359 add_routes (ret, false, false, false);
3361 add_routes (ret, true, true, false);
3363 IO::enable_connecting ();
3370 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
3373 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
3374 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
3377 error << _("Adding new tracks/busses failed") << endmsg;
3382 update_latency (true);
3383 update_latency (false);
3388 save_state (_current_snapshot_name);
3391 reassign_track_numbers();
3393 update_route_record_state ();
3395 RouteAdded (new_routes); /* EMIT SIGNAL */
3399 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
3401 ChanCount existing_inputs;
3402 ChanCount existing_outputs;
3403 uint32_t order = next_control_id();
3405 if (_order_hint > -1) {
3406 order = _order_hint;
3410 count_existing_track_channels (existing_inputs, existing_outputs);
3413 RCUWriter<RouteList> writer (routes);
3414 boost::shared_ptr<RouteList> r = writer.get_copy ();
3415 r->insert (r->end(), new_routes.begin(), new_routes.end());
3417 /* if there is no control out and we're not in the middle of loading,
3418 resort the graph here. if there is a control out, we will resort
3419 toward the end of this method. if we are in the middle of loading,
3420 we will resort when done.
3423 if (!_monitor_out && IO::connecting_legal) {
3424 resort_routes_using (r);
3428 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3430 boost::weak_ptr<Route> wpr (*x);
3431 boost::shared_ptr<Route> r (*x);
3433 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
3434 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
3435 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, wpr));
3436 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this));
3437 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
3438 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
3440 if (r->is_master()) {
3444 if (r->is_monitor()) {
3448 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
3450 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
3451 track_playlist_changed (boost::weak_ptr<Track> (tr));
3452 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
3454 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
3456 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
3457 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
3462 if (input_auto_connect || output_auto_connect) {
3463 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
3466 /* order keys are a GUI responsibility but we need to set up
3467 reasonable defaults because they also affect the remote control
3468 ID in most situations.
3471 if (!r->has_order_key ()) {
3472 if (r->is_auditioner()) {
3473 /* use an arbitrarily high value */
3474 r->set_order_key (UINT_MAX);
3476 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
3477 r->set_order_key (order);
3485 if (_monitor_out && IO::connecting_legal) {
3486 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
3488 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3489 if ((*x)->is_monitor()) {
3491 } else if ((*x)->is_master()) {
3494 (*x)->enable_monitor_send ();
3501 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
3503 boost::shared_ptr<RouteList> r = routes.reader ();
3504 boost::shared_ptr<Send> s;
3506 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3507 if ((s = (*i)->internal_send_for (dest)) != 0) {
3508 s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO, Controllable::NoGroup);
3514 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
3516 boost::shared_ptr<RouteList> r = routes.reader ();
3517 boost::shared_ptr<Send> s;
3519 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3520 if ((s = (*i)->internal_send_for (dest)) != 0) {
3521 s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY, Controllable::NoGroup);
3527 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
3529 boost::shared_ptr<RouteList> r = routes.reader ();
3530 boost::shared_ptr<Send> s;
3532 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3533 if ((s = (*i)->internal_send_for (dest)) != 0) {
3534 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value(), Controllable::NoGroup);
3539 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
3541 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
3543 boost::shared_ptr<RouteList> r = routes.reader ();
3544 boost::shared_ptr<RouteList> t (new RouteList);
3546 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3547 /* no MIDI sends because there are no MIDI busses yet */
3548 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
3553 add_internal_sends (dest, p, t);
3557 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
3559 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
3560 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
3565 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
3567 add_internal_send (dest, sender->before_processor_for_index (index), sender);
3571 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
3573 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
3577 if (!dest->internal_return()) {
3578 dest->add_internal_return ();
3581 sender->add_aux_send (dest, before);
3588 Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
3590 { // RCU Writer scope
3591 PBD::Unwinder<bool> uw_flag (_route_deletion_in_progress, true);
3592 RCUWriter<RouteList> writer (routes);
3593 boost::shared_ptr<RouteList> rs = writer.get_copy ();
3596 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3598 if (*iter == _master_out) {
3602 (*iter)->set_solo (false, Controllable::NoGroup);
3606 /* deleting the master out seems like a dumb
3607 idea, but its more of a UI policy issue
3611 if (*iter == _master_out) {
3612 _master_out = boost::shared_ptr<Route> ();
3615 if (*iter == _monitor_out) {
3616 _monitor_out.reset ();
3619 // We need to disconnect the route's inputs and outputs
3621 (*iter)->input()->disconnect (0);
3622 (*iter)->output()->disconnect (0);
3624 /* if the route had internal sends sending to it, remove them */
3625 if ((*iter)->internal_return()) {
3627 boost::shared_ptr<RouteList> r = routes.reader ();
3628 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3629 boost::shared_ptr<Send> s = (*i)->internal_send_for (*iter);
3631 (*i)->remove_processor (s);
3636 /* if the monitoring section had a pointer to this route, remove it */
3637 if (_monitor_out && !(*iter)->is_master() && !(*iter)->is_monitor()) {
3638 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3639 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
3640 (*iter)->remove_aux_or_listen (_monitor_out);
3643 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*iter);
3644 if (mt && mt->step_editing()) {
3645 if (_step_editors > 0) {
3651 /* writer goes out of scope, forces route list update */
3653 } // end of RCU Writer scope
3655 update_route_solo_state ();
3656 RouteAddedOrRemoved (false); /* EMIT SIGNAL */
3657 update_latency_compensation ();
3660 /* Re-sort routes to remove the graph's current references to the one that is
3661 * going away, then flush old references out of the graph.
3662 * Wave Tracks: reconnect routes
3665 #ifdef USE_TRACKS_CODE_FEATURES
3666 reconnect_existing_routes(true, false);
3668 routes.flush (); // maybe unsafe, see below.
3672 if (_process_graph) {
3673 _process_graph->clear_other_chain ();
3676 /* get rid of it from the dead wood collection in the route list manager */
3677 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
3681 /* try to cause everyone to drop their references
3682 * and unregister ports from the backend
3685 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3686 (*iter)->drop_references ();
3689 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
3691 /* save the new state of the world */
3693 if (save_state (_current_snapshot_name)) {
3694 save_history (_current_snapshot_name);
3697 reassign_track_numbers();
3698 update_route_record_state ();
3702 Session::remove_route (boost::shared_ptr<Route> route)
3704 boost::shared_ptr<RouteList> rl (new RouteList);
3705 rl->push_back (route);
3710 Session::route_mute_changed ()
3716 Session::route_listen_changed (Controllable::GroupControlDisposition group_override, boost::weak_ptr<Route> wpr)
3718 boost::shared_ptr<Route> route = wpr.lock();
3720 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_listen_changed")) << endmsg;
3724 if (route->listening_via_monitor ()) {
3726 if (Config->get_exclusive_solo()) {
3728 RouteGroup* rg = route->route_group ();
3729 const bool group_already_accounted_for = route->use_group (group_override, &RouteGroup::is_solo);
3731 boost::shared_ptr<RouteList> r = routes.reader ();
3733 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3734 if ((*i) == route) {
3735 /* already changed */
3739 if ((*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3740 /* route does not get solo propagated to it */
3744 if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
3745 /* this route is a part of the same solo group as the route
3746 * that was changed. Changing that route did change or will
3747 * change all group members appropriately, so we can ignore it
3752 (*i)->set_listen (false, Controllable::NoGroup);
3758 } else if (_listen_cnt > 0) {
3763 update_route_solo_state ();
3766 Session::route_solo_isolated_changed (boost::weak_ptr<Route> wpr)
3768 boost::shared_ptr<Route> route = wpr.lock ();
3771 /* should not happen */
3772 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_isolated_changed")) << endmsg;
3776 bool send_changed = false;
3778 if (route->solo_isolated()) {
3779 if (_solo_isolated_cnt == 0) {
3780 send_changed = true;
3782 _solo_isolated_cnt++;
3783 } else if (_solo_isolated_cnt > 0) {
3784 _solo_isolated_cnt--;
3785 if (_solo_isolated_cnt == 0) {
3786 send_changed = true;
3791 IsolatedChanged (); /* EMIT SIGNAL */
3796 Session::route_solo_changed (bool self_solo_change, Controllable::GroupControlDisposition group_override, boost::weak_ptr<Route> wpr)
3798 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
3800 if (!self_solo_change) {
3801 // session doesn't care about changes to soloed-by-others
3805 boost::shared_ptr<Route> route = wpr.lock ();
3808 boost::shared_ptr<RouteList> r = routes.reader ();
3811 if (route->self_soloed()) {
3817 /* the route may be a member of a group that has shared-solo
3818 * semantics. If so, then all members of that group should follow the
3819 * solo of the changed route. But ... this is optional, controlled by a
3820 * Controllable::GroupControlDisposition.
3822 * The first argument to the signal that this method is connected to is the
3823 * GroupControlDisposition value that was used to change solo.
3825 * If the solo change was done with group semantics (either InverseGroup
3826 * (force the entire group to change even if the group shared solo is
3827 * disabled) or UseGroup (use the group, which may or may not have the
3828 * shared solo property enabled)) then as we propagate the change to
3829 * the entire session we should IGNORE THE GROUP that the changed route
3833 RouteGroup* rg = route->route_group ();
3834 const bool group_already_accounted_for = (group_override == Controllable::ForGroup);
3836 if (delta == 1 && Config->get_exclusive_solo()) {
3838 /* new solo: disable all other solos, but not the group if its solo-enabled */
3840 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3842 if ((*i) == route) {
3843 /* already changed */
3847 if ((*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3848 /* route does not get solo propagated to it */
3852 if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
3853 /* this route is a part of the same solo group as the route
3854 * that was changed. Changing that route did change or will
3855 * change all group members appropriately, so we can ignore it
3861 (*i)->set_solo (false, group_override);
3865 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3867 RouteList uninvolved;
3869 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
3871 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3872 bool via_sends_only;
3873 bool in_signal_flow;
3875 if ((*i) == route) {
3876 /* already changed */
3880 if ((*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3881 /* route does not get solo propagated to it */
3885 if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
3886 /* this route is a part of the same solo group as the route
3887 * that was changed. Changing that route did change or will
3888 * change all group members appropriately, so we can ignore it
3894 in_signal_flow = false;
3896 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3898 if ((*i)->feeds (route, &via_sends_only)) {
3899 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3900 if (!via_sends_only) {
3901 if (!route->soloed_by_others_upstream()) {
3902 (*i)->mod_solo_by_others_downstream (delta);
3904 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others upstream\n");
3907 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3909 in_signal_flow = true;
3911 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3914 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3916 if (route->feeds (*i, &via_sends_only)) {
3917 /* propagate solo upstream only if routing other than
3918 sends is involved, but do consider the other route
3919 (*i) to be part of the signal flow even if only
3922 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3926 route->soloed_by_others_downstream(),
3927 route->soloed_by_others_upstream()));
3928 if (!via_sends_only) {
3929 //NB. Triggers Invert Push, which handles soloed by downstream
3930 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3931 (*i)->mod_solo_by_others_upstream (delta);
3933 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3935 in_signal_flow = true;
3937 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3940 if (!in_signal_flow) {
3941 uninvolved.push_back (*i);
3945 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3947 update_route_solo_state (r);
3949 /* now notify that the mute state of the routes not involved in the signal
3950 pathway of the just-solo-changed route may have altered.
3953 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3954 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
3955 (*i)->act_on_mute ();
3956 (*i)->mute_changed ();
3959 SoloChanged (); /* EMIT SIGNAL */
3964 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
3966 /* now figure out if anything that matters is soloed (or is "listening")*/
3968 bool something_soloed = false;
3969 bool something_listening = false;
3970 uint32_t listeners = 0;
3971 uint32_t isolated = 0;
3974 r = routes.reader();
3977 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3978 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
3979 something_soloed = true;
3982 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
3983 if (Config->get_solo_control_is_listen_control()) {
3985 something_listening = true;
3987 (*i)->set_listen (false, Controllable::NoGroup);
3991 if ((*i)->solo_isolated()) {
3996 if (something_soloed != _non_soloed_outs_muted) {
3997 _non_soloed_outs_muted = something_soloed;
3998 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
4001 if (something_listening != _listening) {
4002 _listening = something_listening;
4003 SoloActive (_listening);
4006 _listen_cnt = listeners;
4008 if (isolated != _solo_isolated_cnt) {
4009 _solo_isolated_cnt = isolated;
4010 IsolatedChanged (); /* EMIT SIGNAL */
4013 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
4014 something_soloed, listeners, isolated));
4017 boost::shared_ptr<RouteList>
4018 Session::get_routes_with_internal_returns() const
4020 boost::shared_ptr<RouteList> r = routes.reader ();
4021 boost::shared_ptr<RouteList> rl (new RouteList);
4023 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4024 if ((*i)->internal_return ()) {
4032 Session::io_name_is_legal (const std::string& name)
4034 boost::shared_ptr<RouteList> r = routes.reader ();
4036 for (vector<string>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
4037 if (name == *reserved) {
4038 if (!route_by_name (*reserved)) {
4039 /* first instance of a reserved name is allowed */
4042 /* all other instances of a reserved name are not allowed */
4047 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4048 if ((*i)->name() == name) {
4052 if ((*i)->has_io_processor_named (name)) {
4061 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
4064 vector<string> connections;
4066 /* if we are passed only a single route and we're not told to turn
4067 * others off, then just do the simple thing.
4070 if (flip_others == false && rl->size() == 1) {
4071 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
4073 mt->set_input_active (onoff);
4078 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
4080 PortSet& ps ((*rt)->input()->ports());
4082 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
4083 p->get_connections (connections);
4086 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
4087 routes_using_input_from (*s, rl2);
4090 /* scan all relevant routes to see if others are on or off */
4092 bool others_are_already_on = false;
4094 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
4096 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
4102 if ((*r) != (*rt)) {
4103 if (mt->input_active()) {
4104 others_are_already_on = true;
4107 /* this one needs changing */
4108 mt->set_input_active (onoff);
4114 /* globally reverse other routes */
4116 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
4117 if ((*r) != (*rt)) {
4118 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
4120 mt->set_input_active (!others_are_already_on);
4129 Session::routes_using_input_from (const string& str, RouteList& rl)
4131 boost::shared_ptr<RouteList> r = routes.reader();
4133 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4134 if ((*i)->input()->connected_to (str)) {
4140 boost::shared_ptr<Route>
4141 Session::route_by_name (string name)
4143 boost::shared_ptr<RouteList> r = routes.reader ();
4145 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4146 if ((*i)->name() == name) {
4151 return boost::shared_ptr<Route> ((Route*) 0);
4154 boost::shared_ptr<Route>
4155 Session::route_by_id (PBD::ID id)
4157 boost::shared_ptr<RouteList> r = routes.reader ();
4159 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4160 if ((*i)->id() == id) {
4165 return boost::shared_ptr<Route> ((Route*) 0);
4168 boost::shared_ptr<Processor>
4169 Session::processor_by_id (PBD::ID id) const
4171 boost::shared_ptr<RouteList> r = routes.reader ();
4173 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4174 boost::shared_ptr<Processor> p = (*i)->Route::processor_by_id (id);
4180 return boost::shared_ptr<Processor> ();
4183 boost::shared_ptr<Track>
4184 Session::track_by_diskstream_id (PBD::ID id)
4186 boost::shared_ptr<RouteList> r = routes.reader ();
4188 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4189 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
4190 if (t && t->using_diskstream_id (id)) {
4195 return boost::shared_ptr<Track> ();
4198 boost::shared_ptr<Route>
4199 Session::route_by_remote_id (uint32_t id)
4201 boost::shared_ptr<RouteList> r = routes.reader ();
4203 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4204 if ((*i)->remote_control_id() == id) {
4209 return boost::shared_ptr<Route> ((Route*) 0);
4213 boost::shared_ptr<Route>
4214 Session::route_by_selected_count (uint32_t id)
4216 boost::shared_ptr<RouteList> r = routes.reader ();
4218 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4219 /* NOT IMPLEMENTED */
4222 return boost::shared_ptr<Route> ((Route*) 0);
4227 Session::reassign_track_numbers ()
4231 RouteList r (*(routes.reader ()));
4232 SignalOrderRouteSorter sorter;
4235 StateProtector sp (this);
4237 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4238 if (boost::dynamic_pointer_cast<Track> (*i)) {
4239 (*i)->set_track_number(++tn);
4241 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
4242 (*i)->set_track_number(--bn);
4245 const uint32_t decimals = ceilf (log10f (tn + 1));
4246 const bool decimals_changed = _track_number_decimals != decimals;
4247 _track_number_decimals = decimals;
4249 if (decimals_changed && config.get_track_name_number ()) {
4250 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4251 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
4253 t->resync_track_name();
4256 // trigger GUI re-layout
4257 config.ParameterChanged("track-name-number");
4262 Session::playlist_region_added (boost::weak_ptr<Region> w)
4264 boost::shared_ptr<Region> r = w.lock ();
4269 /* These are the operations that are currently in progress... */
4270 list<GQuark> curr = _current_trans_quarks;
4273 /* ...and these are the operations during which we want to update
4274 the session range location markers.
4277 ops.push_back (Operations::capture);
4278 ops.push_back (Operations::paste);
4279 ops.push_back (Operations::duplicate_region);
4280 ops.push_back (Operations::insert_file);
4281 ops.push_back (Operations::insert_region);
4282 ops.push_back (Operations::drag_region_brush);
4283 ops.push_back (Operations::region_drag);
4284 ops.push_back (Operations::selection_grab);
4285 ops.push_back (Operations::region_fill);
4286 ops.push_back (Operations::fill_selection);
4287 ops.push_back (Operations::create_region);
4288 ops.push_back (Operations::region_copy);
4289 ops.push_back (Operations::fixed_time_region_copy);
4292 /* See if any of the current operations match the ones that we want */
4294 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
4296 /* If so, update the session range markers */
4298 maybe_update_session_range (r->position (), r->last_frame ());
4302 /** Update the session range markers if a is before the current start or
4303 * b is after the current end.
4306 Session::maybe_update_session_range (framepos_t a, framepos_t b)
4308 if (_state_of_the_state & Loading) {
4312 framepos_t session_end_marker_shift_samples = session_end_shift * _nominal_frame_rate;
4314 if (_session_range_location == 0) {
4316 set_session_range_location (a, b + session_end_marker_shift_samples);
4320 if (a < _session_range_location->start()) {
4321 _session_range_location->set_start (a);
4324 if (b > _session_range_location->end()) {
4325 _session_range_location->set_end (b);
4331 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
4333 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4334 maybe_update_session_range (i->to, i->to + i->length);
4339 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
4341 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4342 maybe_update_session_range (i->from, i->to);
4346 /* Region management */
4348 boost::shared_ptr<Region>
4349 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
4351 const RegionFactory::RegionMap& regions (RegionFactory::regions());
4352 RegionFactory::RegionMap::const_iterator i;
4353 boost::shared_ptr<Region> region;
4355 Glib::Threads::Mutex::Lock lm (region_lock);
4357 for (i = regions.begin(); i != regions.end(); ++i) {
4361 if (region->whole_file()) {
4363 if (child->source_equivalent (region)) {
4369 return boost::shared_ptr<Region> ();
4373 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
4375 set<boost::shared_ptr<Region> > relevant_regions;
4377 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
4378 RegionFactory::get_regions_using_source (*s, relevant_regions);
4381 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
4382 set<boost::shared_ptr<Region> >::iterator tmp;
4387 playlists->destroy_region (*r);
4388 RegionFactory::map_remove (*r);
4390 (*r)->drop_sources ();
4391 (*r)->drop_references ();
4393 relevant_regions.erase (r);
4398 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
4401 Glib::Threads::Mutex::Lock ls (source_lock);
4402 /* remove from the main source list */
4403 sources.erase ((*s)->id());
4406 (*s)->mark_for_remove ();
4407 (*s)->drop_references ();
4416 Session::remove_last_capture ()
4418 list<boost::shared_ptr<Source> > srcs;
4420 boost::shared_ptr<RouteList> rl = routes.reader ();
4421 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4422 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4427 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
4430 srcs.insert (srcs.end(), l.begin(), l.end());
4435 destroy_sources (srcs);
4437 save_state (_current_snapshot_name);
4442 /* Source Management */
4445 Session::add_source (boost::shared_ptr<Source> source)
4447 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
4448 pair<SourceMap::iterator,bool> result;
4450 entry.first = source->id();
4451 entry.second = source;
4454 Glib::Threads::Mutex::Lock lm (source_lock);
4455 result = sources.insert (entry);
4458 if (result.second) {
4460 /* yay, new source */
4462 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
4465 if (!fs->within_session()) {
4466 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
4472 boost::shared_ptr<AudioFileSource> afs;
4474 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
4475 if (Config->get_auto_analyse_audio()) {
4476 Analyser::queue_source_for_analysis (source, false);
4480 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
4485 Session::remove_source (boost::weak_ptr<Source> src)
4487 if (_state_of_the_state & Deletion) {
4491 SourceMap::iterator i;
4492 boost::shared_ptr<Source> source = src.lock();
4499 Glib::Threads::Mutex::Lock lm (source_lock);
4501 if ((i = sources.find (source->id())) != sources.end()) {
4506 if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
4508 /* save state so we don't end up with a session file
4509 referring to non-existent sources.
4512 save_state (_current_snapshot_name);
4516 boost::shared_ptr<Source>
4517 Session::source_by_id (const PBD::ID& id)
4519 Glib::Threads::Mutex::Lock lm (source_lock);
4520 SourceMap::iterator i;
4521 boost::shared_ptr<Source> source;
4523 if ((i = sources.find (id)) != sources.end()) {
4530 boost::shared_ptr<AudioFileSource>
4531 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
4533 /* Restricted to audio files because only audio sources have channel
4537 Glib::Threads::Mutex::Lock lm (source_lock);
4539 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
4540 boost::shared_ptr<AudioFileSource> afs
4541 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
4543 if (afs && afs->path() == path && chn == afs->channel()) {
4548 return boost::shared_ptr<AudioFileSource>();
4551 boost::shared_ptr<MidiSource>
4552 Session::midi_source_by_path (const std::string& path) const
4554 /* Restricted to MIDI files because audio sources require a channel
4555 for unique identification, in addition to a path.
4558 Glib::Threads::Mutex::Lock lm (source_lock);
4560 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
4561 boost::shared_ptr<MidiSource> ms
4562 = boost::dynamic_pointer_cast<MidiSource>(s->second);
4563 boost::shared_ptr<FileSource> fs
4564 = boost::dynamic_pointer_cast<FileSource>(s->second);
4566 if (ms && fs && fs->path() == path) {
4571 return boost::shared_ptr<MidiSource>();
4575 Session::count_sources_by_origin (const string& path)
4578 Glib::Threads::Mutex::Lock lm (source_lock);
4580 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
4581 boost::shared_ptr<FileSource> fs
4582 = boost::dynamic_pointer_cast<FileSource>(i->second);
4584 if (fs && fs->origin() == path) {
4593 peak_file_helper (const string& peak_path, const string& file_path, const string& file_base, bool hash) {
4595 std::string checksum = Glib::Checksum::compute_checksum(Glib::Checksum::CHECKSUM_SHA1, file_path + G_DIR_SEPARATOR + file_base);
4596 return Glib::build_filename (peak_path, checksum + peakfile_suffix);
4598 return Glib::build_filename (peak_path, file_base + peakfile_suffix);
4603 Session::construct_peak_filepath (const string& filepath, const bool in_session, const bool old_peak_name) const
4605 string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
4607 if (Glib::path_is_absolute (filepath)) {
4609 /* rip the session dir from the audiofile source */
4611 string session_path;
4612 bool in_another_session = true;
4614 if (filepath.find (interchange_dir_string) != string::npos) {
4616 session_path = Glib::path_get_dirname (filepath); /* now ends in audiofiles */
4617 session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
4618 session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
4619 session_path = Glib::path_get_dirname (session_path); /* now has session path */
4621 /* see if it is within our session */
4623 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4624 if (i->path == session_path) {
4625 in_another_session = false;
4630 in_another_session = false;
4634 if (in_another_session) {
4635 SessionDirectory sd (session_path);
4636 return peak_file_helper (sd.peak_path(), "", Glib::path_get_basename (filepath), !old_peak_name);
4640 /* 1) if file belongs to this session
4641 * it may be a relative path (interchange/...)
4642 * or just basename (session_state, remove source)
4643 * -> just use the basename
4645 std::string filename = Glib::path_get_basename (filepath);
4648 /* 2) if the file is outside our session dir:
4649 * (imported but not copied) add the path for check-summming */
4651 path = Glib::path_get_dirname (filepath);
4654 return peak_file_helper (_session_dir->peak_path(), path, Glib::path_get_basename (filepath), !old_peak_name);
4658 Session::new_audio_source_path_for_embedded (const std::string& path)
4662 * we know that the filename is already unique because it exists
4663 * out in the filesystem.
4665 * However, when we bring it into the session, we could get a
4668 * Eg. two embedded files:
4673 * When merged into session, these collide.
4675 * There will not be a conflict with in-memory sources
4676 * because when the source was created we already picked
4677 * a unique name for it.
4679 * This collision is not likely to be common, but we have to guard
4680 * against it. So, if there is a collision, take the md5 hash of the
4681 * the path, and use that as the filename instead.
4684 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4685 string base = Glib::path_get_basename (path);
4686 string newpath = Glib::build_filename (sdir.sound_path(), base);
4688 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4692 md5.digestString (path.c_str());
4693 md5.writeToString ();
4694 base = md5.digestChars;
4696 string ext = get_suffix (path);
4703 newpath = Glib::build_filename (sdir.sound_path(), base);
4705 /* if this collides, we're screwed */
4707 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4708 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
4717 /** Return true if there are no audio file sources that use @param name as
4718 * the filename component of their path.
4720 * Return false otherwise.
4722 * This method MUST ONLY be used to check in-session, mono files since it
4723 * hard-codes the channel of the audio file source we are looking for as zero.
4725 * If/when Ardour supports native files in non-mono formats, the logic here
4726 * will need to be revisited.
4729 Session::audio_source_name_is_unique (const string& name)
4731 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
4732 vector<space_and_path>::iterator i;
4733 uint32_t existing = 0;
4735 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4737 /* note that we search *without* the extension so that
4738 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
4739 in the event that this new name is required for
4740 a file format change.
4743 const string spath = *i;
4745 if (matching_unsuffixed_filename_exists_in (spath, name)) {
4750 /* it is possible that we have the path already
4751 * assigned to a source that has not yet been written
4752 * (ie. the write source for a diskstream). we have to
4753 * check this in order to make sure that our candidate
4754 * path isn't used again, because that can lead to
4755 * two Sources point to the same file with different
4756 * notions of their removability.
4760 string possible_path = Glib::build_filename (spath, name);
4762 if (audio_source_by_path_and_channel (possible_path, 0)) {
4768 return (existing == 0);
4772 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)
4775 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4777 if (Profile->get_trx() && destructive) {
4779 sstr << setfill ('0') << setw (4) << cnt;
4780 sstr << legalized_base;
4782 sstr << legalized_base;
4784 if (take_required || related_exists) {
4796 } else if (nchan > 2) {
4801 /* XXX what? more than 26 channels! */
4812 /** Return a unique name based on \a base for a new internal audio source */
4814 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
4817 string possible_name;
4818 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
4820 bool some_related_source_name_exists = false;
4822 legalized = legalize_for_path (base);
4824 // Find a "version" of the base name that doesn't exist in any of the possible directories.
4826 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
4828 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
4830 if (audio_source_name_is_unique (possible_name)) {
4834 some_related_source_name_exists = true;
4837 error << string_compose(
4838 _("There are already %1 recordings for %2, which I consider too many."),
4839 limit, base) << endmsg;
4841 throw failed_constructor();
4845 /* We've established that the new name does not exist in any session
4846 * directory, so now find out which one we should use for this new
4850 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4852 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
4857 /** Return a unique name based on `base` for a new internal MIDI source */
4859 Session::new_midi_source_path (const string& base)
4862 char buf[PATH_MAX+1];
4863 const uint32_t limit = 10000;
4865 string possible_path;
4866 string possible_name;
4869 legalized = legalize_for_path (base);
4871 // Find a "version" of the file name that doesn't exist in any of the possible directories.
4872 std::vector<string> sdirs = source_search_path(DataType::MIDI);
4874 /* - the main session folder is the first in the vector.
4875 * - after checking all locations for file-name uniqueness,
4876 * we keep the one from the last iteration as new file name
4877 * - midi files are small and should just be kept in the main session-folder
4879 * -> reverse the array, check main session folder last and use that as location
4882 std::reverse(sdirs.begin(), sdirs.end());
4884 for (cnt = 1; cnt <= limit; ++cnt) {
4886 vector<space_and_path>::iterator i;
4887 uint32_t existing = 0;
4889 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4891 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
4892 possible_name = buf;
4894 possible_path = Glib::build_filename (*i, possible_name);
4896 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
4900 if (midi_source_by_path (possible_path)) {
4905 if (existing == 0) {
4910 error << string_compose(
4911 _("There are already %1 recordings for %2, which I consider too many."),
4912 limit, base) << endmsg;
4918 /* No need to "find best location" for software/app-based RAID, because
4919 MIDI is so small that we always put it in the same place.
4922 return possible_path;
4926 /** Create a new within-session audio source */
4927 boost::shared_ptr<AudioFileSource>
4928 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
4930 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
4932 if (!path.empty()) {
4933 return boost::dynamic_pointer_cast<AudioFileSource> (
4934 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate(), true, true));
4936 throw failed_constructor ();
4940 /** Create a new within-session MIDI source */
4941 boost::shared_ptr<MidiSource>
4942 Session::create_midi_source_for_session (string const & basic_name)
4944 const string path = new_midi_source_path (basic_name);
4946 if (!path.empty()) {
4947 return boost::dynamic_pointer_cast<SMFSource> (
4948 SourceFactory::createWritable (
4949 DataType::MIDI, *this, path, false, frame_rate()));
4951 throw failed_constructor ();
4955 /** Create a new within-session MIDI source */
4956 boost::shared_ptr<MidiSource>
4957 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
4959 /* the caller passes in the track the source will be used in,
4960 so that we can keep the numbering sane.
4962 Rationale: a track with the name "Foo" that has had N
4963 captures carried out so far will ALREADY have a write source
4964 named "Foo-N+1.mid" waiting to be used for the next capture.
4966 If we call new_midi_source_name() we will get "Foo-N+2". But
4967 there is no region corresponding to "Foo-N+1", so when
4968 "Foo-N+2" appears in the track, the gap presents the user
4969 with odd behaviour - why did it skip past Foo-N+1?
4971 We could explain this to the user in some odd way, but
4972 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
4975 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
4978 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
4980 std::string name = track->steal_write_source_name ();
4983 return boost::shared_ptr<MidiSource>();
4986 /* MIDI files are small, just put them in the first location of the
4987 session source search path.
4990 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
4992 return boost::dynamic_pointer_cast<SMFSource> (
4993 SourceFactory::createWritable (
4994 DataType::MIDI, *this, path, false, frame_rate()));
4999 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
5001 if (playlist->hidden()) {
5005 playlists->add (playlist);
5008 playlist->release();
5015 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
5017 if (_state_of_the_state & Deletion) {
5021 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
5027 playlists->remove (playlist);
5033 Session::set_audition (boost::shared_ptr<Region> r)
5035 pending_audition_region = r;
5036 add_post_transport_work (PostTransportAudition);
5037 _butler->schedule_transport_work ();
5041 Session::audition_playlist ()
5043 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
5044 ev->region.reset ();
5050 Session::register_lua_function (
5051 const std::string& name,
5052 const std::string& script,
5053 const LuaScriptParamList& args
5056 Glib::Threads::Mutex::Lock lm (lua_lock);
5058 lua_State* L = lua.getState();
5060 const std::string& bytecode = LuaScripting::get_factory_bytecode (script);
5061 luabridge::LuaRef tbl_arg (luabridge::newTable(L));
5062 for (LuaScriptParamList::const_iterator i = args.begin(); i != args.end(); ++i) {
5063 if ((*i)->optional && !(*i)->is_set) { continue; }
5064 tbl_arg[(*i)->name] = (*i)->value;
5066 (*_lua_add)(name, bytecode, tbl_arg); // throws luabridge::LuaException
5071 Session::unregister_lua_function (const std::string& name)
5073 Glib::Threads::Mutex::Lock lm (lua_lock);
5074 (*_lua_del)(name); // throws luabridge::LuaException
5075 lua.collect_garbage ();
5079 std::vector<std::string>
5080 Session::registered_lua_functions ()
5082 Glib::Threads::Mutex::Lock lm (lua_lock);
5083 std::vector<std::string> rv;
5086 luabridge::LuaRef list ((*_lua_list)());
5087 for (luabridge::Iterator i (list); !i.isNil (); ++i) {
5088 if (!i.key ().isString ()) { assert(0); continue; }
5089 rv.push_back (i.key ().cast<std::string> ());
5091 } catch (luabridge::LuaException const& e) { }
5096 static void _lua_print (std::string s) {
5097 std::cout << "SessionLua: " << s << "\n";
5102 Session::try_run_lua (pframes_t nframes)
5104 if (_n_lua_scripts == 0) return;
5105 Glib::Threads::Mutex::Lock tm (lua_lock, Glib::Threads::TRY_LOCK);
5107 try { (*_lua_run)(nframes); } catch (luabridge::LuaException const& e) { }
5112 Session::setup_lua ()
5115 lua.Print.connect (&_lua_print);
5118 "function ArdourSession ()"
5119 " local self = { scripts = {}, instances = {} }"
5121 " local remove = function (n)"
5122 " self.scripts[n] = nil"
5123 " self.instances[n] = nil"
5124 " Session:scripts_changed()" // call back
5127 " local addinternal = function (n, f, a)"
5128 " assert(type(n) == 'string', 'function-name must be string')"
5129 " assert(type(f) == 'function', 'Given script is a not a function')"
5130 " assert(type(a) == 'table' or type(a) == 'nil', 'Given argument is invalid')"
5131 " assert(self.scripts[n] == nil, 'Callback \"'.. n ..'\" already exists.')"
5132 " self.scripts[n] = { ['f'] = f, ['a'] = a }"
5133 " local env = _ENV; env.f = nil env.io = nil env.os = nil env.loadfile = nil env.require = nil env.dofile = nil env.package = nil env.debug = nil"
5134 " local env = { print = print, Session = Session, tostring = tostring, assert = assert, ipairs = ipairs, error = error, select = select, string = string, type = type, tonumber = tonumber, collectgarbage = collectgarbage, pairs = pairs, math = math, table = table, pcall = pcall }"
5135 " self.instances[n] = load (string.dump(f, true), nil, nil, env)(a)"
5136 " Session:scripts_changed()" // call back
5139 " local add = function (n, b, a)"
5140 " assert(type(b) == 'string', 'ByteCode must be string')"
5141 " load (b)()" // assigns f
5142 " assert(type(f) == 'string', 'Assigned ByteCode must be string')"
5143 " addinternal (n, load(f), a)"
5146 " local run = function (...)"
5147 " for n, s in pairs (self.instances) do"
5148 " local status, err = pcall (s, ...)"
5149 " if not status then"
5150 " print ('fn \"'.. n .. '\": ', err)"
5157 " local cleanup = function ()"
5158 " self.scripts = nil"
5159 " self.instances = nil"
5162 " local list = function ()"
5164 " for n, _ in pairs (self.scripts) do"
5170 " local function basic_serialize (o)"
5171 " if type(o) == \"number\" then"
5172 " return tostring(o)"
5174 " return string.format(\"%q\", o)"
5178 " local function serialize (name, value)"
5179 " local rv = name .. ' = '"
5181 " if type(value) == \"number\" or type(value) == \"string\" or type(value) == \"nil\" then"
5182 " return rv .. basic_serialize(value) .. ' '"
5183 " elseif type(value) == \"table\" then"
5185 " for k,v in pairs(value) do"
5186 " local fieldname = string.format(\"%s[%s]\", name, basic_serialize(k))"
5187 " rv = rv .. serialize(fieldname, v) .. ' '"
5188 " collectgarbage()" // string concatenation allocates a new string :(
5191 " elseif type(value) == \"function\" then"
5192 " return rv .. string.format(\"%q\", string.dump(value, true))"
5194 " error('cannot save a ' .. type(value))"
5199 " local save = function ()"
5200 " return (serialize('scripts', self.scripts))"
5203 " local restore = function (state)"
5204 " self.scripts = {}"
5206 " for n, s in pairs (scripts) do"
5207 " addinternal (n, load(s['f']), s['a'])"
5211 " return { run = run, add = add, remove = remove,"
5212 " list = list, restore = restore, save = save, cleanup = cleanup}"
5215 " sess = ArdourSession ()"
5216 " ArdourSession = nil"
5218 "function ardour () end"
5221 lua_State* L = lua.getState();
5224 luabridge::LuaRef lua_sess = luabridge::getGlobal (L, "sess");
5225 lua.do_command ("sess = nil"); // hide it.
5226 lua.do_command ("collectgarbage()");
5228 _lua_run = new luabridge::LuaRef(lua_sess["run"]);
5229 _lua_add = new luabridge::LuaRef(lua_sess["add"]);
5230 _lua_del = new luabridge::LuaRef(lua_sess["remove"]);
5231 _lua_list = new luabridge::LuaRef(lua_sess["list"]);
5232 _lua_save = new luabridge::LuaRef(lua_sess["save"]);
5233 _lua_load = new luabridge::LuaRef(lua_sess["restore"]);
5234 _lua_cleanup = new luabridge::LuaRef(lua_sess["cleanup"]);
5235 } catch (luabridge::LuaException const& e) {
5236 fatal << string_compose (_("programming error: %1"),
5237 X_("Failed to setup Lua interpreter"))
5239 abort(); /*NOTREACHED*/
5242 LuaBindings::stddef (L);
5243 LuaBindings::common (L);
5244 LuaBindings::dsp (L);
5245 luabridge::push <Session *> (L, this);
5246 lua_setglobal (L, "Session");
5250 Session::scripts_changed ()
5252 assert (!lua_lock.trylock()); // must hold lua_lock
5255 luabridge::LuaRef list ((*_lua_list)());
5257 for (luabridge::Iterator i (list); !i.isNil (); ++i) {
5258 if (!i.key ().isString ()) { assert(0); continue; }
5261 _n_lua_scripts = cnt;
5262 } catch (luabridge::LuaException const& e) {
5263 fatal << string_compose (_("programming error: %1"),
5264 X_("Indexing Lua Session Scripts failed."))
5266 abort(); /*NOTREACHED*/
5271 Session::non_realtime_set_audition ()
5273 assert (pending_audition_region);
5274 auditioner->audition_region (pending_audition_region);
5275 pending_audition_region.reset ();
5276 AuditionActive (true); /* EMIT SIGNAL */
5280 Session::audition_region (boost::shared_ptr<Region> r)
5282 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
5288 Session::cancel_audition ()
5293 if (auditioner->auditioning()) {
5294 auditioner->cancel_audition ();
5295 AuditionActive (false); /* EMIT SIGNAL */
5300 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
5302 if (a->is_monitor()) {
5305 if (b->is_monitor()) {
5308 return a->order_key () < b->order_key ();
5312 Session::is_auditioning () const
5314 /* can be called before we have an auditioner object */
5316 return auditioner->auditioning();
5323 Session::graph_reordered ()
5325 /* don't do this stuff if we are setting up connections
5326 from a set_state() call or creating new tracks. Ditto for deletion.
5329 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _reconnecting_routes_in_progress || _route_deletion_in_progress) {
5333 /* every track/bus asked for this to be handled but it was deferred because
5334 we were connecting. do it now.
5337 request_input_change_handling ();
5341 /* force all diskstreams to update their capture offset values to
5342 reflect any changes in latencies within the graph.
5345 boost::shared_ptr<RouteList> rl = routes.reader ();
5346 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5347 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5349 tr->set_capture_offset ();
5354 /** @return Number of frames that there is disk space available to write,
5357 boost::optional<framecnt_t>
5358 Session::available_capture_duration ()
5360 Glib::Threads::Mutex::Lock lm (space_lock);
5362 if (_total_free_4k_blocks_uncertain) {
5363 return boost::optional<framecnt_t> ();
5366 float sample_bytes_on_disk = 4.0; // keep gcc happy
5368 switch (config.get_native_file_data_format()) {
5370 sample_bytes_on_disk = 4.0;
5374 sample_bytes_on_disk = 3.0;
5378 sample_bytes_on_disk = 2.0;
5382 /* impossible, but keep some gcc versions happy */
5383 fatal << string_compose (_("programming error: %1"),
5384 X_("illegal native file data format"))
5386 abort(); /*NOTREACHED*/
5389 double scale = 4096.0 / sample_bytes_on_disk;
5391 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
5392 return max_framecnt;
5395 return (framecnt_t) floor (_total_free_4k_blocks * scale);
5399 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
5402 RCUWriter<BundleList> writer (_bundles);
5403 boost::shared_ptr<BundleList> b = writer.get_copy ();
5404 b->push_back (bundle);
5408 BundleAddedOrRemoved (); /* EMIT SIGNAL */
5415 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
5417 bool removed = false;
5420 RCUWriter<BundleList> writer (_bundles);
5421 boost::shared_ptr<BundleList> b = writer.get_copy ();
5422 BundleList::iterator i = find (b->begin(), b->end(), bundle);
5424 if (i != b->end()) {
5431 BundleAddedOrRemoved (); /* EMIT SIGNAL */
5437 boost::shared_ptr<Bundle>
5438 Session::bundle_by_name (string name) const
5440 boost::shared_ptr<BundleList> b = _bundles.reader ();
5442 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
5443 if ((*i)->name() == name) {
5448 return boost::shared_ptr<Bundle> ();
5452 Session::tempo_map_changed (const PropertyChange&)
5456 playlists->update_after_tempo_map_change ();
5458 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
5464 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
5466 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
5467 (*i)->recompute_frames_from_bbt ();
5471 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
5472 * the given count with the current block size.
5475 Session::ensure_buffers (ChanCount howmany)
5477 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
5481 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
5483 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5484 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
5489 Session::next_insert_id ()
5491 /* this doesn't really loop forever. just think about it */
5494 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
5495 if (!insert_bitset[n]) {
5496 insert_bitset[n] = true;
5502 /* none available, so resize and try again */
5504 insert_bitset.resize (insert_bitset.size() + 16, false);
5509 Session::next_send_id ()
5511 /* this doesn't really loop forever. just think about it */
5514 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
5515 if (!send_bitset[n]) {
5516 send_bitset[n] = true;
5522 /* none available, so resize and try again */
5524 send_bitset.resize (send_bitset.size() + 16, false);
5529 Session::next_aux_send_id ()
5531 /* this doesn't really loop forever. just think about it */
5534 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
5535 if (!aux_send_bitset[n]) {
5536 aux_send_bitset[n] = true;
5542 /* none available, so resize and try again */
5544 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
5549 Session::next_return_id ()
5551 /* this doesn't really loop forever. just think about it */
5554 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
5555 if (!return_bitset[n]) {
5556 return_bitset[n] = true;
5562 /* none available, so resize and try again */
5564 return_bitset.resize (return_bitset.size() + 16, false);
5569 Session::mark_send_id (uint32_t id)
5571 if (id >= send_bitset.size()) {
5572 send_bitset.resize (id+16, false);
5574 if (send_bitset[id]) {
5575 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
5577 send_bitset[id] = true;
5581 Session::mark_aux_send_id (uint32_t id)
5583 if (id >= aux_send_bitset.size()) {
5584 aux_send_bitset.resize (id+16, false);
5586 if (aux_send_bitset[id]) {
5587 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
5589 aux_send_bitset[id] = true;
5593 Session::mark_return_id (uint32_t id)
5595 if (id >= return_bitset.size()) {
5596 return_bitset.resize (id+16, false);
5598 if (return_bitset[id]) {
5599 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
5601 return_bitset[id] = true;
5605 Session::mark_insert_id (uint32_t id)
5607 if (id >= insert_bitset.size()) {
5608 insert_bitset.resize (id+16, false);
5610 if (insert_bitset[id]) {
5611 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
5613 insert_bitset[id] = true;
5617 Session::unmark_send_id (uint32_t id)
5619 if (id < send_bitset.size()) {
5620 send_bitset[id] = false;
5625 Session::unmark_aux_send_id (uint32_t id)
5627 if (id < aux_send_bitset.size()) {
5628 aux_send_bitset[id] = false;
5633 Session::unmark_return_id (uint32_t id)
5635 if (_state_of_the_state & Deletion) { return; }
5636 if (id < return_bitset.size()) {
5637 return_bitset[id] = false;
5642 Session::unmark_insert_id (uint32_t id)
5644 if (id < insert_bitset.size()) {
5645 insert_bitset[id] = false;
5650 Session::reset_native_file_format ()
5652 boost::shared_ptr<RouteList> rl = routes.reader ();
5654 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5655 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5657 /* don't save state as we do this, there's no point
5659 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
5660 tr->reset_write_sources (false);
5661 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
5667 Session::route_name_unique (string n) const
5669 boost::shared_ptr<RouteList> r = routes.reader ();
5671 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5672 if ((*i)->name() == n) {
5681 Session::route_name_internal (string n) const
5683 if (auditioner && auditioner->name() == n) {
5687 if (_click_io && _click_io->name() == n) {
5695 Session::freeze_all (InterThreadInfo& itt)
5697 boost::shared_ptr<RouteList> r = routes.reader ();
5699 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5701 boost::shared_ptr<Track> t;
5703 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
5704 /* XXX this is wrong because itt.progress will keep returning to zero at the start
5714 boost::shared_ptr<Region>
5715 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
5716 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
5717 InterThreadInfo& itt,
5718 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
5719 bool for_export, bool for_freeze)
5721 boost::shared_ptr<Region> result;
5722 boost::shared_ptr<Playlist> playlist;
5723 boost::shared_ptr<Source> source;
5724 ChanCount diskstream_channels (track.n_channels());
5725 framepos_t position;
5726 framecnt_t this_chunk;
5728 framepos_t latency_skip;
5730 framepos_t len = end - start;
5731 bool need_block_size_reset = false;
5732 ChanCount const max_proc = track.max_processor_streams ();
5733 string legal_playlist_name;
5734 string possible_path;
5737 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
5738 end, start) << endmsg;
5742 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
5743 include_endpoint, for_export, for_freeze);
5745 if (diskstream_channels.n(track.data_type()) < 1) {
5746 error << _("Cannot write a range with no data.") << endmsg;
5750 // block all process callback handling
5752 block_processing ();
5755 // synchronize with AudioEngine::process_callback()
5756 // make sure processing is not currently running
5757 // and processing_blocked() is honored before
5758 // acquiring thread buffers
5759 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5762 _bounce_processing_active = true;
5764 /* call tree *MUST* hold route_lock */
5766 if ((playlist = track.playlist()) == 0) {
5770 legal_playlist_name = legalize_for_path (playlist->name());
5772 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
5774 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
5775 string path = ((track.data_type() == DataType::AUDIO)
5776 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
5777 : new_midi_source_path (legal_playlist_name));
5784 source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
5787 catch (failed_constructor& err) {
5788 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
5792 srcs.push_back (source);
5795 /* tell redirects that care that we are about to use a much larger
5796 * blocksize. this will flush all plugins too, so that they are ready
5797 * to be used for this process.
5800 need_block_size_reset = true;
5801 track.set_block_size (bounce_chunk_size);
5802 _engine.main_thread()->get_buffers ();
5806 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5808 /* create a set of reasonably-sized buffers */
5809 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5810 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
5812 buffers.set_count (max_proc);
5814 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5815 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5816 boost::shared_ptr<MidiSource> ms;
5818 afs->prepare_for_peakfile_writes ();
5819 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5820 Source::Lock lock(ms->mutex());
5821 ms->mark_streaming_write_started(lock);
5825 while (to_do && !itt.cancel) {
5827 this_chunk = min (to_do, bounce_chunk_size);
5829 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
5833 start += this_chunk;
5834 to_do -= this_chunk;
5835 itt.progress = (float) (1.0 - ((double) to_do / len));
5837 if (latency_skip >= bounce_chunk_size) {
5838 latency_skip -= bounce_chunk_size;
5842 const framecnt_t current_chunk = this_chunk - latency_skip;
5845 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5846 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5847 boost::shared_ptr<MidiSource> ms;
5850 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
5853 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5854 Source::Lock lock(ms->mutex());
5856 const MidiBuffer& buf = buffers.get_midi(0);
5857 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
5858 Evoral::Event<framepos_t> ev = *i;
5859 ev.set_time(ev.time() - position);
5860 ms->append_event_frames(lock, ev, ms->timeline_position());
5867 /* post-roll, pick up delayed processor output */
5868 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5870 while (latency_skip && !itt.cancel) {
5871 this_chunk = min (latency_skip, bounce_chunk_size);
5872 latency_skip -= this_chunk;
5874 buffers.silence (this_chunk, 0);
5875 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
5878 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5879 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5882 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
5894 xnow = localtime (&now);
5896 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
5897 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5898 boost::shared_ptr<MidiSource> ms;
5901 afs->update_header (position, *xnow, now);
5902 afs->flush_header ();
5903 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5904 Source::Lock lock(ms->mutex());
5905 ms->mark_streaming_write_completed(lock);
5909 /* construct a region to represent the bounced material */
5913 plist.add (Properties::start, 0);
5914 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
5915 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
5917 result = RegionFactory::create (srcs, plist);
5923 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5924 (*src)->mark_for_remove ();
5925 (*src)->drop_references ();
5929 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5930 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5933 afs->done_with_peakfile_writes ();
5937 _bounce_processing_active = false;
5939 if (need_block_size_reset) {
5940 _engine.main_thread()->drop_buffers ();
5941 track.set_block_size (get_block_size());
5944 unblock_processing ();
5951 Session::gain_automation_buffer() const
5953 return ProcessThread::gain_automation_buffer ();
5957 Session::trim_automation_buffer() const
5959 return ProcessThread::trim_automation_buffer ();
5963 Session::send_gain_automation_buffer() const
5965 return ProcessThread::send_gain_automation_buffer ();
5969 Session::pan_automation_buffer() const
5971 return ProcessThread::pan_automation_buffer ();
5975 Session::get_silent_buffers (ChanCount count)
5977 return ProcessThread::get_silent_buffers (count);
5981 Session::get_scratch_buffers (ChanCount count, bool silence)
5983 return ProcessThread::get_scratch_buffers (count, silence);
5987 Session::get_noinplace_buffers (ChanCount count)
5989 return ProcessThread::get_noinplace_buffers (count);
5993 Session::get_route_buffers (ChanCount count, bool silence)
5995 return ProcessThread::get_route_buffers (count, silence);
6000 Session::get_mix_buffers (ChanCount count)
6002 return ProcessThread::get_mix_buffers (count);
6006 Session::ntracks () const
6009 boost::shared_ptr<RouteList> r = routes.reader ();
6011 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
6012 if (boost::dynamic_pointer_cast<Track> (*i)) {
6021 Session::nbusses () const
6024 boost::shared_ptr<RouteList> r = routes.reader ();
6026 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
6027 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
6036 Session::add_automation_list(AutomationList *al)
6038 automation_lists[al->id()] = al;
6041 /** @return true if there is at least one record-enabled track, otherwise false */
6043 Session::have_rec_enabled_track () const
6045 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
6049 Session::have_rec_disabled_track () const
6051 return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
6054 /** Update the state of our rec-enabled tracks flag */
6056 Session::update_route_record_state ()
6058 boost::shared_ptr<RouteList> rl = routes.reader ();
6059 RouteList::iterator i = rl->begin();
6060 while (i != rl->end ()) {
6062 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6063 if (tr && tr->record_enabled ()) {
6070 int const old = g_atomic_int_get (&_have_rec_enabled_track);
6072 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
6074 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
6075 RecordStateChanged (); /* EMIT SIGNAL */
6078 for (i = rl->begin(); i != rl->end (); ++i) {
6079 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6080 if (tr && !tr->record_enabled ()) {
6085 g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
6087 bool record_arm_state_changed = (old != g_atomic_int_get (&_have_rec_enabled_track) );
6089 if (record_status() == Recording && record_arm_state_changed ) {
6090 RecordArmStateChanged ();
6096 Session::listen_position_changed ()
6098 boost::shared_ptr<RouteList> r = routes.reader ();
6100 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6101 (*i)->listen_position_changed ();
6106 Session::solo_control_mode_changed ()
6108 /* cancel all solo or all listen when solo control mode changes */
6111 set_solo (get_routes(), false);
6112 } else if (listening()) {
6113 set_listen (get_routes(), false);
6117 /** Called when a property of one of our route groups changes */
6119 Session::route_group_property_changed (RouteGroup* rg)
6121 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
6124 /** Called when a route is added to one of our route groups */
6126 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
6128 RouteAddedToRouteGroup (rg, r);
6131 /** Called when a route is removed from one of our route groups */
6133 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
6135 update_route_record_state ();
6136 RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
6139 boost::shared_ptr<RouteList>
6140 Session::get_tracks () const
6142 boost::shared_ptr<RouteList> rl = routes.reader ();
6143 boost::shared_ptr<RouteList> tl (new RouteList);
6145 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
6146 if (boost::dynamic_pointer_cast<Track> (*r)) {
6147 if (!(*r)->is_auditioner()) {
6155 boost::shared_ptr<RouteList>
6156 Session::get_routes_with_regions_at (framepos_t const p) const
6158 boost::shared_ptr<RouteList> r = routes.reader ();
6159 boost::shared_ptr<RouteList> rl (new RouteList);
6161 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6162 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6167 boost::shared_ptr<Playlist> pl = tr->playlist ();
6172 if (pl->has_region_at (p)) {
6181 Session::goto_end ()
6183 if (_session_range_location) {
6184 request_locate (_session_range_location->end(), false);
6186 request_locate (0, false);
6191 Session::goto_start ()
6193 if (_session_range_location) {
6194 request_locate (_session_range_location->start(), false);
6196 request_locate (0, false);
6201 Session::current_start_frame () const
6203 return _session_range_location ? _session_range_location->start() : 0;
6207 Session::current_end_frame () const
6209 return _session_range_location ? _session_range_location->end() : 0;
6213 Session::set_session_range_location (framepos_t start, framepos_t end)
6215 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
6216 _locations->add (_session_range_location);
6220 Session::step_edit_status_change (bool yn)
6226 send = (_step_editors == 0);
6231 send = (_step_editors == 1);
6234 if (_step_editors > 0) {
6240 StepEditStatusChange (val);
6246 Session::start_time_changed (framepos_t old)
6248 /* Update the auto loop range to match the session range
6249 (unless the auto loop range has been changed by the user)
6252 Location* s = _locations->session_range_location ();
6257 Location* l = _locations->auto_loop_location ();
6259 if (l && l->start() == old) {
6260 l->set_start (s->start(), true);
6265 Session::end_time_changed (framepos_t old)
6267 /* Update the auto loop range to match the session range
6268 (unless the auto loop range has been changed by the user)
6271 Location* s = _locations->session_range_location ();
6276 Location* l = _locations->auto_loop_location ();
6278 if (l && l->end() == old) {
6279 l->set_end (s->end(), true);
6283 std::vector<std::string>
6284 Session::source_search_path (DataType type) const
6288 if (session_dirs.size() == 1) {
6290 case DataType::AUDIO:
6291 sp.push_back (_session_dir->sound_path());
6293 case DataType::MIDI:
6294 sp.push_back (_session_dir->midi_path());
6298 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
6299 SessionDirectory sdir (i->path);
6301 case DataType::AUDIO:
6302 sp.push_back (sdir.sound_path());
6304 case DataType::MIDI:
6305 sp.push_back (sdir.midi_path());
6311 if (type == DataType::AUDIO) {
6312 const string sound_path_2X = _session_dir->sound_path_2X();
6313 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
6314 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
6315 sp.push_back (sound_path_2X);
6320 // now check the explicit (possibly user-specified) search path
6323 case DataType::AUDIO:
6324 sp += Searchpath(config.get_audio_search_path ());
6326 case DataType::MIDI:
6327 sp += Searchpath(config.get_midi_search_path ());
6335 Session::ensure_search_path_includes (const string& path, DataType type)
6344 case DataType::AUDIO:
6345 sp += Searchpath(config.get_audio_search_path ());
6347 case DataType::MIDI:
6348 sp += Searchpath (config.get_midi_search_path ());
6352 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
6353 /* No need to add this new directory if it has the same inode as
6354 an existing one; checking inode rather than name prevents duplicated
6355 directories when we are using symlinks.
6357 On Windows, I think we could just do if (*i == path) here.
6359 if (PBD::equivalent_paths (*i, path)) {
6367 case DataType::AUDIO:
6368 config.set_audio_search_path (sp.to_string());
6370 case DataType::MIDI:
6371 config.set_midi_search_path (sp.to_string());
6377 Session::remove_dir_from_search_path (const string& dir, DataType type)
6382 case DataType::AUDIO:
6383 sp = Searchpath(config.get_audio_search_path ());
6385 case DataType::MIDI:
6386 sp = Searchpath (config.get_midi_search_path ());
6393 case DataType::AUDIO:
6394 config.set_audio_search_path (sp.to_string());
6396 case DataType::MIDI:
6397 config.set_midi_search_path (sp.to_string());
6403 boost::shared_ptr<Speakers>
6404 Session::get_speakers()
6410 Session::unknown_processors () const
6414 boost::shared_ptr<RouteList> r = routes.reader ();
6415 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6416 list<string> t = (*i)->unknown_processors ();
6417 copy (t.begin(), t.end(), back_inserter (p));
6427 Session::update_latency (bool playback)
6429 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
6431 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
6435 boost::shared_ptr<RouteList> r = routes.reader ();
6436 framecnt_t max_latency = 0;
6439 /* reverse the list so that we work backwards from the last route to run to the first */
6440 RouteList* rl = routes.reader().get();
6441 r.reset (new RouteList (*rl));
6442 reverse (r->begin(), r->end());
6445 /* compute actual latency values for the given direction and store them all in per-port
6446 structures. this will also publish the same values (to JACK) so that computation of latency
6447 for routes can consistently use public latency values.
6450 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6451 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
6454 /* because we latency compensate playback, our published playback latencies should
6455 be the same for all output ports - all material played back by ardour has
6456 the same latency, whether its caused by plugins or by latency compensation. since
6457 these may differ from the values computed above, reset all playback port latencies
6461 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
6463 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6464 (*i)->set_public_port_latencies (max_latency, playback);
6469 post_playback_latency ();
6473 post_capture_latency ();
6476 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
6480 Session::post_playback_latency ()
6482 set_worst_playback_latency ();
6484 boost::shared_ptr<RouteList> r = routes.reader ();
6486 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6487 if (!(*i)->is_auditioner() && ((*i)->active())) {
6488 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
6492 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6493 (*i)->set_latency_compensation (_worst_track_latency);
6498 Session::post_capture_latency ()
6500 set_worst_capture_latency ();
6502 /* reflect any changes in capture latencies into capture offsets
6505 boost::shared_ptr<RouteList> rl = routes.reader();
6506 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
6507 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6509 tr->set_capture_offset ();
6515 Session::initialize_latencies ()
6518 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
6519 update_latency (false);
6520 update_latency (true);
6523 set_worst_io_latencies ();
6527 Session::set_worst_io_latencies ()
6529 set_worst_playback_latency ();
6530 set_worst_capture_latency ();
6534 Session::set_worst_playback_latency ()
6536 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6540 _worst_output_latency = 0;
6542 if (!_engine.connected()) {
6546 boost::shared_ptr<RouteList> r = routes.reader ();
6548 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6549 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
6552 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
6556 Session::set_worst_capture_latency ()
6558 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6562 _worst_input_latency = 0;
6564 if (!_engine.connected()) {
6568 boost::shared_ptr<RouteList> r = routes.reader ();
6570 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6571 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
6574 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
6578 Session::update_latency_compensation (bool force_whole_graph)
6580 bool some_track_latency_changed = false;
6582 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6586 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
6588 _worst_track_latency = 0;
6590 boost::shared_ptr<RouteList> r = routes.reader ();
6592 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6593 if (!(*i)->is_auditioner() && ((*i)->active())) {
6595 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
6596 some_track_latency_changed = true;
6598 _worst_track_latency = max (tl, _worst_track_latency);
6602 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
6603 (some_track_latency_changed ? "yes" : "no")));
6605 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
6607 if (some_track_latency_changed || force_whole_graph) {
6608 _engine.update_latencies ();
6612 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6613 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6617 tr->set_capture_offset ();
6622 Session::session_name_is_legal (const string& path)
6624 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
6626 for (int i = 0; illegal_chars[i]; ++i) {
6627 if (path.find (illegal_chars[i]) != string::npos) {
6628 return illegal_chars[i];
6636 Session::next_control_id () const
6640 /* the monitor bus remote ID is in a different
6641 * "namespace" than regular routes. its existence doesn't
6642 * affect normal (low) numbered routes.
6649 /* the same about masterbus in Waves Tracks */
6651 if (Profile->get_trx() && _master_out) {
6655 return nroutes() - subtract;
6659 Session::notify_remote_id_change ()
6661 if (deletion_in_progress()) {
6665 switch (Config->get_remote_model()) {
6667 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
6673 #ifdef USE_TRACKS_CODE_FEATURES
6674 /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
6675 * if track order has been changed by user
6677 reconnect_existing_routes(true, true);
6683 Session::sync_order_keys ()
6685 if (deletion_in_progress()) {
6689 /* tell everyone that something has happened to the sort keys
6690 and let them sync up with the change(s)
6691 this will give objects that manage the sort order keys the
6692 opportunity to keep them in sync if they wish to.
6695 DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
6697 reassign_track_numbers();
6699 Route::SyncOrderKeys (); /* EMIT SIGNAL */
6701 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
6705 Session::operation_in_progress (GQuark op) const
6707 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
6710 boost::shared_ptr<Port>
6711 Session::ltc_input_port () const
6713 return _ltc_input->nth (0);
6716 boost::shared_ptr<Port>
6717 Session::ltc_output_port () const
6719 return _ltc_output->nth (0);
6723 Session::reconnect_ltc_input ()
6727 string src = Config->get_ltc_source_port();
6729 _ltc_input->disconnect (this);
6731 if (src != _("None") && !src.empty()) {
6732 _ltc_input->nth (0)->connect (src);
6735 if ( ARDOUR::Profile->get_trx () ) {
6736 // Tracks need this signal to update timecode_source_dropdown
6737 MtcOrLtcInputPortChanged (); //emit signal
6743 Session::reconnect_ltc_output ()
6747 string src = Config->get_ltc_output_port();
6749 _ltc_output->disconnect (this);
6751 if (src != _("None") && !src.empty()) {
6752 _ltc_output->nth (0)->connect (src);
6758 Session::set_range_selection (framepos_t start, framepos_t end)
6760 _range_selection = Evoral::Range<framepos_t> (start, end);
6761 #ifdef USE_TRACKS_CODE_FEATURES
6762 follow_playhead_priority ();
6767 Session::set_object_selection (framepos_t start, framepos_t end)
6769 _object_selection = Evoral::Range<framepos_t> (start, end);
6770 #ifdef USE_TRACKS_CODE_FEATURES
6771 follow_playhead_priority ();
6776 Session::clear_range_selection ()
6778 _range_selection = Evoral::Range<framepos_t> (-1,-1);
6779 #ifdef USE_TRACKS_CODE_FEATURES
6780 follow_playhead_priority ();
6785 Session::clear_object_selection ()
6787 _object_selection = Evoral::Range<framepos_t> (-1,-1);
6788 #ifdef USE_TRACKS_CODE_FEATURES
6789 follow_playhead_priority ();