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/replace_all.h"
50 #include "pbd/unwind.h"
52 #include "ardour/amp.h"
53 #include "ardour/analyser.h"
54 #include "ardour/async_midi_port.h"
55 #include "ardour/audio_buffer.h"
56 #include "ardour/audio_diskstream.h"
57 #include "ardour/audio_port.h"
58 #include "ardour/audio_track.h"
59 #include "ardour/audioengine.h"
60 #include "ardour/audiofilesource.h"
61 #include "ardour/auditioner.h"
62 #include "ardour/buffer_manager.h"
63 #include "ardour/buffer_set.h"
64 #include "ardour/bundle.h"
65 #include "ardour/butler.h"
66 #include "ardour/click.h"
67 #include "ardour/control_protocol_manager.h"
68 #include "ardour/data_type.h"
69 #include "ardour/debug.h"
70 #include "ardour/directory_names.h"
71 #ifdef USE_TRACKS_CODE_FEATURES
72 #include "ardour/engine_state_controller.h"
74 #include "ardour/filename_extensions.h"
75 #include "ardour/graph.h"
76 #include "ardour/midiport_manager.h"
77 #include "ardour/scene_changer.h"
78 #include "ardour/midi_track.h"
79 #include "ardour/midi_ui.h"
80 #include "ardour/operations.h"
81 #include "ardour/playlist.h"
82 #include "ardour/plugin.h"
83 #include "ardour/plugin_insert.h"
84 #include "ardour/process_thread.h"
85 #include "ardour/profile.h"
86 #include "ardour/rc_configuration.h"
87 #include "ardour/recent_sessions.h"
88 #include "ardour/region.h"
89 #include "ardour/region_factory.h"
90 #include "ardour/route_graph.h"
91 #include "ardour/route_group.h"
92 #include "ardour/route_sorters.h"
93 #include "ardour/send.h"
94 #include "ardour/session.h"
95 #include "ardour/session_directory.h"
96 #include "ardour/session_playlists.h"
97 #include "ardour/smf_source.h"
98 #include "ardour/source_factory.h"
99 #include "ardour/speakers.h"
100 #include "ardour/tempo.h"
101 #include "ardour/track.h"
102 #include "ardour/user_bundle.h"
103 #include "ardour/utils.h"
105 #include "midi++/port.h"
106 #include "midi++/mmc.h"
117 using namespace ARDOUR;
120 bool Session::_disable_all_loaded_plugins = false;
122 PBD::Signal1<int,uint32_t> Session::AudioEngineSetupRequired;
123 PBD::Signal1<void,std::string> Session::Dialog;
124 PBD::Signal0<int> Session::AskAboutPendingState;
125 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
126 PBD::Signal0<void> Session::SendFeedback;
127 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
129 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
130 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
131 PBD::Signal2<void,std::string, std::string> Session::Exported;
132 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
133 PBD::Signal0<void> Session::Quit;
134 PBD::Signal0<void> Session::FeedbackDetected;
135 PBD::Signal0<void> Session::SuccessfulGraphSort;
136 PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
138 const framecnt_t Session::bounce_chunk_size = 65536;
139 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
140 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
142 /** @param snapshot_name Snapshot name, without .ardour suffix */
143 Session::Session (AudioEngine &eng,
144 const string& fullpath,
145 const string& snapshot_name,
146 BusProfile* bus_profile,
148 : playlists (new SessionPlaylists)
150 , process_function (&Session::process_with_events)
151 , _bounce_processing_active (false)
152 , waiting_for_sync_offset (false)
153 , _base_frame_rate (0)
154 , _current_frame_rate (0)
155 , _nominal_frame_rate (0)
156 , transport_sub_state (0)
157 , _record_status (Disabled)
158 , _transport_frame (0)
159 , _session_range_location (0)
162 , _transport_speed (0)
163 , _default_transport_speed (1.0)
164 , _last_transport_speed (0)
165 , _target_transport_speed (0.0)
166 , auto_play_legal (false)
167 , _last_slave_transport_frame (0)
168 , maximum_output_latency (0)
169 , _requested_return_frame (-1)
170 , current_block_size (0)
171 , _worst_output_latency (0)
172 , _worst_input_latency (0)
173 , _worst_track_latency (0)
174 , _have_captured (false)
175 , _non_soloed_outs_muted (false)
177 , _solo_isolated_cnt (0)
179 , _was_seamless (Config->get_seamless_loop ())
180 , _under_nsm_control (false)
182 , delta_accumulator_cnt (0)
183 , average_slave_delta (1800) // !!! why 1800 ???
185 , have_first_delta_accumulator (false)
186 , _slave_state (Stopped)
187 , _mtc_active (false)
188 , post_export_sync (false)
189 , post_export_position (0)
191 , _export_started (false)
192 , _export_rolling (false)
193 , _pre_export_mmc_enabled (false)
194 , _name (snapshot_name)
196 , _send_qf_mtc (false)
197 , _pframes_since_last_mtc (0)
198 , session_midi_feedback (0)
200 , loop_changing (false)
202 , _session_dir (new SessionDirectory (fullpath))
203 , _current_snapshot_name (snapshot_name)
205 , state_was_pending (false)
206 , _state_of_the_state (StateOfTheState(CannotSave|InitialConnecting|Loading))
208 , _save_queued (false)
209 , _last_roll_location (0)
210 , _last_roll_or_reversal_location (0)
211 , _last_record_location (0)
212 , pending_locate_roll (false)
213 , pending_locate_frame (0)
214 , pending_locate_flush (false)
215 , pending_abort (false)
216 , pending_auto_loop (false)
217 , _butler (new Butler (*this))
218 , _post_transport_work (0)
219 , cumulative_rf_motion (0)
221 , _locations (new Locations (*this))
222 , _ignore_skips_updates (false)
223 , _rt_thread_active (false)
224 , _rt_emit_pending (false)
226 , outbound_mtc_timecode_frame (0)
227 , next_quarter_frame_to_send (-1)
228 , _frames_per_timecode_frame (0)
229 , _frames_per_hour (0)
230 , _timecode_frames_per_hour (0)
231 , last_timecode_valid (false)
232 , last_timecode_when (0)
233 , _send_timecode_update (false)
245 , ltc_timecode_offset (0)
246 , ltc_timecode_negative_offset (false)
247 , midi_control_ui (0)
249 , _all_route_group (new RouteGroup (*this, "all"))
250 , routes (new RouteList)
251 , _adding_routes_in_progress (false)
252 , _reconnecting_routes_in_progress (false)
253 , _route_deletion_in_progress (false)
254 , destructive_index (0)
255 , _track_number_decimals(1)
256 , solo_update_disabled (false)
257 , default_fade_steepness (0)
258 , default_fade_msecs (0)
259 , _total_free_4k_blocks (0)
260 , _total_free_4k_blocks_uncertain (false)
261 , no_questions_about_missing_files (false)
264 , _bundles (new BundleList)
265 , _bundle_xml_node (0)
269 , click_emphasis_data (0)
271 , click_emphasis_length (0)
272 , _clicks_cleared (0)
273 , _play_range (false)
275 , first_file_data_format_reset (true)
276 , first_file_header_format_reset (true)
277 , have_looped (false)
278 , _have_rec_enabled_track (false)
279 , _have_rec_disabled_track (true)
281 , _suspend_timecode_transmission (0)
282 , _speakers (new Speakers)
284 , ignore_route_processor_changes (false)
291 pthread_mutex_init (&_rt_emit_mutex, 0);
292 pthread_cond_init (&_rt_emit_cond, 0);
294 pre_engine_init (fullpath);
298 #ifdef USE_TRACKS_CODE_FEATURES
299 sr = EngineStateController::instance()->get_current_sample_rate();
301 if (ensure_engine (sr)) {
303 throw failed_constructor ();
306 if (create (mix_template, bus_profile)) {
308 throw failed_constructor ();
311 /* if a mix template was provided, then ::create() will
312 * have copied it into the session and we need to load it
313 * so that we have the state ready for ::set_state()
314 * after the engine is started.
316 * Note that we do NOT try to get the sample rate from
317 * the template at this time, though doing so would
318 * be easy if we decided this was an appropriate part
322 if (!mix_template.empty()) {
323 if (load_state (_current_snapshot_name)) {
324 throw failed_constructor ();
326 store_recent_templates (mix_template);
329 /* load default session properties - if any */
334 if (load_state (_current_snapshot_name)) {
335 throw failed_constructor ();
338 /* try to get sample rate from XML state so that we
339 * can influence the SR if we set up the audio
344 const XMLProperty* prop;
345 if ((prop = state_tree->root()->property (X_("sample-rate"))) != 0) {
346 sr = atoi (prop->value());
350 if (ensure_engine (sr)) {
352 throw failed_constructor ();
356 if (post_engine_init ()) {
358 throw failed_constructor ();
361 store_recent_sessions (_name, _path);
363 bool was_dirty = dirty();
365 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
367 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
368 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
371 DirtyChanged (); /* EMIT SIGNAL */
374 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
375 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
379 emit_thread_start ();
381 /* hook us up to the engine since we are now completely constructed */
383 BootMessage (_("Connect to engine"));
385 _engine.set_session (this);
386 _engine.reset_timebase ();
388 #ifdef USE_TRACKS_CODE_FEATURES
390 EngineStateController::instance()->set_session(this);
393 if ( ARDOUR::Profile->get_trx () ) {
395 /* Waves Tracks: fill session with tracks basing on the amount of inputs.
396 * each available input must have corresponding track when session starts.
399 uint32_t how_many (0);
401 std::vector<std::string> inputs;
402 EngineStateController::instance()->get_physical_audio_inputs(inputs);
404 how_many = inputs.size();
406 list<boost::shared_ptr<AudioTrack> > tracks;
408 // Track names after driver
409 if (Config->get_tracks_auto_naming() == NameAfterDriver) {
410 string track_name = "";
411 for (std::vector<string>::size_type i = 0; i < inputs.size(); ++i) {
413 track_name = inputs[i];
414 replace_all (track_name, "system:capture", "");
416 list<boost::shared_ptr<AudioTrack> > single_track = new_audio_track (1, 1, Normal, 0, 1, track_name);
417 tracks.insert(tracks.begin(), single_track.front());
419 } else { // Default track names
420 tracks = new_audio_track (1, 1, Normal, 0, how_many, string());
423 if (tracks.size() != how_many) {
425 throw failed_constructor ();
433 BootMessage (_("Session loading complete"));
445 Session::ensure_engine (uint32_t desired_sample_rate)
447 if (_engine.current_backend() == 0) {
448 /* backend is unknown ... */
449 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
450 if (r.get_value_or (-1) != 0) {
453 } else if (_engine.setup_required()) {
454 /* backend is known, but setup is needed */
455 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
456 if (r.get_value_or (-1) != 0) {
459 } else if (!_engine.running()) {
460 if (_engine.start()) {
465 /* at this point the engine should be running
468 if (!_engine.running()) {
472 return immediately_post_engine ();
477 Session::immediately_post_engine ()
479 /* Do various initializations that should take place directly after we
480 * know that the engine is running, but before we either create a
481 * session or set state for an existing one.
484 if (how_many_dsp_threads () > 1) {
485 /* For now, only create the graph if we are using >1 DSP threads, as
486 it is a bit slower than the old code with 1 thread.
488 _process_graph.reset (new Graph (*this));
491 /* every time we reconnect, recompute worst case output latencies */
493 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
495 if (synced_to_engine()) {
496 _engine.transport_stop ();
499 if (config.get_jack_time_master()) {
500 _engine.transport_locate (_transport_frame);
504 BootMessage (_("Set up LTC"));
506 BootMessage (_("Set up Click"));
508 BootMessage (_("Set up standard connections"));
512 catch (failed_constructor& err) {
516 /* TODO, connect in different thread. (PortRegisteredOrUnregistered may be in RT context)
518 _engine.PortRegisteredOrUnregistered.connect_same_thread (*this, boost::bind (&Session::setup_bundles, this));
526 vector<void*> debug_pointers;
528 /* if we got to here, leaving pending capture state around
532 remove_pending_capture_state ();
534 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
536 /* disconnect from any and all signals that we are connected to */
540 _engine.remove_session ();
542 #ifdef USE_TRACKS_CODE_FEATURES
543 EngineStateController::instance()->remove_session();
546 /* deregister all ports - there will be no process or any other
547 * callbacks from the engine any more.
550 Port::PortDrop (); /* EMIT SIGNAL */
554 /* clear history so that no references to objects are held any more */
558 /* clear state tree so that no references to objects are held any more */
563 /* reset dynamic state version back to default */
565 Stateful::loading_state_version = 0;
567 _butler->drop_references ();
571 delete _all_route_group;
573 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
574 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
578 if (click_data != default_click) {
579 delete [] click_data;
582 if (click_emphasis_data != default_click_emphasis) {
583 delete [] click_emphasis_data;
588 /* need to remove auditioner before monitoring section
589 * otherwise it is re-connected */
592 /* drop references to routes held by the monitoring section
593 * specifically _monitor_out aux/listen references */
594 remove_monitor_section();
596 /* clear out any pending dead wood from RCU managed objects */
601 AudioDiskstream::free_working_buffers();
603 /* tell everyone who is still standing that we're about to die */
606 /* tell everyone to drop references and delete objects as we go */
608 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
609 RegionFactory::delete_all_regions ();
611 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
613 /* reset these three references to special routes before we do the usual route delete thing */
615 _master_out.reset ();
616 _monitor_out.reset ();
619 RCUWriter<RouteList> writer (routes);
620 boost::shared_ptr<RouteList> r = writer.get_copy ();
622 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
623 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
624 (*i)->drop_references ();
628 /* writer goes out of scope and updates master */
633 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
634 Glib::Threads::Mutex::Lock lm (source_lock);
635 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
636 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
637 i->second->drop_references ();
643 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
646 emit_thread_terminate ();
648 pthread_cond_destroy (&_rt_emit_cond);
649 pthread_mutex_destroy (&_rt_emit_mutex);
651 delete _scene_changer; _scene_changer = 0;
652 delete midi_control_ui; midi_control_ui = 0;
654 delete _mmc; _mmc = 0;
655 delete _midi_ports; _midi_ports = 0;
656 delete _locations; _locations = 0;
660 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
662 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
663 boost_debug_list_ptrs ();
668 Session::setup_ltc ()
672 _ltc_input.reset (new IO (*this, X_("LTC In"), IO::Input));
673 _ltc_output.reset (new IO (*this, X_("LTC Out"), IO::Output));
675 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC In"))) != 0) {
676 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
679 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
680 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
682 reconnect_ltc_input ();
685 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC Out"))) != 0) {
686 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
689 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
690 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
692 reconnect_ltc_output ();
695 /* fix up names of LTC ports because we don't want the normal
696 * IO style of NAME/TYPE-{in,out}N
699 _ltc_input->nth (0)->set_name (X_("LTC-in"));
700 _ltc_output->nth (0)->set_name (X_("LTC-out"));
704 Session::setup_click ()
707 _click_io.reset (new ClickIO (*this, X_("Click")));
708 _click_gain.reset (new Amp (*this));
709 _click_gain->activate ();
711 setup_click_state (state_tree->root());
713 setup_click_state (0);
718 Session::setup_click_state (const XMLNode* node)
720 const XMLNode* child = 0;
722 if (node && (child = find_named_node (*node, "Click")) != 0) {
724 /* existing state for Click */
727 if (Stateful::loading_state_version < 3000) {
728 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
730 const XMLNodeList& children (child->children());
731 XMLNodeList::const_iterator i = children.begin();
732 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
734 if (i != children.end()) {
735 c = _click_gain->set_state (**i, Stateful::loading_state_version);
741 _clicking = Config->get_clicking ();
745 error << _("could not setup Click I/O") << endmsg;
752 /* default state for Click: dual-mono to first 2 physical outputs */
755 _engine.get_physical_outputs (DataType::AUDIO, outs);
757 for (uint32_t physport = 0; physport < 2; ++physport) {
758 if (outs.size() > physport) {
759 if (_click_io->add_port (outs[physport], this)) {
760 // relax, even though its an error
765 if (_click_io->n_ports () > ChanCount::ZERO) {
766 _clicking = Config->get_clicking ();
772 Session::setup_bundles ()
776 RCUWriter<BundleList> writer (_bundles);
777 boost::shared_ptr<BundleList> b = writer.get_copy ();
778 for (BundleList::iterator i = b->begin(); i != b->end();) {
779 if (boost::dynamic_pointer_cast<UserBundle>(*i)) {
787 vector<string> inputs[DataType::num_types];
788 vector<string> outputs[DataType::num_types];
789 for (uint32_t i = 0; i < DataType::num_types; ++i) {
790 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
791 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
794 /* Create a set of Bundle objects that map
795 to the physical I/O currently available. We create both
796 mono and stereo bundles, so that the common cases of mono
797 and stereo tracks get bundles to put in their mixer strip
798 in / out menus. There may be a nicer way of achieving that;
799 it doesn't really scale that well to higher channel counts
802 /* mono output bundles */
804 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
806 std::string pn = _engine.get_pretty_name_by_name (outputs[DataType::AUDIO][np]);
808 snprintf (buf, sizeof (buf), _("out %s"), pn.substr(0,12).c_str());
810 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
813 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
814 c->add_channel (_("mono"), DataType::AUDIO);
815 c->set_port (0, outputs[DataType::AUDIO][np]);
817 add_bundle (c, false);
820 /* stereo output bundles */
822 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
823 if (np + 1 < outputs[DataType::AUDIO].size()) {
825 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
826 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
827 c->add_channel (_("L"), DataType::AUDIO);
828 c->set_port (0, outputs[DataType::AUDIO][np]);
829 c->add_channel (_("R"), DataType::AUDIO);
830 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
832 add_bundle (c, false);
836 /* mono input bundles */
838 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
840 std::string pn = _engine.get_pretty_name_by_name (inputs[DataType::AUDIO][np]);
842 snprintf (buf, sizeof (buf), _("in %s"), pn.substr(0,12).c_str());
844 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
847 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
848 c->add_channel (_("mono"), DataType::AUDIO);
849 c->set_port (0, inputs[DataType::AUDIO][np]);
851 add_bundle (c, false);
854 /* stereo input bundles */
856 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
857 if (np + 1 < inputs[DataType::AUDIO].size()) {
859 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
861 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
862 c->add_channel (_("L"), DataType::AUDIO);
863 c->set_port (0, inputs[DataType::AUDIO][np]);
864 c->add_channel (_("R"), DataType::AUDIO);
865 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
867 add_bundle (c, false);
871 /* MIDI input bundles */
873 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
874 string n = inputs[DataType::MIDI][np];
875 std::string pn = _engine.get_pretty_name_by_name (n);
879 boost::erase_first (n, X_("alsa_pcm:"));
881 boost::shared_ptr<Bundle> c (new Bundle (n, false));
882 c->add_channel ("", DataType::MIDI);
883 c->set_port (0, inputs[DataType::MIDI][np]);
884 add_bundle (c, false);
887 /* MIDI output bundles */
889 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
890 string n = outputs[DataType::MIDI][np];
891 std::string pn = _engine.get_pretty_name_by_name (n);
895 boost::erase_first (n, X_("alsa_pcm:"));
897 boost::shared_ptr<Bundle> c (new Bundle (n, true));
898 c->add_channel ("", DataType::MIDI);
899 c->set_port (0, outputs[DataType::MIDI][np]);
900 add_bundle (c, false);
903 // we trust the backend to only calls us if there's a change
904 BundleAddedOrRemoved (); /* EMIT SIGNAL */
908 Session::auto_connect_master_bus ()
910 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
914 // Waves Tracks: Do not connect master bas for Tracks if AutoConnectMaster option is not set
915 // In this case it means "Multi Out" output mode
916 if (ARDOUR::Profile->get_trx() && !(Config->get_output_auto_connect() & AutoConnectMaster) ) {
920 /* if requested auto-connect the outputs to the first N physical ports.
923 uint32_t limit = _master_out->n_outputs().n_total();
924 vector<string> outputs[DataType::num_types];
926 for (uint32_t i = 0; i < DataType::num_types; ++i) {
927 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
930 for (uint32_t n = 0; n < limit; ++n) {
931 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
933 if (outputs[p->type()].size() > n) {
934 connect_to = outputs[p->type()][n];
937 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
938 if (_master_out->output()->connect (p, connect_to, this)) {
939 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
948 Session::remove_monitor_section ()
950 if (!_monitor_out || Profile->get_trx()) {
954 /* force reversion to Solo-In-Place */
955 Config->set_solo_control_is_listen_control (false);
957 /* if we are auditioning, cancel it ... this is a workaround
958 to a problem (auditioning does not execute the process graph,
959 which is needed to remove routes when using >1 core for processing)
964 /* Hold process lock while doing this so that we don't hear bits and
965 * pieces of audio as we work on each route.
968 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
970 /* Connect tracks to monitor section. Note that in an
971 existing session, the internal sends will already exist, but we want the
972 routes to notice that they connect to the control out specifically.
976 boost::shared_ptr<RouteList> r = routes.reader ();
977 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
979 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
981 if ((*x)->is_monitor()) {
983 } else if ((*x)->is_master()) {
986 (*x)->remove_aux_or_listen (_monitor_out);
991 remove_route (_monitor_out);
992 auto_connect_master_bus ();
995 auditioner->connect ();
1000 Session::add_monitor_section ()
1004 if (_monitor_out || !_master_out || Profile->get_trx()) {
1008 boost::shared_ptr<Route> r (new Route (*this, _("Monitor"), Route::MonitorOut, DataType::AUDIO));
1014 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1015 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
1018 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1019 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1020 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1024 add_routes (rl, false, false, false);
1026 assert (_monitor_out);
1028 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
1029 are undefined, at best.
1032 uint32_t limit = _monitor_out->n_inputs().n_audio();
1036 /* connect the inputs to the master bus outputs. this
1037 * represents a separate data feed from the internal sends from
1038 * each route. as of jan 2011, it allows the monitor section to
1039 * conditionally ignore either the internal sends or the normal
1040 * input feed, but we should really find a better way to do
1044 _master_out->output()->disconnect (this);
1046 for (uint32_t n = 0; n < limit; ++n) {
1047 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1048 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1051 string connect_to = o->name();
1052 if (_monitor_out->input()->connect (p, connect_to, this)) {
1053 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1061 /* if monitor section is not connected, connect it to physical outs
1064 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
1066 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1068 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1071 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1073 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1074 Config->get_monitor_bus_preferred_bundle())
1080 /* Monitor bus is audio only */
1082 vector<string> outputs[DataType::num_types];
1084 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1085 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1088 uint32_t mod = outputs[DataType::AUDIO].size();
1089 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1093 for (uint32_t n = 0; n < limit; ++n) {
1095 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1097 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1098 connect_to = outputs[DataType::AUDIO][n % mod];
1101 if (!connect_to.empty()) {
1102 if (_monitor_out->output()->connect (p, connect_to, this)) {
1103 error << string_compose (
1104 _("cannot connect control output %1 to %2"),
1115 /* Hold process lock while doing this so that we don't hear bits and
1116 * pieces of audio as we work on each route.
1119 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1121 /* Connect tracks to monitor section. Note that in an
1122 existing session, the internal sends will already exist, but we want the
1123 routes to notice that they connect to the control out specifically.
1127 boost::shared_ptr<RouteList> rls = routes.reader ();
1129 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1131 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1133 if ((*x)->is_monitor()) {
1135 } else if ((*x)->is_master()) {
1138 (*x)->enable_monitor_send ();
1143 auditioner->connect ();
1148 Session::reset_monitor_section ()
1150 /* Process lock should be held by the caller.*/
1152 if (!_monitor_out || Profile->get_trx()) {
1156 uint32_t limit = _master_out->n_outputs().n_audio();
1158 /* connect the inputs to the master bus outputs. this
1159 * represents a separate data feed from the internal sends from
1160 * each route. as of jan 2011, it allows the monitor section to
1161 * conditionally ignore either the internal sends or the normal
1162 * input feed, but we should really find a better way to do
1166 _master_out->output()->disconnect (this);
1167 _monitor_out->output()->disconnect (this);
1169 _monitor_out->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1170 _monitor_out->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1172 for (uint32_t n = 0; n < limit; ++n) {
1173 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1174 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1177 string connect_to = o->name();
1178 if (_monitor_out->input()->connect (p, connect_to, this)) {
1179 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1186 /* connect monitor section to physical outs
1189 if (Config->get_auto_connect_standard_busses()) {
1191 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1193 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1196 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1198 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1199 Config->get_monitor_bus_preferred_bundle())
1205 /* Monitor bus is audio only */
1207 vector<string> outputs[DataType::num_types];
1209 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1210 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1213 uint32_t mod = outputs[DataType::AUDIO].size();
1214 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1218 for (uint32_t n = 0; n < limit; ++n) {
1220 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1222 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1223 connect_to = outputs[DataType::AUDIO][n % mod];
1226 if (!connect_to.empty()) {
1227 if (_monitor_out->output()->connect (p, connect_to, this)) {
1228 error << string_compose (
1229 _("cannot connect control output %1 to %2"),
1240 /* Connect tracks to monitor section. Note that in an
1241 existing session, the internal sends will already exist, but we want the
1242 routes to notice that they connect to the control out specifically.
1246 boost::shared_ptr<RouteList> rls = routes.reader ();
1248 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1250 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1252 if ((*x)->is_monitor()) {
1254 } else if ((*x)->is_master()) {
1257 (*x)->enable_monitor_send ();
1263 Session::hookup_io ()
1265 /* stop graph reordering notifications from
1266 causing resorts, etc.
1269 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
1273 /* we delay creating the auditioner till now because
1274 it makes its own connections to ports.
1278 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
1280 throw failed_constructor ();
1282 a->use_new_diskstream ();
1286 catch (failed_constructor& err) {
1287 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
1291 /* load bundles, which we may have postponed earlier on */
1292 if (_bundle_xml_node) {
1293 load_bundles (*_bundle_xml_node);
1294 delete _bundle_xml_node;
1297 /* Tell all IO objects to connect themselves together */
1299 IO::enable_connecting ();
1301 /* Now tell all "floating" ports to connect to whatever
1302 they should be connected to.
1305 AudioEngine::instance()->reconnect_ports ();
1307 /* Anyone who cares about input state, wake up and do something */
1309 IOConnectionsComplete (); /* EMIT SIGNAL */
1311 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
1313 /* now handle the whole enchilada as if it was one
1314 graph reorder event.
1319 /* update the full solo state, which can't be
1320 correctly determined on a per-route basis, but
1321 needs the global overview that only the session
1325 update_route_solo_state ();
1329 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
1331 boost::shared_ptr<Track> track = wp.lock ();
1336 boost::shared_ptr<Playlist> playlist;
1338 if ((playlist = track->playlist()) != 0) {
1339 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
1340 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
1341 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
1346 Session::record_enabling_legal () const
1348 /* this used to be in here, but survey says.... we don't need to restrict it */
1349 // if (record_status() == Recording) {
1353 if (Config->get_all_safe()) {
1360 Session::set_track_monitor_input_status (bool yn)
1362 boost::shared_ptr<RouteList> rl = routes.reader ();
1363 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1364 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1365 if (tr && tr->record_enabled ()) {
1366 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1367 tr->request_input_monitoring (yn);
1373 Session::auto_punch_start_changed (Location* location)
1375 replace_event (SessionEvent::PunchIn, location->start());
1377 if (get_record_enabled() && config.get_punch_in()) {
1378 /* capture start has been changed, so save new pending state */
1379 save_state ("", true);
1384 Session::auto_punch_end_changed (Location* location)
1386 framepos_t when_to_stop = location->end();
1387 // when_to_stop += _worst_output_latency + _worst_input_latency;
1388 replace_event (SessionEvent::PunchOut, when_to_stop);
1392 Session::auto_punch_changed (Location* location)
1394 framepos_t when_to_stop = location->end();
1396 replace_event (SessionEvent::PunchIn, location->start());
1397 //when_to_stop += _worst_output_latency + _worst_input_latency;
1398 replace_event (SessionEvent::PunchOut, when_to_stop);
1401 /** @param loc A loop location.
1402 * @param pos Filled in with the start time of the required fade-out (in session frames).
1403 * @param length Filled in with the length of the required fade-out.
1406 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
1408 pos = max (loc->start(), loc->end() - 64);
1409 length = loc->end() - pos;
1413 Session::auto_loop_changed (Location* location)
1415 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1418 auto_loop_declick_range (location, dcp, dcl);
1420 if (transport_rolling() && play_loop) {
1422 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1424 // if (_transport_frame > location->end()) {
1426 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1427 // relocate to beginning of loop
1428 clear_events (SessionEvent::LocateRoll);
1430 request_locate (location->start(), true);
1433 else if (Config->get_seamless_loop() && !loop_changing) {
1435 // schedule a locate-roll to refill the diskstreams at the
1436 // previous loop end
1437 loop_changing = true;
1439 if (location->end() > last_loopend) {
1440 clear_events (SessionEvent::LocateRoll);
1441 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1447 clear_events (SessionEvent::AutoLoopDeclick);
1448 clear_events (SessionEvent::AutoLoop);
1451 last_loopend = location->end();
1456 Session::set_auto_punch_location (Location* location)
1460 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1461 punch_connections.drop_connections();
1462 existing->set_auto_punch (false, this);
1463 remove_event (existing->start(), SessionEvent::PunchIn);
1464 clear_events (SessionEvent::PunchOut);
1465 auto_punch_location_changed (0);
1470 if (location == 0) {
1474 if (location->end() <= location->start()) {
1475 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1479 punch_connections.drop_connections ();
1481 location->StartChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, location));
1482 location->EndChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, location));
1483 location->Changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, location));
1485 location->set_auto_punch (true, this);
1487 auto_punch_changed (location);
1489 auto_punch_location_changed (location);
1493 Session::set_session_extents (framepos_t start, framepos_t end)
1496 if ((existing = _locations->session_range_location()) == 0) {
1497 //if there is no existing session, we need to make a new session location (should never happen)
1498 existing = new Location (*this, 0, 0, _("session"), Location::IsSessionRange);
1502 error << _("Session: you can't use that location for session start/end)") << endmsg;
1506 existing->set( start, end );
1512 Session::set_auto_loop_location (Location* location)
1516 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1517 loop_connections.drop_connections ();
1518 existing->set_auto_loop (false, this);
1519 remove_event (existing->end(), SessionEvent::AutoLoop);
1522 auto_loop_declick_range (existing, dcp, dcl);
1523 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1524 auto_loop_location_changed (0);
1529 if (location == 0) {
1533 if (location->end() <= location->start()) {
1534 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1538 last_loopend = location->end();
1540 loop_connections.drop_connections ();
1542 location->StartChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1543 location->EndChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1544 location->Changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1545 location->FlagsChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1547 location->set_auto_loop (true, this);
1549 if (Config->get_loop_is_mode() && play_loop && Config->get_seamless_loop()) {
1550 // set all tracks to use internal looping
1551 boost::shared_ptr<RouteList> rl = routes.reader ();
1552 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1553 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1554 if (tr && !tr->hidden()) {
1555 tr->set_loop (location);
1560 /* take care of our stuff first */
1562 auto_loop_changed (location);
1564 /* now tell everyone else */
1566 auto_loop_location_changed (location);
1570 Session::update_marks (Location*)
1576 Session::update_skips (Location* loc, bool consolidate)
1578 if (_ignore_skips_updates) {
1582 Locations::LocationList skips;
1585 PBD::Unwinder<bool> uw (_ignore_skips_updates, true);
1586 consolidate_skips (loc);
1589 sync_locations_to_skips ();
1595 Session::consolidate_skips (Location* loc)
1597 Locations::LocationList all_locations = _locations->list ();
1599 for (Locations::LocationList::iterator l = all_locations.begin(); l != all_locations.end(); ) {
1601 if (!(*l)->is_skip ()) {
1606 /* don't test against self */
1613 switch (Evoral::coverage ((*l)->start(), (*l)->end(), loc->start(), loc->end())) {
1614 case Evoral::OverlapInternal:
1615 case Evoral::OverlapExternal:
1616 case Evoral::OverlapStart:
1617 case Evoral::OverlapEnd:
1618 /* adjust new location to cover existing one */
1619 loc->set_start (min (loc->start(), (*l)->start()));
1620 loc->set_end (max (loc->end(), (*l)->end()));
1621 /* we don't need this one any more */
1622 _locations->remove (*l);
1623 /* the location has been deleted, so remove reference to it in our local list */
1624 l = all_locations.erase (l);
1627 case Evoral::OverlapNone:
1635 Session::sync_locations_to_skips ()
1637 /* This happens asynchronously (in the audioengine thread). After the clear is done, we will call
1638 * Session::_sync_locations_to_skips() from the audioengine thread.
1640 clear_events (SessionEvent::Skip, boost::bind (&Session::_sync_locations_to_skips, this));
1644 Session::_sync_locations_to_skips ()
1646 /* called as a callback after existing Skip events have been cleared from a realtime audioengine thread */
1648 Locations::LocationList const & locs (_locations->list());
1650 for (Locations::LocationList::const_iterator i = locs.begin(); i != locs.end(); ++i) {
1652 Location* location = *i;
1654 if (location->is_skip() && location->is_skipping()) {
1655 SessionEvent* ev = new SessionEvent (SessionEvent::Skip, SessionEvent::Add, location->start(), location->end(), 1.0);
1663 Session::location_added (Location *location)
1665 if (location->is_auto_punch()) {
1666 set_auto_punch_location (location);
1669 if (location->is_auto_loop()) {
1670 set_auto_loop_location (location);
1673 if (location->is_session_range()) {
1674 /* no need for any signal handling or event setting with the session range,
1675 because we keep a direct reference to it and use its start/end directly.
1677 _session_range_location = location;
1680 if (location->is_mark()) {
1681 /* listen for per-location signals that require us to do any * global updates for marks */
1683 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1684 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1685 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1686 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1689 if (location->is_skip()) {
1690 /* listen for per-location signals that require us to update skip-locate events */
1692 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1693 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1694 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1695 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, false));
1697 update_skips (location, true);
1704 Session::location_removed (Location *location)
1706 if (location->is_auto_loop()) {
1707 set_auto_loop_location (0);
1708 set_track_loop (false);
1711 if (location->is_auto_punch()) {
1712 set_auto_punch_location (0);
1715 if (location->is_session_range()) {
1716 /* this is never supposed to happen */
1717 error << _("programming error: session range removed!") << endl;
1720 if (location->is_skip()) {
1722 update_skips (location, false);
1729 Session::locations_changed ()
1731 _locations->apply (*this, &Session::_locations_changed);
1735 Session::_locations_changed (const Locations::LocationList& locations)
1737 /* There was some mass-change in the Locations object.
1739 We might be re-adding a location here but it doesn't actually matter
1740 for all the locations that the Session takes an interest in.
1744 PBD::Unwinder<bool> protect_ignore_skip_updates (_ignore_skips_updates, true);
1745 for (Locations::LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
1746 location_added (*i);
1750 update_skips (NULL, false);
1754 Session::enable_record ()
1756 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1757 /* no recording at anything except normal speed */
1762 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1764 if (rs == Recording) {
1768 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1770 _last_record_location = _transport_frame;
1771 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1773 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1774 set_track_monitor_input_status (true);
1777 RecordStateChanged ();
1784 Session::disable_record (bool rt_context, bool force)
1788 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1790 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1791 g_atomic_int_set (&_record_status, Disabled);
1792 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1794 if (rs == Recording) {
1795 g_atomic_int_set (&_record_status, Enabled);
1799 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1800 set_track_monitor_input_status (false);
1803 RecordStateChanged (); /* emit signal */
1806 remove_pending_capture_state ();
1812 Session::step_back_from_record ()
1814 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1816 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1817 set_track_monitor_input_status (false);
1820 RecordStateChanged (); /* emit signal */
1825 Session::maybe_enable_record ()
1827 if (_step_editors > 0) {
1831 g_atomic_int_set (&_record_status, Enabled);
1833 /* This function is currently called from somewhere other than an RT thread.
1834 This save_state() call therefore doesn't impact anything. Doing it here
1835 means that we save pending state of which sources the next record will use,
1836 which gives us some chance of recovering from a crash during the record.
1839 save_state ("", true);
1841 if (_transport_speed) {
1842 if (!config.get_punch_in()) {
1846 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1847 RecordStateChanged (); /* EMIT SIGNAL */
1854 Session::audible_frame () const
1860 offset = worst_playback_latency ();
1862 if (synced_to_engine()) {
1863 /* Note: this is basically just sync-to-JACK */
1864 tf = _engine.transport_frame();
1866 tf = _transport_frame;
1871 if (!non_realtime_work_pending()) {
1875 /* Check to see if we have passed the first guaranteed
1876 audible frame past our last start position. if not,
1877 return that last start point because in terms
1878 of audible frames, we have not moved yet.
1880 `Start position' in this context means the time we last
1881 either started, located, or changed transport direction.
1884 if (_transport_speed > 0.0f) {
1886 if (!play_loop || !have_looped) {
1887 if (tf < _last_roll_or_reversal_location + offset) {
1888 return _last_roll_or_reversal_location;
1896 } else if (_transport_speed < 0.0f) {
1898 /* XXX wot? no backward looping? */
1900 if (tf > _last_roll_or_reversal_location - offset) {
1901 return _last_roll_or_reversal_location;
1913 Session::set_frame_rate (framecnt_t frames_per_second)
1915 /** \fn void Session::set_frame_size(framecnt_t)
1916 the AudioEngine object that calls this guarantees
1917 that it will not be called while we are also in
1918 ::process(). Its fine to do things that block
1922 _base_frame_rate = frames_per_second;
1923 _nominal_frame_rate = frames_per_second;
1928 reset_write_sources (false);
1930 // XXX we need some equivalent to this, somehow
1931 // SndFileSource::setup_standard_crossfades (frames_per_second);
1935 /* XXX need to reset/reinstantiate all LADSPA plugins */
1939 Session::set_block_size (pframes_t nframes)
1941 /* the AudioEngine guarantees
1942 that it will not be called while we are also in
1943 ::process(). It is therefore fine to do things that block
1948 current_block_size = nframes;
1952 boost::shared_ptr<RouteList> r = routes.reader ();
1954 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1955 (*i)->set_block_size (nframes);
1958 boost::shared_ptr<RouteList> rl = routes.reader ();
1959 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1960 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1962 tr->set_block_size (nframes);
1966 set_worst_io_latencies ();
1972 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1974 boost::shared_ptr<Route> r2;
1976 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1977 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1981 /* make a copy of the existing list of routes that feed r1 */
1983 Route::FedBy existing (r1->fed_by());
1985 /* for each route that feeds r1, recurse, marking it as feeding
1989 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1990 if (!(r2 = i->r.lock ())) {
1991 /* (*i) went away, ignore it */
1995 /* r2 is a route that feeds r1 which somehow feeds base. mark
1996 base as being fed by r2
1999 rbase->add_fed_by (r2, i->sends_only);
2003 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
2007 if (r1->feeds (r2) && r2->feeds (r1)) {
2011 /* now recurse, so that we can mark base as being fed by
2012 all routes that feed r2
2015 trace_terminal (r2, rbase);
2022 Session::resort_routes ()
2024 /* don't do anything here with signals emitted
2025 by Routes during initial setup or while we
2026 are being destroyed.
2029 if (_state_of_the_state & (InitialConnecting | Deletion)) {
2034 RCUWriter<RouteList> writer (routes);
2035 boost::shared_ptr<RouteList> r = writer.get_copy ();
2036 resort_routes_using (r);
2037 /* writer goes out of scope and forces update */
2041 boost::shared_ptr<RouteList> rl = routes.reader ();
2042 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2043 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
2045 const Route::FedBy& fb ((*i)->fed_by());
2047 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
2048 boost::shared_ptr<Route> sf = f->r.lock();
2050 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
2058 /** This is called whenever we need to rebuild the graph of how we will process
2060 * @param r List of routes, in any order.
2064 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
2066 /* We are going to build a directed graph of our routes;
2067 this is where the edges of that graph are put.
2072 /* Go through all routes doing two things:
2074 * 1. Collect the edges of the route graph. Each of these edges
2075 * is a pair of routes, one of which directly feeds the other
2076 * either by a JACK connection or by an internal send.
2078 * 2. Begin the process of making routes aware of which other
2079 * routes directly or indirectly feed them. This information
2080 * is used by the solo code.
2083 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2085 /* Clear out the route's list of direct or indirect feeds */
2086 (*i)->clear_fed_by ();
2088 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
2090 bool via_sends_only;
2092 /* See if this *j feeds *i according to the current state of the JACK
2093 connections and internal sends.
2095 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
2096 /* add the edge to the graph (part #1) */
2097 edges.add (*j, *i, via_sends_only);
2098 /* tell the route (for part #2) */
2099 (*i)->add_fed_by (*j, via_sends_only);
2104 /* Attempt a topological sort of the route graph */
2105 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
2107 if (sorted_routes) {
2108 /* We got a satisfactory topological sort, so there is no feedback;
2111 Note: the process graph rechain does not require a
2112 topologically-sorted list, but hey ho.
2114 if (_process_graph) {
2115 _process_graph->rechain (sorted_routes, edges);
2118 _current_route_graph = edges;
2120 /* Complete the building of the routes' lists of what directly
2121 or indirectly feeds them.
2123 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2124 trace_terminal (*i, *i);
2127 *r = *sorted_routes;
2130 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
2131 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2132 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
2133 (*i)->name(), (*i)->order_key ()));
2137 SuccessfulGraphSort (); /* EMIT SIGNAL */
2140 /* The topological sort failed, so we have a problem. Tell everyone
2141 and stick to the old graph; this will continue to be processed, so
2142 until the feedback is fixed, what is played back will not quite
2143 reflect what is actually connected. Note also that we do not
2144 do trace_terminal here, as it would fail due to an endless recursion,
2145 so the solo code will think that everything is still connected
2149 FeedbackDetected (); /* EMIT SIGNAL */
2154 /** Find a route name starting with \a base, maybe followed by the
2155 * lowest \a id. \a id will always be added if \a definitely_add_number
2156 * is true on entry; otherwise it will only be added if required
2157 * to make the name unique.
2159 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
2160 * The available route name with the lowest ID will be used, and \a id
2161 * will be set to the ID.
2163 * \return false if a route name could not be found, and \a track_name
2164 * and \a id do not reflect a free route name.
2167 Session::find_route_name (string const & base, uint32_t& id, string& name, bool definitely_add_number)
2169 if (!definitely_add_number && route_by_name (base) == 0) {
2170 /* juse use the base */
2176 name = string_compose ("%1 %2", base, id);
2178 if (route_by_name (name) == 0) {
2184 } while (id < (UINT_MAX-1));
2189 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
2191 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
2193 in = ChanCount::ZERO;
2194 out = ChanCount::ZERO;
2196 boost::shared_ptr<RouteList> r = routes.reader ();
2198 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2199 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2200 if (tr && !tr->is_auditioner()) {
2201 in += tr->n_inputs();
2202 out += tr->n_outputs();
2207 /** Caller must not hold process lock
2208 * @param name_template string to use for the start of the name, or "" to use "MIDI".
2209 * @param instrument plugin info for the instrument to insert pre-fader, if any
2211 list<boost::shared_ptr<MidiTrack> >
2212 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
2213 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
2216 uint32_t track_id = 0;
2218 RouteList new_routes;
2219 list<boost::shared_ptr<MidiTrack> > ret;
2221 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
2224 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, use_number)) {
2225 error << "cannot find name for new midi track" << endmsg;
2229 boost::shared_ptr<MidiTrack> track;
2232 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
2234 if (track->init ()) {
2238 track->use_new_diskstream();
2240 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2241 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2244 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2245 if (track->input()->ensure_io (input, false, this)) {
2246 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
2250 if (track->output()->ensure_io (output, false, this)) {
2251 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
2256 track->non_realtime_input_change();
2259 route_group->add (track);
2262 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2264 if (Config->get_remote_model() == UserOrdered) {
2265 track->set_remote_control_id (next_control_id());
2268 new_routes.push_back (track);
2269 ret.push_back (track);
2271 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2274 catch (failed_constructor &err) {
2275 error << _("Session: could not create new midi track.") << endmsg;
2279 catch (AudioEngine::PortRegistrationFailure& pfe) {
2281 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;
2289 if (!new_routes.empty()) {
2290 StateProtector sp (this);
2291 if (Profile->get_trx()) {
2292 add_routes (new_routes, false, false, false);
2294 add_routes (new_routes, true, true, false);
2298 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
2299 PluginPtr plugin = instrument->load (*this);
2300 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2301 (*r)->add_processor (p, PreFader);
2311 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2313 boost::shared_ptr<Route> midi_track (wmt.lock());
2319 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2321 if (change.after.n_audio() <= change.before.n_audio()) {
2325 /* new audio ports: make sure the audio goes somewhere useful,
2326 unless the user has no-auto-connect selected.
2328 The existing ChanCounts don't matter for this call as they are only
2329 to do with matching input and output indices, and we are only changing
2335 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
2339 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
2340 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
2341 * @param output_start As \a input_start, but for outputs.
2344 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
2345 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
2347 if (!IO::connecting_legal) {
2351 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2357 /* If both inputs and outputs are auto-connected to physical ports,
2358 use the max of input and output offsets to ensure auto-connected
2359 port numbers always match up (e.g. the first audio input and the
2360 first audio output of the route will have the same physical
2361 port number). Otherwise just use the lowest input or output
2365 DEBUG_TRACE (DEBUG::Graph,
2366 string_compose("Auto-connect: existing in = %1 out = %2\n",
2367 existing_inputs, existing_outputs));
2369 const bool in_out_physical =
2370 (Config->get_input_auto_connect() & AutoConnectPhysical)
2371 && (Config->get_output_auto_connect() & AutoConnectPhysical)
2374 const ChanCount in_offset = in_out_physical
2375 ? ChanCount::max(existing_inputs, existing_outputs)
2378 const ChanCount out_offset = in_out_physical
2379 ? ChanCount::max(existing_inputs, existing_outputs)
2382 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2383 vector<string> physinputs;
2384 vector<string> physoutputs;
2386 _engine.get_physical_outputs (*t, physoutputs);
2387 _engine.get_physical_inputs (*t, physinputs);
2389 if (!physinputs.empty() && connect_inputs) {
2390 uint32_t nphysical_in = physinputs.size();
2392 DEBUG_TRACE (DEBUG::Graph,
2393 string_compose("There are %1 physical inputs of type %2\n",
2396 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
2399 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
2400 DEBUG_TRACE (DEBUG::Graph,
2401 string_compose("Get index %1 + %2 % %3 = %4\n",
2402 in_offset.get(*t), i, nphysical_in,
2403 (in_offset.get(*t) + i) % nphysical_in));
2404 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
2407 DEBUG_TRACE (DEBUG::Graph,
2408 string_compose("Connect route %1 IN to %2\n",
2409 route->name(), port));
2411 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
2415 ChanCount one_added (*t, 1);
2416 existing_inputs += one_added;
2420 if (!physoutputs.empty()) {
2421 uint32_t nphysical_out = physoutputs.size();
2422 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
2426 * do not create new connections if we reached the limit of physical outputs
2430 if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
2431 ARDOUR::Profile->get_trx () &&
2432 existing_outputs.get(*t) == nphysical_out ) {
2436 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
2437 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
2438 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
2439 /* master bus is audio only */
2440 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
2441 port = _master_out->input()->ports().port(*t,
2442 i % _master_out->input()->n_ports().get(*t))->name();
2446 DEBUG_TRACE (DEBUG::Graph,
2447 string_compose("Connect route %1 OUT to %2\n",
2448 route->name(), port));
2450 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
2454 ChanCount one_added (*t, 1);
2455 existing_outputs += one_added;
2461 #ifdef USE_TRACKS_CODE_FEATURES
2464 compare_routes_by_remote_id (const boost::shared_ptr<Route>& route1, const boost::shared_ptr<Route>& route2)
2466 return route1->remote_control_id() < route2->remote_control_id();
2470 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2472 // it is not allowed to perform connection
2473 if (!IO::connecting_legal) {
2477 // if we are deleting routes we will call this once at the end
2478 if (_route_deletion_in_progress) {
2482 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2488 // We need to disconnect the route's inputs and outputs first
2489 // basing on autoconnect configuration
2490 bool reconnectIputs = !(Config->get_input_auto_connect() & ManualConnect) && reconnect_inputs;
2491 bool reconnectOutputs = !(Config->get_output_auto_connect() & ManualConnect) && reconnect_outputs;
2493 ChanCount existing_inputs;
2494 ChanCount existing_outputs;
2495 count_existing_track_channels (existing_inputs, existing_outputs);
2497 //ChanCount inputs = ChanCount::ZERO;
2498 //ChanCount outputs = ChanCount::ZERO;
2500 RouteList existing_routes = *routes.reader ();
2501 existing_routes.sort (compare_routes_by_remote_id);
2504 PBD::Unwinder<bool> protect_ignore_changes (_reconnecting_routes_in_progress, true);
2506 vector<string> physinputs;
2507 vector<string> physoutputs;
2509 EngineStateController::instance()->get_physical_audio_outputs(physoutputs);
2510 EngineStateController::instance()->get_physical_audio_inputs(physinputs);
2512 uint32_t input_n = 0;
2513 uint32_t output_n = 0;
2514 RouteList::iterator rIter = existing_routes.begin();
2515 const AutoConnectOption current_input_auto_connection (Config->get_input_auto_connect());
2516 const AutoConnectOption current_output_auto_connection (Config->get_output_auto_connect());
2517 for (; rIter != existing_routes.end(); ++rIter) {
2518 if (*rIter == _master_out || *rIter == _monitor_out ) {
2522 if (current_output_auto_connection == AutoConnectPhysical) {
2523 (*rIter)->amp()->deactivate();
2524 } else if (current_output_auto_connection == AutoConnectMaster) {
2525 (*rIter)->amp()->activate();
2528 if (reconnectIputs) {
2529 (*rIter)->input()->disconnect (this); //GZ: check this; could be heavy
2531 for (uint32_t route_input_n = 0; route_input_n < (*rIter)->n_inputs().get(DataType::AUDIO); ++route_input_n) {
2533 if (current_input_auto_connection & AutoConnectPhysical) {
2535 if ( input_n == physinputs.size() ) {
2539 string port = physinputs[input_n];
2541 if (port.empty() ) {
2542 error << "Physical Input number "<< input_n << " is unavailable and cannot be connected" << endmsg;
2545 //GZ: check this; could be heavy
2546 (*rIter)->input()->connect ((*rIter)->input()->ports().port(DataType::AUDIO, route_input_n), port, this);
2552 if (reconnectOutputs) {
2554 //normalize route ouptuts: reduce the amount outputs to be equal to the amount of inputs
2555 if (current_output_auto_connection & AutoConnectPhysical) {
2557 //GZ: check this; could be heavy
2558 (*rIter)->output()->disconnect (this);
2559 size_t route_inputs_count = (*rIter)->n_inputs().get(DataType::AUDIO);
2561 //GZ: check this; could be heavy
2562 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, route_inputs_count), false, this );
2564 } else if (current_output_auto_connection & AutoConnectMaster){
2566 if (!reconnect_master) {
2570 //GZ: check this; could be heavy
2571 (*rIter)->output()->disconnect (this);
2574 uint32_t master_inputs_count = _master_out->n_inputs().get(DataType::AUDIO);
2575 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, master_inputs_count), false, this );
2577 error << error << "Master bus is not available" << endmsg;
2582 for (uint32_t route_output_n = 0; route_output_n < (*rIter)->n_outputs().get(DataType::AUDIO); ++route_output_n) {
2583 if (current_output_auto_connection & AutoConnectPhysical) {
2585 if ( output_n == physoutputs.size() ) {
2589 string port = physoutputs[output_n];
2591 if (port.empty() ) {
2592 error << "Physical Output number "<< output_n << " is unavailable and cannot be connected" << endmsg;
2595 //GZ: check this; could be heavy
2596 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2599 } else if (current_output_auto_connection & AutoConnectMaster) {
2601 if ( route_output_n == _master_out->n_inputs().get(DataType::AUDIO) ) {
2605 // connect to master bus
2606 string port = _master_out->input()->ports().port(DataType::AUDIO, route_output_n)->name();
2608 if (port.empty() ) {
2609 error << "MasterBus Input number "<< route_output_n << " is unavailable and cannot be connected" << endmsg;
2613 //GZ: check this; could be heavy
2614 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2620 //auto_connect_route (*rIter, inputs, outputs, false, reconnectIputs);
2623 _master_out->output()->disconnect (this);
2624 auto_connect_master_bus ();
2629 session_routes_reconnected (); /* EMIT SIGNAL */
2633 Session::reconnect_midi_scene_ports(bool inputs)
2637 boost::shared_ptr<MidiPort> scene_in_ptr = scene_in();
2639 scene_in_ptr->disconnect_all ();
2641 std::vector<EngineStateController::MidiPortState> midi_port_states;
2642 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2644 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2646 for (; state_iter != midi_port_states.end(); ++state_iter) {
2647 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2648 scene_in_ptr->connect (state_iter->name);
2655 boost::shared_ptr<MidiPort> scene_out_ptr = scene_out();
2657 if (scene_out_ptr ) {
2658 scene_out_ptr->disconnect_all ();
2660 std::vector<EngineStateController::MidiPortState> midi_port_states;
2661 EngineStateController::instance()->get_physical_midi_output_states (midi_port_states);
2663 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2665 for (; state_iter != midi_port_states.end(); ++state_iter) {
2666 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2667 scene_out_ptr->connect (state_iter->name);
2675 Session::reconnect_mtc_ports ()
2677 boost::shared_ptr<MidiPort> mtc_in_ptr = _midi_ports->mtc_input_port();
2683 mtc_in_ptr->disconnect_all ();
2685 std::vector<EngineStateController::MidiPortState> midi_port_states;
2686 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2688 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2690 for (; state_iter != midi_port_states.end(); ++state_iter) {
2691 if (state_iter->available && state_iter->mtc_in) {
2692 mtc_in_ptr->connect (state_iter->name);
2696 if (!_midi_ports->mtc_input_port ()->connected () &&
2697 config.get_external_sync () &&
2698 (Config->get_sync_source () == MTC) ) {
2699 config.set_external_sync (false);
2702 if ( ARDOUR::Profile->get_trx () ) {
2703 // Tracks need this signal to update timecode_source_dropdown
2704 MtcOrLtcInputPortChanged (); //emit signal
2709 Session::reconnect_mmc_ports(bool inputs)
2711 if (inputs ) { // get all enabled midi input ports
2713 boost::shared_ptr<MidiPort> mmc_in_ptr = _midi_ports->mmc_in();
2715 mmc_in_ptr->disconnect_all ();
2716 std::vector<std::string> enabled_midi_inputs;
2717 EngineStateController::instance()->get_physical_midi_inputs (enabled_midi_inputs);
2719 std::vector<std::string>::iterator port_iter = enabled_midi_inputs.begin();
2721 for (; port_iter != enabled_midi_inputs.end(); ++port_iter) {
2722 mmc_in_ptr->connect (*port_iter);
2726 } else { // get all enabled midi output ports
2728 boost::shared_ptr<MidiPort> mmc_out_ptr = _midi_ports->mmc_out();
2730 mmc_out_ptr->disconnect_all ();
2731 std::vector<std::string> enabled_midi_outputs;
2732 EngineStateController::instance()->get_physical_midi_outputs (enabled_midi_outputs);
2734 std::vector<std::string>::iterator port_iter = enabled_midi_outputs.begin();
2736 for (; port_iter != enabled_midi_outputs.end(); ++port_iter) {
2737 mmc_out_ptr->connect (*port_iter);
2745 /** Caller must not hold process lock
2746 * @param name_template string to use for the start of the name, or "" to use "Audio".
2748 list< boost::shared_ptr<AudioTrack> >
2749 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
2750 uint32_t how_many, string name_template)
2753 uint32_t track_id = 0;
2755 RouteList new_routes;
2756 list<boost::shared_ptr<AudioTrack> > ret;
2758 string name_pattern;
2760 if (Profile->get_trx() ) {
2761 name_pattern = "Track ";
2763 name_pattern = "Audio ";
2766 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _(name_pattern.c_str() );
2770 if (!find_route_name (name_template.empty() ? _(name_pattern.c_str()) : name_template, ++track_id, track_name, use_number)) {
2771 error << "cannot find name for new audio track" << endmsg;
2775 boost::shared_ptr<AudioTrack> track;
2778 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
2780 if (track->init ()) {
2784 if (ARDOUR::Profile->get_trx ()) {
2785 // TRACKS considers it's not a USE CASE, it's
2786 // a piece of behavior of the session model:
2788 // Gain for a newly created route depends on
2789 // the current output_auto_connect mode:
2791 // 0 for Stereo Out mode
2793 if (Config->get_output_auto_connect() & AutoConnectMaster) {
2794 track->set_gain (dB_to_coefficient (0), 0);
2798 track->use_new_diskstream();
2800 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2801 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2804 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2806 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2807 error << string_compose (
2808 _("cannot configure %1 in/%2 out configuration for new audio track"),
2809 input_channels, output_channels)
2814 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2815 error << string_compose (
2816 _("cannot configure %1 in/%2 out configuration for new audio track"),
2817 input_channels, output_channels)
2824 route_group->add (track);
2827 track->non_realtime_input_change();
2829 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2830 if (Config->get_remote_model() == UserOrdered) {
2831 track->set_remote_control_id (next_control_id());
2834 new_routes.push_back (track);
2835 ret.push_back (track);
2837 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2840 catch (failed_constructor &err) {
2841 error << _("Session: could not create new audio track.") << endmsg;
2845 catch (AudioEngine::PortRegistrationFailure& pfe) {
2847 error << pfe.what() << endmsg;
2855 if (!new_routes.empty()) {
2856 StateProtector sp (this);
2857 if (Profile->get_trx()) {
2858 add_routes (new_routes, false, false, false);
2860 add_routes (new_routes, true, true, false);
2867 /** Caller must not hold process lock.
2868 * @param name_template string to use for the start of the name, or "" to use "Bus".
2871 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
2874 uint32_t bus_id = 0;
2878 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
2881 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, use_number)) {
2882 error << "cannot find name for new audio bus" << endmsg;
2887 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
2893 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2894 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
2897 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2899 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2900 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2901 input_channels, output_channels)
2907 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2908 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2909 input_channels, output_channels)
2916 route_group->add (bus);
2918 if (Config->get_remote_model() == UserOrdered) {
2919 bus->set_remote_control_id (next_control_id());
2922 bus->add_internal_return ();
2924 ret.push_back (bus);
2926 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2932 catch (failed_constructor &err) {
2933 error << _("Session: could not create new audio route.") << endmsg;
2937 catch (AudioEngine::PortRegistrationFailure& pfe) {
2938 error << pfe.what() << endmsg;
2948 StateProtector sp (this);
2949 if (Profile->get_trx()) {
2950 add_routes (ret, false, false, false);
2952 add_routes (ret, false, true, true); // autoconnect // outputs only
2961 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base)
2964 uint32_t control_id;
2966 uint32_t number = 0;
2967 const uint32_t being_added = how_many;
2969 if (!tree.read (template_path.c_str())) {
2973 XMLNode* node = tree.root();
2975 IO::disable_connecting ();
2977 control_id = next_control_id ();
2981 XMLNode node_copy (*node);
2983 /* Remove IDs of everything so that new ones are used */
2984 node_copy.remove_property_recursively (X_("id"));
2989 if (!name_base.empty()) {
2991 /* if we're adding more than one routes, force
2992 * all the names of the new routes to be
2993 * numbered, via the final parameter.
2996 if (!find_route_name (name_base.c_str(), ++number, name, (being_added > 1))) {
2997 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3003 string const route_name = node_copy.property(X_("name"))->value ();
3005 /* generate a new name by adding a number to the end of the template name */
3006 if (!find_route_name (route_name.c_str(), ++number, name, true)) {
3007 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3008 abort(); /*NOTREACHED*/
3012 /* set this name in the XML description that we are about to use */
3013 Route::set_name_in_state (node_copy, name);
3015 /* trim bitslots from listen sends so that new ones are used */
3016 XMLNodeList children = node_copy.children ();
3017 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
3018 if ((*i)->name() == X_("Processor")) {
3019 XMLProperty* role = (*i)->property (X_("role"));
3020 if (role && role->value() == X_("Listen")) {
3021 (*i)->remove_property (X_("bitslot"));
3026 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
3029 error << _("Session: cannot create track/bus from template description") << endmsg;
3033 if (boost::dynamic_pointer_cast<Track>(route)) {
3034 /* force input/output change signals so that the new diskstream
3035 picks up the configuration of the route. During session
3036 loading this normally happens in a different way.
3039 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3041 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
3042 change.after = route->input()->n_ports();
3043 route->input()->changed (change, this);
3044 change.after = route->output()->n_ports();
3045 route->output()->changed (change, this);
3048 route->set_remote_control_id (control_id);
3051 ret.push_back (route);
3053 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
3056 catch (failed_constructor &err) {
3057 error << _("Session: could not create new route from template") << endmsg;
3061 catch (AudioEngine::PortRegistrationFailure& pfe) {
3062 error << pfe.what() << endmsg;
3071 StateProtector sp (this);
3072 if (Profile->get_trx()) {
3073 add_routes (ret, false, false, false);
3075 add_routes (ret, true, true, false);
3077 IO::enable_connecting ();
3084 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
3087 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
3088 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
3091 error << _("Adding new tracks/busses failed") << endmsg;
3096 update_latency (true);
3097 update_latency (false);
3102 save_state (_current_snapshot_name);
3105 reassign_track_numbers();
3107 update_route_record_state ();
3109 RouteAdded (new_routes); /* EMIT SIGNAL */
3113 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
3115 ChanCount existing_inputs;
3116 ChanCount existing_outputs;
3117 uint32_t order = next_control_id();
3119 if (_order_hint > -1) {
3120 order = _order_hint;
3124 count_existing_track_channels (existing_inputs, existing_outputs);
3127 RCUWriter<RouteList> writer (routes);
3128 boost::shared_ptr<RouteList> r = writer.get_copy ();
3129 r->insert (r->end(), new_routes.begin(), new_routes.end());
3131 /* if there is no control out and we're not in the middle of loading,
3132 resort the graph here. if there is a control out, we will resort
3133 toward the end of this method. if we are in the middle of loading,
3134 we will resort when done.
3137 if (!_monitor_out && IO::connecting_legal) {
3138 resort_routes_using (r);
3142 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3144 boost::weak_ptr<Route> wpr (*x);
3145 boost::shared_ptr<Route> r (*x);
3147 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
3148 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
3149 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
3150 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
3151 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
3152 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
3154 if (r->is_master()) {
3158 if (r->is_monitor()) {
3162 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
3164 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
3165 track_playlist_changed (boost::weak_ptr<Track> (tr));
3166 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
3168 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
3170 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
3171 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
3176 if (input_auto_connect || output_auto_connect) {
3177 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
3180 /* order keys are a GUI responsibility but we need to set up
3181 reasonable defaults because they also affect the remote control
3182 ID in most situations.
3185 if (!r->has_order_key ()) {
3186 if (r->is_auditioner()) {
3187 /* use an arbitrarily high value */
3188 r->set_order_key (UINT_MAX);
3190 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
3191 r->set_order_key (order);
3199 if (_monitor_out && IO::connecting_legal) {
3200 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
3202 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3203 if ((*x)->is_monitor()) {
3205 } else if ((*x)->is_master()) {
3208 (*x)->enable_monitor_send ();
3215 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
3217 boost::shared_ptr<RouteList> r = routes.reader ();
3218 boost::shared_ptr<Send> s;
3220 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3221 if ((s = (*i)->internal_send_for (dest)) != 0) {
3222 s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO);
3228 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
3230 boost::shared_ptr<RouteList> r = routes.reader ();
3231 boost::shared_ptr<Send> s;
3233 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3234 if ((s = (*i)->internal_send_for (dest)) != 0) {
3235 s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY);
3241 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
3243 boost::shared_ptr<RouteList> r = routes.reader ();
3244 boost::shared_ptr<Send> s;
3246 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3247 if ((s = (*i)->internal_send_for (dest)) != 0) {
3248 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
3253 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
3255 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
3257 boost::shared_ptr<RouteList> r = routes.reader ();
3258 boost::shared_ptr<RouteList> t (new RouteList);
3260 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3261 /* no MIDI sends because there are no MIDI busses yet */
3262 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
3267 add_internal_sends (dest, p, t);
3271 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
3273 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
3274 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
3279 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
3281 add_internal_send (dest, sender->before_processor_for_index (index), sender);
3285 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
3287 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
3291 if (!dest->internal_return()) {
3292 dest->add_internal_return ();
3295 sender->add_aux_send (dest, before);
3302 Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
3304 { // RCU Writer scope
3305 RCUWriter<RouteList> writer (routes);
3306 boost::shared_ptr<RouteList> rs = writer.get_copy ();
3309 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3311 if (*iter == _master_out) {
3315 (*iter)->set_solo (false, this);
3319 /* deleting the master out seems like a dumb
3320 idea, but its more of a UI policy issue
3324 if (*iter == _master_out) {
3325 _master_out = boost::shared_ptr<Route> ();
3328 if (*iter == _monitor_out) {
3329 _monitor_out.reset ();
3332 update_route_solo_state ();
3334 // We need to disconnect the route's inputs and outputs
3336 (*iter)->input()->disconnect (0);
3337 (*iter)->output()->disconnect (0);
3339 /* if the route had internal sends sending to it, remove them */
3340 if ((*iter)->internal_return()) {
3342 boost::shared_ptr<RouteList> r = routes.reader ();
3343 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3344 boost::shared_ptr<Send> s = (*i)->internal_send_for (*iter);
3346 (*i)->remove_processor (s);
3351 /* if the monitoring section had a pointer to this route, remove it */
3352 if (_monitor_out && !(*iter)->is_master() && !(*iter)->is_monitor()) {
3353 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3354 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
3355 (*iter)->remove_aux_or_listen (_monitor_out);
3358 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*iter);
3359 if (mt && mt->step_editing()) {
3360 if (_step_editors > 0) {
3365 RouteAddedOrRemoved (false); /* EMIT SIGNAL */
3368 /* writer goes out of scope, forces route list update */
3370 } // end of RCU Writer scope
3372 update_latency_compensation ();
3375 /* Re-sort routes to remove the graph's current references to the one that is
3376 * going away, then flush old references out of the graph.
3377 * Wave Tracks: reconnect routes
3380 #ifdef USE_TRACKS_CODE_FEATURES
3381 reconnect_existing_routes(true, false);
3386 if (_process_graph) {
3387 _process_graph->clear_other_chain ();
3390 /* get rid of it from the dead wood collection in the route list manager */
3391 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
3395 /* try to cause everyone to drop their references
3396 * and unregister ports from the backend
3398 PBD::Unwinder<bool> uw_flag (_route_deletion_in_progress, true);
3400 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3401 (*iter)->drop_references ();
3404 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
3406 /* save the new state of the world */
3408 if (save_state (_current_snapshot_name)) {
3409 save_history (_current_snapshot_name);
3412 reassign_track_numbers();
3413 update_route_record_state ();
3417 Session::remove_route (boost::shared_ptr<Route> route)
3419 boost::shared_ptr<RouteList> rl (new RouteList);
3420 rl->push_back (route);
3425 Session::route_mute_changed (void* /*src*/)
3431 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3433 boost::shared_ptr<Route> route = wpr.lock();
3435 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
3439 if (route->listening_via_monitor ()) {
3441 if (Config->get_exclusive_solo()) {
3442 /* new listen: disable all other listen */
3443 boost::shared_ptr<RouteList> r = routes.reader ();
3444 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3445 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3448 (*i)->set_listen (false, this);
3454 } else if (_listen_cnt > 0) {
3459 update_route_solo_state ();
3462 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3464 boost::shared_ptr<Route> route = wpr.lock ();
3467 /* should not happen */
3468 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
3472 bool send_changed = false;
3474 if (route->solo_isolated()) {
3475 if (_solo_isolated_cnt == 0) {
3476 send_changed = true;
3478 _solo_isolated_cnt++;
3479 } else if (_solo_isolated_cnt > 0) {
3480 _solo_isolated_cnt--;
3481 if (_solo_isolated_cnt == 0) {
3482 send_changed = true;
3487 IsolatedChanged (); /* EMIT SIGNAL */
3492 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
3494 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
3496 if (!self_solo_change) {
3497 // session doesn't care about changes to soloed-by-others
3501 if (solo_update_disabled) {
3503 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
3507 boost::shared_ptr<Route> route = wpr.lock ();
3510 boost::shared_ptr<RouteList> r = routes.reader ();
3513 if (route->self_soloed()) {
3519 RouteGroup* rg = route->route_group ();
3520 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
3522 if (delta == 1 && Config->get_exclusive_solo()) {
3524 /* new solo: disable all other solos, but not the group if its solo-enabled */
3526 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3527 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3528 (leave_group_alone && ((*i)->route_group() == rg))) {
3531 (*i)->set_solo (false, this);
3535 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3537 solo_update_disabled = true;
3539 RouteList uninvolved;
3541 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
3543 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3544 bool via_sends_only;
3545 bool in_signal_flow;
3547 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3548 (leave_group_alone && ((*i)->route_group() == rg))) {
3552 in_signal_flow = false;
3554 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3556 if ((*i)->feeds (route, &via_sends_only)) {
3557 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3558 if (!via_sends_only) {
3559 if (!route->soloed_by_others_upstream()) {
3560 (*i)->mod_solo_by_others_downstream (delta);
3563 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3565 in_signal_flow = true;
3567 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3570 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3572 if (route->feeds (*i, &via_sends_only)) {
3573 /* propagate solo upstream only if routing other than
3574 sends is involved, but do consider the other route
3575 (*i) to be part of the signal flow even if only
3578 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3582 route->soloed_by_others_downstream(),
3583 route->soloed_by_others_upstream()));
3584 if (!via_sends_only) {
3585 if (!route->soloed_by_others_downstream()) {
3586 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3587 (*i)->mod_solo_by_others_upstream (delta);
3589 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
3592 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3594 in_signal_flow = true;
3596 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3599 if (!in_signal_flow) {
3600 uninvolved.push_back (*i);
3604 solo_update_disabled = false;
3605 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3607 update_route_solo_state (r);
3609 /* now notify that the mute state of the routes not involved in the signal
3610 pathway of the just-solo-changed route may have altered.
3613 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3614 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
3615 (*i)->act_on_mute ();
3616 (*i)->mute_changed (this);
3619 SoloChanged (); /* EMIT SIGNAL */
3624 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
3626 /* now figure out if anything that matters is soloed (or is "listening")*/
3628 bool something_soloed = false;
3629 uint32_t listeners = 0;
3630 uint32_t isolated = 0;
3633 r = routes.reader();
3636 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3637 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
3638 something_soloed = true;
3641 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
3642 if (Config->get_solo_control_is_listen_control()) {
3645 (*i)->set_listen (false, this);
3649 if ((*i)->solo_isolated()) {
3654 if (something_soloed != _non_soloed_outs_muted) {
3655 _non_soloed_outs_muted = something_soloed;
3656 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
3659 _listen_cnt = listeners;
3661 if (isolated != _solo_isolated_cnt) {
3662 _solo_isolated_cnt = isolated;
3663 IsolatedChanged (); /* EMIT SIGNAL */
3666 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
3667 something_soloed, listeners, isolated));
3670 boost::shared_ptr<RouteList>
3671 Session::get_routes_with_internal_returns() const
3673 boost::shared_ptr<RouteList> r = routes.reader ();
3674 boost::shared_ptr<RouteList> rl (new RouteList);
3676 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3677 if ((*i)->internal_return ()) {
3685 Session::io_name_is_legal (const std::string& name)
3687 boost::shared_ptr<RouteList> r = routes.reader ();
3689 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3690 if ((*i)->name() == name) {
3694 if ((*i)->has_io_processor_named (name)) {
3703 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
3706 vector<string> connections;
3708 /* if we are passed only a single route and we're not told to turn
3709 * others off, then just do the simple thing.
3712 if (flip_others == false && rl->size() == 1) {
3713 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
3715 mt->set_input_active (onoff);
3720 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
3722 PortSet& ps ((*rt)->input()->ports());
3724 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
3725 p->get_connections (connections);
3728 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
3729 routes_using_input_from (*s, rl2);
3732 /* scan all relevant routes to see if others are on or off */
3734 bool others_are_already_on = false;
3736 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3738 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3744 if ((*r) != (*rt)) {
3745 if (mt->input_active()) {
3746 others_are_already_on = true;
3749 /* this one needs changing */
3750 mt->set_input_active (onoff);
3756 /* globally reverse other routes */
3758 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3759 if ((*r) != (*rt)) {
3760 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3762 mt->set_input_active (!others_are_already_on);
3771 Session::routes_using_input_from (const string& str, RouteList& rl)
3773 boost::shared_ptr<RouteList> r = routes.reader();
3775 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3776 if ((*i)->input()->connected_to (str)) {
3782 boost::shared_ptr<Route>
3783 Session::route_by_name (string name)
3785 boost::shared_ptr<RouteList> r = routes.reader ();
3787 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3788 if ((*i)->name() == name) {
3793 return boost::shared_ptr<Route> ((Route*) 0);
3796 boost::shared_ptr<Route>
3797 Session::route_by_id (PBD::ID id)
3799 boost::shared_ptr<RouteList> r = routes.reader ();
3801 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3802 if ((*i)->id() == id) {
3807 return boost::shared_ptr<Route> ((Route*) 0);
3810 boost::shared_ptr<Track>
3811 Session::track_by_diskstream_id (PBD::ID id)
3813 boost::shared_ptr<RouteList> r = routes.reader ();
3815 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3816 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3817 if (t && t->using_diskstream_id (id)) {
3822 return boost::shared_ptr<Track> ();
3825 boost::shared_ptr<Route>
3826 Session::route_by_remote_id (uint32_t id)
3828 boost::shared_ptr<RouteList> r = routes.reader ();
3830 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3831 if ((*i)->remote_control_id() == id) {
3836 return boost::shared_ptr<Route> ((Route*) 0);
3841 Session::reassign_track_numbers ()
3845 RouteList r (*(routes.reader ()));
3846 SignalOrderRouteSorter sorter;
3849 StateProtector sp (this);
3851 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3852 if (boost::dynamic_pointer_cast<Track> (*i)) {
3853 (*i)->set_track_number(++tn);
3855 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
3856 (*i)->set_track_number(--bn);
3859 const uint32_t decimals = ceilf (log10f (tn + 1));
3860 const bool decimals_changed = _track_number_decimals != decimals;
3861 _track_number_decimals = decimals;
3863 if (decimals_changed && config.get_track_name_number ()) {
3864 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3865 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3867 t->resync_track_name();
3870 // trigger GUI re-layout
3871 config.ParameterChanged("track-name-number");
3876 Session::playlist_region_added (boost::weak_ptr<Region> w)
3878 boost::shared_ptr<Region> r = w.lock ();
3883 /* These are the operations that are currently in progress... */
3884 list<GQuark> curr = _current_trans_quarks;
3887 /* ...and these are the operations during which we want to update
3888 the session range location markers.
3891 ops.push_back (Operations::capture);
3892 ops.push_back (Operations::paste);
3893 ops.push_back (Operations::duplicate_region);
3894 ops.push_back (Operations::insert_file);
3895 ops.push_back (Operations::insert_region);
3896 ops.push_back (Operations::drag_region_brush);
3897 ops.push_back (Operations::region_drag);
3898 ops.push_back (Operations::selection_grab);
3899 ops.push_back (Operations::region_fill);
3900 ops.push_back (Operations::fill_selection);
3901 ops.push_back (Operations::create_region);
3902 ops.push_back (Operations::region_copy);
3903 ops.push_back (Operations::fixed_time_region_copy);
3906 /* See if any of the current operations match the ones that we want */
3908 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
3910 /* If so, update the session range markers */
3912 maybe_update_session_range (r->position (), r->last_frame ());
3916 /** Update the session range markers if a is before the current start or
3917 * b is after the current end.
3920 Session::maybe_update_session_range (framepos_t a, framepos_t b)
3922 if (_state_of_the_state & Loading) {
3926 if (_session_range_location == 0) {
3928 add_session_range_location (a, b);
3932 if (a < _session_range_location->start()) {
3933 _session_range_location->set_start (a);
3936 if (b > _session_range_location->end()) {
3937 _session_range_location->set_end (b);
3943 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
3945 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3946 maybe_update_session_range (i->to, i->to + i->length);
3951 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
3953 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3954 maybe_update_session_range (i->from, i->to);
3958 /* Region management */
3960 boost::shared_ptr<Region>
3961 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
3963 const RegionFactory::RegionMap& regions (RegionFactory::regions());
3964 RegionFactory::RegionMap::const_iterator i;
3965 boost::shared_ptr<Region> region;
3967 Glib::Threads::Mutex::Lock lm (region_lock);
3969 for (i = regions.begin(); i != regions.end(); ++i) {
3973 if (region->whole_file()) {
3975 if (child->source_equivalent (region)) {
3981 return boost::shared_ptr<Region> ();
3985 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
3987 set<boost::shared_ptr<Region> > relevant_regions;
3989 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
3990 RegionFactory::get_regions_using_source (*s, relevant_regions);
3993 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
3994 set<boost::shared_ptr<Region> >::iterator tmp;
3999 playlists->destroy_region (*r);
4000 RegionFactory::map_remove (*r);
4002 (*r)->drop_sources ();
4003 (*r)->drop_references ();
4005 relevant_regions.erase (r);
4010 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
4013 Glib::Threads::Mutex::Lock ls (source_lock);
4014 /* remove from the main source list */
4015 sources.erase ((*s)->id());
4018 (*s)->mark_for_remove ();
4019 (*s)->drop_references ();
4028 Session::remove_last_capture ()
4030 list<boost::shared_ptr<Source> > srcs;
4032 boost::shared_ptr<RouteList> rl = routes.reader ();
4033 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4034 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4039 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
4042 srcs.insert (srcs.end(), l.begin(), l.end());
4047 destroy_sources (srcs);
4049 save_state (_current_snapshot_name);
4054 /* Source Management */
4057 Session::add_source (boost::shared_ptr<Source> source)
4059 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
4060 pair<SourceMap::iterator,bool> result;
4062 entry.first = source->id();
4063 entry.second = source;
4066 Glib::Threads::Mutex::Lock lm (source_lock);
4067 result = sources.insert (entry);
4070 if (result.second) {
4072 /* yay, new source */
4074 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
4077 if (!fs->within_session()) {
4078 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
4084 boost::shared_ptr<AudioFileSource> afs;
4086 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
4087 if (Config->get_auto_analyse_audio()) {
4088 Analyser::queue_source_for_analysis (source, false);
4092 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
4097 Session::remove_source (boost::weak_ptr<Source> src)
4099 if (_state_of_the_state & Deletion) {
4103 SourceMap::iterator i;
4104 boost::shared_ptr<Source> source = src.lock();
4111 Glib::Threads::Mutex::Lock lm (source_lock);
4113 if ((i = sources.find (source->id())) != sources.end()) {
4118 if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
4120 /* save state so we don't end up with a session file
4121 referring to non-existent sources.
4124 save_state (_current_snapshot_name);
4128 boost::shared_ptr<Source>
4129 Session::source_by_id (const PBD::ID& id)
4131 Glib::Threads::Mutex::Lock lm (source_lock);
4132 SourceMap::iterator i;
4133 boost::shared_ptr<Source> source;
4135 if ((i = sources.find (id)) != sources.end()) {
4142 boost::shared_ptr<AudioFileSource>
4143 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
4145 /* Restricted to audio files because only audio sources have channel
4149 Glib::Threads::Mutex::Lock lm (source_lock);
4151 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
4152 boost::shared_ptr<AudioFileSource> afs
4153 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
4155 if (afs && afs->path() == path && chn == afs->channel()) {
4160 return boost::shared_ptr<AudioFileSource>();
4163 boost::shared_ptr<MidiSource>
4164 Session::midi_source_by_path (const std::string& path) const
4166 /* Restricted to MIDI files because audio sources require a channel
4167 for unique identification, in addition to a path.
4170 Glib::Threads::Mutex::Lock lm (source_lock);
4172 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
4173 boost::shared_ptr<MidiSource> ms
4174 = boost::dynamic_pointer_cast<MidiSource>(s->second);
4175 boost::shared_ptr<FileSource> fs
4176 = boost::dynamic_pointer_cast<FileSource>(s->second);
4178 if (ms && fs && fs->path() == path) {
4183 return boost::shared_ptr<MidiSource>();
4187 Session::count_sources_by_origin (const string& path)
4190 Glib::Threads::Mutex::Lock lm (source_lock);
4192 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
4193 boost::shared_ptr<FileSource> fs
4194 = boost::dynamic_pointer_cast<FileSource>(i->second);
4196 if (fs && fs->origin() == path) {
4205 Session::peak_path (string base) const
4207 if (Glib::path_is_absolute (base)) {
4209 /* rip the session dir from the audiofile source */
4211 string session_path;
4212 string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
4213 bool in_another_session = true;
4215 if (base.find (interchange_dir_string) != string::npos) {
4217 session_path = Glib::path_get_dirname (base); /* now ends in audiofiles */
4218 session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
4219 session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
4220 session_path = Glib::path_get_dirname (session_path); /* now has session path */
4222 /* see if it is within our session */
4224 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4225 if (i->path == session_path) {
4226 in_another_session = false;
4231 in_another_session = false;
4235 if (in_another_session) {
4236 SessionDirectory sd (session_path);
4237 return Glib::build_filename (sd.peak_path(), Glib::path_get_basename (base) + peakfile_suffix);
4241 base = Glib::path_get_basename (base);
4242 return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
4246 Session::new_audio_source_path_for_embedded (const std::string& path)
4250 * we know that the filename is already unique because it exists
4251 * out in the filesystem.
4253 * However, when we bring it into the session, we could get a
4256 * Eg. two embedded files:
4261 * When merged into session, these collide.
4263 * There will not be a conflict with in-memory sources
4264 * because when the source was created we already picked
4265 * a unique name for it.
4267 * This collision is not likely to be common, but we have to guard
4268 * against it. So, if there is a collision, take the md5 hash of the
4269 * the path, and use that as the filename instead.
4272 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4273 string base = Glib::path_get_basename (path);
4274 string newpath = Glib::build_filename (sdir.sound_path(), base);
4276 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4280 md5.digestString (path.c_str());
4281 md5.writeToString ();
4282 base = md5.digestChars;
4284 string ext = get_suffix (path);
4291 newpath = Glib::build_filename (sdir.sound_path(), base);
4293 /* if this collides, we're screwed */
4295 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4296 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
4305 /** Return true if there are no audio file sources that use @param name as
4306 * the filename component of their path.
4308 * Return false otherwise.
4310 * This method MUST ONLY be used to check in-session, mono files since it
4311 * hard-codes the channel of the audio file source we are looking for as zero.
4313 * If/when Ardour supports native files in non-mono formats, the logic here
4314 * will need to be revisited.
4317 Session::audio_source_name_is_unique (const string& name)
4319 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
4320 vector<space_and_path>::iterator i;
4321 uint32_t existing = 0;
4323 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4325 /* note that we search *without* the extension so that
4326 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
4327 in the event that this new name is required for
4328 a file format change.
4331 const string spath = *i;
4333 if (matching_unsuffixed_filename_exists_in (spath, name)) {
4338 /* it is possible that we have the path already
4339 * assigned to a source that has not yet been written
4340 * (ie. the write source for a diskstream). we have to
4341 * check this in order to make sure that our candidate
4342 * path isn't used again, because that can lead to
4343 * two Sources point to the same file with different
4344 * notions of their removability.
4348 string possible_path = Glib::build_filename (spath, name);
4350 if (audio_source_by_path_and_channel (possible_path, 0)) {
4356 return (existing == 0);
4360 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)
4363 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4365 if (Profile->get_trx() && destructive) {
4367 sstr << setfill ('0') << setw (4) << cnt;
4368 sstr << legalized_base;
4370 sstr << legalized_base;
4372 if (take_required || related_exists) {
4384 } else if (nchan > 2) {
4389 /* XXX what? more than 26 channels! */
4400 /** Return a unique name based on \a base for a new internal audio source */
4402 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
4405 string possible_name;
4406 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
4408 bool some_related_source_name_exists = false;
4410 legalized = legalize_for_path (base);
4412 // Find a "version" of the base name that doesn't exist in any of the possible directories.
4414 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
4416 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
4418 if (audio_source_name_is_unique (possible_name)) {
4422 some_related_source_name_exists = true;
4425 error << string_compose(
4426 _("There are already %1 recordings for %2, which I consider too many."),
4427 limit, base) << endmsg;
4429 throw failed_constructor();
4433 /* We've established that the new name does not exist in any session
4434 * directory, so now find out which one we should use for this new
4438 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4440 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
4445 /** Return a unique name based on `base` for a new internal MIDI source */
4447 Session::new_midi_source_path (const string& base)
4450 char buf[PATH_MAX+1];
4451 const uint32_t limit = 10000;
4453 string possible_path;
4454 string possible_name;
4457 legalized = legalize_for_path (base);
4459 // Find a "version" of the file name that doesn't exist in any of the possible directories.
4460 std::vector<string> sdirs = source_search_path(DataType::MIDI);
4462 /* - the main session folder is the first in the vector.
4463 * - after checking all locations for file-name uniqueness,
4464 * we keep the one from the last iteration as new file name
4465 * - midi files are small and should just be kept in the main session-folder
4467 * -> reverse the array, check main session folder last and use that as location
4470 std::reverse(sdirs.begin(), sdirs.end());
4472 for (cnt = 1; cnt <= limit; ++cnt) {
4474 vector<space_and_path>::iterator i;
4475 uint32_t existing = 0;
4477 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4479 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
4480 possible_name = buf;
4482 possible_path = Glib::build_filename (*i, possible_name);
4484 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
4488 if (midi_source_by_path (possible_path)) {
4493 if (existing == 0) {
4498 error << string_compose(
4499 _("There are already %1 recordings for %2, which I consider too many."),
4500 limit, base) << endmsg;
4506 /* No need to "find best location" for software/app-based RAID, because
4507 MIDI is so small that we always put it in the same place.
4510 return possible_path;
4514 /** Create a new within-session audio source */
4515 boost::shared_ptr<AudioFileSource>
4516 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
4518 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
4520 if (!path.empty()) {
4521 return boost::dynamic_pointer_cast<AudioFileSource> (
4522 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
4524 throw failed_constructor ();
4528 /** Create a new within-session MIDI source */
4529 boost::shared_ptr<MidiSource>
4530 Session::create_midi_source_for_session (string const & basic_name)
4532 const string path = new_midi_source_path (basic_name);
4534 if (!path.empty()) {
4535 return boost::dynamic_pointer_cast<SMFSource> (
4536 SourceFactory::createWritable (
4537 DataType::MIDI, *this, path, false, frame_rate()));
4539 throw failed_constructor ();
4543 /** Create a new within-session MIDI source */
4544 boost::shared_ptr<MidiSource>
4545 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
4547 /* the caller passes in the track the source will be used in,
4548 so that we can keep the numbering sane.
4550 Rationale: a track with the name "Foo" that has had N
4551 captures carried out so far will ALREADY have a write source
4552 named "Foo-N+1.mid" waiting to be used for the next capture.
4554 If we call new_midi_source_name() we will get "Foo-N+2". But
4555 there is no region corresponding to "Foo-N+1", so when
4556 "Foo-N+2" appears in the track, the gap presents the user
4557 with odd behaviour - why did it skip past Foo-N+1?
4559 We could explain this to the user in some odd way, but
4560 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
4563 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
4566 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
4568 std::string name = track->steal_write_source_name ();
4571 return boost::shared_ptr<MidiSource>();
4574 /* MIDI files are small, just put them in the first location of the
4575 session source search path.
4578 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
4580 return boost::dynamic_pointer_cast<SMFSource> (
4581 SourceFactory::createWritable (
4582 DataType::MIDI, *this, path, false, frame_rate()));
4587 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
4589 if (playlist->hidden()) {
4593 playlists->add (playlist);
4596 playlist->release();
4603 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
4605 if (_state_of_the_state & Deletion) {
4609 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
4615 playlists->remove (playlist);
4621 Session::set_audition (boost::shared_ptr<Region> r)
4623 pending_audition_region = r;
4624 add_post_transport_work (PostTransportAudition);
4625 _butler->schedule_transport_work ();
4629 Session::audition_playlist ()
4631 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4632 ev->region.reset ();
4637 Session::non_realtime_set_audition ()
4639 assert (pending_audition_region);
4640 auditioner->audition_region (pending_audition_region);
4641 pending_audition_region.reset ();
4642 AuditionActive (true); /* EMIT SIGNAL */
4646 Session::audition_region (boost::shared_ptr<Region> r)
4648 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4654 Session::cancel_audition ()
4659 if (auditioner->auditioning()) {
4660 auditioner->cancel_audition ();
4661 AuditionActive (false); /* EMIT SIGNAL */
4666 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
4668 if (a->is_monitor()) {
4671 if (b->is_monitor()) {
4674 return a->order_key () < b->order_key ();
4678 Session::is_auditioning () const
4680 /* can be called before we have an auditioner object */
4682 return auditioner->auditioning();
4689 Session::graph_reordered ()
4691 /* don't do this stuff if we are setting up connections
4692 from a set_state() call or creating new tracks. Ditto for deletion.
4695 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _reconnecting_routes_in_progress) {
4699 /* every track/bus asked for this to be handled but it was deferred because
4700 we were connecting. do it now.
4703 request_input_change_handling ();
4707 /* force all diskstreams to update their capture offset values to
4708 reflect any changes in latencies within the graph.
4711 boost::shared_ptr<RouteList> rl = routes.reader ();
4712 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4713 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4715 tr->set_capture_offset ();
4720 /** @return Number of frames that there is disk space available to write,
4723 boost::optional<framecnt_t>
4724 Session::available_capture_duration ()
4726 Glib::Threads::Mutex::Lock lm (space_lock);
4728 if (_total_free_4k_blocks_uncertain) {
4729 return boost::optional<framecnt_t> ();
4732 float sample_bytes_on_disk = 4.0; // keep gcc happy
4734 switch (config.get_native_file_data_format()) {
4736 sample_bytes_on_disk = 4.0;
4740 sample_bytes_on_disk = 3.0;
4744 sample_bytes_on_disk = 2.0;
4748 /* impossible, but keep some gcc versions happy */
4749 fatal << string_compose (_("programming error: %1"),
4750 X_("illegal native file data format"))
4752 abort(); /*NOTREACHED*/
4755 double scale = 4096.0 / sample_bytes_on_disk;
4757 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
4758 return max_framecnt;
4761 return (framecnt_t) floor (_total_free_4k_blocks * scale);
4765 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
4768 RCUWriter<BundleList> writer (_bundles);
4769 boost::shared_ptr<BundleList> b = writer.get_copy ();
4770 b->push_back (bundle);
4774 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4781 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
4783 bool removed = false;
4786 RCUWriter<BundleList> writer (_bundles);
4787 boost::shared_ptr<BundleList> b = writer.get_copy ();
4788 BundleList::iterator i = find (b->begin(), b->end(), bundle);
4790 if (i != b->end()) {
4797 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4803 boost::shared_ptr<Bundle>
4804 Session::bundle_by_name (string name) const
4806 boost::shared_ptr<BundleList> b = _bundles.reader ();
4808 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
4809 if ((*i)->name() == name) {
4814 return boost::shared_ptr<Bundle> ();
4818 Session::tempo_map_changed (const PropertyChange&)
4822 playlists->update_after_tempo_map_change ();
4824 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
4830 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
4832 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
4833 (*i)->recompute_frames_from_bbt ();
4837 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
4838 * the given count with the current block size.
4841 Session::ensure_buffers (ChanCount howmany)
4843 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
4847 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
4849 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4850 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
4855 Session::next_insert_id ()
4857 /* this doesn't really loop forever. just think about it */
4860 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
4861 if (!insert_bitset[n]) {
4862 insert_bitset[n] = true;
4868 /* none available, so resize and try again */
4870 insert_bitset.resize (insert_bitset.size() + 16, false);
4875 Session::next_send_id ()
4877 /* this doesn't really loop forever. just think about it */
4880 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
4881 if (!send_bitset[n]) {
4882 send_bitset[n] = true;
4888 /* none available, so resize and try again */
4890 send_bitset.resize (send_bitset.size() + 16, false);
4895 Session::next_aux_send_id ()
4897 /* this doesn't really loop forever. just think about it */
4900 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
4901 if (!aux_send_bitset[n]) {
4902 aux_send_bitset[n] = true;
4908 /* none available, so resize and try again */
4910 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
4915 Session::next_return_id ()
4917 /* this doesn't really loop forever. just think about it */
4920 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
4921 if (!return_bitset[n]) {
4922 return_bitset[n] = true;
4928 /* none available, so resize and try again */
4930 return_bitset.resize (return_bitset.size() + 16, false);
4935 Session::mark_send_id (uint32_t id)
4937 if (id >= send_bitset.size()) {
4938 send_bitset.resize (id+16, false);
4940 if (send_bitset[id]) {
4941 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
4943 send_bitset[id] = true;
4947 Session::mark_aux_send_id (uint32_t id)
4949 if (id >= aux_send_bitset.size()) {
4950 aux_send_bitset.resize (id+16, false);
4952 if (aux_send_bitset[id]) {
4953 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
4955 aux_send_bitset[id] = true;
4959 Session::mark_return_id (uint32_t id)
4961 if (id >= return_bitset.size()) {
4962 return_bitset.resize (id+16, false);
4964 if (return_bitset[id]) {
4965 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
4967 return_bitset[id] = true;
4971 Session::mark_insert_id (uint32_t id)
4973 if (id >= insert_bitset.size()) {
4974 insert_bitset.resize (id+16, false);
4976 if (insert_bitset[id]) {
4977 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
4979 insert_bitset[id] = true;
4983 Session::unmark_send_id (uint32_t id)
4985 if (id < send_bitset.size()) {
4986 send_bitset[id] = false;
4991 Session::unmark_aux_send_id (uint32_t id)
4993 if (id < aux_send_bitset.size()) {
4994 aux_send_bitset[id] = false;
4999 Session::unmark_return_id (uint32_t id)
5001 if (id < return_bitset.size()) {
5002 return_bitset[id] = false;
5007 Session::unmark_insert_id (uint32_t id)
5009 if (id < insert_bitset.size()) {
5010 insert_bitset[id] = false;
5015 Session::reset_native_file_format ()
5017 boost::shared_ptr<RouteList> rl = routes.reader ();
5019 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5020 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5022 /* don't save state as we do this, there's no point
5024 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
5025 tr->reset_write_sources (false);
5026 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
5032 Session::route_name_unique (string n) const
5034 boost::shared_ptr<RouteList> r = routes.reader ();
5036 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5037 if ((*i)->name() == n) {
5046 Session::route_name_internal (string n) const
5048 if (auditioner && auditioner->name() == n) {
5052 if (_click_io && _click_io->name() == n) {
5060 Session::freeze_all (InterThreadInfo& itt)
5062 boost::shared_ptr<RouteList> r = routes.reader ();
5064 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5066 boost::shared_ptr<Track> t;
5068 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
5069 /* XXX this is wrong because itt.progress will keep returning to zero at the start
5079 boost::shared_ptr<Region>
5080 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
5081 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
5082 InterThreadInfo& itt,
5083 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
5084 bool for_export, bool for_freeze)
5086 boost::shared_ptr<Region> result;
5087 boost::shared_ptr<Playlist> playlist;
5088 boost::shared_ptr<Source> source;
5089 ChanCount diskstream_channels (track.n_channels());
5090 framepos_t position;
5091 framecnt_t this_chunk;
5093 framepos_t latency_skip;
5095 framepos_t len = end - start;
5096 bool need_block_size_reset = false;
5097 ChanCount const max_proc = track.max_processor_streams ();
5098 string legal_playlist_name;
5099 string possible_path;
5102 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
5103 end, start) << endmsg;
5107 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
5108 include_endpoint, for_export, for_freeze);
5110 if (diskstream_channels.n(track.data_type()) < 1) {
5111 error << _("Cannot write a range with no data.") << endmsg;
5115 // block all process callback handling
5117 block_processing ();
5120 // synchronize with AudioEngine::process_callback()
5121 // make sure processing is not currently running
5122 // and processing_blocked() is honored before
5123 // acquiring thread buffers
5124 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5127 _bounce_processing_active = true;
5129 /* call tree *MUST* hold route_lock */
5131 if ((playlist = track.playlist()) == 0) {
5135 legal_playlist_name = legalize_for_path (playlist->name());
5137 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
5139 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
5140 string path = ((track.data_type() == DataType::AUDIO)
5141 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
5142 : new_midi_source_path (legal_playlist_name));
5149 source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
5152 catch (failed_constructor& err) {
5153 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
5157 srcs.push_back (source);
5160 /* tell redirects that care that we are about to use a much larger
5161 * blocksize. this will flush all plugins too, so that they are ready
5162 * to be used for this process.
5165 need_block_size_reset = true;
5166 track.set_block_size (bounce_chunk_size);
5167 _engine.main_thread()->get_buffers ();
5171 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5173 /* create a set of reasonably-sized buffers */
5174 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5175 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
5177 buffers.set_count (max_proc);
5179 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5180 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5181 boost::shared_ptr<MidiSource> ms;
5183 afs->prepare_for_peakfile_writes ();
5184 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5185 Source::Lock lock(ms->mutex());
5186 ms->mark_streaming_write_started(lock);
5190 while (to_do && !itt.cancel) {
5192 this_chunk = min (to_do, bounce_chunk_size);
5194 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
5198 start += this_chunk;
5199 to_do -= this_chunk;
5200 itt.progress = (float) (1.0 - ((double) to_do / len));
5202 if (latency_skip >= bounce_chunk_size) {
5203 latency_skip -= bounce_chunk_size;
5207 const framecnt_t current_chunk = this_chunk - latency_skip;
5210 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5211 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5212 boost::shared_ptr<MidiSource> ms;
5215 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
5218 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5219 Source::Lock lock(ms->mutex());
5221 const MidiBuffer& buf = buffers.get_midi(0);
5222 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
5223 Evoral::Event<framepos_t> ev = *i;
5224 ev.set_time(ev.time() - position);
5225 ms->append_event_frames(lock, ev, ms->timeline_position());
5232 /* post-roll, pick up delayed processor output */
5233 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5235 while (latency_skip && !itt.cancel) {
5236 this_chunk = min (latency_skip, bounce_chunk_size);
5237 latency_skip -= this_chunk;
5239 buffers.silence (this_chunk, 0);
5240 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
5243 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5244 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5247 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
5259 xnow = localtime (&now);
5261 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
5262 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5263 boost::shared_ptr<MidiSource> ms;
5266 afs->update_header (position, *xnow, now);
5267 afs->flush_header ();
5268 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5269 Source::Lock lock(ms->mutex());
5270 ms->mark_streaming_write_completed(lock);
5274 /* construct a region to represent the bounced material */
5278 plist.add (Properties::start, 0);
5279 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
5280 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
5282 result = RegionFactory::create (srcs, plist);
5288 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5289 (*src)->mark_for_remove ();
5290 (*src)->drop_references ();
5294 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5295 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5298 afs->done_with_peakfile_writes ();
5302 _bounce_processing_active = false;
5304 if (need_block_size_reset) {
5305 _engine.main_thread()->drop_buffers ();
5306 track.set_block_size (get_block_size());
5309 unblock_processing ();
5315 Session::gain_automation_buffer() const
5317 return ProcessThread::gain_automation_buffer ();
5321 Session::trim_automation_buffer() const
5323 return ProcessThread::trim_automation_buffer ();
5327 Session::send_gain_automation_buffer() const
5329 return ProcessThread::send_gain_automation_buffer ();
5333 Session::pan_automation_buffer() const
5335 return ProcessThread::pan_automation_buffer ();
5339 Session::get_silent_buffers (ChanCount count)
5341 return ProcessThread::get_silent_buffers (count);
5345 Session::get_scratch_buffers (ChanCount count, bool silence)
5347 return ProcessThread::get_scratch_buffers (count, silence);
5351 Session::get_route_buffers (ChanCount count, bool silence)
5353 return ProcessThread::get_route_buffers (count, silence);
5358 Session::get_mix_buffers (ChanCount count)
5360 return ProcessThread::get_mix_buffers (count);
5364 Session::ntracks () const
5367 boost::shared_ptr<RouteList> r = routes.reader ();
5369 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5370 if (boost::dynamic_pointer_cast<Track> (*i)) {
5379 Session::nbusses () const
5382 boost::shared_ptr<RouteList> r = routes.reader ();
5384 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5385 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
5394 Session::add_automation_list(AutomationList *al)
5396 automation_lists[al->id()] = al;
5399 /** @return true if there is at least one record-enabled track, otherwise false */
5401 Session::have_rec_enabled_track () const
5403 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
5407 Session::have_rec_disabled_track () const
5409 return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
5412 /** Update the state of our rec-enabled tracks flag */
5414 Session::update_route_record_state ()
5416 boost::shared_ptr<RouteList> rl = routes.reader ();
5417 RouteList::iterator i = rl->begin();
5418 while (i != rl->end ()) {
5420 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5421 if (tr && tr->record_enabled ()) {
5428 int const old = g_atomic_int_get (&_have_rec_enabled_track);
5430 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
5432 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
5433 RecordStateChanged (); /* EMIT SIGNAL */
5436 for (i = rl->begin(); i != rl->end (); ++i) {
5437 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5438 if (tr && !tr->record_enabled ()) {
5443 g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
5445 bool record_arm_state_changed = (old != g_atomic_int_get (&_have_rec_enabled_track) );
5447 if (record_status() == Recording && record_arm_state_changed ) {
5448 RecordArmStateChanged ();
5454 Session::listen_position_changed ()
5456 boost::shared_ptr<RouteList> r = routes.reader ();
5458 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5459 (*i)->listen_position_changed ();
5464 Session::solo_control_mode_changed ()
5466 /* cancel all solo or all listen when solo control mode changes */
5469 set_solo (get_routes(), false);
5470 } else if (listening()) {
5471 set_listen (get_routes(), false);
5475 /** Called when a property of one of our route groups changes */
5477 Session::route_group_property_changed (RouteGroup* rg)
5479 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
5482 /** Called when a route is added to one of our route groups */
5484 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5486 RouteAddedToRouteGroup (rg, r);
5489 /** Called when a route is removed from one of our route groups */
5491 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5493 update_route_record_state ();
5494 RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
5497 boost::shared_ptr<RouteList>
5498 Session::get_tracks () const
5500 boost::shared_ptr<RouteList> rl = routes.reader ();
5501 boost::shared_ptr<RouteList> tl (new RouteList);
5503 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
5504 if (boost::dynamic_pointer_cast<Track> (*r)) {
5505 if (!(*r)->is_auditioner()) {
5513 boost::shared_ptr<RouteList>
5514 Session::get_routes_with_regions_at (framepos_t const p) const
5516 boost::shared_ptr<RouteList> r = routes.reader ();
5517 boost::shared_ptr<RouteList> rl (new RouteList);
5519 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5520 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5525 boost::shared_ptr<Playlist> pl = tr->playlist ();
5530 if (pl->has_region_at (p)) {
5539 Session::goto_end ()
5541 if (_session_range_location) {
5542 request_locate (_session_range_location->end(), false);
5544 request_locate (0, false);
5549 Session::goto_start ()
5551 if (_session_range_location) {
5552 request_locate (_session_range_location->start(), false);
5554 request_locate (0, false);
5559 Session::current_start_frame () const
5561 return _session_range_location ? _session_range_location->start() : 0;
5565 Session::current_end_frame () const
5567 return _session_range_location ? _session_range_location->end() : 0;
5571 Session::add_session_range_location (framepos_t start, framepos_t end)
5573 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
5574 _locations->add (_session_range_location);
5578 Session::step_edit_status_change (bool yn)
5584 send = (_step_editors == 0);
5589 send = (_step_editors == 1);
5592 if (_step_editors > 0) {
5598 StepEditStatusChange (val);
5604 Session::start_time_changed (framepos_t old)
5606 /* Update the auto loop range to match the session range
5607 (unless the auto loop range has been changed by the user)
5610 Location* s = _locations->session_range_location ();
5615 Location* l = _locations->auto_loop_location ();
5617 if (l && l->start() == old) {
5618 l->set_start (s->start(), true);
5623 Session::end_time_changed (framepos_t old)
5625 /* Update the auto loop range to match the session range
5626 (unless the auto loop range has been changed by the user)
5629 Location* s = _locations->session_range_location ();
5634 Location* l = _locations->auto_loop_location ();
5636 if (l && l->end() == old) {
5637 l->set_end (s->end(), true);
5641 std::vector<std::string>
5642 Session::source_search_path (DataType type) const
5646 if (session_dirs.size() == 1) {
5648 case DataType::AUDIO:
5649 sp.push_back (_session_dir->sound_path());
5651 case DataType::MIDI:
5652 sp.push_back (_session_dir->midi_path());
5656 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
5657 SessionDirectory sdir (i->path);
5659 case DataType::AUDIO:
5660 sp.push_back (sdir.sound_path());
5662 case DataType::MIDI:
5663 sp.push_back (sdir.midi_path());
5669 if (type == DataType::AUDIO) {
5670 const string sound_path_2X = _session_dir->sound_path_2X();
5671 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
5672 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
5673 sp.push_back (sound_path_2X);
5678 // now check the explicit (possibly user-specified) search path
5681 case DataType::AUDIO:
5682 sp += Searchpath(config.get_audio_search_path ());
5684 case DataType::MIDI:
5685 sp += Searchpath(config.get_midi_search_path ());
5693 Session::ensure_search_path_includes (const string& path, DataType type)
5702 case DataType::AUDIO:
5703 sp += Searchpath(config.get_audio_search_path ());
5705 case DataType::MIDI:
5706 sp += Searchpath (config.get_midi_search_path ());
5710 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
5711 /* No need to add this new directory if it has the same inode as
5712 an existing one; checking inode rather than name prevents duplicated
5713 directories when we are using symlinks.
5715 On Windows, I think we could just do if (*i == path) here.
5717 if (PBD::equivalent_paths (*i, path)) {
5725 case DataType::AUDIO:
5726 config.set_audio_search_path (sp.to_string());
5728 case DataType::MIDI:
5729 config.set_midi_search_path (sp.to_string());
5735 Session::remove_dir_from_search_path (const string& dir, DataType type)
5740 case DataType::AUDIO:
5741 sp = Searchpath(config.get_audio_search_path ());
5743 case DataType::MIDI:
5744 sp = Searchpath (config.get_midi_search_path ());
5751 case DataType::AUDIO:
5752 config.set_audio_search_path (sp.to_string());
5754 case DataType::MIDI:
5755 config.set_midi_search_path (sp.to_string());
5761 boost::shared_ptr<Speakers>
5762 Session::get_speakers()
5768 Session::unknown_processors () const
5772 boost::shared_ptr<RouteList> r = routes.reader ();
5773 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5774 list<string> t = (*i)->unknown_processors ();
5775 copy (t.begin(), t.end(), back_inserter (p));
5785 Session::update_latency (bool playback)
5787 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
5789 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
5793 boost::shared_ptr<RouteList> r = routes.reader ();
5794 framecnt_t max_latency = 0;
5797 /* reverse the list so that we work backwards from the last route to run to the first */
5798 RouteList* rl = routes.reader().get();
5799 r.reset (new RouteList (*rl));
5800 reverse (r->begin(), r->end());
5803 /* compute actual latency values for the given direction and store them all in per-port
5804 structures. this will also publish the same values (to JACK) so that computation of latency
5805 for routes can consistently use public latency values.
5808 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5809 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
5812 /* because we latency compensate playback, our published playback latencies should
5813 be the same for all output ports - all material played back by ardour has
5814 the same latency, whether its caused by plugins or by latency compensation. since
5815 these may differ from the values computed above, reset all playback port latencies
5819 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
5821 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5822 (*i)->set_public_port_latencies (max_latency, playback);
5827 post_playback_latency ();
5831 post_capture_latency ();
5834 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
5838 Session::post_playback_latency ()
5840 set_worst_playback_latency ();
5842 boost::shared_ptr<RouteList> r = routes.reader ();
5844 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5845 if (!(*i)->is_auditioner() && ((*i)->active())) {
5846 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
5850 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5851 (*i)->set_latency_compensation (_worst_track_latency);
5856 Session::post_capture_latency ()
5858 set_worst_capture_latency ();
5860 /* reflect any changes in capture latencies into capture offsets
5863 boost::shared_ptr<RouteList> rl = routes.reader();
5864 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5865 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5867 tr->set_capture_offset ();
5873 Session::initialize_latencies ()
5876 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5877 update_latency (false);
5878 update_latency (true);
5881 set_worst_io_latencies ();
5885 Session::set_worst_io_latencies ()
5887 set_worst_playback_latency ();
5888 set_worst_capture_latency ();
5892 Session::set_worst_playback_latency ()
5894 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5898 _worst_output_latency = 0;
5900 if (!_engine.connected()) {
5904 boost::shared_ptr<RouteList> r = routes.reader ();
5906 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5907 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
5910 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
5914 Session::set_worst_capture_latency ()
5916 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5920 _worst_input_latency = 0;
5922 if (!_engine.connected()) {
5926 boost::shared_ptr<RouteList> r = routes.reader ();
5928 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5929 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
5932 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
5936 Session::update_latency_compensation (bool force_whole_graph)
5938 bool some_track_latency_changed = false;
5940 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5944 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
5946 _worst_track_latency = 0;
5948 boost::shared_ptr<RouteList> r = routes.reader ();
5950 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5951 if (!(*i)->is_auditioner() && ((*i)->active())) {
5953 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
5954 some_track_latency_changed = true;
5956 _worst_track_latency = max (tl, _worst_track_latency);
5960 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
5961 (some_track_latency_changed ? "yes" : "no")));
5963 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
5965 if (some_track_latency_changed || force_whole_graph) {
5966 _engine.update_latencies ();
5970 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5971 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5975 tr->set_capture_offset ();
5980 Session::session_name_is_legal (const string& path)
5982 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
5984 for (int i = 0; illegal_chars[i]; ++i) {
5985 if (path.find (illegal_chars[i]) != string::npos) {
5986 return illegal_chars[i];
5994 Session::next_control_id () const
5998 /* the monitor bus remote ID is in a different
5999 * "namespace" than regular routes. its existence doesn't
6000 * affect normal (low) numbered routes.
6007 /* the same about masterbus in Waves Tracks */
6009 if (Profile->get_trx() && _master_out) {
6013 return nroutes() - subtract;
6017 Session::notify_remote_id_change ()
6019 if (deletion_in_progress()) {
6023 switch (Config->get_remote_model()) {
6025 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
6031 #ifdef USE_TRACKS_CODE_FEATURES
6032 /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
6033 * if track order has been changed by user
6035 reconnect_existing_routes(true, true);
6041 Session::sync_order_keys ()
6043 if (deletion_in_progress()) {
6047 /* tell everyone that something has happened to the sort keys
6048 and let them sync up with the change(s)
6049 this will give objects that manage the sort order keys the
6050 opportunity to keep them in sync if they wish to.
6053 DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
6055 reassign_track_numbers();
6057 Route::SyncOrderKeys (); /* EMIT SIGNAL */
6059 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
6063 Session::operation_in_progress (GQuark op) const
6065 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
6068 boost::shared_ptr<Port>
6069 Session::ltc_input_port () const
6071 return _ltc_input->nth (0);
6074 boost::shared_ptr<Port>
6075 Session::ltc_output_port () const
6077 return _ltc_output->nth (0);
6081 Session::reconnect_ltc_input ()
6085 string src = Config->get_ltc_source_port();
6087 _ltc_input->disconnect (this);
6089 if (src != _("None") && !src.empty()) {
6090 _ltc_input->nth (0)->connect (src);
6096 Session::reconnect_ltc_output ()
6101 string src = Config->get_ltc_sink_port();
6103 _ltc_output->disconnect (this);
6105 if (src != _("None") && !src.empty()) {
6106 _ltc_output->nth (0)->connect (src);