2 Copyright (C) 1999-2010 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #include <cstdio> /* sprintf(3) ... grrr */
33 #include <glibmm/threads.h>
34 #include <glibmm/miscutils.h>
35 #include <glibmm/fileutils.h>
37 #include <boost/algorithm/string/erase.hpp>
39 #include "pbd/basename.h"
40 #include "pbd/boost_debug.h"
41 #include "pbd/convert.h"
42 #include "pbd/convert.h"
43 #include "pbd/error.h"
44 #include "pbd/file_utils.h"
46 #include "pbd/search_path.h"
47 #include "pbd/stacktrace.h"
48 #include "pbd/stl_delete.h"
49 #include "pbd/unwind.h"
51 #include "ardour/amp.h"
52 #include "ardour/analyser.h"
53 #include "ardour/async_midi_port.h"
54 #include "ardour/audio_buffer.h"
55 #include "ardour/audio_diskstream.h"
56 #include "ardour/audio_port.h"
57 #include "ardour/audio_track.h"
58 #include "ardour/audioengine.h"
59 #include "ardour/audiofilesource.h"
60 #include "ardour/auditioner.h"
61 #include "ardour/buffer_manager.h"
62 #include "ardour/buffer_set.h"
63 #include "ardour/bundle.h"
64 #include "ardour/butler.h"
65 #include "ardour/click.h"
66 #include "ardour/control_protocol_manager.h"
67 #include "ardour/data_type.h"
68 #include "ardour/debug.h"
69 #include "ardour/directory_names.h"
70 #include "ardour/filename_extensions.h"
71 #include "ardour/graph.h"
72 #include "ardour/midiport_manager.h"
73 #include "ardour/scene_changer.h"
74 #include "ardour/midi_track.h"
75 #include "ardour/midi_ui.h"
76 #include "ardour/operations.h"
77 #include "ardour/playlist.h"
78 #include "ardour/plugin.h"
79 #include "ardour/plugin_insert.h"
80 #include "ardour/process_thread.h"
81 #include "ardour/profile.h"
82 #include "ardour/rc_configuration.h"
83 #include "ardour/recent_sessions.h"
84 #include "ardour/region.h"
85 #include "ardour/region_factory.h"
86 #include "ardour/route_graph.h"
87 #include "ardour/route_group.h"
88 #include "ardour/route_sorters.h"
89 #include "ardour/send.h"
90 #include "ardour/session.h"
91 #include "ardour/session_directory.h"
92 #include "ardour/session_playlists.h"
93 #include "ardour/smf_source.h"
94 #include "ardour/source_factory.h"
95 #include "ardour/speakers.h"
96 #include "ardour/tempo.h"
97 #include "ardour/track.h"
98 #include "ardour/user_bundle.h"
99 #include "ardour/utils.h"
101 #include "midi++/port.h"
102 #include "midi++/mmc.h"
113 using namespace ARDOUR;
116 bool Session::_disable_all_loaded_plugins = false;
118 PBD::Signal1<int,uint32_t> Session::AudioEngineSetupRequired;
119 PBD::Signal1<void,std::string> Session::Dialog;
120 PBD::Signal0<int> Session::AskAboutPendingState;
121 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
122 PBD::Signal0<void> Session::SendFeedback;
123 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
125 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
126 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
127 PBD::Signal2<void,std::string, std::string> Session::Exported;
128 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
129 PBD::Signal0<void> Session::Quit;
130 PBD::Signal0<void> Session::FeedbackDetected;
131 PBD::Signal0<void> Session::SuccessfulGraphSort;
132 PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
134 const framecnt_t Session::bounce_chunk_size = 65536;
135 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
136 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
138 /** @param snapshot_name Snapshot name, without .ardour suffix */
139 Session::Session (AudioEngine &eng,
140 const string& fullpath,
141 const string& snapshot_name,
142 BusProfile* bus_profile,
144 : playlists (new SessionPlaylists)
146 , process_function (&Session::process_with_events)
147 , _bounce_processing_active (false)
148 , waiting_for_sync_offset (false)
149 , _base_frame_rate (0)
150 , _current_frame_rate (0)
151 , _nominal_frame_rate (0)
152 , transport_sub_state (0)
153 , _record_status (Disabled)
154 , _transport_frame (0)
155 , _session_range_location (0)
158 , _transport_speed (0)
159 , _default_transport_speed (1.0)
160 , _last_transport_speed (0)
161 , _target_transport_speed (0.0)
162 , auto_play_legal (false)
163 , _last_slave_transport_frame (0)
164 , maximum_output_latency (0)
165 , _requested_return_frame (-1)
166 , current_block_size (0)
167 , _worst_output_latency (0)
168 , _worst_input_latency (0)
169 , _worst_track_latency (0)
170 , _have_captured (false)
171 , _non_soloed_outs_muted (false)
173 , _solo_isolated_cnt (0)
175 , _was_seamless (Config->get_seamless_loop ())
176 , _under_nsm_control (false)
178 , delta_accumulator_cnt (0)
179 , average_slave_delta (1800) // !!! why 1800 ???
181 , have_first_delta_accumulator (false)
182 , _slave_state (Stopped)
183 , post_export_sync (false)
184 , post_export_position (0)
186 , _export_started (false)
187 , _export_rolling (false)
188 , _pre_export_mmc_enabled (false)
189 , _name (snapshot_name)
191 , _send_qf_mtc (false)
192 , _pframes_since_last_mtc (0)
193 , session_midi_feedback (0)
195 , loop_changing (false)
197 , _session_dir (new SessionDirectory (fullpath))
198 , _current_snapshot_name (snapshot_name)
200 , state_was_pending (false)
201 , _state_of_the_state (StateOfTheState(CannotSave|InitialConnecting|Loading))
203 , _save_queued (false)
204 , _last_roll_location (0)
205 , _last_roll_or_reversal_location (0)
206 , _last_record_location (0)
207 , pending_locate_roll (false)
208 , pending_locate_frame (0)
209 , pending_locate_flush (false)
210 , pending_abort (false)
211 , pending_auto_loop (false)
212 , _butler (new Butler (*this))
213 , _post_transport_work (0)
214 , cumulative_rf_motion (0)
216 , _locations (new Locations (*this))
217 , _ignore_skips_updates (false)
218 , _rt_thread_active (false)
219 , _rt_emit_pending (false)
221 , outbound_mtc_timecode_frame (0)
222 , next_quarter_frame_to_send (-1)
223 , _frames_per_timecode_frame (0)
224 , _frames_per_hour (0)
225 , _timecode_frames_per_hour (0)
226 , last_timecode_valid (false)
227 , last_timecode_when (0)
228 , _send_timecode_update (false)
240 , ltc_timecode_offset (0)
241 , ltc_timecode_negative_offset (false)
242 , midi_control_ui (0)
244 , _all_route_group (new RouteGroup (*this, "all"))
245 , routes (new RouteList)
246 , _adding_routes_in_progress (false)
247 , _reconnecting_routes_in_progress (false)
248 , _route_deletion_in_progress (false)
249 , destructive_index (0)
250 , _track_number_decimals(1)
251 , solo_update_disabled (false)
252 , default_fade_steepness (0)
253 , default_fade_msecs (0)
254 , _total_free_4k_blocks (0)
255 , _total_free_4k_blocks_uncertain (false)
256 , no_questions_about_missing_files (false)
259 , _bundles (new BundleList)
260 , _bundle_xml_node (0)
264 , click_emphasis_data (0)
266 , click_emphasis_length (0)
267 , _clicks_cleared (0)
268 , _play_range (false)
270 , first_file_data_format_reset (true)
271 , first_file_header_format_reset (true)
272 , have_looped (false)
273 , _have_rec_enabled_track (false)
274 , _have_rec_disabled_track (true)
276 , _suspend_timecode_transmission (0)
277 , _speakers (new Speakers)
279 , ignore_route_processor_changes (false)
286 pthread_mutex_init (&_rt_emit_mutex, 0);
287 pthread_cond_init (&_rt_emit_cond, 0);
289 pre_engine_init (fullpath);
292 if (ensure_engine (sr)) {
294 throw failed_constructor ();
297 if (create (mix_template, bus_profile)) {
299 throw failed_constructor ();
302 /* if a mix template was provided, then ::create() will
303 * have copied it into the session and we need to load it
304 * so that we have the state ready for ::set_state()
305 * after the engine is started.
307 * Note that we do NOT try to get the sample rate from
308 * the template at this time, though doing so would
309 * be easy if we decided this was an appropriate part
313 if (!mix_template.empty()) {
314 if (load_state (_current_snapshot_name)) {
315 throw failed_constructor ();
317 store_recent_templates (mix_template);
320 /* load default session properties - if any */
325 if (load_state (_current_snapshot_name)) {
326 throw failed_constructor ();
329 /* try to get sample rate from XML state so that we
330 * can influence the SR if we set up the audio
335 const XMLProperty* prop;
336 if ((prop = state_tree->root()->property (X_("sample-rate"))) != 0) {
337 sr = atoi (prop->value());
341 if (ensure_engine (sr)) {
343 throw failed_constructor ();
347 if (post_engine_init ()) {
349 throw failed_constructor ();
352 store_recent_sessions (_name, _path);
354 bool was_dirty = dirty();
356 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
358 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
359 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
362 DirtyChanged (); /* EMIT SIGNAL */
365 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
366 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
370 emit_thread_start ();
372 /* hook us up to the engine since we are now completely constructed */
374 BootMessage (_("Connect to engine"));
376 _engine.set_session (this);
377 _engine.reset_timebase ();
379 #ifdef USE_TRACKS_CODE_FEATURES
381 EngineStateController::instance()->set_session(this);
384 if ( ARDOUR::Profile->get_trx () ) {
386 /* Waves Tracks: fill session with tracks basing on the amount of inputs.
387 * each available input must have corresponding track when session starts.
390 uint32_t how_many (0);
392 std::vector<std::string> inputs;
393 EngineStateController::instance()->get_physical_audio_inputs(inputs);
395 how_many = inputs.size();
397 list<boost::shared_ptr<AudioTrack> > tracks;
399 // Track names after driver
400 if (Config->get_tracks_auto_naming() == NameAfterDriver) {
401 string track_name = "";
402 for (std::vector<string>::size_type i = 0; i < inputs.size(); ++i) {
404 remove_pattern_from_string(inputs[i], "system:capture:", track_name);
406 list<boost::shared_ptr<AudioTrack> > single_track = new_audio_track (1, 1, Normal, 0, 1, track_name);
407 tracks.insert(tracks.begin(), single_track.front());
409 } else { // Default track names
410 tracks = new_audio_track (1, 1, Normal, 0, how_many, string());
413 if (tracks.size() != how_many) {
415 throw failed_constructor ();
423 BootMessage (_("Session loading complete"));
435 Session::ensure_engine (uint32_t desired_sample_rate)
437 if (_engine.current_backend() == 0) {
438 /* backend is unknown ... */
439 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
440 if (r.get_value_or (-1) != 0) {
443 } else if (_engine.setup_required()) {
444 /* backend is known, but setup is needed */
445 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
446 if (r.get_value_or (-1) != 0) {
449 } else if (!_engine.running()) {
450 if (_engine.start()) {
455 /* at this point the engine should be running
458 if (!_engine.running()) {
462 return immediately_post_engine ();
467 Session::immediately_post_engine ()
469 /* Do various initializations that should take place directly after we
470 * know that the engine is running, but before we either create a
471 * session or set state for an existing one.
474 if (how_many_dsp_threads () > 1) {
475 /* For now, only create the graph if we are using >1 DSP threads, as
476 it is a bit slower than the old code with 1 thread.
478 _process_graph.reset (new Graph (*this));
481 /* every time we reconnect, recompute worst case output latencies */
483 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
485 if (synced_to_engine()) {
486 _engine.transport_stop ();
489 if (config.get_jack_time_master()) {
490 _engine.transport_locate (_transport_frame);
494 BootMessage (_("Set up LTC"));
496 BootMessage (_("Set up Click"));
498 BootMessage (_("Set up standard connections"));
502 catch (failed_constructor& err) {
506 /* TODO, connect in different thread. (PortRegisteredOrUnregistered may be in RT context)
508 _engine.PortRegisteredOrUnregistered.connect_same_thread (*this, boost::bind (&Session::setup_bundles, this));
516 vector<void*> debug_pointers;
518 /* if we got to here, leaving pending capture state around
522 remove_pending_capture_state ();
524 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
526 /* disconnect from any and all signals that we are connected to */
530 _engine.remove_session ();
532 #ifdef USE_TRACKS_CODE_FEATURES
533 EngineStateController::instance()->remove_session();
536 /* deregister all ports - there will be no process or any other
537 * callbacks from the engine any more.
540 Port::PortDrop (); /* EMIT SIGNAL */
544 /* clear history so that no references to objects are held any more */
548 /* clear state tree so that no references to objects are held any more */
553 /* reset dynamic state version back to default */
555 Stateful::loading_state_version = 0;
557 _butler->drop_references ();
561 delete _all_route_group;
563 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
564 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
568 if (click_data != default_click) {
569 delete [] click_data;
572 if (click_emphasis_data != default_click_emphasis) {
573 delete [] click_emphasis_data;
578 /* need to remove auditioner before monitoring section
579 * otherwise it is re-connected */
582 /* drop references to routes held by the monitoring section
583 * specifically _monitor_out aux/listen references */
584 remove_monitor_section();
586 /* clear out any pending dead wood from RCU managed objects */
591 AudioDiskstream::free_working_buffers();
593 /* tell everyone who is still standing that we're about to die */
596 /* tell everyone to drop references and delete objects as we go */
598 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
599 RegionFactory::delete_all_regions ();
601 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
603 /* reset these three references to special routes before we do the usual route delete thing */
605 _master_out.reset ();
606 _monitor_out.reset ();
609 RCUWriter<RouteList> writer (routes);
610 boost::shared_ptr<RouteList> r = writer.get_copy ();
612 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
613 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
614 (*i)->drop_references ();
618 /* writer goes out of scope and updates master */
623 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
624 Glib::Threads::Mutex::Lock lm (source_lock);
625 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
626 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
627 i->second->drop_references ();
633 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
636 emit_thread_terminate ();
638 pthread_cond_destroy (&_rt_emit_cond);
639 pthread_mutex_destroy (&_rt_emit_mutex);
641 delete _scene_changer; _scene_changer = 0;
642 delete midi_control_ui; midi_control_ui = 0;
644 delete _mmc; _mmc = 0;
645 delete _midi_ports; _midi_ports = 0;
646 delete _locations; _locations = 0;
650 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
652 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
653 boost_debug_list_ptrs ();
658 Session::setup_ltc ()
662 _ltc_input.reset (new IO (*this, X_("LTC In"), IO::Input));
663 _ltc_output.reset (new IO (*this, X_("LTC Out"), IO::Output));
665 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC In"))) != 0) {
666 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
669 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
670 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
672 reconnect_ltc_input ();
675 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC Out"))) != 0) {
676 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
679 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
680 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
682 reconnect_ltc_output ();
685 /* fix up names of LTC ports because we don't want the normal
686 * IO style of NAME/TYPE-{in,out}N
689 _ltc_input->nth (0)->set_name (X_("LTC-in"));
690 _ltc_output->nth (0)->set_name (X_("LTC-out"));
694 Session::setup_click ()
697 _click_io.reset (new ClickIO (*this, X_("Click")));
698 _click_gain.reset (new Amp (*this));
699 _click_gain->activate ();
701 setup_click_state (state_tree->root());
703 setup_click_state (0);
708 Session::setup_click_state (const XMLNode* node)
710 const XMLNode* child = 0;
712 if (node && (child = find_named_node (*node, "Click")) != 0) {
714 /* existing state for Click */
717 if (Stateful::loading_state_version < 3000) {
718 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
720 const XMLNodeList& children (child->children());
721 XMLNodeList::const_iterator i = children.begin();
722 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
724 if (i != children.end()) {
725 c = _click_gain->set_state (**i, Stateful::loading_state_version);
731 _clicking = Config->get_clicking ();
735 error << _("could not setup Click I/O") << endmsg;
742 /* default state for Click: dual-mono to first 2 physical outputs */
745 _engine.get_physical_outputs (DataType::AUDIO, outs);
747 for (uint32_t physport = 0; physport < 2; ++physport) {
748 if (outs.size() > physport) {
749 if (_click_io->add_port (outs[physport], this)) {
750 // relax, even though its an error
755 if (_click_io->n_ports () > ChanCount::ZERO) {
756 _clicking = Config->get_clicking ();
762 Session::setup_bundles ()
766 RCUWriter<BundleList> writer (_bundles);
767 boost::shared_ptr<BundleList> b = writer.get_copy ();
768 for (BundleList::iterator i = b->begin(); i != b->end();) {
769 if (boost::dynamic_pointer_cast<UserBundle>(*i)) {
777 vector<string> inputs[DataType::num_types];
778 vector<string> outputs[DataType::num_types];
779 for (uint32_t i = 0; i < DataType::num_types; ++i) {
780 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
781 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
784 /* Create a set of Bundle objects that map
785 to the physical I/O currently available. We create both
786 mono and stereo bundles, so that the common cases of mono
787 and stereo tracks get bundles to put in their mixer strip
788 in / out menus. There may be a nicer way of achieving that;
789 it doesn't really scale that well to higher channel counts
792 /* mono output bundles */
794 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
796 std::string pn = _engine.get_pretty_name_by_name (outputs[DataType::AUDIO][np]);
798 snprintf (buf, sizeof (buf), _("out %s"), pn.substr(0,12).c_str());
800 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
803 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
804 c->add_channel (_("mono"), DataType::AUDIO);
805 c->set_port (0, outputs[DataType::AUDIO][np]);
807 add_bundle (c, false);
810 /* stereo output bundles */
812 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
813 if (np + 1 < outputs[DataType::AUDIO].size()) {
815 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
816 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
817 c->add_channel (_("L"), DataType::AUDIO);
818 c->set_port (0, outputs[DataType::AUDIO][np]);
819 c->add_channel (_("R"), DataType::AUDIO);
820 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
822 add_bundle (c, false);
826 /* mono input bundles */
828 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
830 std::string pn = _engine.get_pretty_name_by_name (inputs[DataType::AUDIO][np]);
832 snprintf (buf, sizeof (buf), _("in %s"), pn.substr(0,12).c_str());
834 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
837 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
838 c->add_channel (_("mono"), DataType::AUDIO);
839 c->set_port (0, inputs[DataType::AUDIO][np]);
841 add_bundle (c, false);
844 /* stereo input bundles */
846 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
847 if (np + 1 < inputs[DataType::AUDIO].size()) {
849 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
851 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
852 c->add_channel (_("L"), DataType::AUDIO);
853 c->set_port (0, inputs[DataType::AUDIO][np]);
854 c->add_channel (_("R"), DataType::AUDIO);
855 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
857 add_bundle (c, false);
861 /* MIDI input bundles */
863 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
864 string n = inputs[DataType::MIDI][np];
865 std::string pn = _engine.get_pretty_name_by_name (n);
869 boost::erase_first (n, X_("alsa_pcm:"));
871 boost::shared_ptr<Bundle> c (new Bundle (n, false));
872 c->add_channel ("", DataType::MIDI);
873 c->set_port (0, inputs[DataType::MIDI][np]);
874 add_bundle (c, false);
877 /* MIDI output bundles */
879 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
880 string n = outputs[DataType::MIDI][np];
881 std::string pn = _engine.get_pretty_name_by_name (n);
885 boost::erase_first (n, X_("alsa_pcm:"));
887 boost::shared_ptr<Bundle> c (new Bundle (n, true));
888 c->add_channel ("", DataType::MIDI);
889 c->set_port (0, outputs[DataType::MIDI][np]);
890 add_bundle (c, false);
893 // we trust the backend to only calls us if there's a change
894 BundleAddedOrRemoved (); /* EMIT SIGNAL */
898 Session::auto_connect_master_bus ()
900 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
904 // Waves Tracks: Do not connect master bas for Tracks if AutoConnectMaster option is not set
905 // In this case it means "Multi Out" output mode
906 if (ARDOUR::Profile->get_trx() && !(Config->get_output_auto_connect() & AutoConnectMaster) ) {
910 /* if requested auto-connect the outputs to the first N physical ports.
913 uint32_t limit = _master_out->n_outputs().n_total();
914 vector<string> outputs[DataType::num_types];
916 for (uint32_t i = 0; i < DataType::num_types; ++i) {
917 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
920 for (uint32_t n = 0; n < limit; ++n) {
921 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
923 if (outputs[p->type()].size() > n) {
924 connect_to = outputs[p->type()][n];
927 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
928 if (_master_out->output()->connect (p, connect_to, this)) {
929 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
938 Session::remove_monitor_section ()
940 if (!_monitor_out || Profile->get_trx()) {
944 /* force reversion to Solo-In-Place */
945 Config->set_solo_control_is_listen_control (false);
947 /* if we are auditioning, cancel it ... this is a workaround
948 to a problem (auditioning does not execute the process graph,
949 which is needed to remove routes when using >1 core for processing)
954 /* Hold process lock while doing this so that we don't hear bits and
955 * pieces of audio as we work on each route.
958 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
960 /* Connect tracks to monitor section. Note that in an
961 existing session, the internal sends will already exist, but we want the
962 routes to notice that they connect to the control out specifically.
966 boost::shared_ptr<RouteList> r = routes.reader ();
967 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
969 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
971 if ((*x)->is_monitor()) {
973 } else if ((*x)->is_master()) {
976 (*x)->remove_aux_or_listen (_monitor_out);
981 remove_route (_monitor_out);
982 auto_connect_master_bus ();
985 auditioner->connect ();
990 Session::add_monitor_section ()
994 if (_monitor_out || !_master_out || Profile->get_trx()) {
998 boost::shared_ptr<Route> r (new Route (*this, _("Monitor"), Route::MonitorOut, DataType::AUDIO));
1004 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1005 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
1008 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1009 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1010 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1014 add_routes (rl, false, false, false);
1016 assert (_monitor_out);
1018 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
1019 are undefined, at best.
1022 uint32_t limit = _monitor_out->n_inputs().n_audio();
1026 /* connect the inputs to the master bus outputs. this
1027 * represents a separate data feed from the internal sends from
1028 * each route. as of jan 2011, it allows the monitor section to
1029 * conditionally ignore either the internal sends or the normal
1030 * input feed, but we should really find a better way to do
1034 _master_out->output()->disconnect (this);
1036 for (uint32_t n = 0; n < limit; ++n) {
1037 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1038 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1041 string connect_to = o->name();
1042 if (_monitor_out->input()->connect (p, connect_to, this)) {
1043 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1051 /* if monitor section is not connected, connect it to physical outs
1054 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
1056 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1058 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1061 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1063 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1064 Config->get_monitor_bus_preferred_bundle())
1070 /* Monitor bus is audio only */
1072 vector<string> outputs[DataType::num_types];
1074 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1075 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1078 uint32_t mod = outputs[DataType::AUDIO].size();
1079 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1083 for (uint32_t n = 0; n < limit; ++n) {
1085 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1087 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1088 connect_to = outputs[DataType::AUDIO][n % mod];
1091 if (!connect_to.empty()) {
1092 if (_monitor_out->output()->connect (p, connect_to, this)) {
1093 error << string_compose (
1094 _("cannot connect control output %1 to %2"),
1105 /* Hold process lock while doing this so that we don't hear bits and
1106 * pieces of audio as we work on each route.
1109 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1111 /* Connect tracks to monitor section. Note that in an
1112 existing session, the internal sends will already exist, but we want the
1113 routes to notice that they connect to the control out specifically.
1117 boost::shared_ptr<RouteList> rls = routes.reader ();
1119 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1121 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1123 if ((*x)->is_monitor()) {
1125 } else if ((*x)->is_master()) {
1128 (*x)->enable_monitor_send ();
1133 auditioner->connect ();
1138 Session::reset_monitor_section ()
1140 /* Process lock should be held by the caller.*/
1142 if (!_monitor_out || Profile->get_trx()) {
1146 uint32_t limit = _master_out->n_outputs().n_audio();
1148 /* connect the inputs to the master bus outputs. this
1149 * represents a separate data feed from the internal sends from
1150 * each route. as of jan 2011, it allows the monitor section to
1151 * conditionally ignore either the internal sends or the normal
1152 * input feed, but we should really find a better way to do
1156 _master_out->output()->disconnect (this);
1157 _monitor_out->output()->disconnect (this);
1159 _monitor_out->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1160 _monitor_out->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1162 for (uint32_t n = 0; n < limit; ++n) {
1163 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1164 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1167 string connect_to = o->name();
1168 if (_monitor_out->input()->connect (p, connect_to, this)) {
1169 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1176 /* connect monitor section to physical outs
1179 if (Config->get_auto_connect_standard_busses()) {
1181 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1183 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1186 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1188 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1189 Config->get_monitor_bus_preferred_bundle())
1195 /* Monitor bus is audio only */
1197 vector<string> outputs[DataType::num_types];
1199 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1200 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1203 uint32_t mod = outputs[DataType::AUDIO].size();
1204 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1208 for (uint32_t n = 0; n < limit; ++n) {
1210 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1212 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1213 connect_to = outputs[DataType::AUDIO][n % mod];
1216 if (!connect_to.empty()) {
1217 if (_monitor_out->output()->connect (p, connect_to, this)) {
1218 error << string_compose (
1219 _("cannot connect control output %1 to %2"),
1230 /* Connect tracks to monitor section. Note that in an
1231 existing session, the internal sends will already exist, but we want the
1232 routes to notice that they connect to the control out specifically.
1236 boost::shared_ptr<RouteList> rls = routes.reader ();
1238 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1240 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1242 if ((*x)->is_monitor()) {
1244 } else if ((*x)->is_master()) {
1247 (*x)->enable_monitor_send ();
1253 Session::hookup_io ()
1255 /* stop graph reordering notifications from
1256 causing resorts, etc.
1259 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
1263 /* we delay creating the auditioner till now because
1264 it makes its own connections to ports.
1268 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
1270 throw failed_constructor ();
1272 a->use_new_diskstream ();
1276 catch (failed_constructor& err) {
1277 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
1281 /* load bundles, which we may have postponed earlier on */
1282 if (_bundle_xml_node) {
1283 load_bundles (*_bundle_xml_node);
1284 delete _bundle_xml_node;
1287 /* Tell all IO objects to connect themselves together */
1289 IO::enable_connecting ();
1291 /* Now tell all "floating" ports to connect to whatever
1292 they should be connected to.
1295 AudioEngine::instance()->reconnect_ports ();
1297 /* Anyone who cares about input state, wake up and do something */
1299 IOConnectionsComplete (); /* EMIT SIGNAL */
1301 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
1303 /* now handle the whole enchilada as if it was one
1304 graph reorder event.
1309 /* update the full solo state, which can't be
1310 correctly determined on a per-route basis, but
1311 needs the global overview that only the session
1315 update_route_solo_state ();
1319 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
1321 boost::shared_ptr<Track> track = wp.lock ();
1326 boost::shared_ptr<Playlist> playlist;
1328 if ((playlist = track->playlist()) != 0) {
1329 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
1330 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
1331 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
1336 Session::record_enabling_legal () const
1338 /* this used to be in here, but survey says.... we don't need to restrict it */
1339 // if (record_status() == Recording) {
1343 if (Config->get_all_safe()) {
1350 Session::set_track_monitor_input_status (bool yn)
1352 boost::shared_ptr<RouteList> rl = routes.reader ();
1353 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1354 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1355 if (tr && tr->record_enabled ()) {
1356 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1357 tr->request_input_monitoring (yn);
1363 Session::auto_punch_start_changed (Location* location)
1365 replace_event (SessionEvent::PunchIn, location->start());
1367 if (get_record_enabled() && config.get_punch_in()) {
1368 /* capture start has been changed, so save new pending state */
1369 save_state ("", true);
1374 Session::auto_punch_end_changed (Location* location)
1376 framepos_t when_to_stop = location->end();
1377 // when_to_stop += _worst_output_latency + _worst_input_latency;
1378 replace_event (SessionEvent::PunchOut, when_to_stop);
1382 Session::auto_punch_changed (Location* location)
1384 framepos_t when_to_stop = location->end();
1386 replace_event (SessionEvent::PunchIn, location->start());
1387 //when_to_stop += _worst_output_latency + _worst_input_latency;
1388 replace_event (SessionEvent::PunchOut, when_to_stop);
1391 /** @param loc A loop location.
1392 * @param pos Filled in with the start time of the required fade-out (in session frames).
1393 * @param length Filled in with the length of the required fade-out.
1396 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
1398 pos = max (loc->start(), loc->end() - 64);
1399 length = loc->end() - pos;
1403 Session::auto_loop_changed (Location* location)
1405 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1408 auto_loop_declick_range (location, dcp, dcl);
1410 if (transport_rolling() && play_loop) {
1412 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1414 // if (_transport_frame > location->end()) {
1416 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1417 // relocate to beginning of loop
1418 clear_events (SessionEvent::LocateRoll);
1420 request_locate (location->start(), true);
1423 else if (Config->get_seamless_loop() && !loop_changing) {
1425 // schedule a locate-roll to refill the diskstreams at the
1426 // previous loop end
1427 loop_changing = true;
1429 if (location->end() > last_loopend) {
1430 clear_events (SessionEvent::LocateRoll);
1431 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1437 clear_events (SessionEvent::AutoLoopDeclick);
1438 clear_events (SessionEvent::AutoLoop);
1441 last_loopend = location->end();
1446 Session::set_auto_punch_location (Location* location)
1450 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1451 punch_connections.drop_connections();
1452 existing->set_auto_punch (false, this);
1453 remove_event (existing->start(), SessionEvent::PunchIn);
1454 clear_events (SessionEvent::PunchOut);
1455 auto_punch_location_changed (0);
1460 if (location == 0) {
1464 if (location->end() <= location->start()) {
1465 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1469 punch_connections.drop_connections ();
1471 location->StartChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, location));
1472 location->EndChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, location));
1473 location->Changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, location));
1475 location->set_auto_punch (true, this);
1477 auto_punch_changed (location);
1479 auto_punch_location_changed (location);
1483 Session::set_session_extents (framepos_t start, framepos_t end)
1486 if ((existing = _locations->session_range_location()) == 0) {
1487 //if there is no existing session, we need to make a new session location (should never happen)
1488 existing = new Location (*this, 0, 0, _("session"), Location::IsSessionRange);
1492 error << _("Session: you can't use that location for session start/end)") << endmsg;
1496 existing->set( start, end );
1502 Session::set_auto_loop_location (Location* location)
1506 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1507 loop_connections.drop_connections ();
1508 existing->set_auto_loop (false, this);
1509 remove_event (existing->end(), SessionEvent::AutoLoop);
1512 auto_loop_declick_range (existing, dcp, dcl);
1513 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1514 auto_loop_location_changed (0);
1519 if (location == 0) {
1523 if (location->end() <= location->start()) {
1524 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1528 last_loopend = location->end();
1530 loop_connections.drop_connections ();
1532 location->StartChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1533 location->EndChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1534 location->Changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1536 location->set_auto_loop (true, this);
1538 /* take care of our stuff first */
1540 auto_loop_changed (location);
1542 /* now tell everyone else */
1544 auto_loop_location_changed (location);
1548 Session::update_loop (Location*)
1554 Session::update_marks (Location*)
1560 Session::update_skips (Location* loc, bool consolidate)
1562 if (_ignore_skips_updates) {
1566 Locations::LocationList skips;
1569 PBD::Unwinder<bool> uw (_ignore_skips_updates, true);
1570 consolidate_skips (loc);
1573 sync_locations_to_skips ();
1579 Session::consolidate_skips (Location* loc)
1581 Locations::LocationList all_locations = _locations->list ();
1583 for (Locations::LocationList::iterator l = all_locations.begin(); l != all_locations.end(); ) {
1585 if (!(*l)->is_skip ()) {
1590 /* don't test against self */
1597 switch (Evoral::coverage ((*l)->start(), (*l)->end(), loc->start(), loc->end())) {
1598 case Evoral::OverlapInternal:
1599 case Evoral::OverlapExternal:
1600 case Evoral::OverlapStart:
1601 case Evoral::OverlapEnd:
1602 /* adjust new location to cover existing one */
1603 loc->set_start (min (loc->start(), (*l)->start()));
1604 loc->set_end (max (loc->end(), (*l)->end()));
1605 /* we don't need this one any more */
1606 _locations->remove (*l);
1607 /* the location has been deleted, so remove reference to it in our local list */
1608 l = all_locations.erase (l);
1611 case Evoral::OverlapNone:
1619 Session::sync_locations_to_skips ()
1621 /* This happens asynchronously (in the audioengine thread). After the clear is done, we will call
1622 * Session::_sync_locations_to_skips() from the audioengine thread.
1624 clear_events (SessionEvent::Skip, boost::bind (&Session::_sync_locations_to_skips, this));
1628 Session::_sync_locations_to_skips ()
1630 /* called as a callback after existing Skip events have been cleared from a realtime audioengine thread */
1632 Locations::LocationList const & locs (_locations->list());
1634 for (Locations::LocationList::const_iterator i = locs.begin(); i != locs.end(); ++i) {
1636 Location* location = *i;
1638 if (location->is_skip() && location->is_skipping()) {
1639 SessionEvent* ev = new SessionEvent (SessionEvent::Skip, SessionEvent::Add, location->start(), location->end(), 1.0);
1647 Session::location_added (Location *location)
1649 if (location->is_auto_punch()) {
1650 set_auto_punch_location (location);
1653 if (location->is_auto_loop()) {
1654 set_auto_loop_location (location);
1657 if (location->is_session_range()) {
1658 /* no need for any signal handling or event setting with the session range,
1659 because we keep a direct reference to it and use its start/end directly.
1661 _session_range_location = location;
1664 if (location->is_mark()) {
1665 /* listen for per-location signals that require us to do any * global updates for marks */
1667 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1668 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1669 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1670 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1673 if (location->is_skip()) {
1674 /* listen for per-location signals that require us to update skip-locate events */
1676 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1677 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1678 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1679 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, false));
1681 update_skips (location, true);
1688 Session::location_removed (Location *location)
1690 if (location->is_auto_loop()) {
1691 set_auto_loop_location (0);
1692 set_track_loop (false);
1695 if (location->is_auto_punch()) {
1696 set_auto_punch_location (0);
1699 if (location->is_session_range()) {
1700 /* this is never supposed to happen */
1701 error << _("programming error: session range removed!") << endl;
1704 if (location->is_skip()) {
1706 update_skips (location, false);
1713 Session::locations_changed ()
1715 _locations->apply (*this, &Session::_locations_changed);
1719 Session::_locations_changed (const Locations::LocationList& locations)
1721 /* There was some mass-change in the Locations object.
1723 We might be re-adding a location here but it doesn't actually matter
1724 for all the locations that the Session takes an interest in.
1727 for (Locations::LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
1728 location_added (*i);
1733 Session::enable_record ()
1735 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1736 /* no recording at anything except normal speed */
1741 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1743 if (rs == Recording) {
1747 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1749 _last_record_location = _transport_frame;
1750 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1752 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1753 set_track_monitor_input_status (true);
1756 RecordStateChanged ();
1763 Session::disable_record (bool rt_context, bool force)
1767 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1769 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1770 g_atomic_int_set (&_record_status, Disabled);
1771 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1773 if (rs == Recording) {
1774 g_atomic_int_set (&_record_status, Enabled);
1778 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1779 set_track_monitor_input_status (false);
1782 RecordStateChanged (); /* emit signal */
1785 remove_pending_capture_state ();
1791 Session::step_back_from_record ()
1793 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1795 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1796 set_track_monitor_input_status (false);
1799 RecordStateChanged (); /* emit signal */
1804 Session::maybe_enable_record ()
1806 if (_step_editors > 0) {
1810 g_atomic_int_set (&_record_status, Enabled);
1812 /* This function is currently called from somewhere other than an RT thread.
1813 This save_state() call therefore doesn't impact anything. Doing it here
1814 means that we save pending state of which sources the next record will use,
1815 which gives us some chance of recovering from a crash during the record.
1818 save_state ("", true);
1820 if (_transport_speed) {
1821 if (!config.get_punch_in()) {
1825 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1826 RecordStateChanged (); /* EMIT SIGNAL */
1833 Session::audible_frame () const
1839 offset = worst_playback_latency ();
1841 if (synced_to_engine()) {
1842 /* Note: this is basically just sync-to-JACK */
1843 tf = _engine.transport_frame();
1845 tf = _transport_frame;
1850 if (!non_realtime_work_pending()) {
1854 /* Check to see if we have passed the first guaranteed
1855 audible frame past our last start position. if not,
1856 return that last start point because in terms
1857 of audible frames, we have not moved yet.
1859 `Start position' in this context means the time we last
1860 either started, located, or changed transport direction.
1863 if (_transport_speed > 0.0f) {
1865 if (!play_loop || !have_looped) {
1866 if (tf < _last_roll_or_reversal_location + offset) {
1867 return _last_roll_or_reversal_location;
1875 } else if (_transport_speed < 0.0f) {
1877 /* XXX wot? no backward looping? */
1879 if (tf > _last_roll_or_reversal_location - offset) {
1880 return _last_roll_or_reversal_location;
1892 Session::set_frame_rate (framecnt_t frames_per_second)
1894 /** \fn void Session::set_frame_size(framecnt_t)
1895 the AudioEngine object that calls this guarantees
1896 that it will not be called while we are also in
1897 ::process(). Its fine to do things that block
1901 _base_frame_rate = frames_per_second;
1902 _nominal_frame_rate = frames_per_second;
1908 // XXX we need some equivalent to this, somehow
1909 // SndFileSource::setup_standard_crossfades (frames_per_second);
1913 /* XXX need to reset/reinstantiate all LADSPA plugins */
1917 Session::set_block_size (pframes_t nframes)
1919 /* the AudioEngine guarantees
1920 that it will not be called while we are also in
1921 ::process(). It is therefore fine to do things that block
1926 current_block_size = nframes;
1930 boost::shared_ptr<RouteList> r = routes.reader ();
1932 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1933 (*i)->set_block_size (nframes);
1936 boost::shared_ptr<RouteList> rl = routes.reader ();
1937 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1938 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1940 tr->set_block_size (nframes);
1944 set_worst_io_latencies ();
1950 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1952 boost::shared_ptr<Route> r2;
1954 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1955 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1959 /* make a copy of the existing list of routes that feed r1 */
1961 Route::FedBy existing (r1->fed_by());
1963 /* for each route that feeds r1, recurse, marking it as feeding
1967 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1968 if (!(r2 = i->r.lock ())) {
1969 /* (*i) went away, ignore it */
1973 /* r2 is a route that feeds r1 which somehow feeds base. mark
1974 base as being fed by r2
1977 rbase->add_fed_by (r2, i->sends_only);
1981 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1985 if (r1->feeds (r2) && r2->feeds (r1)) {
1989 /* now recurse, so that we can mark base as being fed by
1990 all routes that feed r2
1993 trace_terminal (r2, rbase);
2000 Session::resort_routes ()
2002 /* don't do anything here with signals emitted
2003 by Routes during initial setup or while we
2004 are being destroyed.
2007 if (_state_of_the_state & (InitialConnecting | Deletion)) {
2012 RCUWriter<RouteList> writer (routes);
2013 boost::shared_ptr<RouteList> r = writer.get_copy ();
2014 resort_routes_using (r);
2015 /* writer goes out of scope and forces update */
2019 boost::shared_ptr<RouteList> rl = routes.reader ();
2020 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2021 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
2023 const Route::FedBy& fb ((*i)->fed_by());
2025 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
2026 boost::shared_ptr<Route> sf = f->r.lock();
2028 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
2036 /** This is called whenever we need to rebuild the graph of how we will process
2038 * @param r List of routes, in any order.
2042 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
2044 /* We are going to build a directed graph of our routes;
2045 this is where the edges of that graph are put.
2050 /* Go through all routes doing two things:
2052 * 1. Collect the edges of the route graph. Each of these edges
2053 * is a pair of routes, one of which directly feeds the other
2054 * either by a JACK connection or by an internal send.
2056 * 2. Begin the process of making routes aware of which other
2057 * routes directly or indirectly feed them. This information
2058 * is used by the solo code.
2061 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2063 /* Clear out the route's list of direct or indirect feeds */
2064 (*i)->clear_fed_by ();
2066 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
2068 bool via_sends_only;
2070 /* See if this *j feeds *i according to the current state of the JACK
2071 connections and internal sends.
2073 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
2074 /* add the edge to the graph (part #1) */
2075 edges.add (*j, *i, via_sends_only);
2076 /* tell the route (for part #2) */
2077 (*i)->add_fed_by (*j, via_sends_only);
2082 /* Attempt a topological sort of the route graph */
2083 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
2085 if (sorted_routes) {
2086 /* We got a satisfactory topological sort, so there is no feedback;
2089 Note: the process graph rechain does not require a
2090 topologically-sorted list, but hey ho.
2092 if (_process_graph) {
2093 _process_graph->rechain (sorted_routes, edges);
2096 _current_route_graph = edges;
2098 /* Complete the building of the routes' lists of what directly
2099 or indirectly feeds them.
2101 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2102 trace_terminal (*i, *i);
2105 *r = *sorted_routes;
2108 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
2109 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2110 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
2111 (*i)->name(), (*i)->order_key ()));
2115 SuccessfulGraphSort (); /* EMIT SIGNAL */
2118 /* The topological sort failed, so we have a problem. Tell everyone
2119 and stick to the old graph; this will continue to be processed, so
2120 until the feedback is fixed, what is played back will not quite
2121 reflect what is actually connected. Note also that we do not
2122 do trace_terminal here, as it would fail due to an endless recursion,
2123 so the solo code will think that everything is still connected
2127 FeedbackDetected (); /* EMIT SIGNAL */
2132 /** Find a route name starting with \a base, maybe followed by the
2133 * lowest \a id. \a id will always be added if \a definitely_add_number
2134 * is true on entry; otherwise it will only be added if required
2135 * to make the name unique.
2137 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
2138 * The available route name with the lowest ID will be used, and \a id
2139 * will be set to the ID.
2141 * \return false if a route name could not be found, and \a track_name
2142 * and \a id do not reflect a free route name.
2145 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
2147 if (!definitely_add_number && route_by_name (base) == 0) {
2148 /* juse use the base */
2149 snprintf (name, name_len, "%s", base.c_str());
2154 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
2156 if (route_by_name (name) == 0) {
2162 } while (id < (UINT_MAX-1));
2167 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
2169 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
2171 in = ChanCount::ZERO;
2172 out = ChanCount::ZERO;
2174 boost::shared_ptr<RouteList> r = routes.reader ();
2176 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2177 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2178 if (tr && !tr->is_auditioner()) {
2179 in += tr->n_inputs();
2180 out += tr->n_outputs();
2185 /** Caller must not hold process lock
2186 * @param name_template string to use for the start of the name, or "" to use "MIDI".
2187 * @param instrument plugin info for the instrument to insert pre-fader, if any
2189 list<boost::shared_ptr<MidiTrack> >
2190 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
2191 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
2193 char track_name[32];
2194 uint32_t track_id = 0;
2196 RouteList new_routes;
2197 list<boost::shared_ptr<MidiTrack> > ret;
2199 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
2202 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
2203 error << "cannot find name for new midi track" << endmsg;
2207 boost::shared_ptr<MidiTrack> track;
2210 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
2212 if (track->init ()) {
2216 track->use_new_diskstream();
2218 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2219 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2222 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2223 if (track->input()->ensure_io (input, false, this)) {
2224 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
2228 if (track->output()->ensure_io (output, false, this)) {
2229 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
2234 track->non_realtime_input_change();
2237 route_group->add (track);
2240 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2242 if (Config->get_remote_model() == UserOrdered) {
2243 track->set_remote_control_id (next_control_id());
2246 new_routes.push_back (track);
2247 ret.push_back (track);
2249 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2252 catch (failed_constructor &err) {
2253 error << _("Session: could not create new midi track.") << endmsg;
2257 catch (AudioEngine::PortRegistrationFailure& pfe) {
2259 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;
2267 if (!new_routes.empty()) {
2268 StateProtector sp (this);
2269 if (Profile->get_trx()) {
2270 add_routes (new_routes, false, false, false);
2272 add_routes (new_routes, true, true, false);
2276 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
2277 PluginPtr plugin = instrument->load (*this);
2278 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2279 (*r)->add_processor (p, PreFader);
2289 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2291 boost::shared_ptr<Route> midi_track (wmt.lock());
2297 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2299 if (change.after.n_audio() <= change.before.n_audio()) {
2303 /* new audio ports: make sure the audio goes somewhere useful,
2304 unless the user has no-auto-connect selected.
2306 The existing ChanCounts don't matter for this call as they are only
2307 to do with matching input and output indices, and we are only changing
2313 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
2317 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
2318 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
2319 * @param output_start As \a input_start, but for outputs.
2322 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
2323 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
2325 if (!IO::connecting_legal) {
2329 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2335 /* If both inputs and outputs are auto-connected to physical ports,
2336 use the max of input and output offsets to ensure auto-connected
2337 port numbers always match up (e.g. the first audio input and the
2338 first audio output of the route will have the same physical
2339 port number). Otherwise just use the lowest input or output
2343 DEBUG_TRACE (DEBUG::Graph,
2344 string_compose("Auto-connect: existing in = %1 out = %2\n",
2345 existing_inputs, existing_outputs));
2347 const bool in_out_physical =
2348 (Config->get_input_auto_connect() & AutoConnectPhysical)
2349 && (Config->get_output_auto_connect() & AutoConnectPhysical)
2352 const ChanCount in_offset = in_out_physical
2353 ? ChanCount::max(existing_inputs, existing_outputs)
2356 const ChanCount out_offset = in_out_physical
2357 ? ChanCount::max(existing_inputs, existing_outputs)
2360 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2361 vector<string> physinputs;
2362 vector<string> physoutputs;
2364 _engine.get_physical_outputs (*t, physoutputs);
2365 _engine.get_physical_inputs (*t, physinputs);
2367 if (!physinputs.empty() && connect_inputs) {
2368 uint32_t nphysical_in = physinputs.size();
2370 DEBUG_TRACE (DEBUG::Graph,
2371 string_compose("There are %1 physical inputs of type %2\n",
2374 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
2377 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
2378 DEBUG_TRACE (DEBUG::Graph,
2379 string_compose("Get index %1 + %2 % %3 = %4\n",
2380 in_offset.get(*t), i, nphysical_in,
2381 (in_offset.get(*t) + i) % nphysical_in));
2382 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
2385 DEBUG_TRACE (DEBUG::Graph,
2386 string_compose("Connect route %1 IN to %2\n",
2387 route->name(), port));
2389 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
2393 ChanCount one_added (*t, 1);
2394 existing_inputs += one_added;
2398 if (!physoutputs.empty()) {
2399 uint32_t nphysical_out = physoutputs.size();
2400 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
2404 * do not create new connections if we reached the limit of physical outputs
2408 if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
2409 ARDOUR::Profile->get_trx () &&
2410 existing_outputs.get(*t) == nphysical_out ) {
2414 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
2415 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
2416 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
2417 /* master bus is audio only */
2418 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
2419 port = _master_out->input()->ports().port(*t,
2420 i % _master_out->input()->n_ports().get(*t))->name();
2424 DEBUG_TRACE (DEBUG::Graph,
2425 string_compose("Connect route %1 OUT to %2\n",
2426 route->name(), port));
2428 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
2432 ChanCount one_added (*t, 1);
2433 existing_outputs += one_added;
2439 #ifdef USE_TRACKS_CODE_FEATURES
2442 compare_routes_by_remote_id (const boost::shared_ptr<Route>& route1, const boost::shared_ptr<Route>& route2)
2444 return route1->remote_control_id() < route2->remote_control_id();
2448 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2450 // it is not allowed to perform connection
2451 if (!IO::connecting_legal) {
2455 // if we are deleting routes we will call this once at the end
2456 if (_route_deletion_in_progress) {
2460 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2466 // We need to disconnect the route's inputs and outputs first
2467 // basing on autoconnect configuration
2468 bool reconnectIputs = !(Config->get_input_auto_connect() & ManualConnect) && reconnect_inputs;
2469 bool reconnectOutputs = !(Config->get_output_auto_connect() & ManualConnect) && reconnect_outputs;
2471 ChanCount existing_inputs;
2472 ChanCount existing_outputs;
2473 count_existing_track_channels (existing_inputs, existing_outputs);
2475 //ChanCount inputs = ChanCount::ZERO;
2476 //ChanCount outputs = ChanCount::ZERO;
2478 RouteList existing_routes = *routes.reader ();
2479 existing_routes.sort (compare_routes_by_remote_id);
2482 PBD::Unwinder<bool> protect_ignore_changes (_reconnecting_routes_in_progress, true);
2484 vector<string> physinputs;
2485 vector<string> physoutputs;
2487 EngineStateController::instance()->get_physical_audio_outputs(physoutputs);
2488 EngineStateController::instance()->get_physical_audio_inputs(physinputs);
2490 uint32_t input_n = 0;
2491 uint32_t output_n = 0;
2492 RouteList::iterator rIter = existing_routes.begin();
2493 const AutoConnectOption current_input_auto_connection (Config->get_input_auto_connect());
2494 const AutoConnectOption current_output_auto_connection (Config->get_output_auto_connect());
2495 for (; rIter != existing_routes.end(); ++rIter) {
2496 if (*rIter == _master_out || *rIter == _monitor_out ) {
2500 if (current_output_auto_connection == AutoConnectPhysical) {
2501 (*rIter)->amp()->deactivate();
2502 } else if (current_output_auto_connection == AutoConnectMaster) {
2503 (*rIter)->amp()->activate();
2506 if (reconnectIputs) {
2507 (*rIter)->input()->disconnect (this); //GZ: check this; could be heavy
2509 for (uint32_t route_input_n = 0; route_input_n < (*rIter)->n_inputs().get(DataType::AUDIO); ++route_input_n) {
2511 if (current_input_auto_connection & AutoConnectPhysical) {
2513 if ( input_n == physinputs.size() ) {
2517 string port = physinputs[input_n];
2519 if (port.empty() ) {
2520 error << "Physical Input number "<< input_n << " is unavailable and cannot be connected" << endmsg;
2523 //GZ: check this; could be heavy
2524 (*rIter)->input()->connect ((*rIter)->input()->ports().port(DataType::AUDIO, route_input_n), port, this);
2530 if (reconnectOutputs) {
2532 //normalize route ouptuts: reduce the amount outputs to be equal to the amount of inputs
2533 if (current_output_auto_connection & AutoConnectPhysical) {
2535 //GZ: check this; could be heavy
2536 (*rIter)->output()->disconnect (this);
2537 size_t route_inputs_count = (*rIter)->n_inputs().get(DataType::AUDIO);
2539 //GZ: check this; could be heavy
2540 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, route_inputs_count), false, this );
2542 } else if (current_output_auto_connection & AutoConnectMaster){
2544 if (!reconnect_master) {
2548 //GZ: check this; could be heavy
2549 (*rIter)->output()->disconnect (this);
2552 uint32_t master_inputs_count = _master_out->n_inputs().get(DataType::AUDIO);
2553 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, master_inputs_count), false, this );
2555 error << error << "Master bus is not available" << endmsg;
2560 for (uint32_t route_output_n = 0; route_output_n < (*rIter)->n_outputs().get(DataType::AUDIO); ++route_output_n) {
2561 if (current_output_auto_connection & AutoConnectPhysical) {
2563 if ( output_n == physoutputs.size() ) {
2567 string port = physoutputs[output_n];
2569 if (port.empty() ) {
2570 error << "Physical Output number "<< output_n << " is unavailable and cannot be connected" << endmsg;
2573 //GZ: check this; could be heavy
2574 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2577 } else if (current_output_auto_connection & AutoConnectMaster) {
2579 if ( route_output_n == _master_out->n_inputs().get(DataType::AUDIO) ) {
2583 // connect to master bus
2584 string port = _master_out->input()->ports().port(DataType::AUDIO, route_output_n)->name();
2586 if (port.empty() ) {
2587 error << "MasterBus Input number "<< route_output_n << " is unavailable and cannot be connected" << endmsg;
2591 //GZ: check this; could be heavy
2592 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2598 //auto_connect_route (*rIter, inputs, outputs, false, reconnectIputs);
2601 _master_out->output()->disconnect (this);
2602 auto_connect_master_bus ();
2607 session_routes_reconnected (); /* EMIT SIGNAL */
2611 Session::reconnect_midi_scene_ports(bool inputs)
2615 boost::shared_ptr<MidiPort> scene_in_ptr = scene_in();
2617 scene_in_ptr->disconnect_all ();
2619 std::vector<EngineStateController::MidiPortState> midi_port_states;
2620 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2622 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2624 for (; state_iter != midi_port_states.end(); ++state_iter) {
2625 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2626 scene_in_ptr->connect (state_iter->name);
2633 boost::shared_ptr<MidiPort> scene_out_ptr = scene_out();
2635 if (scene_out_ptr ) {
2636 scene_out_ptr->disconnect_all ();
2638 std::vector<EngineStateController::MidiPortState> midi_port_states;
2639 EngineStateController::instance()->get_physical_midi_output_states (midi_port_states);
2641 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2643 for (; state_iter != midi_port_states.end(); ++state_iter) {
2644 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2645 scene_out_ptr->connect (state_iter->name);
2654 /** Caller must not hold process lock
2655 * @param name_template string to use for the start of the name, or "" to use "Audio".
2657 list< boost::shared_ptr<AudioTrack> >
2658 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
2659 uint32_t how_many, string name_template)
2661 char track_name[32];
2662 uint32_t track_id = 0;
2664 RouteList new_routes;
2665 list<boost::shared_ptr<AudioTrack> > ret;
2667 string name_pattern;
2669 if (Profile->get_trx() ) {
2670 name_pattern = "Track ";
2672 name_pattern = "Audio ";
2675 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _(name_pattern.c_str() );
2679 if (!find_route_name (name_template.empty() ? _(name_pattern.c_str()) : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
2680 error << "cannot find name for new audio track" << endmsg;
2684 boost::shared_ptr<AudioTrack> track;
2687 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
2689 if (track->init ()) {
2693 track->use_new_diskstream();
2695 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2696 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2699 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2701 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2702 error << string_compose (
2703 _("cannot configure %1 in/%2 out configuration for new audio track"),
2704 input_channels, output_channels)
2709 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2710 error << string_compose (
2711 _("cannot configure %1 in/%2 out configuration for new audio track"),
2712 input_channels, output_channels)
2719 route_group->add (track);
2722 track->non_realtime_input_change();
2724 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2725 if (Config->get_remote_model() == UserOrdered) {
2726 track->set_remote_control_id (next_control_id());
2729 new_routes.push_back (track);
2730 ret.push_back (track);
2732 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2735 catch (failed_constructor &err) {
2736 error << _("Session: could not create new audio track.") << endmsg;
2740 catch (AudioEngine::PortRegistrationFailure& pfe) {
2742 error << pfe.what() << endmsg;
2750 if (!new_routes.empty()) {
2751 StateProtector sp (this);
2752 if (Profile->get_trx()) {
2753 add_routes (new_routes, false, false, false);
2755 add_routes (new_routes, true, true, false);
2762 /** Caller must not hold process lock.
2763 * @param name_template string to use for the start of the name, or "" to use "Bus".
2766 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
2769 uint32_t bus_id = 0;
2773 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
2776 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
2777 error << "cannot find name for new audio bus" << endmsg;
2782 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
2788 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2789 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
2792 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2794 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2795 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2796 input_channels, output_channels)
2802 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2803 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2804 input_channels, output_channels)
2811 route_group->add (bus);
2813 if (Config->get_remote_model() == UserOrdered) {
2814 bus->set_remote_control_id (next_control_id());
2817 bus->add_internal_return ();
2819 ret.push_back (bus);
2821 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2827 catch (failed_constructor &err) {
2828 error << _("Session: could not create new audio route.") << endmsg;
2832 catch (AudioEngine::PortRegistrationFailure& pfe) {
2833 error << pfe.what() << endmsg;
2843 StateProtector sp (this);
2844 if (Profile->get_trx()) {
2845 add_routes (ret, false, false, false);
2847 add_routes (ret, false, true, true); // autoconnect // outputs only
2856 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base)
2859 uint32_t control_id;
2861 uint32_t number = 0;
2862 const uint32_t being_added = how_many;
2864 if (!tree.read (template_path.c_str())) {
2868 XMLNode* node = tree.root();
2870 IO::disable_connecting ();
2872 control_id = next_control_id ();
2876 XMLNode node_copy (*node);
2878 /* Remove IDs of everything so that new ones are used */
2879 node_copy.remove_property_recursively (X_("id"));
2884 if (!name_base.empty()) {
2886 /* if we're adding more than one routes, force
2887 * all the names of the new routes to be
2888 * numbered, via the final parameter.
2891 if (!find_route_name (name_base.c_str(), ++number, name, sizeof(name), (being_added > 1))) {
2892 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2898 string const route_name = node_copy.property(X_("name"))->value ();
2900 /* generate a new name by adding a number to the end of the template name */
2901 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2902 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2903 abort(); /*NOTREACHED*/
2907 /* set this name in the XML description that we are about to use */
2908 Route::set_name_in_state (node_copy, name);
2910 /* trim bitslots from listen sends so that new ones are used */
2911 XMLNodeList children = node_copy.children ();
2912 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2913 if ((*i)->name() == X_("Processor")) {
2914 XMLProperty* role = (*i)->property (X_("role"));
2915 if (role && role->value() == X_("Listen")) {
2916 (*i)->remove_property (X_("bitslot"));
2921 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2924 error << _("Session: cannot create track/bus from template description") << endmsg;
2928 if (boost::dynamic_pointer_cast<Track>(route)) {
2929 /* force input/output change signals so that the new diskstream
2930 picks up the configuration of the route. During session
2931 loading this normally happens in a different way.
2934 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2936 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2937 change.after = route->input()->n_ports();
2938 route->input()->changed (change, this);
2939 change.after = route->output()->n_ports();
2940 route->output()->changed (change, this);
2943 route->set_remote_control_id (control_id);
2946 ret.push_back (route);
2948 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2951 catch (failed_constructor &err) {
2952 error << _("Session: could not create new route from template") << endmsg;
2956 catch (AudioEngine::PortRegistrationFailure& pfe) {
2957 error << pfe.what() << endmsg;
2966 StateProtector sp (this);
2967 if (Profile->get_trx()) {
2968 add_routes (ret, false, false, false);
2970 add_routes (ret, true, true, false);
2972 IO::enable_connecting ();
2979 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
2982 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
2983 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
2986 error << _("Adding new tracks/busses failed") << endmsg;
2991 update_latency (true);
2992 update_latency (false);
2997 save_state (_current_snapshot_name);
3000 reassign_track_numbers();
3002 update_route_record_state ();
3004 RouteAdded (new_routes); /* EMIT SIGNAL */
3008 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
3010 ChanCount existing_inputs;
3011 ChanCount existing_outputs;
3012 uint32_t order = next_control_id();
3014 if (_order_hint > -1) {
3015 order = _order_hint;
3019 count_existing_track_channels (existing_inputs, existing_outputs);
3022 RCUWriter<RouteList> writer (routes);
3023 boost::shared_ptr<RouteList> r = writer.get_copy ();
3024 r->insert (r->end(), new_routes.begin(), new_routes.end());
3026 /* if there is no control out and we're not in the middle of loading,
3027 resort the graph here. if there is a control out, we will resort
3028 toward the end of this method. if we are in the middle of loading,
3029 we will resort when done.
3032 if (!_monitor_out && IO::connecting_legal) {
3033 resort_routes_using (r);
3037 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3039 boost::weak_ptr<Route> wpr (*x);
3040 boost::shared_ptr<Route> r (*x);
3042 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
3043 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
3044 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
3045 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
3046 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
3047 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
3049 if (r->is_master()) {
3053 if (r->is_monitor()) {
3057 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
3059 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
3060 track_playlist_changed (boost::weak_ptr<Track> (tr));
3061 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
3063 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
3065 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
3066 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
3071 if (input_auto_connect || output_auto_connect) {
3072 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
3075 /* order keys are a GUI responsibility but we need to set up
3076 reasonable defaults because they also affect the remote control
3077 ID in most situations.
3080 if (!r->has_order_key ()) {
3081 if (r->is_auditioner()) {
3082 /* use an arbitrarily high value */
3083 r->set_order_key (UINT_MAX);
3085 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
3086 r->set_order_key (order);
3094 if (_monitor_out && IO::connecting_legal) {
3095 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
3097 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3098 if ((*x)->is_monitor()) {
3100 } else if ((*x)->is_master()) {
3103 (*x)->enable_monitor_send ();
3110 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
3112 boost::shared_ptr<RouteList> r = routes.reader ();
3113 boost::shared_ptr<Send> s;
3115 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3116 if ((s = (*i)->internal_send_for (dest)) != 0) {
3117 s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO);
3123 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
3125 boost::shared_ptr<RouteList> r = routes.reader ();
3126 boost::shared_ptr<Send> s;
3128 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3129 if ((s = (*i)->internal_send_for (dest)) != 0) {
3130 s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY);
3136 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
3138 boost::shared_ptr<RouteList> r = routes.reader ();
3139 boost::shared_ptr<Send> s;
3141 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3142 if ((s = (*i)->internal_send_for (dest)) != 0) {
3143 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
3148 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
3150 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
3152 boost::shared_ptr<RouteList> r = routes.reader ();
3153 boost::shared_ptr<RouteList> t (new RouteList);
3155 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3156 /* no MIDI sends because there are no MIDI busses yet */
3157 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
3162 add_internal_sends (dest, p, t);
3166 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
3168 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
3169 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
3174 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
3176 add_internal_send (dest, sender->before_processor_for_index (index), sender);
3180 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
3182 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
3186 if (!dest->internal_return()) {
3187 dest->add_internal_return ();
3190 sender->add_aux_send (dest, before);
3197 Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
3199 { // RCU Writer scope
3200 RCUWriter<RouteList> writer (routes);
3201 boost::shared_ptr<RouteList> rs = writer.get_copy ();
3204 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3206 if (*iter == _master_out) {
3210 (*iter)->set_solo (false, this);
3214 /* deleting the master out seems like a dumb
3215 idea, but its more of a UI policy issue
3219 if (*iter == _master_out) {
3220 _master_out = boost::shared_ptr<Route> ();
3223 if (*iter == _monitor_out) {
3224 _monitor_out.reset ();
3227 update_route_solo_state ();
3229 // We need to disconnect the route's inputs and outputs
3231 (*iter)->input()->disconnect (0);
3232 (*iter)->output()->disconnect (0);
3234 /* if the route had internal sends sending to it, remove them */
3235 if ((*iter)->internal_return()) {
3237 boost::shared_ptr<RouteList> r = routes.reader ();
3238 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3239 boost::shared_ptr<Send> s = (*i)->internal_send_for (*iter);
3241 (*i)->remove_processor (s);
3246 /* if the monitoring section had a pointer to this route, remove it */
3247 if (_monitor_out && !(*iter)->is_master() && !(*iter)->is_monitor()) {
3248 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3249 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
3250 (*iter)->remove_aux_or_listen (_monitor_out);
3253 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*iter);
3254 if (mt && mt->step_editing()) {
3255 if (_step_editors > 0) {
3260 RouteAddedOrRemoved (false); /* EMIT SIGNAL */
3263 /* writer goes out of scope, forces route list update */
3265 } // end of RCU Writer scope
3267 update_latency_compensation ();
3270 /* Re-sort routes to remove the graph's current references to the one that is
3271 * going away, then flush old references out of the graph.
3272 * Wave Tracks: reconnect routes
3275 #ifdef USE_TRACKS_CODE_FEATURES
3276 reconnect_existing_routes(true, false);
3281 if (_process_graph) {
3282 _process_graph->clear_other_chain ();
3285 /* get rid of it from the dead wood collection in the route list manager */
3286 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
3290 /* try to cause everyone to drop their references
3291 * and unregister ports from the backend
3293 PBD::Unwinder<bool> uw_flag (_route_deletion_in_progress, true);
3295 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3296 (*iter)->drop_references ();
3299 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
3301 /* save the new state of the world */
3303 if (save_state (_current_snapshot_name)) {
3304 save_history (_current_snapshot_name);
3307 reassign_track_numbers();
3308 update_route_record_state ();
3312 Session::remove_route (boost::shared_ptr<Route> route)
3314 boost::shared_ptr<RouteList> rl (new RouteList);
3315 rl->push_back (route);
3320 Session::route_mute_changed (void* /*src*/)
3326 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3328 boost::shared_ptr<Route> route = wpr.lock();
3330 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
3334 if (route->listening_via_monitor ()) {
3336 if (Config->get_exclusive_solo()) {
3337 /* new listen: disable all other listen */
3338 boost::shared_ptr<RouteList> r = routes.reader ();
3339 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3340 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3343 (*i)->set_listen (false, this);
3349 } else if (_listen_cnt > 0) {
3354 update_route_solo_state ();
3357 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3359 boost::shared_ptr<Route> route = wpr.lock ();
3362 /* should not happen */
3363 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
3367 bool send_changed = false;
3369 if (route->solo_isolated()) {
3370 if (_solo_isolated_cnt == 0) {
3371 send_changed = true;
3373 _solo_isolated_cnt++;
3374 } else if (_solo_isolated_cnt > 0) {
3375 _solo_isolated_cnt--;
3376 if (_solo_isolated_cnt == 0) {
3377 send_changed = true;
3382 IsolatedChanged (); /* EMIT SIGNAL */
3387 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
3389 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
3391 if (!self_solo_change) {
3392 // session doesn't care about changes to soloed-by-others
3396 if (solo_update_disabled) {
3398 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
3402 boost::shared_ptr<Route> route = wpr.lock ();
3405 boost::shared_ptr<RouteList> r = routes.reader ();
3408 if (route->self_soloed()) {
3414 RouteGroup* rg = route->route_group ();
3415 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
3417 if (delta == 1 && Config->get_exclusive_solo()) {
3419 /* new solo: disable all other solos, but not the group if its solo-enabled */
3421 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3422 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3423 (leave_group_alone && ((*i)->route_group() == rg))) {
3426 (*i)->set_solo (false, this);
3430 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3432 solo_update_disabled = true;
3434 RouteList uninvolved;
3436 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
3438 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3439 bool via_sends_only;
3440 bool in_signal_flow;
3442 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3443 (leave_group_alone && ((*i)->route_group() == rg))) {
3447 in_signal_flow = false;
3449 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3451 if ((*i)->feeds (route, &via_sends_only)) {
3452 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3453 if (!via_sends_only) {
3454 if (!route->soloed_by_others_upstream()) {
3455 (*i)->mod_solo_by_others_downstream (delta);
3458 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3460 in_signal_flow = true;
3462 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3465 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3467 if (route->feeds (*i, &via_sends_only)) {
3468 /* propagate solo upstream only if routing other than
3469 sends is involved, but do consider the other route
3470 (*i) to be part of the signal flow even if only
3473 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3477 route->soloed_by_others_downstream(),
3478 route->soloed_by_others_upstream()));
3479 if (!via_sends_only) {
3480 if (!route->soloed_by_others_downstream()) {
3481 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3482 (*i)->mod_solo_by_others_upstream (delta);
3484 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
3487 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3489 in_signal_flow = true;
3491 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3494 if (!in_signal_flow) {
3495 uninvolved.push_back (*i);
3499 solo_update_disabled = false;
3500 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3502 update_route_solo_state (r);
3504 /* now notify that the mute state of the routes not involved in the signal
3505 pathway of the just-solo-changed route may have altered.
3508 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3509 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
3510 (*i)->act_on_mute ();
3511 (*i)->mute_changed (this);
3514 SoloChanged (); /* EMIT SIGNAL */
3519 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
3521 /* now figure out if anything that matters is soloed (or is "listening")*/
3523 bool something_soloed = false;
3524 uint32_t listeners = 0;
3525 uint32_t isolated = 0;
3528 r = routes.reader();
3531 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3532 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
3533 something_soloed = true;
3536 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
3537 if (Config->get_solo_control_is_listen_control()) {
3540 (*i)->set_listen (false, this);
3544 if ((*i)->solo_isolated()) {
3549 if (something_soloed != _non_soloed_outs_muted) {
3550 _non_soloed_outs_muted = something_soloed;
3551 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
3554 _listen_cnt = listeners;
3556 if (isolated != _solo_isolated_cnt) {
3557 _solo_isolated_cnt = isolated;
3558 IsolatedChanged (); /* EMIT SIGNAL */
3561 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
3562 something_soloed, listeners, isolated));
3565 boost::shared_ptr<RouteList>
3566 Session::get_routes_with_internal_returns() const
3568 boost::shared_ptr<RouteList> r = routes.reader ();
3569 boost::shared_ptr<RouteList> rl (new RouteList);
3571 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3572 if ((*i)->internal_return ()) {
3580 Session::io_name_is_legal (const std::string& name)
3582 boost::shared_ptr<RouteList> r = routes.reader ();
3584 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3585 if ((*i)->name() == name) {
3589 if ((*i)->has_io_processor_named (name)) {
3598 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
3601 vector<string> connections;
3603 /* if we are passed only a single route and we're not told to turn
3604 * others off, then just do the simple thing.
3607 if (flip_others == false && rl->size() == 1) {
3608 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
3610 mt->set_input_active (onoff);
3615 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
3617 PortSet& ps ((*rt)->input()->ports());
3619 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
3620 p->get_connections (connections);
3623 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
3624 routes_using_input_from (*s, rl2);
3627 /* scan all relevant routes to see if others are on or off */
3629 bool others_are_already_on = false;
3631 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3633 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3639 if ((*r) != (*rt)) {
3640 if (mt->input_active()) {
3641 others_are_already_on = true;
3644 /* this one needs changing */
3645 mt->set_input_active (onoff);
3651 /* globally reverse other routes */
3653 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3654 if ((*r) != (*rt)) {
3655 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3657 mt->set_input_active (!others_are_already_on);
3666 Session::routes_using_input_from (const string& str, RouteList& rl)
3668 boost::shared_ptr<RouteList> r = routes.reader();
3670 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3671 if ((*i)->input()->connected_to (str)) {
3677 boost::shared_ptr<Route>
3678 Session::route_by_name (string name)
3680 boost::shared_ptr<RouteList> r = routes.reader ();
3682 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3683 if ((*i)->name() == name) {
3688 return boost::shared_ptr<Route> ((Route*) 0);
3691 boost::shared_ptr<Route>
3692 Session::route_by_id (PBD::ID id)
3694 boost::shared_ptr<RouteList> r = routes.reader ();
3696 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3697 if ((*i)->id() == id) {
3702 return boost::shared_ptr<Route> ((Route*) 0);
3705 boost::shared_ptr<Track>
3706 Session::track_by_diskstream_id (PBD::ID id)
3708 boost::shared_ptr<RouteList> r = routes.reader ();
3710 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3711 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3712 if (t && t->using_diskstream_id (id)) {
3717 return boost::shared_ptr<Track> ();
3720 boost::shared_ptr<Route>
3721 Session::route_by_remote_id (uint32_t id)
3723 boost::shared_ptr<RouteList> r = routes.reader ();
3725 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3726 if ((*i)->remote_control_id() == id) {
3731 return boost::shared_ptr<Route> ((Route*) 0);
3736 Session::reassign_track_numbers ()
3740 RouteList r (*(routes.reader ()));
3741 SignalOrderRouteSorter sorter;
3744 StateProtector sp (this);
3746 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3747 if (boost::dynamic_pointer_cast<Track> (*i)) {
3748 (*i)->set_track_number(++tn);
3750 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
3751 (*i)->set_track_number(--bn);
3754 const uint32_t decimals = ceilf (log10f (tn + 1));
3755 const bool decimals_changed = _track_number_decimals != decimals;
3756 _track_number_decimals = decimals;
3758 if (decimals_changed && config.get_track_name_number ()) {
3759 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3760 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3762 t->resync_track_name();
3765 // trigger GUI re-layout
3766 config.ParameterChanged("track-name-number");
3771 Session::playlist_region_added (boost::weak_ptr<Region> w)
3773 boost::shared_ptr<Region> r = w.lock ();
3778 /* These are the operations that are currently in progress... */
3779 list<GQuark> curr = _current_trans_quarks;
3782 /* ...and these are the operations during which we want to update
3783 the session range location markers.
3786 ops.push_back (Operations::capture);
3787 ops.push_back (Operations::paste);
3788 ops.push_back (Operations::duplicate_region);
3789 ops.push_back (Operations::insert_file);
3790 ops.push_back (Operations::insert_region);
3791 ops.push_back (Operations::drag_region_brush);
3792 ops.push_back (Operations::region_drag);
3793 ops.push_back (Operations::selection_grab);
3794 ops.push_back (Operations::region_fill);
3795 ops.push_back (Operations::fill_selection);
3796 ops.push_back (Operations::create_region);
3797 ops.push_back (Operations::region_copy);
3798 ops.push_back (Operations::fixed_time_region_copy);
3801 /* See if any of the current operations match the ones that we want */
3803 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
3805 /* If so, update the session range markers */
3807 maybe_update_session_range (r->position (), r->last_frame ());
3811 /** Update the session range markers if a is before the current start or
3812 * b is after the current end.
3815 Session::maybe_update_session_range (framepos_t a, framepos_t b)
3817 if (_state_of_the_state & Loading) {
3821 if (_session_range_location == 0) {
3823 add_session_range_location (a, b);
3827 if (a < _session_range_location->start()) {
3828 _session_range_location->set_start (a);
3831 if (b > _session_range_location->end()) {
3832 _session_range_location->set_end (b);
3838 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
3840 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3841 maybe_update_session_range (i->to, i->to + i->length);
3846 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
3848 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3849 maybe_update_session_range (i->from, i->to);
3853 /* Region management */
3855 boost::shared_ptr<Region>
3856 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
3858 const RegionFactory::RegionMap& regions (RegionFactory::regions());
3859 RegionFactory::RegionMap::const_iterator i;
3860 boost::shared_ptr<Region> region;
3862 Glib::Threads::Mutex::Lock lm (region_lock);
3864 for (i = regions.begin(); i != regions.end(); ++i) {
3868 if (region->whole_file()) {
3870 if (child->source_equivalent (region)) {
3876 return boost::shared_ptr<Region> ();
3880 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
3882 set<boost::shared_ptr<Region> > relevant_regions;
3884 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
3885 RegionFactory::get_regions_using_source (*s, relevant_regions);
3888 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
3889 set<boost::shared_ptr<Region> >::iterator tmp;
3894 playlists->destroy_region (*r);
3895 RegionFactory::map_remove (*r);
3897 (*r)->drop_sources ();
3898 (*r)->drop_references ();
3900 relevant_regions.erase (r);
3905 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
3908 Glib::Threads::Mutex::Lock ls (source_lock);
3909 /* remove from the main source list */
3910 sources.erase ((*s)->id());
3913 (*s)->mark_for_remove ();
3914 (*s)->drop_references ();
3923 Session::remove_last_capture ()
3925 list<boost::shared_ptr<Source> > srcs;
3927 boost::shared_ptr<RouteList> rl = routes.reader ();
3928 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3929 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3934 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
3937 srcs.insert (srcs.end(), l.begin(), l.end());
3942 destroy_sources (srcs);
3944 save_state (_current_snapshot_name);
3949 /* Source Management */
3952 Session::add_source (boost::shared_ptr<Source> source)
3954 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
3955 pair<SourceMap::iterator,bool> result;
3957 entry.first = source->id();
3958 entry.second = source;
3961 Glib::Threads::Mutex::Lock lm (source_lock);
3962 result = sources.insert (entry);
3965 if (result.second) {
3967 /* yay, new source */
3969 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
3972 if (!fs->within_session()) {
3973 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
3979 boost::shared_ptr<AudioFileSource> afs;
3981 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
3982 if (Config->get_auto_analyse_audio()) {
3983 Analyser::queue_source_for_analysis (source, false);
3987 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
3992 Session::remove_source (boost::weak_ptr<Source> src)
3994 if (_state_of_the_state & Deletion) {
3998 SourceMap::iterator i;
3999 boost::shared_ptr<Source> source = src.lock();
4006 Glib::Threads::Mutex::Lock lm (source_lock);
4008 if ((i = sources.find (source->id())) != sources.end()) {
4013 if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
4015 /* save state so we don't end up with a session file
4016 referring to non-existent sources.
4019 save_state (_current_snapshot_name);
4023 boost::shared_ptr<Source>
4024 Session::source_by_id (const PBD::ID& id)
4026 Glib::Threads::Mutex::Lock lm (source_lock);
4027 SourceMap::iterator i;
4028 boost::shared_ptr<Source> source;
4030 if ((i = sources.find (id)) != sources.end()) {
4037 boost::shared_ptr<AudioFileSource>
4038 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
4040 /* Restricted to audio files because only audio sources have channel
4044 Glib::Threads::Mutex::Lock lm (source_lock);
4046 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
4047 boost::shared_ptr<AudioFileSource> afs
4048 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
4050 if (afs && afs->path() == path && chn == afs->channel()) {
4055 return boost::shared_ptr<AudioFileSource>();
4058 boost::shared_ptr<MidiSource>
4059 Session::midi_source_by_path (const std::string& path) const
4061 /* Restricted to MIDI files because audio sources require a channel
4062 for unique identification, in addition to a path.
4065 Glib::Threads::Mutex::Lock lm (source_lock);
4067 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
4068 boost::shared_ptr<MidiSource> ms
4069 = boost::dynamic_pointer_cast<MidiSource>(s->second);
4070 boost::shared_ptr<FileSource> fs
4071 = boost::dynamic_pointer_cast<FileSource>(s->second);
4073 if (ms && fs && fs->path() == path) {
4078 return boost::shared_ptr<MidiSource>();
4082 Session::count_sources_by_origin (const string& path)
4085 Glib::Threads::Mutex::Lock lm (source_lock);
4087 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
4088 boost::shared_ptr<FileSource> fs
4089 = boost::dynamic_pointer_cast<FileSource>(i->second);
4091 if (fs && fs->origin() == path) {
4100 Session::peak_path (string base) const
4102 if (Glib::path_is_absolute (base)) {
4104 /* rip the session dir from the audiofile source */
4106 string session_path;
4107 string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
4108 bool in_another_session = true;
4110 if (base.find (interchange_dir_string) != string::npos) {
4112 session_path = Glib::path_get_dirname (base); /* now ends in audiofiles */
4113 session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
4114 session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
4115 session_path = Glib::path_get_dirname (session_path); /* now has session path */
4117 /* see if it is within our session */
4119 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4120 if (i->path == session_path) {
4121 in_another_session = false;
4126 in_another_session = false;
4130 if (in_another_session) {
4131 SessionDirectory sd (session_path);
4132 return Glib::build_filename (sd.peak_path(), Glib::path_get_basename (base) + peakfile_suffix);
4136 base = Glib::path_get_basename (base);
4137 return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
4141 Session::new_audio_source_path_for_embedded (const std::string& path)
4145 * we know that the filename is already unique because it exists
4146 * out in the filesystem.
4148 * However, when we bring it into the session, we could get a
4151 * Eg. two embedded files:
4156 * When merged into session, these collide.
4158 * There will not be a conflict with in-memory sources
4159 * because when the source was created we already picked
4160 * a unique name for it.
4162 * This collision is not likely to be common, but we have to guard
4163 * against it. So, if there is a collision, take the md5 hash of the
4164 * the path, and use that as the filename instead.
4167 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4168 string base = Glib::path_get_basename (path);
4169 string newpath = Glib::build_filename (sdir.sound_path(), base);
4171 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4175 md5.digestString (path.c_str());
4176 md5.writeToString ();
4177 base = md5.digestChars;
4179 string ext = get_suffix (path);
4186 newpath = Glib::build_filename (sdir.sound_path(), base);
4188 /* if this collides, we're screwed */
4190 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4191 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
4200 /** Return true if there are no audio file sources that use @param name as
4201 * the filename component of their path.
4203 * Return false otherwise.
4205 * This method MUST ONLY be used to check in-session, mono files since it
4206 * hard-codes the channel of the audio file source we are looking for as zero.
4208 * If/when Ardour supports native files in non-mono formats, the logic here
4209 * will need to be revisited.
4212 Session::audio_source_name_is_unique (const string& name)
4214 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
4215 vector<space_and_path>::iterator i;
4216 uint32_t existing = 0;
4218 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4220 /* note that we search *without* the extension so that
4221 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
4222 in the event that this new name is required for
4223 a file format change.
4226 const string spath = *i;
4228 if (matching_unsuffixed_filename_exists_in (spath, name)) {
4233 /* it is possible that we have the path already
4234 * assigned to a source that has not yet been written
4235 * (ie. the write source for a diskstream). we have to
4236 * check this in order to make sure that our candidate
4237 * path isn't used again, because that can lead to
4238 * two Sources point to the same file with different
4239 * notions of their removability.
4243 string possible_path = Glib::build_filename (spath, name);
4245 if (audio_source_by_path_and_channel (possible_path, 0)) {
4251 return (existing == 0);
4255 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)
4258 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4262 sstr << setfill ('0') << setw (4) << cnt;
4263 sstr << legalized_base;
4265 sstr << legalized_base;
4267 if (take_required || related_exists) {
4279 } else if (nchan > 2) {
4284 /* XXX what? more than 26 channels! */
4295 /** Return a unique name based on \a base for a new internal audio source */
4297 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
4300 string possible_name;
4301 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
4303 bool some_related_source_name_exists = false;
4305 legalized = legalize_for_path (base);
4307 // Find a "version" of the base name that doesn't exist in any of the possible directories.
4309 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
4311 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
4313 if (audio_source_name_is_unique (possible_name)) {
4317 some_related_source_name_exists = true;
4320 error << string_compose(
4321 _("There are already %1 recordings for %2, which I consider too many."),
4322 limit, base) << endmsg;
4324 throw failed_constructor();
4328 /* We've established that the new name does not exist in any session
4329 * directory, so now find out which one we should use for this new
4333 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4335 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
4340 /** Return a unique name based on `base` for a new internal MIDI source */
4342 Session::new_midi_source_path (const string& base)
4345 char buf[PATH_MAX+1];
4346 const uint32_t limit = 10000;
4348 string possible_path;
4349 string possible_name;
4352 legalized = legalize_for_path (base);
4354 // Find a "version" of the file name that doesn't exist in any of the possible directories.
4355 std::vector<string> sdirs = source_search_path(DataType::MIDI);
4357 /* - the main session folder is the first in the vector.
4358 * - after checking all locations for file-name uniqueness,
4359 * we keep the one from the last iteration as new file name
4360 * - midi files are small and should just be kept in the main session-folder
4362 * -> reverse the array, check main session folder last and use that as location
4365 std::reverse(sdirs.begin(), sdirs.end());
4367 for (cnt = 1; cnt <= limit; ++cnt) {
4369 vector<space_and_path>::iterator i;
4370 uint32_t existing = 0;
4372 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4374 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
4375 possible_name = buf;
4377 possible_path = Glib::build_filename (*i, possible_name);
4379 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
4383 if (midi_source_by_path (possible_path)) {
4388 if (existing == 0) {
4393 error << string_compose(
4394 _("There are already %1 recordings for %2, which I consider too many."),
4395 limit, base) << endmsg;
4401 /* No need to "find best location" for software/app-based RAID, because
4402 MIDI is so small that we always put it in the same place.
4405 return possible_path;
4409 /** Create a new within-session audio source */
4410 boost::shared_ptr<AudioFileSource>
4411 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
4413 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
4415 if (!path.empty()) {
4416 return boost::dynamic_pointer_cast<AudioFileSource> (
4417 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
4419 throw failed_constructor ();
4423 /** Create a new within-session MIDI source */
4424 boost::shared_ptr<MidiSource>
4425 Session::create_midi_source_for_session (string const & basic_name)
4427 const string path = new_midi_source_path (basic_name);
4429 if (!path.empty()) {
4430 return boost::dynamic_pointer_cast<SMFSource> (
4431 SourceFactory::createWritable (
4432 DataType::MIDI, *this, path, false, frame_rate()));
4434 throw failed_constructor ();
4438 /** Create a new within-session MIDI source */
4439 boost::shared_ptr<MidiSource>
4440 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
4442 /* the caller passes in the track the source will be used in,
4443 so that we can keep the numbering sane.
4445 Rationale: a track with the name "Foo" that has had N
4446 captures carried out so far will ALREADY have a write source
4447 named "Foo-N+1.mid" waiting to be used for the next capture.
4449 If we call new_midi_source_name() we will get "Foo-N+2". But
4450 there is no region corresponding to "Foo-N+1", so when
4451 "Foo-N+2" appears in the track, the gap presents the user
4452 with odd behaviour - why did it skip past Foo-N+1?
4454 We could explain this to the user in some odd way, but
4455 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
4458 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
4461 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
4463 std::string name = track->steal_write_source_name ();
4466 return boost::shared_ptr<MidiSource>();
4469 /* MIDI files are small, just put them in the first location of the
4470 session source search path.
4473 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
4475 return boost::dynamic_pointer_cast<SMFSource> (
4476 SourceFactory::createWritable (
4477 DataType::MIDI, *this, path, false, frame_rate()));
4482 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
4484 if (playlist->hidden()) {
4488 playlists->add (playlist);
4491 playlist->release();
4498 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
4500 if (_state_of_the_state & Deletion) {
4504 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
4510 playlists->remove (playlist);
4516 Session::set_audition (boost::shared_ptr<Region> r)
4518 pending_audition_region = r;
4519 add_post_transport_work (PostTransportAudition);
4520 _butler->schedule_transport_work ();
4524 Session::audition_playlist ()
4526 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4527 ev->region.reset ();
4532 Session::non_realtime_set_audition ()
4534 assert (pending_audition_region);
4535 auditioner->audition_region (pending_audition_region);
4536 pending_audition_region.reset ();
4537 AuditionActive (true); /* EMIT SIGNAL */
4541 Session::audition_region (boost::shared_ptr<Region> r)
4543 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4549 Session::cancel_audition ()
4554 if (auditioner->auditioning()) {
4555 auditioner->cancel_audition ();
4556 AuditionActive (false); /* EMIT SIGNAL */
4561 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
4563 if (a->is_monitor()) {
4566 if (b->is_monitor()) {
4569 return a->order_key () < b->order_key ();
4573 Session::is_auditioning () const
4575 /* can be called before we have an auditioner object */
4577 return auditioner->auditioning();
4584 Session::graph_reordered ()
4586 /* don't do this stuff if we are setting up connections
4587 from a set_state() call or creating new tracks. Ditto for deletion.
4590 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _reconnecting_routes_in_progress) {
4594 /* every track/bus asked for this to be handled but it was deferred because
4595 we were connecting. do it now.
4598 request_input_change_handling ();
4602 /* force all diskstreams to update their capture offset values to
4603 reflect any changes in latencies within the graph.
4606 boost::shared_ptr<RouteList> rl = routes.reader ();
4607 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4608 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4610 tr->set_capture_offset ();
4615 /** @return Number of frames that there is disk space available to write,
4618 boost::optional<framecnt_t>
4619 Session::available_capture_duration ()
4621 Glib::Threads::Mutex::Lock lm (space_lock);
4623 if (_total_free_4k_blocks_uncertain) {
4624 return boost::optional<framecnt_t> ();
4627 float sample_bytes_on_disk = 4.0; // keep gcc happy
4629 switch (config.get_native_file_data_format()) {
4631 sample_bytes_on_disk = 4.0;
4635 sample_bytes_on_disk = 3.0;
4639 sample_bytes_on_disk = 2.0;
4643 /* impossible, but keep some gcc versions happy */
4644 fatal << string_compose (_("programming error: %1"),
4645 X_("illegal native file data format"))
4647 abort(); /*NOTREACHED*/
4650 double scale = 4096.0 / sample_bytes_on_disk;
4652 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
4653 return max_framecnt;
4656 return (framecnt_t) floor (_total_free_4k_blocks * scale);
4660 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
4663 RCUWriter<BundleList> writer (_bundles);
4664 boost::shared_ptr<BundleList> b = writer.get_copy ();
4665 b->push_back (bundle);
4669 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4676 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
4678 bool removed = false;
4681 RCUWriter<BundleList> writer (_bundles);
4682 boost::shared_ptr<BundleList> b = writer.get_copy ();
4683 BundleList::iterator i = find (b->begin(), b->end(), bundle);
4685 if (i != b->end()) {
4692 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4698 boost::shared_ptr<Bundle>
4699 Session::bundle_by_name (string name) const
4701 boost::shared_ptr<BundleList> b = _bundles.reader ();
4703 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
4704 if ((*i)->name() == name) {
4709 return boost::shared_ptr<Bundle> ();
4713 Session::tempo_map_changed (const PropertyChange&)
4717 playlists->update_after_tempo_map_change ();
4719 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
4725 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
4727 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
4728 (*i)->recompute_frames_from_bbt ();
4732 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
4733 * the given count with the current block size.
4736 Session::ensure_buffers (ChanCount howmany)
4738 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
4742 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
4744 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4745 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
4750 Session::next_insert_id ()
4752 /* this doesn't really loop forever. just think about it */
4755 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
4756 if (!insert_bitset[n]) {
4757 insert_bitset[n] = true;
4763 /* none available, so resize and try again */
4765 insert_bitset.resize (insert_bitset.size() + 16, false);
4770 Session::next_send_id ()
4772 /* this doesn't really loop forever. just think about it */
4775 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
4776 if (!send_bitset[n]) {
4777 send_bitset[n] = true;
4783 /* none available, so resize and try again */
4785 send_bitset.resize (send_bitset.size() + 16, false);
4790 Session::next_aux_send_id ()
4792 /* this doesn't really loop forever. just think about it */
4795 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
4796 if (!aux_send_bitset[n]) {
4797 aux_send_bitset[n] = true;
4803 /* none available, so resize and try again */
4805 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
4810 Session::next_return_id ()
4812 /* this doesn't really loop forever. just think about it */
4815 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
4816 if (!return_bitset[n]) {
4817 return_bitset[n] = true;
4823 /* none available, so resize and try again */
4825 return_bitset.resize (return_bitset.size() + 16, false);
4830 Session::mark_send_id (uint32_t id)
4832 if (id >= send_bitset.size()) {
4833 send_bitset.resize (id+16, false);
4835 if (send_bitset[id]) {
4836 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
4838 send_bitset[id] = true;
4842 Session::mark_aux_send_id (uint32_t id)
4844 if (id >= aux_send_bitset.size()) {
4845 aux_send_bitset.resize (id+16, false);
4847 if (aux_send_bitset[id]) {
4848 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
4850 aux_send_bitset[id] = true;
4854 Session::mark_return_id (uint32_t id)
4856 if (id >= return_bitset.size()) {
4857 return_bitset.resize (id+16, false);
4859 if (return_bitset[id]) {
4860 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
4862 return_bitset[id] = true;
4866 Session::mark_insert_id (uint32_t id)
4868 if (id >= insert_bitset.size()) {
4869 insert_bitset.resize (id+16, false);
4871 if (insert_bitset[id]) {
4872 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
4874 insert_bitset[id] = true;
4878 Session::unmark_send_id (uint32_t id)
4880 if (id < send_bitset.size()) {
4881 send_bitset[id] = false;
4886 Session::unmark_aux_send_id (uint32_t id)
4888 if (id < aux_send_bitset.size()) {
4889 aux_send_bitset[id] = false;
4894 Session::unmark_return_id (uint32_t id)
4896 if (id < return_bitset.size()) {
4897 return_bitset[id] = false;
4902 Session::unmark_insert_id (uint32_t id)
4904 if (id < insert_bitset.size()) {
4905 insert_bitset[id] = false;
4910 Session::reset_native_file_format ()
4912 boost::shared_ptr<RouteList> rl = routes.reader ();
4913 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4914 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4916 /* don't save state as we do this, there's no point
4919 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
4920 tr->reset_write_sources (false);
4921 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
4927 Session::route_name_unique (string n) const
4929 boost::shared_ptr<RouteList> r = routes.reader ();
4931 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4932 if ((*i)->name() == n) {
4941 Session::route_name_internal (string n) const
4943 if (auditioner && auditioner->name() == n) {
4947 if (_click_io && _click_io->name() == n) {
4955 Session::freeze_all (InterThreadInfo& itt)
4957 boost::shared_ptr<RouteList> r = routes.reader ();
4959 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4961 boost::shared_ptr<Track> t;
4963 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
4964 /* XXX this is wrong because itt.progress will keep returning to zero at the start
4974 boost::shared_ptr<Region>
4975 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
4976 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
4977 InterThreadInfo& itt,
4978 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
4979 bool for_export, bool for_freeze)
4981 boost::shared_ptr<Region> result;
4982 boost::shared_ptr<Playlist> playlist;
4983 boost::shared_ptr<Source> source;
4984 ChanCount diskstream_channels (track.n_channels());
4985 framepos_t position;
4986 framecnt_t this_chunk;
4988 framepos_t latency_skip;
4990 framepos_t len = end - start;
4991 bool need_block_size_reset = false;
4992 ChanCount const max_proc = track.max_processor_streams ();
4993 string legal_playlist_name;
4994 string possible_path;
4997 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
4998 end, start) << endmsg;
5002 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
5003 include_endpoint, for_export, for_freeze);
5005 if (diskstream_channels.n(track.data_type()) < 1) {
5006 error << _("Cannot write a range with no data.") << endmsg;
5010 // block all process callback handling
5012 block_processing ();
5015 // synchronize with AudioEngine::process_callback()
5016 // make sure processing is not currently running
5017 // and processing_blocked() is honored before
5018 // acquiring thread buffers
5019 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5022 _bounce_processing_active = true;
5024 /* call tree *MUST* hold route_lock */
5026 if ((playlist = track.playlist()) == 0) {
5030 legal_playlist_name = legalize_for_path (playlist->name());
5032 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
5034 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
5035 string path = ((track.data_type() == DataType::AUDIO)
5036 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
5037 : new_midi_source_path (legal_playlist_name));
5044 source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
5047 catch (failed_constructor& err) {
5048 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
5052 srcs.push_back (source);
5055 /* tell redirects that care that we are about to use a much larger
5056 * blocksize. this will flush all plugins too, so that they are ready
5057 * to be used for this process.
5060 need_block_size_reset = true;
5061 track.set_block_size (bounce_chunk_size);
5062 _engine.main_thread()->get_buffers ();
5066 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5068 /* create a set of reasonably-sized buffers */
5069 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5070 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
5072 buffers.set_count (max_proc);
5074 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5075 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5076 boost::shared_ptr<MidiSource> ms;
5078 afs->prepare_for_peakfile_writes ();
5079 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5080 Source::Lock lock(ms->mutex());
5081 ms->mark_streaming_write_started(lock);
5085 while (to_do && !itt.cancel) {
5087 this_chunk = min (to_do, bounce_chunk_size);
5089 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
5093 start += this_chunk;
5094 to_do -= this_chunk;
5095 itt.progress = (float) (1.0 - ((double) to_do / len));
5097 if (latency_skip >= bounce_chunk_size) {
5098 latency_skip -= bounce_chunk_size;
5102 const framecnt_t current_chunk = this_chunk - latency_skip;
5105 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5106 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5107 boost::shared_ptr<MidiSource> ms;
5110 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
5113 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5114 Source::Lock lock(ms->mutex());
5116 const MidiBuffer& buf = buffers.get_midi(0);
5117 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
5118 Evoral::Event<framepos_t> ev = *i;
5119 ev.set_time(ev.time() - position);
5120 ms->append_event_frames(lock, ev, ms->timeline_position());
5127 /* post-roll, pick up delayed processor output */
5128 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5130 while (latency_skip && !itt.cancel) {
5131 this_chunk = min (latency_skip, bounce_chunk_size);
5132 latency_skip -= this_chunk;
5134 buffers.silence (this_chunk, 0);
5135 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
5138 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5139 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5142 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
5154 xnow = localtime (&now);
5156 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
5157 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5158 boost::shared_ptr<MidiSource> ms;
5161 afs->update_header (position, *xnow, now);
5162 afs->flush_header ();
5163 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5164 Source::Lock lock(ms->mutex());
5165 ms->mark_streaming_write_completed(lock);
5169 /* construct a region to represent the bounced material */
5173 plist.add (Properties::start, 0);
5174 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
5175 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
5177 result = RegionFactory::create (srcs, plist);
5183 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5184 (*src)->mark_for_remove ();
5185 (*src)->drop_references ();
5189 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5190 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5193 afs->done_with_peakfile_writes ();
5197 _bounce_processing_active = false;
5199 if (need_block_size_reset) {
5200 _engine.main_thread()->drop_buffers ();
5201 track.set_block_size (get_block_size());
5204 unblock_processing ();
5210 Session::gain_automation_buffer() const
5212 return ProcessThread::gain_automation_buffer ();
5216 Session::trim_automation_buffer() const
5218 return ProcessThread::trim_automation_buffer ();
5222 Session::send_gain_automation_buffer() const
5224 return ProcessThread::send_gain_automation_buffer ();
5228 Session::pan_automation_buffer() const
5230 return ProcessThread::pan_automation_buffer ();
5234 Session::get_silent_buffers (ChanCount count)
5236 return ProcessThread::get_silent_buffers (count);
5240 Session::get_scratch_buffers (ChanCount count, bool silence)
5242 return ProcessThread::get_scratch_buffers (count, silence);
5246 Session::get_route_buffers (ChanCount count, bool silence)
5248 return ProcessThread::get_route_buffers (count, silence);
5253 Session::get_mix_buffers (ChanCount count)
5255 return ProcessThread::get_mix_buffers (count);
5259 Session::ntracks () const
5262 boost::shared_ptr<RouteList> r = routes.reader ();
5264 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5265 if (boost::dynamic_pointer_cast<Track> (*i)) {
5274 Session::nbusses () const
5277 boost::shared_ptr<RouteList> r = routes.reader ();
5279 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5280 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
5289 Session::add_automation_list(AutomationList *al)
5291 automation_lists[al->id()] = al;
5294 /** @return true if there is at least one record-enabled track, otherwise false */
5296 Session::have_rec_enabled_track () const
5298 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
5302 Session::have_rec_disabled_track () const
5304 return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
5307 /** Update the state of our rec-enabled tracks flag */
5309 Session::update_route_record_state ()
5311 boost::shared_ptr<RouteList> rl = routes.reader ();
5312 RouteList::iterator i = rl->begin();
5313 while (i != rl->end ()) {
5315 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5316 if (tr && tr->record_enabled ()) {
5323 int const old = g_atomic_int_get (&_have_rec_enabled_track);
5325 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
5327 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
5328 RecordStateChanged (); /* EMIT SIGNAL */
5331 for (i = rl->begin(); i != rl->end (); ++i) {
5332 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5333 if (tr && !tr->record_enabled ()) {
5338 g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
5340 bool record_arm_state_changed = (old != g_atomic_int_get (&_have_rec_enabled_track) );
5342 if (record_status() == Recording && record_arm_state_changed ) {
5343 RecordArmStateChanged ();
5349 Session::listen_position_changed ()
5351 boost::shared_ptr<RouteList> r = routes.reader ();
5353 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5354 (*i)->listen_position_changed ();
5359 Session::solo_control_mode_changed ()
5361 /* cancel all solo or all listen when solo control mode changes */
5364 set_solo (get_routes(), false);
5365 } else if (listening()) {
5366 set_listen (get_routes(), false);
5370 /** Called when a property of one of our route groups changes */
5372 Session::route_group_property_changed (RouteGroup* rg)
5374 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
5377 /** Called when a route is added to one of our route groups */
5379 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5381 RouteAddedToRouteGroup (rg, r);
5384 /** Called when a route is removed from one of our route groups */
5386 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5388 update_route_record_state ();
5389 RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
5392 boost::shared_ptr<RouteList>
5393 Session::get_tracks () const
5395 boost::shared_ptr<RouteList> rl = routes.reader ();
5396 boost::shared_ptr<RouteList> tl (new RouteList);
5398 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
5399 if (boost::dynamic_pointer_cast<Track> (*r)) {
5400 if (!(*r)->is_auditioner()) {
5408 boost::shared_ptr<RouteList>
5409 Session::get_routes_with_regions_at (framepos_t const p) const
5411 boost::shared_ptr<RouteList> r = routes.reader ();
5412 boost::shared_ptr<RouteList> rl (new RouteList);
5414 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5415 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5420 boost::shared_ptr<Playlist> pl = tr->playlist ();
5425 if (pl->has_region_at (p)) {
5434 Session::goto_end ()
5436 if (_session_range_location) {
5437 request_locate (_session_range_location->end(), false);
5439 request_locate (0, false);
5444 Session::goto_start ()
5446 if (_session_range_location) {
5447 request_locate (_session_range_location->start(), false);
5449 request_locate (0, false);
5454 Session::current_start_frame () const
5456 return _session_range_location ? _session_range_location->start() : 0;
5460 Session::current_end_frame () const
5462 return _session_range_location ? _session_range_location->end() : 0;
5466 Session::add_session_range_location (framepos_t start, framepos_t end)
5468 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
5469 _locations->add (_session_range_location);
5473 Session::step_edit_status_change (bool yn)
5479 send = (_step_editors == 0);
5484 send = (_step_editors == 1);
5487 if (_step_editors > 0) {
5493 StepEditStatusChange (val);
5499 Session::start_time_changed (framepos_t old)
5501 /* Update the auto loop range to match the session range
5502 (unless the auto loop range has been changed by the user)
5505 Location* s = _locations->session_range_location ();
5510 Location* l = _locations->auto_loop_location ();
5512 if (l && l->start() == old) {
5513 l->set_start (s->start(), true);
5518 Session::end_time_changed (framepos_t old)
5520 /* Update the auto loop range to match the session range
5521 (unless the auto loop range has been changed by the user)
5524 Location* s = _locations->session_range_location ();
5529 Location* l = _locations->auto_loop_location ();
5531 if (l && l->end() == old) {
5532 l->set_end (s->end(), true);
5536 std::vector<std::string>
5537 Session::source_search_path (DataType type) const
5541 if (session_dirs.size() == 1) {
5543 case DataType::AUDIO:
5544 sp.push_back (_session_dir->sound_path());
5546 case DataType::MIDI:
5547 sp.push_back (_session_dir->midi_path());
5551 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
5552 SessionDirectory sdir (i->path);
5554 case DataType::AUDIO:
5555 sp.push_back (sdir.sound_path());
5557 case DataType::MIDI:
5558 sp.push_back (sdir.midi_path());
5564 if (type == DataType::AUDIO) {
5565 const string sound_path_2X = _session_dir->sound_path_2X();
5566 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
5567 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
5568 sp.push_back (sound_path_2X);
5573 // now check the explicit (possibly user-specified) search path
5576 case DataType::AUDIO:
5577 sp += Searchpath(config.get_audio_search_path ());
5579 case DataType::MIDI:
5580 sp += Searchpath(config.get_midi_search_path ());
5588 Session::ensure_search_path_includes (const string& path, DataType type)
5597 case DataType::AUDIO:
5598 sp += Searchpath(config.get_audio_search_path ());
5600 case DataType::MIDI:
5601 sp += Searchpath (config.get_midi_search_path ());
5605 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
5606 /* No need to add this new directory if it has the same inode as
5607 an existing one; checking inode rather than name prevents duplicated
5608 directories when we are using symlinks.
5610 On Windows, I think we could just do if (*i == path) here.
5612 if (PBD::equivalent_paths (*i, path)) {
5620 case DataType::AUDIO:
5621 config.set_audio_search_path (sp.to_string());
5623 case DataType::MIDI:
5624 config.set_midi_search_path (sp.to_string());
5630 Session::remove_dir_from_search_path (const string& dir, DataType type)
5635 case DataType::AUDIO:
5636 sp = Searchpath(config.get_audio_search_path ());
5638 case DataType::MIDI:
5639 sp = Searchpath (config.get_midi_search_path ());
5646 case DataType::AUDIO:
5647 config.set_audio_search_path (sp.to_string());
5649 case DataType::MIDI:
5650 config.set_midi_search_path (sp.to_string());
5656 boost::shared_ptr<Speakers>
5657 Session::get_speakers()
5663 Session::unknown_processors () const
5667 boost::shared_ptr<RouteList> r = routes.reader ();
5668 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5669 list<string> t = (*i)->unknown_processors ();
5670 copy (t.begin(), t.end(), back_inserter (p));
5680 Session::update_latency (bool playback)
5682 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
5684 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
5688 boost::shared_ptr<RouteList> r = routes.reader ();
5689 framecnt_t max_latency = 0;
5692 /* reverse the list so that we work backwards from the last route to run to the first */
5693 RouteList* rl = routes.reader().get();
5694 r.reset (new RouteList (*rl));
5695 reverse (r->begin(), r->end());
5698 /* compute actual latency values for the given direction and store them all in per-port
5699 structures. this will also publish the same values (to JACK) so that computation of latency
5700 for routes can consistently use public latency values.
5703 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5704 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
5707 /* because we latency compensate playback, our published playback latencies should
5708 be the same for all output ports - all material played back by ardour has
5709 the same latency, whether its caused by plugins or by latency compensation. since
5710 these may differ from the values computed above, reset all playback port latencies
5714 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
5716 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5717 (*i)->set_public_port_latencies (max_latency, playback);
5722 post_playback_latency ();
5726 post_capture_latency ();
5729 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
5733 Session::post_playback_latency ()
5735 set_worst_playback_latency ();
5737 boost::shared_ptr<RouteList> r = routes.reader ();
5739 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5740 if (!(*i)->is_auditioner() && ((*i)->active())) {
5741 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
5745 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5746 (*i)->set_latency_compensation (_worst_track_latency);
5751 Session::post_capture_latency ()
5753 set_worst_capture_latency ();
5755 /* reflect any changes in capture latencies into capture offsets
5758 boost::shared_ptr<RouteList> rl = routes.reader();
5759 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5760 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5762 tr->set_capture_offset ();
5768 Session::initialize_latencies ()
5771 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5772 update_latency (false);
5773 update_latency (true);
5776 set_worst_io_latencies ();
5780 Session::set_worst_io_latencies ()
5782 set_worst_playback_latency ();
5783 set_worst_capture_latency ();
5787 Session::set_worst_playback_latency ()
5789 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5793 _worst_output_latency = 0;
5795 if (!_engine.connected()) {
5799 boost::shared_ptr<RouteList> r = routes.reader ();
5801 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5802 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
5805 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
5809 Session::set_worst_capture_latency ()
5811 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5815 _worst_input_latency = 0;
5817 if (!_engine.connected()) {
5821 boost::shared_ptr<RouteList> r = routes.reader ();
5823 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5824 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
5827 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
5831 Session::update_latency_compensation (bool force_whole_graph)
5833 bool some_track_latency_changed = false;
5835 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5839 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
5841 _worst_track_latency = 0;
5843 boost::shared_ptr<RouteList> r = routes.reader ();
5845 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5846 if (!(*i)->is_auditioner() && ((*i)->active())) {
5848 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
5849 some_track_latency_changed = true;
5851 _worst_track_latency = max (tl, _worst_track_latency);
5855 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
5856 (some_track_latency_changed ? "yes" : "no")));
5858 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
5860 if (some_track_latency_changed || force_whole_graph) {
5861 _engine.update_latencies ();
5865 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5866 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5870 tr->set_capture_offset ();
5875 Session::session_name_is_legal (const string& path)
5877 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
5879 for (int i = 0; illegal_chars[i]; ++i) {
5880 if (path.find (illegal_chars[i]) != string::npos) {
5881 return illegal_chars[i];
5889 Session::next_control_id () const
5893 /* the monitor bus remote ID is in a different
5894 * "namespace" than regular routes. its existence doesn't
5895 * affect normal (low) numbered routes.
5902 return nroutes() - subtract;
5906 Session::notify_remote_id_change ()
5908 if (deletion_in_progress()) {
5912 switch (Config->get_remote_model()) {
5914 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
5920 #ifdef USE_TRACKS_CODE_FEATURES
5921 /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
5922 * if track order has been changed by user
5924 reconnect_existing_routes(true, true);
5930 Session::sync_order_keys ()
5932 if (deletion_in_progress()) {
5936 /* tell everyone that something has happened to the sort keys
5937 and let them sync up with the change(s)
5938 this will give objects that manage the sort order keys the
5939 opportunity to keep them in sync if they wish to.
5942 DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
5944 reassign_track_numbers();
5946 Route::SyncOrderKeys (); /* EMIT SIGNAL */
5948 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
5952 Session::operation_in_progress (GQuark op) const
5954 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
5957 boost::shared_ptr<Port>
5958 Session::ltc_input_port () const
5960 return _ltc_input->nth (0);
5963 boost::shared_ptr<Port>
5964 Session::ltc_output_port () const
5966 return _ltc_output->nth (0);
5970 Session::reconnect_ltc_input ()
5974 string src = Config->get_ltc_source_port();
5976 _ltc_input->disconnect (this);
5978 if (src != _("None") && !src.empty()) {
5979 _ltc_input->nth (0)->connect (src);
5985 Session::reconnect_ltc_output ()
5990 string src = Config->get_ltc_sink_port();
5992 _ltc_output->disconnect (this);
5994 if (src != _("None") && !src.empty()) {
5995 _ltc_output->nth (0)->connect (src);