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 , post_export_sync (false)
188 , post_export_position (0)
190 , _export_started (false)
191 , _export_rolling (false)
192 , _pre_export_mmc_enabled (false)
193 , _name (snapshot_name)
195 , _send_qf_mtc (false)
196 , _pframes_since_last_mtc (0)
197 , session_midi_feedback (0)
199 , loop_changing (false)
201 , _session_dir (new SessionDirectory (fullpath))
202 , _current_snapshot_name (snapshot_name)
204 , state_was_pending (false)
205 , _state_of_the_state (StateOfTheState(CannotSave|InitialConnecting|Loading))
207 , _save_queued (false)
208 , _last_roll_location (0)
209 , _last_roll_or_reversal_location (0)
210 , _last_record_location (0)
211 , pending_locate_roll (false)
212 , pending_locate_frame (0)
213 , pending_locate_flush (false)
214 , pending_abort (false)
215 , pending_auto_loop (false)
216 , _butler (new Butler (*this))
217 , _post_transport_work (0)
218 , cumulative_rf_motion (0)
220 , _locations (new Locations (*this))
221 , _ignore_skips_updates (false)
222 , _rt_thread_active (false)
223 , _rt_emit_pending (false)
225 , outbound_mtc_timecode_frame (0)
226 , next_quarter_frame_to_send (-1)
227 , _frames_per_timecode_frame (0)
228 , _frames_per_hour (0)
229 , _timecode_frames_per_hour (0)
230 , last_timecode_valid (false)
231 , last_timecode_when (0)
232 , _send_timecode_update (false)
244 , ltc_timecode_offset (0)
245 , ltc_timecode_negative_offset (false)
246 , midi_control_ui (0)
248 , _all_route_group (new RouteGroup (*this, "all"))
249 , routes (new RouteList)
250 , _adding_routes_in_progress (false)
251 , _reconnecting_routes_in_progress (false)
252 , _route_deletion_in_progress (false)
253 , destructive_index (0)
254 , _track_number_decimals(1)
255 , solo_update_disabled (false)
256 , default_fade_steepness (0)
257 , default_fade_msecs (0)
258 , _total_free_4k_blocks (0)
259 , _total_free_4k_blocks_uncertain (false)
260 , no_questions_about_missing_files (false)
263 , _bundles (new BundleList)
264 , _bundle_xml_node (0)
268 , click_emphasis_data (0)
270 , click_emphasis_length (0)
271 , _clicks_cleared (0)
272 , _play_range (false)
274 , first_file_data_format_reset (true)
275 , first_file_header_format_reset (true)
276 , have_looped (false)
277 , _have_rec_enabled_track (false)
278 , _have_rec_disabled_track (true)
280 , _suspend_timecode_transmission (0)
281 , _speakers (new Speakers)
283 , ignore_route_processor_changes (false)
290 pthread_mutex_init (&_rt_emit_mutex, 0);
291 pthread_cond_init (&_rt_emit_cond, 0);
293 pre_engine_init (fullpath);
297 #ifdef USE_TRACKS_CODE_FEATURES
298 sr = EngineStateController::instance()->get_current_sample_rate();
300 if (ensure_engine (sr)) {
302 throw failed_constructor ();
305 if (create (mix_template, bus_profile)) {
307 throw failed_constructor ();
310 /* if a mix template was provided, then ::create() will
311 * have copied it into the session and we need to load it
312 * so that we have the state ready for ::set_state()
313 * after the engine is started.
315 * Note that we do NOT try to get the sample rate from
316 * the template at this time, though doing so would
317 * be easy if we decided this was an appropriate part
321 if (!mix_template.empty()) {
322 if (load_state (_current_snapshot_name)) {
323 throw failed_constructor ();
325 store_recent_templates (mix_template);
328 /* load default session properties - if any */
333 if (load_state (_current_snapshot_name)) {
334 throw failed_constructor ();
337 /* try to get sample rate from XML state so that we
338 * can influence the SR if we set up the audio
343 const XMLProperty* prop;
344 if ((prop = state_tree->root()->property (X_("sample-rate"))) != 0) {
345 sr = atoi (prop->value());
349 if (ensure_engine (sr)) {
351 throw failed_constructor ();
355 if (post_engine_init ()) {
357 throw failed_constructor ();
360 store_recent_sessions (_name, _path);
362 bool was_dirty = dirty();
364 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
366 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
367 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
370 DirtyChanged (); /* EMIT SIGNAL */
373 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
374 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
378 emit_thread_start ();
380 /* hook us up to the engine since we are now completely constructed */
382 BootMessage (_("Connect to engine"));
384 _engine.set_session (this);
385 _engine.reset_timebase ();
387 #ifdef USE_TRACKS_CODE_FEATURES
389 EngineStateController::instance()->set_session(this);
392 if ( ARDOUR::Profile->get_trx () ) {
394 /* Waves Tracks: fill session with tracks basing on the amount of inputs.
395 * each available input must have corresponding track when session starts.
398 uint32_t how_many (0);
400 std::vector<std::string> inputs;
401 EngineStateController::instance()->get_physical_audio_inputs(inputs);
403 how_many = inputs.size();
405 list<boost::shared_ptr<AudioTrack> > tracks;
407 // Track names after driver
408 if (Config->get_tracks_auto_naming() == NameAfterDriver) {
409 string track_name = "";
410 for (std::vector<string>::size_type i = 0; i < inputs.size(); ++i) {
412 track_name = inputs[i];
413 replace_all (track_name, "system:capture", "");
415 list<boost::shared_ptr<AudioTrack> > single_track = new_audio_track (1, 1, Normal, 0, 1, track_name);
416 tracks.insert(tracks.begin(), single_track.front());
418 } else { // Default track names
419 tracks = new_audio_track (1, 1, Normal, 0, how_many, string());
422 if (tracks.size() != how_many) {
424 throw failed_constructor ();
432 BootMessage (_("Session loading complete"));
444 Session::ensure_engine (uint32_t desired_sample_rate)
446 if (_engine.current_backend() == 0) {
447 /* backend is unknown ... */
448 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
449 if (r.get_value_or (-1) != 0) {
452 } else if (_engine.setup_required()) {
453 /* backend is known, but setup is needed */
454 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
455 if (r.get_value_or (-1) != 0) {
458 } else if (!_engine.running()) {
459 if (_engine.start()) {
464 /* at this point the engine should be running
467 if (!_engine.running()) {
471 return immediately_post_engine ();
476 Session::immediately_post_engine ()
478 /* Do various initializations that should take place directly after we
479 * know that the engine is running, but before we either create a
480 * session or set state for an existing one.
483 if (how_many_dsp_threads () > 1) {
484 /* For now, only create the graph if we are using >1 DSP threads, as
485 it is a bit slower than the old code with 1 thread.
487 _process_graph.reset (new Graph (*this));
490 /* every time we reconnect, recompute worst case output latencies */
492 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
494 if (synced_to_engine()) {
495 _engine.transport_stop ();
498 if (config.get_jack_time_master()) {
499 _engine.transport_locate (_transport_frame);
503 BootMessage (_("Set up LTC"));
505 BootMessage (_("Set up Click"));
507 BootMessage (_("Set up standard connections"));
511 catch (failed_constructor& err) {
515 /* TODO, connect in different thread. (PortRegisteredOrUnregistered may be in RT context)
517 _engine.PortRegisteredOrUnregistered.connect_same_thread (*this, boost::bind (&Session::setup_bundles, this));
525 vector<void*> debug_pointers;
527 /* if we got to here, leaving pending capture state around
531 remove_pending_capture_state ();
533 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
535 /* disconnect from any and all signals that we are connected to */
539 _engine.remove_session ();
541 #ifdef USE_TRACKS_CODE_FEATURES
542 EngineStateController::instance()->remove_session();
545 /* deregister all ports - there will be no process or any other
546 * callbacks from the engine any more.
549 Port::PortDrop (); /* EMIT SIGNAL */
553 /* clear history so that no references to objects are held any more */
557 /* clear state tree so that no references to objects are held any more */
562 /* reset dynamic state version back to default */
564 Stateful::loading_state_version = 0;
566 _butler->drop_references ();
570 delete _all_route_group;
572 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
573 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
577 if (click_data != default_click) {
578 delete [] click_data;
581 if (click_emphasis_data != default_click_emphasis) {
582 delete [] click_emphasis_data;
587 /* need to remove auditioner before monitoring section
588 * otherwise it is re-connected */
591 /* drop references to routes held by the monitoring section
592 * specifically _monitor_out aux/listen references */
593 remove_monitor_section();
595 /* clear out any pending dead wood from RCU managed objects */
600 AudioDiskstream::free_working_buffers();
602 /* tell everyone who is still standing that we're about to die */
605 /* tell everyone to drop references and delete objects as we go */
607 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
608 RegionFactory::delete_all_regions ();
610 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
612 /* reset these three references to special routes before we do the usual route delete thing */
614 _master_out.reset ();
615 _monitor_out.reset ();
618 RCUWriter<RouteList> writer (routes);
619 boost::shared_ptr<RouteList> r = writer.get_copy ();
621 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
622 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
623 (*i)->drop_references ();
627 /* writer goes out of scope and updates master */
632 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
633 Glib::Threads::Mutex::Lock lm (source_lock);
634 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
635 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
636 i->second->drop_references ();
642 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
645 emit_thread_terminate ();
647 pthread_cond_destroy (&_rt_emit_cond);
648 pthread_mutex_destroy (&_rt_emit_mutex);
650 delete _scene_changer; _scene_changer = 0;
651 delete midi_control_ui; midi_control_ui = 0;
653 delete _mmc; _mmc = 0;
654 delete _midi_ports; _midi_ports = 0;
655 delete _locations; _locations = 0;
659 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
661 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
662 boost_debug_list_ptrs ();
667 Session::setup_ltc ()
671 _ltc_input.reset (new IO (*this, X_("LTC In"), IO::Input));
672 _ltc_output.reset (new IO (*this, X_("LTC Out"), IO::Output));
674 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC In"))) != 0) {
675 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
678 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
679 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
681 reconnect_ltc_input ();
684 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC Out"))) != 0) {
685 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
688 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
689 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
691 reconnect_ltc_output ();
694 /* fix up names of LTC ports because we don't want the normal
695 * IO style of NAME/TYPE-{in,out}N
698 _ltc_input->nth (0)->set_name (X_("LTC-in"));
699 _ltc_output->nth (0)->set_name (X_("LTC-out"));
703 Session::setup_click ()
706 _click_io.reset (new ClickIO (*this, X_("Click")));
707 _click_gain.reset (new Amp (*this));
708 _click_gain->activate ();
710 setup_click_state (state_tree->root());
712 setup_click_state (0);
717 Session::setup_click_state (const XMLNode* node)
719 const XMLNode* child = 0;
721 if (node && (child = find_named_node (*node, "Click")) != 0) {
723 /* existing state for Click */
726 if (Stateful::loading_state_version < 3000) {
727 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
729 const XMLNodeList& children (child->children());
730 XMLNodeList::const_iterator i = children.begin();
731 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
733 if (i != children.end()) {
734 c = _click_gain->set_state (**i, Stateful::loading_state_version);
740 _clicking = Config->get_clicking ();
744 error << _("could not setup Click I/O") << endmsg;
751 /* default state for Click: dual-mono to first 2 physical outputs */
754 _engine.get_physical_outputs (DataType::AUDIO, outs);
756 for (uint32_t physport = 0; physport < 2; ++physport) {
757 if (outs.size() > physport) {
758 if (_click_io->add_port (outs[physport], this)) {
759 // relax, even though its an error
764 if (_click_io->n_ports () > ChanCount::ZERO) {
765 _clicking = Config->get_clicking ();
771 Session::setup_bundles ()
775 RCUWriter<BundleList> writer (_bundles);
776 boost::shared_ptr<BundleList> b = writer.get_copy ();
777 for (BundleList::iterator i = b->begin(); i != b->end();) {
778 if (boost::dynamic_pointer_cast<UserBundle>(*i)) {
786 vector<string> inputs[DataType::num_types];
787 vector<string> outputs[DataType::num_types];
788 for (uint32_t i = 0; i < DataType::num_types; ++i) {
789 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
790 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
793 /* Create a set of Bundle objects that map
794 to the physical I/O currently available. We create both
795 mono and stereo bundles, so that the common cases of mono
796 and stereo tracks get bundles to put in their mixer strip
797 in / out menus. There may be a nicer way of achieving that;
798 it doesn't really scale that well to higher channel counts
801 /* mono output bundles */
803 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
805 std::string pn = _engine.get_pretty_name_by_name (outputs[DataType::AUDIO][np]);
807 snprintf (buf, sizeof (buf), _("out %s"), pn.substr(0,12).c_str());
809 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
812 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
813 c->add_channel (_("mono"), DataType::AUDIO);
814 c->set_port (0, outputs[DataType::AUDIO][np]);
816 add_bundle (c, false);
819 /* stereo output bundles */
821 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
822 if (np + 1 < outputs[DataType::AUDIO].size()) {
824 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
825 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
826 c->add_channel (_("L"), DataType::AUDIO);
827 c->set_port (0, outputs[DataType::AUDIO][np]);
828 c->add_channel (_("R"), DataType::AUDIO);
829 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
831 add_bundle (c, false);
835 /* mono input bundles */
837 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
839 std::string pn = _engine.get_pretty_name_by_name (inputs[DataType::AUDIO][np]);
841 snprintf (buf, sizeof (buf), _("in %s"), pn.substr(0,12).c_str());
843 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
846 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
847 c->add_channel (_("mono"), DataType::AUDIO);
848 c->set_port (0, inputs[DataType::AUDIO][np]);
850 add_bundle (c, false);
853 /* stereo input bundles */
855 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
856 if (np + 1 < inputs[DataType::AUDIO].size()) {
858 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
860 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
861 c->add_channel (_("L"), DataType::AUDIO);
862 c->set_port (0, inputs[DataType::AUDIO][np]);
863 c->add_channel (_("R"), DataType::AUDIO);
864 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
866 add_bundle (c, false);
870 /* MIDI input bundles */
872 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
873 string n = inputs[DataType::MIDI][np];
874 std::string pn = _engine.get_pretty_name_by_name (n);
878 boost::erase_first (n, X_("alsa_pcm:"));
880 boost::shared_ptr<Bundle> c (new Bundle (n, false));
881 c->add_channel ("", DataType::MIDI);
882 c->set_port (0, inputs[DataType::MIDI][np]);
883 add_bundle (c, false);
886 /* MIDI output bundles */
888 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
889 string n = outputs[DataType::MIDI][np];
890 std::string pn = _engine.get_pretty_name_by_name (n);
894 boost::erase_first (n, X_("alsa_pcm:"));
896 boost::shared_ptr<Bundle> c (new Bundle (n, true));
897 c->add_channel ("", DataType::MIDI);
898 c->set_port (0, outputs[DataType::MIDI][np]);
899 add_bundle (c, false);
902 // we trust the backend to only calls us if there's a change
903 BundleAddedOrRemoved (); /* EMIT SIGNAL */
907 Session::auto_connect_master_bus ()
909 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
913 // Waves Tracks: Do not connect master bas for Tracks if AutoConnectMaster option is not set
914 // In this case it means "Multi Out" output mode
915 if (ARDOUR::Profile->get_trx() && !(Config->get_output_auto_connect() & AutoConnectMaster) ) {
919 /* if requested auto-connect the outputs to the first N physical ports.
922 uint32_t limit = _master_out->n_outputs().n_total();
923 vector<string> outputs[DataType::num_types];
925 for (uint32_t i = 0; i < DataType::num_types; ++i) {
926 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
929 for (uint32_t n = 0; n < limit; ++n) {
930 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
932 if (outputs[p->type()].size() > n) {
933 connect_to = outputs[p->type()][n];
936 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
937 if (_master_out->output()->connect (p, connect_to, this)) {
938 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
947 Session::remove_monitor_section ()
949 if (!_monitor_out || Profile->get_trx()) {
953 /* force reversion to Solo-In-Place */
954 Config->set_solo_control_is_listen_control (false);
956 /* if we are auditioning, cancel it ... this is a workaround
957 to a problem (auditioning does not execute the process graph,
958 which is needed to remove routes when using >1 core for processing)
963 /* Hold process lock while doing this so that we don't hear bits and
964 * pieces of audio as we work on each route.
967 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
969 /* Connect tracks to monitor section. Note that in an
970 existing session, the internal sends will already exist, but we want the
971 routes to notice that they connect to the control out specifically.
975 boost::shared_ptr<RouteList> r = routes.reader ();
976 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
978 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
980 if ((*x)->is_monitor()) {
982 } else if ((*x)->is_master()) {
985 (*x)->remove_aux_or_listen (_monitor_out);
990 remove_route (_monitor_out);
991 auto_connect_master_bus ();
994 auditioner->connect ();
999 Session::add_monitor_section ()
1003 if (_monitor_out || !_master_out || Profile->get_trx()) {
1007 boost::shared_ptr<Route> r (new Route (*this, _("Monitor"), Route::MonitorOut, DataType::AUDIO));
1013 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1014 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
1017 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1018 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1019 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1023 add_routes (rl, false, false, false);
1025 assert (_monitor_out);
1027 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
1028 are undefined, at best.
1031 uint32_t limit = _monitor_out->n_inputs().n_audio();
1035 /* connect the inputs to the master bus outputs. this
1036 * represents a separate data feed from the internal sends from
1037 * each route. as of jan 2011, it allows the monitor section to
1038 * conditionally ignore either the internal sends or the normal
1039 * input feed, but we should really find a better way to do
1043 _master_out->output()->disconnect (this);
1045 for (uint32_t n = 0; n < limit; ++n) {
1046 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1047 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1050 string connect_to = o->name();
1051 if (_monitor_out->input()->connect (p, connect_to, this)) {
1052 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1060 /* if monitor section is not connected, connect it to physical outs
1063 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
1065 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1067 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1070 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1072 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1073 Config->get_monitor_bus_preferred_bundle())
1079 /* Monitor bus is audio only */
1081 vector<string> outputs[DataType::num_types];
1083 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1084 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1087 uint32_t mod = outputs[DataType::AUDIO].size();
1088 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1092 for (uint32_t n = 0; n < limit; ++n) {
1094 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1096 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1097 connect_to = outputs[DataType::AUDIO][n % mod];
1100 if (!connect_to.empty()) {
1101 if (_monitor_out->output()->connect (p, connect_to, this)) {
1102 error << string_compose (
1103 _("cannot connect control output %1 to %2"),
1114 /* Hold process lock while doing this so that we don't hear bits and
1115 * pieces of audio as we work on each route.
1118 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1120 /* Connect tracks to monitor section. Note that in an
1121 existing session, the internal sends will already exist, but we want the
1122 routes to notice that they connect to the control out specifically.
1126 boost::shared_ptr<RouteList> rls = routes.reader ();
1128 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1130 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1132 if ((*x)->is_monitor()) {
1134 } else if ((*x)->is_master()) {
1137 (*x)->enable_monitor_send ();
1142 auditioner->connect ();
1147 Session::reset_monitor_section ()
1149 /* Process lock should be held by the caller.*/
1151 if (!_monitor_out || Profile->get_trx()) {
1155 uint32_t limit = _master_out->n_outputs().n_audio();
1157 /* connect the inputs to the master bus outputs. this
1158 * represents a separate data feed from the internal sends from
1159 * each route. as of jan 2011, it allows the monitor section to
1160 * conditionally ignore either the internal sends or the normal
1161 * input feed, but we should really find a better way to do
1165 _master_out->output()->disconnect (this);
1166 _monitor_out->output()->disconnect (this);
1168 _monitor_out->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1169 _monitor_out->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1171 for (uint32_t n = 0; n < limit; ++n) {
1172 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1173 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1176 string connect_to = o->name();
1177 if (_monitor_out->input()->connect (p, connect_to, this)) {
1178 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1185 /* connect monitor section to physical outs
1188 if (Config->get_auto_connect_standard_busses()) {
1190 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1192 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1195 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1197 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1198 Config->get_monitor_bus_preferred_bundle())
1204 /* Monitor bus is audio only */
1206 vector<string> outputs[DataType::num_types];
1208 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1209 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1212 uint32_t mod = outputs[DataType::AUDIO].size();
1213 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1217 for (uint32_t n = 0; n < limit; ++n) {
1219 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1221 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1222 connect_to = outputs[DataType::AUDIO][n % mod];
1225 if (!connect_to.empty()) {
1226 if (_monitor_out->output()->connect (p, connect_to, this)) {
1227 error << string_compose (
1228 _("cannot connect control output %1 to %2"),
1239 /* Connect tracks to monitor section. Note that in an
1240 existing session, the internal sends will already exist, but we want the
1241 routes to notice that they connect to the control out specifically.
1245 boost::shared_ptr<RouteList> rls = routes.reader ();
1247 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1249 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1251 if ((*x)->is_monitor()) {
1253 } else if ((*x)->is_master()) {
1256 (*x)->enable_monitor_send ();
1262 Session::hookup_io ()
1264 /* stop graph reordering notifications from
1265 causing resorts, etc.
1268 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
1272 /* we delay creating the auditioner till now because
1273 it makes its own connections to ports.
1277 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
1279 throw failed_constructor ();
1281 a->use_new_diskstream ();
1285 catch (failed_constructor& err) {
1286 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
1290 /* load bundles, which we may have postponed earlier on */
1291 if (_bundle_xml_node) {
1292 load_bundles (*_bundle_xml_node);
1293 delete _bundle_xml_node;
1296 /* Tell all IO objects to connect themselves together */
1298 IO::enable_connecting ();
1300 /* Now tell all "floating" ports to connect to whatever
1301 they should be connected to.
1304 AudioEngine::instance()->reconnect_ports ();
1306 /* Anyone who cares about input state, wake up and do something */
1308 IOConnectionsComplete (); /* EMIT SIGNAL */
1310 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
1312 /* now handle the whole enchilada as if it was one
1313 graph reorder event.
1318 /* update the full solo state, which can't be
1319 correctly determined on a per-route basis, but
1320 needs the global overview that only the session
1324 update_route_solo_state ();
1328 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
1330 boost::shared_ptr<Track> track = wp.lock ();
1335 boost::shared_ptr<Playlist> playlist;
1337 if ((playlist = track->playlist()) != 0) {
1338 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
1339 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
1340 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
1345 Session::record_enabling_legal () const
1347 /* this used to be in here, but survey says.... we don't need to restrict it */
1348 // if (record_status() == Recording) {
1352 if (Config->get_all_safe()) {
1359 Session::set_track_monitor_input_status (bool yn)
1361 boost::shared_ptr<RouteList> rl = routes.reader ();
1362 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1363 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1364 if (tr && tr->record_enabled ()) {
1365 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1366 tr->request_input_monitoring (yn);
1372 Session::auto_punch_start_changed (Location* location)
1374 replace_event (SessionEvent::PunchIn, location->start());
1376 if (get_record_enabled() && config.get_punch_in()) {
1377 /* capture start has been changed, so save new pending state */
1378 save_state ("", true);
1383 Session::auto_punch_end_changed (Location* location)
1385 framepos_t when_to_stop = location->end();
1386 // when_to_stop += _worst_output_latency + _worst_input_latency;
1387 replace_event (SessionEvent::PunchOut, when_to_stop);
1391 Session::auto_punch_changed (Location* location)
1393 framepos_t when_to_stop = location->end();
1395 replace_event (SessionEvent::PunchIn, location->start());
1396 //when_to_stop += _worst_output_latency + _worst_input_latency;
1397 replace_event (SessionEvent::PunchOut, when_to_stop);
1400 /** @param loc A loop location.
1401 * @param pos Filled in with the start time of the required fade-out (in session frames).
1402 * @param length Filled in with the length of the required fade-out.
1405 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
1407 pos = max (loc->start(), loc->end() - 64);
1408 length = loc->end() - pos;
1412 Session::auto_loop_changed (Location* location)
1414 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1417 auto_loop_declick_range (location, dcp, dcl);
1419 if (transport_rolling() && play_loop) {
1421 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1423 // if (_transport_frame > location->end()) {
1425 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1426 // relocate to beginning of loop
1427 clear_events (SessionEvent::LocateRoll);
1429 request_locate (location->start(), true);
1432 else if (Config->get_seamless_loop() && !loop_changing) {
1434 // schedule a locate-roll to refill the diskstreams at the
1435 // previous loop end
1436 loop_changing = true;
1438 if (location->end() > last_loopend) {
1439 clear_events (SessionEvent::LocateRoll);
1440 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1446 clear_events (SessionEvent::AutoLoopDeclick);
1447 clear_events (SessionEvent::AutoLoop);
1450 last_loopend = location->end();
1455 Session::set_auto_punch_location (Location* location)
1459 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1460 punch_connections.drop_connections();
1461 existing->set_auto_punch (false, this);
1462 remove_event (existing->start(), SessionEvent::PunchIn);
1463 clear_events (SessionEvent::PunchOut);
1464 auto_punch_location_changed (0);
1469 if (location == 0) {
1473 if (location->end() <= location->start()) {
1474 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1478 punch_connections.drop_connections ();
1480 location->StartChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, location));
1481 location->EndChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, location));
1482 location->Changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, location));
1484 location->set_auto_punch (true, this);
1486 auto_punch_changed (location);
1488 auto_punch_location_changed (location);
1492 Session::set_session_extents (framepos_t start, framepos_t end)
1495 if ((existing = _locations->session_range_location()) == 0) {
1496 //if there is no existing session, we need to make a new session location (should never happen)
1497 existing = new Location (*this, 0, 0, _("session"), Location::IsSessionRange);
1501 error << _("Session: you can't use that location for session start/end)") << endmsg;
1505 existing->set( start, end );
1511 Session::set_auto_loop_location (Location* location)
1515 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1516 loop_connections.drop_connections ();
1517 existing->set_auto_loop (false, this);
1518 remove_event (existing->end(), SessionEvent::AutoLoop);
1521 auto_loop_declick_range (existing, dcp, dcl);
1522 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1523 auto_loop_location_changed (0);
1528 if (location == 0) {
1532 if (location->end() <= location->start()) {
1533 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1537 last_loopend = location->end();
1539 loop_connections.drop_connections ();
1541 location->StartChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1542 location->EndChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1543 location->Changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1544 location->FlagsChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1546 location->set_auto_loop (true, this);
1548 if (Config->get_loop_is_mode() && play_loop && Config->get_seamless_loop()) {
1549 // set all tracks to use internal looping
1550 boost::shared_ptr<RouteList> rl = routes.reader ();
1551 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1552 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1553 if (tr && !tr->hidden()) {
1554 tr->set_loop (location);
1559 /* take care of our stuff first */
1561 auto_loop_changed (location);
1563 /* now tell everyone else */
1565 auto_loop_location_changed (location);
1569 Session::update_marks (Location*)
1575 Session::update_skips (Location* loc, bool consolidate)
1577 if (_ignore_skips_updates) {
1581 Locations::LocationList skips;
1584 PBD::Unwinder<bool> uw (_ignore_skips_updates, true);
1585 consolidate_skips (loc);
1588 sync_locations_to_skips ();
1594 Session::consolidate_skips (Location* loc)
1596 Locations::LocationList all_locations = _locations->list ();
1598 for (Locations::LocationList::iterator l = all_locations.begin(); l != all_locations.end(); ) {
1600 if (!(*l)->is_skip ()) {
1605 /* don't test against self */
1612 switch (Evoral::coverage ((*l)->start(), (*l)->end(), loc->start(), loc->end())) {
1613 case Evoral::OverlapInternal:
1614 case Evoral::OverlapExternal:
1615 case Evoral::OverlapStart:
1616 case Evoral::OverlapEnd:
1617 /* adjust new location to cover existing one */
1618 loc->set_start (min (loc->start(), (*l)->start()));
1619 loc->set_end (max (loc->end(), (*l)->end()));
1620 /* we don't need this one any more */
1621 _locations->remove (*l);
1622 /* the location has been deleted, so remove reference to it in our local list */
1623 l = all_locations.erase (l);
1626 case Evoral::OverlapNone:
1634 Session::sync_locations_to_skips ()
1636 /* This happens asynchronously (in the audioengine thread). After the clear is done, we will call
1637 * Session::_sync_locations_to_skips() from the audioengine thread.
1639 clear_events (SessionEvent::Skip, boost::bind (&Session::_sync_locations_to_skips, this));
1643 Session::_sync_locations_to_skips ()
1645 /* called as a callback after existing Skip events have been cleared from a realtime audioengine thread */
1647 Locations::LocationList const & locs (_locations->list());
1649 for (Locations::LocationList::const_iterator i = locs.begin(); i != locs.end(); ++i) {
1651 Location* location = *i;
1653 if (location->is_skip() && location->is_skipping()) {
1654 SessionEvent* ev = new SessionEvent (SessionEvent::Skip, SessionEvent::Add, location->start(), location->end(), 1.0);
1662 Session::location_added (Location *location)
1664 if (location->is_auto_punch()) {
1665 set_auto_punch_location (location);
1668 if (location->is_auto_loop()) {
1669 set_auto_loop_location (location);
1672 if (location->is_session_range()) {
1673 /* no need for any signal handling or event setting with the session range,
1674 because we keep a direct reference to it and use its start/end directly.
1676 _session_range_location = location;
1679 if (location->is_mark()) {
1680 /* listen for per-location signals that require us to do any * global updates for marks */
1682 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1683 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1684 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1685 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1688 if (location->is_skip()) {
1689 /* listen for per-location signals that require us to update skip-locate events */
1691 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1692 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1693 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1694 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, false));
1696 update_skips (location, true);
1703 Session::location_removed (Location *location)
1705 if (location->is_auto_loop()) {
1706 set_auto_loop_location (0);
1707 set_track_loop (false);
1710 if (location->is_auto_punch()) {
1711 set_auto_punch_location (0);
1714 if (location->is_session_range()) {
1715 /* this is never supposed to happen */
1716 error << _("programming error: session range removed!") << endl;
1719 if (location->is_skip()) {
1721 update_skips (location, false);
1728 Session::locations_changed ()
1730 _locations->apply (*this, &Session::_locations_changed);
1734 Session::_locations_changed (const Locations::LocationList& locations)
1736 /* There was some mass-change in the Locations object.
1738 We might be re-adding a location here but it doesn't actually matter
1739 for all the locations that the Session takes an interest in.
1743 PBD::Unwinder<bool> protect_ignore_skip_updates (_ignore_skips_updates, true);
1744 for (Locations::LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
1745 location_added (*i);
1749 update_skips (NULL, false);
1753 Session::enable_record ()
1755 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1756 /* no recording at anything except normal speed */
1761 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1763 if (rs == Recording) {
1767 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1769 _last_record_location = _transport_frame;
1770 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1772 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1773 set_track_monitor_input_status (true);
1776 RecordStateChanged ();
1783 Session::disable_record (bool rt_context, bool force)
1787 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1789 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1790 g_atomic_int_set (&_record_status, Disabled);
1791 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1793 if (rs == Recording) {
1794 g_atomic_int_set (&_record_status, Enabled);
1798 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1799 set_track_monitor_input_status (false);
1802 RecordStateChanged (); /* emit signal */
1805 remove_pending_capture_state ();
1811 Session::step_back_from_record ()
1813 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1815 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1816 set_track_monitor_input_status (false);
1819 RecordStateChanged (); /* emit signal */
1824 Session::maybe_enable_record ()
1826 if (_step_editors > 0) {
1830 g_atomic_int_set (&_record_status, Enabled);
1832 /* This function is currently called from somewhere other than an RT thread.
1833 This save_state() call therefore doesn't impact anything. Doing it here
1834 means that we save pending state of which sources the next record will use,
1835 which gives us some chance of recovering from a crash during the record.
1838 save_state ("", true);
1840 if (_transport_speed) {
1841 if (!config.get_punch_in()) {
1845 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1846 RecordStateChanged (); /* EMIT SIGNAL */
1853 Session::audible_frame () const
1859 offset = worst_playback_latency ();
1861 if (synced_to_engine()) {
1862 /* Note: this is basically just sync-to-JACK */
1863 tf = _engine.transport_frame();
1865 tf = _transport_frame;
1870 if (!non_realtime_work_pending()) {
1874 /* Check to see if we have passed the first guaranteed
1875 audible frame past our last start position. if not,
1876 return that last start point because in terms
1877 of audible frames, we have not moved yet.
1879 `Start position' in this context means the time we last
1880 either started, located, or changed transport direction.
1883 if (_transport_speed > 0.0f) {
1885 if (!play_loop || !have_looped) {
1886 if (tf < _last_roll_or_reversal_location + offset) {
1887 return _last_roll_or_reversal_location;
1895 } else if (_transport_speed < 0.0f) {
1897 /* XXX wot? no backward looping? */
1899 if (tf > _last_roll_or_reversal_location - offset) {
1900 return _last_roll_or_reversal_location;
1912 Session::set_frame_rate (framecnt_t frames_per_second)
1914 /** \fn void Session::set_frame_size(framecnt_t)
1915 the AudioEngine object that calls this guarantees
1916 that it will not be called while we are also in
1917 ::process(). Its fine to do things that block
1921 _base_frame_rate = frames_per_second;
1922 _nominal_frame_rate = frames_per_second;
1927 reset_write_sources (false);
1929 // XXX we need some equivalent to this, somehow
1930 // SndFileSource::setup_standard_crossfades (frames_per_second);
1934 /* XXX need to reset/reinstantiate all LADSPA plugins */
1938 Session::set_block_size (pframes_t nframes)
1940 /* the AudioEngine guarantees
1941 that it will not be called while we are also in
1942 ::process(). It is therefore fine to do things that block
1947 current_block_size = nframes;
1951 boost::shared_ptr<RouteList> r = routes.reader ();
1953 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1954 (*i)->set_block_size (nframes);
1957 boost::shared_ptr<RouteList> rl = routes.reader ();
1958 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1959 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1961 tr->set_block_size (nframes);
1965 set_worst_io_latencies ();
1971 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1973 boost::shared_ptr<Route> r2;
1975 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1976 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1980 /* make a copy of the existing list of routes that feed r1 */
1982 Route::FedBy existing (r1->fed_by());
1984 /* for each route that feeds r1, recurse, marking it as feeding
1988 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1989 if (!(r2 = i->r.lock ())) {
1990 /* (*i) went away, ignore it */
1994 /* r2 is a route that feeds r1 which somehow feeds base. mark
1995 base as being fed by r2
1998 rbase->add_fed_by (r2, i->sends_only);
2002 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
2006 if (r1->feeds (r2) && r2->feeds (r1)) {
2010 /* now recurse, so that we can mark base as being fed by
2011 all routes that feed r2
2014 trace_terminal (r2, rbase);
2021 Session::resort_routes ()
2023 /* don't do anything here with signals emitted
2024 by Routes during initial setup or while we
2025 are being destroyed.
2028 if (_state_of_the_state & (InitialConnecting | Deletion)) {
2033 RCUWriter<RouteList> writer (routes);
2034 boost::shared_ptr<RouteList> r = writer.get_copy ();
2035 resort_routes_using (r);
2036 /* writer goes out of scope and forces update */
2040 boost::shared_ptr<RouteList> rl = routes.reader ();
2041 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2042 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
2044 const Route::FedBy& fb ((*i)->fed_by());
2046 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
2047 boost::shared_ptr<Route> sf = f->r.lock();
2049 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
2057 /** This is called whenever we need to rebuild the graph of how we will process
2059 * @param r List of routes, in any order.
2063 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
2065 /* We are going to build a directed graph of our routes;
2066 this is where the edges of that graph are put.
2071 /* Go through all routes doing two things:
2073 * 1. Collect the edges of the route graph. Each of these edges
2074 * is a pair of routes, one of which directly feeds the other
2075 * either by a JACK connection or by an internal send.
2077 * 2. Begin the process of making routes aware of which other
2078 * routes directly or indirectly feed them. This information
2079 * is used by the solo code.
2082 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2084 /* Clear out the route's list of direct or indirect feeds */
2085 (*i)->clear_fed_by ();
2087 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
2089 bool via_sends_only;
2091 /* See if this *j feeds *i according to the current state of the JACK
2092 connections and internal sends.
2094 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
2095 /* add the edge to the graph (part #1) */
2096 edges.add (*j, *i, via_sends_only);
2097 /* tell the route (for part #2) */
2098 (*i)->add_fed_by (*j, via_sends_only);
2103 /* Attempt a topological sort of the route graph */
2104 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
2106 if (sorted_routes) {
2107 /* We got a satisfactory topological sort, so there is no feedback;
2110 Note: the process graph rechain does not require a
2111 topologically-sorted list, but hey ho.
2113 if (_process_graph) {
2114 _process_graph->rechain (sorted_routes, edges);
2117 _current_route_graph = edges;
2119 /* Complete the building of the routes' lists of what directly
2120 or indirectly feeds them.
2122 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2123 trace_terminal (*i, *i);
2126 *r = *sorted_routes;
2129 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
2130 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2131 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
2132 (*i)->name(), (*i)->order_key ()));
2136 SuccessfulGraphSort (); /* EMIT SIGNAL */
2139 /* The topological sort failed, so we have a problem. Tell everyone
2140 and stick to the old graph; this will continue to be processed, so
2141 until the feedback is fixed, what is played back will not quite
2142 reflect what is actually connected. Note also that we do not
2143 do trace_terminal here, as it would fail due to an endless recursion,
2144 so the solo code will think that everything is still connected
2148 FeedbackDetected (); /* EMIT SIGNAL */
2153 /** Find a route name starting with \a base, maybe followed by the
2154 * lowest \a id. \a id will always be added if \a definitely_add_number
2155 * is true on entry; otherwise it will only be added if required
2156 * to make the name unique.
2158 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
2159 * The available route name with the lowest ID will be used, and \a id
2160 * will be set to the ID.
2162 * \return false if a route name could not be found, and \a track_name
2163 * and \a id do not reflect a free route name.
2166 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
2168 if (!definitely_add_number && route_by_name (base) == 0) {
2169 /* juse use the base */
2170 snprintf (name, name_len, "%s", base.c_str());
2175 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
2177 if (route_by_name (name) == 0) {
2183 } while (id < (UINT_MAX-1));
2188 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
2190 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
2192 in = ChanCount::ZERO;
2193 out = ChanCount::ZERO;
2195 boost::shared_ptr<RouteList> r = routes.reader ();
2197 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2198 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2199 if (tr && !tr->is_auditioner()) {
2200 in += tr->n_inputs();
2201 out += tr->n_outputs();
2206 /** Caller must not hold process lock
2207 * @param name_template string to use for the start of the name, or "" to use "MIDI".
2208 * @param instrument plugin info for the instrument to insert pre-fader, if any
2210 list<boost::shared_ptr<MidiTrack> >
2211 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
2212 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
2214 char track_name[1024];
2215 uint32_t track_id = 0;
2217 RouteList new_routes;
2218 list<boost::shared_ptr<MidiTrack> > ret;
2220 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
2223 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
2224 error << "cannot find name for new midi track" << endmsg;
2228 boost::shared_ptr<MidiTrack> track;
2231 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
2233 if (track->init ()) {
2237 track->use_new_diskstream();
2239 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2240 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2243 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2244 if (track->input()->ensure_io (input, false, this)) {
2245 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
2249 if (track->output()->ensure_io (output, false, this)) {
2250 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
2255 track->non_realtime_input_change();
2258 route_group->add (track);
2261 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2263 if (Config->get_remote_model() == UserOrdered) {
2264 track->set_remote_control_id (next_control_id());
2267 new_routes.push_back (track);
2268 ret.push_back (track);
2270 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2273 catch (failed_constructor &err) {
2274 error << _("Session: could not create new midi track.") << endmsg;
2278 catch (AudioEngine::PortRegistrationFailure& pfe) {
2280 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;
2288 if (!new_routes.empty()) {
2289 StateProtector sp (this);
2290 if (Profile->get_trx()) {
2291 add_routes (new_routes, false, false, false);
2293 add_routes (new_routes, true, true, false);
2297 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
2298 PluginPtr plugin = instrument->load (*this);
2299 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2300 (*r)->add_processor (p, PreFader);
2310 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2312 boost::shared_ptr<Route> midi_track (wmt.lock());
2318 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2320 if (change.after.n_audio() <= change.before.n_audio()) {
2324 /* new audio ports: make sure the audio goes somewhere useful,
2325 unless the user has no-auto-connect selected.
2327 The existing ChanCounts don't matter for this call as they are only
2328 to do with matching input and output indices, and we are only changing
2334 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
2338 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
2339 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
2340 * @param output_start As \a input_start, but for outputs.
2343 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
2344 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
2346 if (!IO::connecting_legal) {
2350 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2356 /* If both inputs and outputs are auto-connected to physical ports,
2357 use the max of input and output offsets to ensure auto-connected
2358 port numbers always match up (e.g. the first audio input and the
2359 first audio output of the route will have the same physical
2360 port number). Otherwise just use the lowest input or output
2364 DEBUG_TRACE (DEBUG::Graph,
2365 string_compose("Auto-connect: existing in = %1 out = %2\n",
2366 existing_inputs, existing_outputs));
2368 const bool in_out_physical =
2369 (Config->get_input_auto_connect() & AutoConnectPhysical)
2370 && (Config->get_output_auto_connect() & AutoConnectPhysical)
2373 const ChanCount in_offset = in_out_physical
2374 ? ChanCount::max(existing_inputs, existing_outputs)
2377 const ChanCount out_offset = in_out_physical
2378 ? ChanCount::max(existing_inputs, existing_outputs)
2381 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2382 vector<string> physinputs;
2383 vector<string> physoutputs;
2385 _engine.get_physical_outputs (*t, physoutputs);
2386 _engine.get_physical_inputs (*t, physinputs);
2388 if (!physinputs.empty() && connect_inputs) {
2389 uint32_t nphysical_in = physinputs.size();
2391 DEBUG_TRACE (DEBUG::Graph,
2392 string_compose("There are %1 physical inputs of type %2\n",
2395 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
2398 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
2399 DEBUG_TRACE (DEBUG::Graph,
2400 string_compose("Get index %1 + %2 % %3 = %4\n",
2401 in_offset.get(*t), i, nphysical_in,
2402 (in_offset.get(*t) + i) % nphysical_in));
2403 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
2406 DEBUG_TRACE (DEBUG::Graph,
2407 string_compose("Connect route %1 IN to %2\n",
2408 route->name(), port));
2410 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
2414 ChanCount one_added (*t, 1);
2415 existing_inputs += one_added;
2419 if (!physoutputs.empty()) {
2420 uint32_t nphysical_out = physoutputs.size();
2421 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
2425 * do not create new connections if we reached the limit of physical outputs
2429 if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
2430 ARDOUR::Profile->get_trx () &&
2431 existing_outputs.get(*t) == nphysical_out ) {
2435 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
2436 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
2437 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
2438 /* master bus is audio only */
2439 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
2440 port = _master_out->input()->ports().port(*t,
2441 i % _master_out->input()->n_ports().get(*t))->name();
2445 DEBUG_TRACE (DEBUG::Graph,
2446 string_compose("Connect route %1 OUT to %2\n",
2447 route->name(), port));
2449 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
2453 ChanCount one_added (*t, 1);
2454 existing_outputs += one_added;
2460 #ifdef USE_TRACKS_CODE_FEATURES
2463 compare_routes_by_remote_id (const boost::shared_ptr<Route>& route1, const boost::shared_ptr<Route>& route2)
2465 return route1->remote_control_id() < route2->remote_control_id();
2469 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2471 // it is not allowed to perform connection
2472 if (!IO::connecting_legal) {
2476 // if we are deleting routes we will call this once at the end
2477 if (_route_deletion_in_progress) {
2481 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2487 // We need to disconnect the route's inputs and outputs first
2488 // basing on autoconnect configuration
2489 bool reconnectIputs = !(Config->get_input_auto_connect() & ManualConnect) && reconnect_inputs;
2490 bool reconnectOutputs = !(Config->get_output_auto_connect() & ManualConnect) && reconnect_outputs;
2492 ChanCount existing_inputs;
2493 ChanCount existing_outputs;
2494 count_existing_track_channels (existing_inputs, existing_outputs);
2496 //ChanCount inputs = ChanCount::ZERO;
2497 //ChanCount outputs = ChanCount::ZERO;
2499 RouteList existing_routes = *routes.reader ();
2500 existing_routes.sort (compare_routes_by_remote_id);
2503 PBD::Unwinder<bool> protect_ignore_changes (_reconnecting_routes_in_progress, true);
2505 vector<string> physinputs;
2506 vector<string> physoutputs;
2508 EngineStateController::instance()->get_physical_audio_outputs(physoutputs);
2509 EngineStateController::instance()->get_physical_audio_inputs(physinputs);
2511 uint32_t input_n = 0;
2512 uint32_t output_n = 0;
2513 RouteList::iterator rIter = existing_routes.begin();
2514 const AutoConnectOption current_input_auto_connection (Config->get_input_auto_connect());
2515 const AutoConnectOption current_output_auto_connection (Config->get_output_auto_connect());
2516 for (; rIter != existing_routes.end(); ++rIter) {
2517 if (*rIter == _master_out || *rIter == _monitor_out ) {
2521 if (current_output_auto_connection == AutoConnectPhysical) {
2522 (*rIter)->amp()->deactivate();
2523 } else if (current_output_auto_connection == AutoConnectMaster) {
2524 (*rIter)->amp()->activate();
2527 if (reconnectIputs) {
2528 (*rIter)->input()->disconnect (this); //GZ: check this; could be heavy
2530 for (uint32_t route_input_n = 0; route_input_n < (*rIter)->n_inputs().get(DataType::AUDIO); ++route_input_n) {
2532 if (current_input_auto_connection & AutoConnectPhysical) {
2534 if ( input_n == physinputs.size() ) {
2538 string port = physinputs[input_n];
2540 if (port.empty() ) {
2541 error << "Physical Input number "<< input_n << " is unavailable and cannot be connected" << endmsg;
2544 //GZ: check this; could be heavy
2545 (*rIter)->input()->connect ((*rIter)->input()->ports().port(DataType::AUDIO, route_input_n), port, this);
2551 if (reconnectOutputs) {
2553 //normalize route ouptuts: reduce the amount outputs to be equal to the amount of inputs
2554 if (current_output_auto_connection & AutoConnectPhysical) {
2556 //GZ: check this; could be heavy
2557 (*rIter)->output()->disconnect (this);
2558 size_t route_inputs_count = (*rIter)->n_inputs().get(DataType::AUDIO);
2560 //GZ: check this; could be heavy
2561 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, route_inputs_count), false, this );
2563 } else if (current_output_auto_connection & AutoConnectMaster){
2565 if (!reconnect_master) {
2569 //GZ: check this; could be heavy
2570 (*rIter)->output()->disconnect (this);
2573 uint32_t master_inputs_count = _master_out->n_inputs().get(DataType::AUDIO);
2574 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, master_inputs_count), false, this );
2576 error << error << "Master bus is not available" << endmsg;
2581 for (uint32_t route_output_n = 0; route_output_n < (*rIter)->n_outputs().get(DataType::AUDIO); ++route_output_n) {
2582 if (current_output_auto_connection & AutoConnectPhysical) {
2584 if ( output_n == physoutputs.size() ) {
2588 string port = physoutputs[output_n];
2590 if (port.empty() ) {
2591 error << "Physical Output number "<< output_n << " is unavailable and cannot be connected" << endmsg;
2594 //GZ: check this; could be heavy
2595 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2598 } else if (current_output_auto_connection & AutoConnectMaster) {
2600 if ( route_output_n == _master_out->n_inputs().get(DataType::AUDIO) ) {
2604 // connect to master bus
2605 string port = _master_out->input()->ports().port(DataType::AUDIO, route_output_n)->name();
2607 if (port.empty() ) {
2608 error << "MasterBus Input number "<< route_output_n << " is unavailable and cannot be connected" << endmsg;
2612 //GZ: check this; could be heavy
2613 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2619 //auto_connect_route (*rIter, inputs, outputs, false, reconnectIputs);
2622 _master_out->output()->disconnect (this);
2623 auto_connect_master_bus ();
2628 session_routes_reconnected (); /* EMIT SIGNAL */
2632 Session::reconnect_midi_scene_ports(bool inputs)
2636 boost::shared_ptr<MidiPort> scene_in_ptr = scene_in();
2638 scene_in_ptr->disconnect_all ();
2640 std::vector<EngineStateController::MidiPortState> midi_port_states;
2641 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2643 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2645 for (; state_iter != midi_port_states.end(); ++state_iter) {
2646 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2647 scene_in_ptr->connect (state_iter->name);
2654 boost::shared_ptr<MidiPort> scene_out_ptr = scene_out();
2656 if (scene_out_ptr ) {
2657 scene_out_ptr->disconnect_all ();
2659 std::vector<EngineStateController::MidiPortState> midi_port_states;
2660 EngineStateController::instance()->get_physical_midi_output_states (midi_port_states);
2662 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2664 for (; state_iter != midi_port_states.end(); ++state_iter) {
2665 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2666 scene_out_ptr->connect (state_iter->name);
2674 Session::reconnect_mtc_ports()
2677 boost::shared_ptr<MidiPort> mtc_in_ptr = _midi_ports->mtc_input_port();
2680 mtc_in_ptr->disconnect_all ();
2682 std::vector<EngineStateController::MidiPortState> midi_port_states;
2683 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2685 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2687 for (; state_iter != midi_port_states.end(); ++state_iter) {
2688 if (state_iter->available && state_iter->mtc_in) {
2689 mtc_in_ptr->connect (state_iter->name);
2693 if (!_midi_ports->mtc_input_port ()->connected () &&
2694 config.get_external_sync () &&
2695 (Config->get_sync_source () == MTC) ) {
2696 config.set_external_sync (false);
2698 if ( ARDOUR::Profile->get_trx () ) {
2699 // Tracks need this signal to update timecode_source_dropdown
2700 MtcOrLtcInputPortChanged (); //emit signal
2707 Session::reconnect_mmc_ports(bool inputs)
2709 if (inputs ) { // get all enabled midi input ports
2711 boost::shared_ptr<MidiPort> mmc_in_ptr = _midi_ports->mmc_in();
2713 mmc_in_ptr->disconnect_all ();
2714 std::vector<std::string> enabled_midi_inputs;
2715 EngineStateController::instance()->get_physical_midi_inputs (enabled_midi_inputs);
2717 std::vector<std::string>::iterator port_iter = enabled_midi_inputs.begin();
2719 for (; port_iter != enabled_midi_inputs.end(); ++port_iter) {
2720 mmc_in_ptr->connect (*port_iter);
2724 } else { // get all enabled midi output ports
2726 boost::shared_ptr<MidiPort> mmc_out_ptr = _midi_ports->mmc_out();
2728 mmc_out_ptr->disconnect_all ();
2729 std::vector<std::string> enabled_midi_outputs;
2730 EngineStateController::instance()->get_physical_midi_outputs (enabled_midi_outputs);
2732 std::vector<std::string>::iterator port_iter = enabled_midi_outputs.begin();
2734 for (; port_iter != enabled_midi_outputs.end(); ++port_iter) {
2735 mmc_out_ptr->connect (*port_iter);
2743 /** Caller must not hold process lock
2744 * @param name_template string to use for the start of the name, or "" to use "Audio".
2746 list< boost::shared_ptr<AudioTrack> >
2747 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
2748 uint32_t how_many, string name_template)
2750 char track_name[1024];
2751 uint32_t track_id = 0;
2753 RouteList new_routes;
2754 list<boost::shared_ptr<AudioTrack> > ret;
2756 string name_pattern;
2758 if (Profile->get_trx() ) {
2759 name_pattern = "Track ";
2761 name_pattern = "Audio ";
2764 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _(name_pattern.c_str() );
2768 if (!find_route_name (name_template.empty() ? _(name_pattern.c_str()) : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
2769 error << "cannot find name for new audio track" << endmsg;
2773 boost::shared_ptr<AudioTrack> track;
2776 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
2778 if (track->init ()) {
2782 if (ARDOUR::Profile->get_trx ()) {
2783 // TRACKS considers it's not a USE CASE, it's
2784 // a piece of behavior of the session model:
2786 // Gain for a newly created route depends on
2787 // the current output_auto_connect mode:
2789 // 0 for Stereo Out mode
2791 if (Config->get_output_auto_connect() & AutoConnectMaster) {
2792 track->set_gain (dB_to_coefficient (0), 0);
2796 track->use_new_diskstream();
2798 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2799 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2802 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2804 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2805 error << string_compose (
2806 _("cannot configure %1 in/%2 out configuration for new audio track"),
2807 input_channels, output_channels)
2812 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2813 error << string_compose (
2814 _("cannot configure %1 in/%2 out configuration for new audio track"),
2815 input_channels, output_channels)
2822 route_group->add (track);
2825 track->non_realtime_input_change();
2827 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2828 if (Config->get_remote_model() == UserOrdered) {
2829 track->set_remote_control_id (next_control_id());
2832 new_routes.push_back (track);
2833 ret.push_back (track);
2835 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2838 catch (failed_constructor &err) {
2839 error << _("Session: could not create new audio track.") << endmsg;
2843 catch (AudioEngine::PortRegistrationFailure& pfe) {
2845 error << pfe.what() << endmsg;
2853 if (!new_routes.empty()) {
2854 StateProtector sp (this);
2855 if (Profile->get_trx()) {
2856 add_routes (new_routes, false, false, false);
2858 add_routes (new_routes, true, true, false);
2865 /** Caller must not hold process lock.
2866 * @param name_template string to use for the start of the name, or "" to use "Bus".
2869 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
2872 uint32_t bus_id = 0;
2876 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
2879 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
2880 error << "cannot find name for new audio bus" << endmsg;
2885 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
2891 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2892 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
2895 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2897 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2898 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2899 input_channels, output_channels)
2905 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2906 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2907 input_channels, output_channels)
2914 route_group->add (bus);
2916 if (Config->get_remote_model() == UserOrdered) {
2917 bus->set_remote_control_id (next_control_id());
2920 bus->add_internal_return ();
2922 ret.push_back (bus);
2924 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2930 catch (failed_constructor &err) {
2931 error << _("Session: could not create new audio route.") << endmsg;
2935 catch (AudioEngine::PortRegistrationFailure& pfe) {
2936 error << pfe.what() << endmsg;
2946 StateProtector sp (this);
2947 if (Profile->get_trx()) {
2948 add_routes (ret, false, false, false);
2950 add_routes (ret, false, true, true); // autoconnect // outputs only
2959 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base)
2962 uint32_t control_id;
2964 uint32_t number = 0;
2965 const uint32_t being_added = how_many;
2967 if (!tree.read (template_path.c_str())) {
2971 XMLNode* node = tree.root();
2973 IO::disable_connecting ();
2975 control_id = next_control_id ();
2979 XMLNode node_copy (*node);
2981 /* Remove IDs of everything so that new ones are used */
2982 node_copy.remove_property_recursively (X_("id"));
2987 if (!name_base.empty()) {
2989 /* if we're adding more than one routes, force
2990 * all the names of the new routes to be
2991 * numbered, via the final parameter.
2994 if (!find_route_name (name_base.c_str(), ++number, name, sizeof(name), (being_added > 1))) {
2995 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3001 string const route_name = node_copy.property(X_("name"))->value ();
3003 /* generate a new name by adding a number to the end of the template name */
3004 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
3005 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3006 abort(); /*NOTREACHED*/
3010 /* set this name in the XML description that we are about to use */
3011 Route::set_name_in_state (node_copy, name);
3013 /* trim bitslots from listen sends so that new ones are used */
3014 XMLNodeList children = node_copy.children ();
3015 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
3016 if ((*i)->name() == X_("Processor")) {
3017 XMLProperty* role = (*i)->property (X_("role"));
3018 if (role && role->value() == X_("Listen")) {
3019 (*i)->remove_property (X_("bitslot"));
3024 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
3027 error << _("Session: cannot create track/bus from template description") << endmsg;
3031 if (boost::dynamic_pointer_cast<Track>(route)) {
3032 /* force input/output change signals so that the new diskstream
3033 picks up the configuration of the route. During session
3034 loading this normally happens in a different way.
3037 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3039 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
3040 change.after = route->input()->n_ports();
3041 route->input()->changed (change, this);
3042 change.after = route->output()->n_ports();
3043 route->output()->changed (change, this);
3046 route->set_remote_control_id (control_id);
3049 ret.push_back (route);
3051 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
3054 catch (failed_constructor &err) {
3055 error << _("Session: could not create new route from template") << endmsg;
3059 catch (AudioEngine::PortRegistrationFailure& pfe) {
3060 error << pfe.what() << endmsg;
3069 StateProtector sp (this);
3070 if (Profile->get_trx()) {
3071 add_routes (ret, false, false, false);
3073 add_routes (ret, true, true, false);
3075 IO::enable_connecting ();
3082 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
3085 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
3086 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
3089 error << _("Adding new tracks/busses failed") << endmsg;
3094 update_latency (true);
3095 update_latency (false);
3100 save_state (_current_snapshot_name);
3103 reassign_track_numbers();
3105 update_route_record_state ();
3107 RouteAdded (new_routes); /* EMIT SIGNAL */
3111 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
3113 ChanCount existing_inputs;
3114 ChanCount existing_outputs;
3115 uint32_t order = next_control_id();
3117 if (_order_hint > -1) {
3118 order = _order_hint;
3122 count_existing_track_channels (existing_inputs, existing_outputs);
3125 RCUWriter<RouteList> writer (routes);
3126 boost::shared_ptr<RouteList> r = writer.get_copy ();
3127 r->insert (r->end(), new_routes.begin(), new_routes.end());
3129 /* if there is no control out and we're not in the middle of loading,
3130 resort the graph here. if there is a control out, we will resort
3131 toward the end of this method. if we are in the middle of loading,
3132 we will resort when done.
3135 if (!_monitor_out && IO::connecting_legal) {
3136 resort_routes_using (r);
3140 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3142 boost::weak_ptr<Route> wpr (*x);
3143 boost::shared_ptr<Route> r (*x);
3145 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
3146 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
3147 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
3148 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
3149 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
3150 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
3152 if (r->is_master()) {
3156 if (r->is_monitor()) {
3160 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
3162 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
3163 track_playlist_changed (boost::weak_ptr<Track> (tr));
3164 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
3166 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
3168 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
3169 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
3174 if (input_auto_connect || output_auto_connect) {
3175 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
3178 /* order keys are a GUI responsibility but we need to set up
3179 reasonable defaults because they also affect the remote control
3180 ID in most situations.
3183 if (!r->has_order_key ()) {
3184 if (r->is_auditioner()) {
3185 /* use an arbitrarily high value */
3186 r->set_order_key (UINT_MAX);
3188 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
3189 r->set_order_key (order);
3197 if (_monitor_out && IO::connecting_legal) {
3198 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
3200 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3201 if ((*x)->is_monitor()) {
3203 } else if ((*x)->is_master()) {
3206 (*x)->enable_monitor_send ();
3213 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
3215 boost::shared_ptr<RouteList> r = routes.reader ();
3216 boost::shared_ptr<Send> s;
3218 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3219 if ((s = (*i)->internal_send_for (dest)) != 0) {
3220 s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO);
3226 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
3228 boost::shared_ptr<RouteList> r = routes.reader ();
3229 boost::shared_ptr<Send> s;
3231 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3232 if ((s = (*i)->internal_send_for (dest)) != 0) {
3233 s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY);
3239 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
3241 boost::shared_ptr<RouteList> r = routes.reader ();
3242 boost::shared_ptr<Send> s;
3244 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3245 if ((s = (*i)->internal_send_for (dest)) != 0) {
3246 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
3251 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
3253 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
3255 boost::shared_ptr<RouteList> r = routes.reader ();
3256 boost::shared_ptr<RouteList> t (new RouteList);
3258 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3259 /* no MIDI sends because there are no MIDI busses yet */
3260 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
3265 add_internal_sends (dest, p, t);
3269 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
3271 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
3272 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
3277 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
3279 add_internal_send (dest, sender->before_processor_for_index (index), sender);
3283 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
3285 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
3289 if (!dest->internal_return()) {
3290 dest->add_internal_return ();
3293 sender->add_aux_send (dest, before);
3300 Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
3302 { // RCU Writer scope
3303 RCUWriter<RouteList> writer (routes);
3304 boost::shared_ptr<RouteList> rs = writer.get_copy ();
3307 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3309 if (*iter == _master_out) {
3313 (*iter)->set_solo (false, this);
3317 /* deleting the master out seems like a dumb
3318 idea, but its more of a UI policy issue
3322 if (*iter == _master_out) {
3323 _master_out = boost::shared_ptr<Route> ();
3326 if (*iter == _monitor_out) {
3327 _monitor_out.reset ();
3330 update_route_solo_state ();
3332 // We need to disconnect the route's inputs and outputs
3334 (*iter)->input()->disconnect (0);
3335 (*iter)->output()->disconnect (0);
3337 /* if the route had internal sends sending to it, remove them */
3338 if ((*iter)->internal_return()) {
3340 boost::shared_ptr<RouteList> r = routes.reader ();
3341 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3342 boost::shared_ptr<Send> s = (*i)->internal_send_for (*iter);
3344 (*i)->remove_processor (s);
3349 /* if the monitoring section had a pointer to this route, remove it */
3350 if (_monitor_out && !(*iter)->is_master() && !(*iter)->is_monitor()) {
3351 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3352 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
3353 (*iter)->remove_aux_or_listen (_monitor_out);
3356 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*iter);
3357 if (mt && mt->step_editing()) {
3358 if (_step_editors > 0) {
3363 RouteAddedOrRemoved (false); /* EMIT SIGNAL */
3366 /* writer goes out of scope, forces route list update */
3368 } // end of RCU Writer scope
3370 update_latency_compensation ();
3373 /* Re-sort routes to remove the graph's current references to the one that is
3374 * going away, then flush old references out of the graph.
3375 * Wave Tracks: reconnect routes
3378 #ifdef USE_TRACKS_CODE_FEATURES
3379 reconnect_existing_routes(true, false);
3384 if (_process_graph) {
3385 _process_graph->clear_other_chain ();
3388 /* get rid of it from the dead wood collection in the route list manager */
3389 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
3393 /* try to cause everyone to drop their references
3394 * and unregister ports from the backend
3396 PBD::Unwinder<bool> uw_flag (_route_deletion_in_progress, true);
3398 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3399 (*iter)->drop_references ();
3402 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
3404 /* save the new state of the world */
3406 if (save_state (_current_snapshot_name)) {
3407 save_history (_current_snapshot_name);
3410 reassign_track_numbers();
3411 update_route_record_state ();
3415 Session::remove_route (boost::shared_ptr<Route> route)
3417 boost::shared_ptr<RouteList> rl (new RouteList);
3418 rl->push_back (route);
3423 Session::route_mute_changed (void* /*src*/)
3429 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3431 boost::shared_ptr<Route> route = wpr.lock();
3433 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
3437 if (route->listening_via_monitor ()) {
3439 if (Config->get_exclusive_solo()) {
3440 /* new listen: disable all other listen */
3441 boost::shared_ptr<RouteList> r = routes.reader ();
3442 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3443 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3446 (*i)->set_listen (false, this);
3452 } else if (_listen_cnt > 0) {
3457 update_route_solo_state ();
3460 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3462 boost::shared_ptr<Route> route = wpr.lock ();
3465 /* should not happen */
3466 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
3470 bool send_changed = false;
3472 if (route->solo_isolated()) {
3473 if (_solo_isolated_cnt == 0) {
3474 send_changed = true;
3476 _solo_isolated_cnt++;
3477 } else if (_solo_isolated_cnt > 0) {
3478 _solo_isolated_cnt--;
3479 if (_solo_isolated_cnt == 0) {
3480 send_changed = true;
3485 IsolatedChanged (); /* EMIT SIGNAL */
3490 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
3492 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
3494 if (!self_solo_change) {
3495 // session doesn't care about changes to soloed-by-others
3499 if (solo_update_disabled) {
3501 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
3505 boost::shared_ptr<Route> route = wpr.lock ();
3508 boost::shared_ptr<RouteList> r = routes.reader ();
3511 if (route->self_soloed()) {
3517 RouteGroup* rg = route->route_group ();
3518 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
3520 if (delta == 1 && Config->get_exclusive_solo()) {
3522 /* new solo: disable all other solos, but not the group if its solo-enabled */
3524 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3525 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3526 (leave_group_alone && ((*i)->route_group() == rg))) {
3529 (*i)->set_solo (false, this);
3533 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3535 solo_update_disabled = true;
3537 RouteList uninvolved;
3539 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
3541 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3542 bool via_sends_only;
3543 bool in_signal_flow;
3545 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3546 (leave_group_alone && ((*i)->route_group() == rg))) {
3550 in_signal_flow = false;
3552 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3554 if ((*i)->feeds (route, &via_sends_only)) {
3555 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3556 if (!via_sends_only) {
3557 if (!route->soloed_by_others_upstream()) {
3558 (*i)->mod_solo_by_others_downstream (delta);
3561 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3563 in_signal_flow = true;
3565 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3568 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3570 if (route->feeds (*i, &via_sends_only)) {
3571 /* propagate solo upstream only if routing other than
3572 sends is involved, but do consider the other route
3573 (*i) to be part of the signal flow even if only
3576 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3580 route->soloed_by_others_downstream(),
3581 route->soloed_by_others_upstream()));
3582 if (!via_sends_only) {
3583 if (!route->soloed_by_others_downstream()) {
3584 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3585 (*i)->mod_solo_by_others_upstream (delta);
3587 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
3590 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3592 in_signal_flow = true;
3594 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3597 if (!in_signal_flow) {
3598 uninvolved.push_back (*i);
3602 solo_update_disabled = false;
3603 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3605 update_route_solo_state (r);
3607 /* now notify that the mute state of the routes not involved in the signal
3608 pathway of the just-solo-changed route may have altered.
3611 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3612 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
3613 (*i)->act_on_mute ();
3614 (*i)->mute_changed (this);
3617 SoloChanged (); /* EMIT SIGNAL */
3622 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
3624 /* now figure out if anything that matters is soloed (or is "listening")*/
3626 bool something_soloed = false;
3627 uint32_t listeners = 0;
3628 uint32_t isolated = 0;
3631 r = routes.reader();
3634 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3635 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
3636 something_soloed = true;
3639 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
3640 if (Config->get_solo_control_is_listen_control()) {
3643 (*i)->set_listen (false, this);
3647 if ((*i)->solo_isolated()) {
3652 if (something_soloed != _non_soloed_outs_muted) {
3653 _non_soloed_outs_muted = something_soloed;
3654 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
3657 _listen_cnt = listeners;
3659 if (isolated != _solo_isolated_cnt) {
3660 _solo_isolated_cnt = isolated;
3661 IsolatedChanged (); /* EMIT SIGNAL */
3664 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
3665 something_soloed, listeners, isolated));
3668 boost::shared_ptr<RouteList>
3669 Session::get_routes_with_internal_returns() const
3671 boost::shared_ptr<RouteList> r = routes.reader ();
3672 boost::shared_ptr<RouteList> rl (new RouteList);
3674 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3675 if ((*i)->internal_return ()) {
3683 Session::io_name_is_legal (const std::string& name)
3685 boost::shared_ptr<RouteList> r = routes.reader ();
3687 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3688 if ((*i)->name() == name) {
3692 if ((*i)->has_io_processor_named (name)) {
3701 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
3704 vector<string> connections;
3706 /* if we are passed only a single route and we're not told to turn
3707 * others off, then just do the simple thing.
3710 if (flip_others == false && rl->size() == 1) {
3711 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
3713 mt->set_input_active (onoff);
3718 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
3720 PortSet& ps ((*rt)->input()->ports());
3722 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
3723 p->get_connections (connections);
3726 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
3727 routes_using_input_from (*s, rl2);
3730 /* scan all relevant routes to see if others are on or off */
3732 bool others_are_already_on = false;
3734 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3736 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3742 if ((*r) != (*rt)) {
3743 if (mt->input_active()) {
3744 others_are_already_on = true;
3747 /* this one needs changing */
3748 mt->set_input_active (onoff);
3754 /* globally reverse other routes */
3756 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3757 if ((*r) != (*rt)) {
3758 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3760 mt->set_input_active (!others_are_already_on);
3769 Session::routes_using_input_from (const string& str, RouteList& rl)
3771 boost::shared_ptr<RouteList> r = routes.reader();
3773 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3774 if ((*i)->input()->connected_to (str)) {
3780 boost::shared_ptr<Route>
3781 Session::route_by_name (string name)
3783 boost::shared_ptr<RouteList> r = routes.reader ();
3785 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3786 if ((*i)->name() == name) {
3791 return boost::shared_ptr<Route> ((Route*) 0);
3794 boost::shared_ptr<Route>
3795 Session::route_by_id (PBD::ID id)
3797 boost::shared_ptr<RouteList> r = routes.reader ();
3799 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3800 if ((*i)->id() == id) {
3805 return boost::shared_ptr<Route> ((Route*) 0);
3808 boost::shared_ptr<Track>
3809 Session::track_by_diskstream_id (PBD::ID id)
3811 boost::shared_ptr<RouteList> r = routes.reader ();
3813 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3814 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3815 if (t && t->using_diskstream_id (id)) {
3820 return boost::shared_ptr<Track> ();
3823 boost::shared_ptr<Route>
3824 Session::route_by_remote_id (uint32_t id)
3826 boost::shared_ptr<RouteList> r = routes.reader ();
3828 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3829 if ((*i)->remote_control_id() == id) {
3834 return boost::shared_ptr<Route> ((Route*) 0);
3839 Session::reassign_track_numbers ()
3843 RouteList r (*(routes.reader ()));
3844 SignalOrderRouteSorter sorter;
3847 StateProtector sp (this);
3849 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3850 if (boost::dynamic_pointer_cast<Track> (*i)) {
3851 (*i)->set_track_number(++tn);
3853 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
3854 (*i)->set_track_number(--bn);
3857 const uint32_t decimals = ceilf (log10f (tn + 1));
3858 const bool decimals_changed = _track_number_decimals != decimals;
3859 _track_number_decimals = decimals;
3861 if (decimals_changed && config.get_track_name_number ()) {
3862 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3863 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3865 t->resync_track_name();
3868 // trigger GUI re-layout
3869 config.ParameterChanged("track-name-number");
3874 Session::playlist_region_added (boost::weak_ptr<Region> w)
3876 boost::shared_ptr<Region> r = w.lock ();
3881 /* These are the operations that are currently in progress... */
3882 list<GQuark> curr = _current_trans_quarks;
3885 /* ...and these are the operations during which we want to update
3886 the session range location markers.
3889 ops.push_back (Operations::capture);
3890 ops.push_back (Operations::paste);
3891 ops.push_back (Operations::duplicate_region);
3892 ops.push_back (Operations::insert_file);
3893 ops.push_back (Operations::insert_region);
3894 ops.push_back (Operations::drag_region_brush);
3895 ops.push_back (Operations::region_drag);
3896 ops.push_back (Operations::selection_grab);
3897 ops.push_back (Operations::region_fill);
3898 ops.push_back (Operations::fill_selection);
3899 ops.push_back (Operations::create_region);
3900 ops.push_back (Operations::region_copy);
3901 ops.push_back (Operations::fixed_time_region_copy);
3904 /* See if any of the current operations match the ones that we want */
3906 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
3908 /* If so, update the session range markers */
3910 maybe_update_session_range (r->position (), r->last_frame ());
3914 /** Update the session range markers if a is before the current start or
3915 * b is after the current end.
3918 Session::maybe_update_session_range (framepos_t a, framepos_t b)
3920 if (_state_of_the_state & Loading) {
3924 if (_session_range_location == 0) {
3926 add_session_range_location (a, b);
3930 if (a < _session_range_location->start()) {
3931 _session_range_location->set_start (a);
3934 if (b > _session_range_location->end()) {
3935 _session_range_location->set_end (b);
3941 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
3943 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3944 maybe_update_session_range (i->to, i->to + i->length);
3949 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
3951 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3952 maybe_update_session_range (i->from, i->to);
3956 /* Region management */
3958 boost::shared_ptr<Region>
3959 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
3961 const RegionFactory::RegionMap& regions (RegionFactory::regions());
3962 RegionFactory::RegionMap::const_iterator i;
3963 boost::shared_ptr<Region> region;
3965 Glib::Threads::Mutex::Lock lm (region_lock);
3967 for (i = regions.begin(); i != regions.end(); ++i) {
3971 if (region->whole_file()) {
3973 if (child->source_equivalent (region)) {
3979 return boost::shared_ptr<Region> ();
3983 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
3985 set<boost::shared_ptr<Region> > relevant_regions;
3987 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
3988 RegionFactory::get_regions_using_source (*s, relevant_regions);
3991 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
3992 set<boost::shared_ptr<Region> >::iterator tmp;
3997 playlists->destroy_region (*r);
3998 RegionFactory::map_remove (*r);
4000 (*r)->drop_sources ();
4001 (*r)->drop_references ();
4003 relevant_regions.erase (r);
4008 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
4011 Glib::Threads::Mutex::Lock ls (source_lock);
4012 /* remove from the main source list */
4013 sources.erase ((*s)->id());
4016 (*s)->mark_for_remove ();
4017 (*s)->drop_references ();
4026 Session::remove_last_capture ()
4028 list<boost::shared_ptr<Source> > srcs;
4030 boost::shared_ptr<RouteList> rl = routes.reader ();
4031 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4032 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4037 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
4040 srcs.insert (srcs.end(), l.begin(), l.end());
4045 destroy_sources (srcs);
4047 save_state (_current_snapshot_name);
4052 /* Source Management */
4055 Session::add_source (boost::shared_ptr<Source> source)
4057 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
4058 pair<SourceMap::iterator,bool> result;
4060 entry.first = source->id();
4061 entry.second = source;
4064 Glib::Threads::Mutex::Lock lm (source_lock);
4065 result = sources.insert (entry);
4068 if (result.second) {
4070 /* yay, new source */
4072 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
4075 if (!fs->within_session()) {
4076 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
4082 boost::shared_ptr<AudioFileSource> afs;
4084 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
4085 if (Config->get_auto_analyse_audio()) {
4086 Analyser::queue_source_for_analysis (source, false);
4090 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
4095 Session::remove_source (boost::weak_ptr<Source> src)
4097 if (_state_of_the_state & Deletion) {
4101 SourceMap::iterator i;
4102 boost::shared_ptr<Source> source = src.lock();
4109 Glib::Threads::Mutex::Lock lm (source_lock);
4111 if ((i = sources.find (source->id())) != sources.end()) {
4116 if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
4118 /* save state so we don't end up with a session file
4119 referring to non-existent sources.
4122 save_state (_current_snapshot_name);
4126 boost::shared_ptr<Source>
4127 Session::source_by_id (const PBD::ID& id)
4129 Glib::Threads::Mutex::Lock lm (source_lock);
4130 SourceMap::iterator i;
4131 boost::shared_ptr<Source> source;
4133 if ((i = sources.find (id)) != sources.end()) {
4140 boost::shared_ptr<AudioFileSource>
4141 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
4143 /* Restricted to audio files because only audio sources have channel
4147 Glib::Threads::Mutex::Lock lm (source_lock);
4149 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
4150 boost::shared_ptr<AudioFileSource> afs
4151 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
4153 if (afs && afs->path() == path && chn == afs->channel()) {
4158 return boost::shared_ptr<AudioFileSource>();
4161 boost::shared_ptr<MidiSource>
4162 Session::midi_source_by_path (const std::string& path) const
4164 /* Restricted to MIDI files because audio sources require a channel
4165 for unique identification, in addition to a path.
4168 Glib::Threads::Mutex::Lock lm (source_lock);
4170 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
4171 boost::shared_ptr<MidiSource> ms
4172 = boost::dynamic_pointer_cast<MidiSource>(s->second);
4173 boost::shared_ptr<FileSource> fs
4174 = boost::dynamic_pointer_cast<FileSource>(s->second);
4176 if (ms && fs && fs->path() == path) {
4181 return boost::shared_ptr<MidiSource>();
4185 Session::count_sources_by_origin (const string& path)
4188 Glib::Threads::Mutex::Lock lm (source_lock);
4190 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
4191 boost::shared_ptr<FileSource> fs
4192 = boost::dynamic_pointer_cast<FileSource>(i->second);
4194 if (fs && fs->origin() == path) {
4203 Session::peak_path (string base) const
4205 if (Glib::path_is_absolute (base)) {
4207 /* rip the session dir from the audiofile source */
4209 string session_path;
4210 string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
4211 bool in_another_session = true;
4213 if (base.find (interchange_dir_string) != string::npos) {
4215 session_path = Glib::path_get_dirname (base); /* now ends in audiofiles */
4216 session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
4217 session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
4218 session_path = Glib::path_get_dirname (session_path); /* now has session path */
4220 /* see if it is within our session */
4222 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4223 if (i->path == session_path) {
4224 in_another_session = false;
4229 in_another_session = false;
4233 if (in_another_session) {
4234 SessionDirectory sd (session_path);
4235 return Glib::build_filename (sd.peak_path(), Glib::path_get_basename (base) + peakfile_suffix);
4239 base = Glib::path_get_basename (base);
4240 return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
4244 Session::new_audio_source_path_for_embedded (const std::string& path)
4248 * we know that the filename is already unique because it exists
4249 * out in the filesystem.
4251 * However, when we bring it into the session, we could get a
4254 * Eg. two embedded files:
4259 * When merged into session, these collide.
4261 * There will not be a conflict with in-memory sources
4262 * because when the source was created we already picked
4263 * a unique name for it.
4265 * This collision is not likely to be common, but we have to guard
4266 * against it. So, if there is a collision, take the md5 hash of the
4267 * the path, and use that as the filename instead.
4270 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4271 string base = Glib::path_get_basename (path);
4272 string newpath = Glib::build_filename (sdir.sound_path(), base);
4274 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4278 md5.digestString (path.c_str());
4279 md5.writeToString ();
4280 base = md5.digestChars;
4282 string ext = get_suffix (path);
4289 newpath = Glib::build_filename (sdir.sound_path(), base);
4291 /* if this collides, we're screwed */
4293 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4294 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
4303 /** Return true if there are no audio file sources that use @param name as
4304 * the filename component of their path.
4306 * Return false otherwise.
4308 * This method MUST ONLY be used to check in-session, mono files since it
4309 * hard-codes the channel of the audio file source we are looking for as zero.
4311 * If/when Ardour supports native files in non-mono formats, the logic here
4312 * will need to be revisited.
4315 Session::audio_source_name_is_unique (const string& name)
4317 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
4318 vector<space_and_path>::iterator i;
4319 uint32_t existing = 0;
4321 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4323 /* note that we search *without* the extension so that
4324 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
4325 in the event that this new name is required for
4326 a file format change.
4329 const string spath = *i;
4331 if (matching_unsuffixed_filename_exists_in (spath, name)) {
4336 /* it is possible that we have the path already
4337 * assigned to a source that has not yet been written
4338 * (ie. the write source for a diskstream). we have to
4339 * check this in order to make sure that our candidate
4340 * path isn't used again, because that can lead to
4341 * two Sources point to the same file with different
4342 * notions of their removability.
4346 string possible_path = Glib::build_filename (spath, name);
4348 if (audio_source_by_path_and_channel (possible_path, 0)) {
4354 return (existing == 0);
4358 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)
4361 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4363 if (Profile->get_trx() && destructive) {
4365 sstr << setfill ('0') << setw (4) << cnt;
4366 sstr << legalized_base;
4368 sstr << legalized_base;
4370 if (take_required || related_exists) {
4382 } else if (nchan > 2) {
4387 /* XXX what? more than 26 channels! */
4398 /** Return a unique name based on \a base for a new internal audio source */
4400 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
4403 string possible_name;
4404 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
4406 bool some_related_source_name_exists = false;
4408 legalized = legalize_for_path (base);
4410 // Find a "version" of the base name that doesn't exist in any of the possible directories.
4412 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
4414 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
4416 if (audio_source_name_is_unique (possible_name)) {
4420 some_related_source_name_exists = true;
4423 error << string_compose(
4424 _("There are already %1 recordings for %2, which I consider too many."),
4425 limit, base) << endmsg;
4427 throw failed_constructor();
4431 /* We've established that the new name does not exist in any session
4432 * directory, so now find out which one we should use for this new
4436 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4438 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
4443 /** Return a unique name based on `base` for a new internal MIDI source */
4445 Session::new_midi_source_path (const string& base)
4448 char buf[PATH_MAX+1];
4449 const uint32_t limit = 10000;
4451 string possible_path;
4452 string possible_name;
4455 legalized = legalize_for_path (base);
4457 // Find a "version" of the file name that doesn't exist in any of the possible directories.
4458 std::vector<string> sdirs = source_search_path(DataType::MIDI);
4460 /* - the main session folder is the first in the vector.
4461 * - after checking all locations for file-name uniqueness,
4462 * we keep the one from the last iteration as new file name
4463 * - midi files are small and should just be kept in the main session-folder
4465 * -> reverse the array, check main session folder last and use that as location
4468 std::reverse(sdirs.begin(), sdirs.end());
4470 for (cnt = 1; cnt <= limit; ++cnt) {
4472 vector<space_and_path>::iterator i;
4473 uint32_t existing = 0;
4475 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4477 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
4478 possible_name = buf;
4480 possible_path = Glib::build_filename (*i, possible_name);
4482 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
4486 if (midi_source_by_path (possible_path)) {
4491 if (existing == 0) {
4496 error << string_compose(
4497 _("There are already %1 recordings for %2, which I consider too many."),
4498 limit, base) << endmsg;
4504 /* No need to "find best location" for software/app-based RAID, because
4505 MIDI is so small that we always put it in the same place.
4508 return possible_path;
4512 /** Create a new within-session audio source */
4513 boost::shared_ptr<AudioFileSource>
4514 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
4516 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
4518 if (!path.empty()) {
4519 return boost::dynamic_pointer_cast<AudioFileSource> (
4520 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
4522 throw failed_constructor ();
4526 /** Create a new within-session MIDI source */
4527 boost::shared_ptr<MidiSource>
4528 Session::create_midi_source_for_session (string const & basic_name)
4530 const string path = new_midi_source_path (basic_name);
4532 if (!path.empty()) {
4533 return boost::dynamic_pointer_cast<SMFSource> (
4534 SourceFactory::createWritable (
4535 DataType::MIDI, *this, path, false, frame_rate()));
4537 throw failed_constructor ();
4541 /** Create a new within-session MIDI source */
4542 boost::shared_ptr<MidiSource>
4543 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
4545 /* the caller passes in the track the source will be used in,
4546 so that we can keep the numbering sane.
4548 Rationale: a track with the name "Foo" that has had N
4549 captures carried out so far will ALREADY have a write source
4550 named "Foo-N+1.mid" waiting to be used for the next capture.
4552 If we call new_midi_source_name() we will get "Foo-N+2". But
4553 there is no region corresponding to "Foo-N+1", so when
4554 "Foo-N+2" appears in the track, the gap presents the user
4555 with odd behaviour - why did it skip past Foo-N+1?
4557 We could explain this to the user in some odd way, but
4558 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
4561 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
4564 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
4566 std::string name = track->steal_write_source_name ();
4569 return boost::shared_ptr<MidiSource>();
4572 /* MIDI files are small, just put them in the first location of the
4573 session source search path.
4576 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
4578 return boost::dynamic_pointer_cast<SMFSource> (
4579 SourceFactory::createWritable (
4580 DataType::MIDI, *this, path, false, frame_rate()));
4585 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
4587 if (playlist->hidden()) {
4591 playlists->add (playlist);
4594 playlist->release();
4601 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
4603 if (_state_of_the_state & Deletion) {
4607 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
4613 playlists->remove (playlist);
4619 Session::set_audition (boost::shared_ptr<Region> r)
4621 pending_audition_region = r;
4622 add_post_transport_work (PostTransportAudition);
4623 _butler->schedule_transport_work ();
4627 Session::audition_playlist ()
4629 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4630 ev->region.reset ();
4635 Session::non_realtime_set_audition ()
4637 assert (pending_audition_region);
4638 auditioner->audition_region (pending_audition_region);
4639 pending_audition_region.reset ();
4640 AuditionActive (true); /* EMIT SIGNAL */
4644 Session::audition_region (boost::shared_ptr<Region> r)
4646 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4652 Session::cancel_audition ()
4657 if (auditioner->auditioning()) {
4658 auditioner->cancel_audition ();
4659 AuditionActive (false); /* EMIT SIGNAL */
4664 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
4666 if (a->is_monitor()) {
4669 if (b->is_monitor()) {
4672 return a->order_key () < b->order_key ();
4676 Session::is_auditioning () const
4678 /* can be called before we have an auditioner object */
4680 return auditioner->auditioning();
4687 Session::graph_reordered ()
4689 /* don't do this stuff if we are setting up connections
4690 from a set_state() call or creating new tracks. Ditto for deletion.
4693 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _reconnecting_routes_in_progress) {
4697 /* every track/bus asked for this to be handled but it was deferred because
4698 we were connecting. do it now.
4701 request_input_change_handling ();
4705 /* force all diskstreams to update their capture offset values to
4706 reflect any changes in latencies within the graph.
4709 boost::shared_ptr<RouteList> rl = routes.reader ();
4710 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4711 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4713 tr->set_capture_offset ();
4718 /** @return Number of frames that there is disk space available to write,
4721 boost::optional<framecnt_t>
4722 Session::available_capture_duration ()
4724 Glib::Threads::Mutex::Lock lm (space_lock);
4726 if (_total_free_4k_blocks_uncertain) {
4727 return boost::optional<framecnt_t> ();
4730 float sample_bytes_on_disk = 4.0; // keep gcc happy
4732 switch (config.get_native_file_data_format()) {
4734 sample_bytes_on_disk = 4.0;
4738 sample_bytes_on_disk = 3.0;
4742 sample_bytes_on_disk = 2.0;
4746 /* impossible, but keep some gcc versions happy */
4747 fatal << string_compose (_("programming error: %1"),
4748 X_("illegal native file data format"))
4750 abort(); /*NOTREACHED*/
4753 double scale = 4096.0 / sample_bytes_on_disk;
4755 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
4756 return max_framecnt;
4759 return (framecnt_t) floor (_total_free_4k_blocks * scale);
4763 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
4766 RCUWriter<BundleList> writer (_bundles);
4767 boost::shared_ptr<BundleList> b = writer.get_copy ();
4768 b->push_back (bundle);
4772 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4779 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
4781 bool removed = false;
4784 RCUWriter<BundleList> writer (_bundles);
4785 boost::shared_ptr<BundleList> b = writer.get_copy ();
4786 BundleList::iterator i = find (b->begin(), b->end(), bundle);
4788 if (i != b->end()) {
4795 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4801 boost::shared_ptr<Bundle>
4802 Session::bundle_by_name (string name) const
4804 boost::shared_ptr<BundleList> b = _bundles.reader ();
4806 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
4807 if ((*i)->name() == name) {
4812 return boost::shared_ptr<Bundle> ();
4816 Session::tempo_map_changed (const PropertyChange&)
4820 playlists->update_after_tempo_map_change ();
4822 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
4828 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
4830 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
4831 (*i)->recompute_frames_from_bbt ();
4835 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
4836 * the given count with the current block size.
4839 Session::ensure_buffers (ChanCount howmany)
4841 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
4845 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
4847 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4848 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
4853 Session::next_insert_id ()
4855 /* this doesn't really loop forever. just think about it */
4858 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
4859 if (!insert_bitset[n]) {
4860 insert_bitset[n] = true;
4866 /* none available, so resize and try again */
4868 insert_bitset.resize (insert_bitset.size() + 16, false);
4873 Session::next_send_id ()
4875 /* this doesn't really loop forever. just think about it */
4878 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
4879 if (!send_bitset[n]) {
4880 send_bitset[n] = true;
4886 /* none available, so resize and try again */
4888 send_bitset.resize (send_bitset.size() + 16, false);
4893 Session::next_aux_send_id ()
4895 /* this doesn't really loop forever. just think about it */
4898 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
4899 if (!aux_send_bitset[n]) {
4900 aux_send_bitset[n] = true;
4906 /* none available, so resize and try again */
4908 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
4913 Session::next_return_id ()
4915 /* this doesn't really loop forever. just think about it */
4918 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
4919 if (!return_bitset[n]) {
4920 return_bitset[n] = true;
4926 /* none available, so resize and try again */
4928 return_bitset.resize (return_bitset.size() + 16, false);
4933 Session::mark_send_id (uint32_t id)
4935 if (id >= send_bitset.size()) {
4936 send_bitset.resize (id+16, false);
4938 if (send_bitset[id]) {
4939 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
4941 send_bitset[id] = true;
4945 Session::mark_aux_send_id (uint32_t id)
4947 if (id >= aux_send_bitset.size()) {
4948 aux_send_bitset.resize (id+16, false);
4950 if (aux_send_bitset[id]) {
4951 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
4953 aux_send_bitset[id] = true;
4957 Session::mark_return_id (uint32_t id)
4959 if (id >= return_bitset.size()) {
4960 return_bitset.resize (id+16, false);
4962 if (return_bitset[id]) {
4963 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
4965 return_bitset[id] = true;
4969 Session::mark_insert_id (uint32_t id)
4971 if (id >= insert_bitset.size()) {
4972 insert_bitset.resize (id+16, false);
4974 if (insert_bitset[id]) {
4975 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
4977 insert_bitset[id] = true;
4981 Session::unmark_send_id (uint32_t id)
4983 if (id < send_bitset.size()) {
4984 send_bitset[id] = false;
4989 Session::unmark_aux_send_id (uint32_t id)
4991 if (id < aux_send_bitset.size()) {
4992 aux_send_bitset[id] = false;
4997 Session::unmark_return_id (uint32_t id)
4999 if (id < return_bitset.size()) {
5000 return_bitset[id] = false;
5005 Session::unmark_insert_id (uint32_t id)
5007 if (id < insert_bitset.size()) {
5008 insert_bitset[id] = false;
5013 Session::reset_native_file_format ()
5015 boost::shared_ptr<RouteList> rl = routes.reader ();
5017 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5018 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5020 /* don't save state as we do this, there's no point
5022 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
5023 tr->reset_write_sources (false);
5024 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
5030 Session::route_name_unique (string n) const
5032 boost::shared_ptr<RouteList> r = routes.reader ();
5034 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5035 if ((*i)->name() == n) {
5044 Session::route_name_internal (string n) const
5046 if (auditioner && auditioner->name() == n) {
5050 if (_click_io && _click_io->name() == n) {
5058 Session::freeze_all (InterThreadInfo& itt)
5060 boost::shared_ptr<RouteList> r = routes.reader ();
5062 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5064 boost::shared_ptr<Track> t;
5066 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
5067 /* XXX this is wrong because itt.progress will keep returning to zero at the start
5077 boost::shared_ptr<Region>
5078 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
5079 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
5080 InterThreadInfo& itt,
5081 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
5082 bool for_export, bool for_freeze)
5084 boost::shared_ptr<Region> result;
5085 boost::shared_ptr<Playlist> playlist;
5086 boost::shared_ptr<Source> source;
5087 ChanCount diskstream_channels (track.n_channels());
5088 framepos_t position;
5089 framecnt_t this_chunk;
5091 framepos_t latency_skip;
5093 framepos_t len = end - start;
5094 bool need_block_size_reset = false;
5095 ChanCount const max_proc = track.max_processor_streams ();
5096 string legal_playlist_name;
5097 string possible_path;
5100 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
5101 end, start) << endmsg;
5105 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
5106 include_endpoint, for_export, for_freeze);
5108 if (diskstream_channels.n(track.data_type()) < 1) {
5109 error << _("Cannot write a range with no data.") << endmsg;
5113 // block all process callback handling
5115 block_processing ();
5118 // synchronize with AudioEngine::process_callback()
5119 // make sure processing is not currently running
5120 // and processing_blocked() is honored before
5121 // acquiring thread buffers
5122 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5125 _bounce_processing_active = true;
5127 /* call tree *MUST* hold route_lock */
5129 if ((playlist = track.playlist()) == 0) {
5133 legal_playlist_name = legalize_for_path (playlist->name());
5135 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
5137 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
5138 string path = ((track.data_type() == DataType::AUDIO)
5139 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
5140 : new_midi_source_path (legal_playlist_name));
5147 source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
5150 catch (failed_constructor& err) {
5151 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
5155 srcs.push_back (source);
5158 /* tell redirects that care that we are about to use a much larger
5159 * blocksize. this will flush all plugins too, so that they are ready
5160 * to be used for this process.
5163 need_block_size_reset = true;
5164 track.set_block_size (bounce_chunk_size);
5165 _engine.main_thread()->get_buffers ();
5169 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5171 /* create a set of reasonably-sized buffers */
5172 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5173 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
5175 buffers.set_count (max_proc);
5177 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5178 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5179 boost::shared_ptr<MidiSource> ms;
5181 afs->prepare_for_peakfile_writes ();
5182 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5183 Source::Lock lock(ms->mutex());
5184 ms->mark_streaming_write_started(lock);
5188 while (to_do && !itt.cancel) {
5190 this_chunk = min (to_do, bounce_chunk_size);
5192 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
5196 start += this_chunk;
5197 to_do -= this_chunk;
5198 itt.progress = (float) (1.0 - ((double) to_do / len));
5200 if (latency_skip >= bounce_chunk_size) {
5201 latency_skip -= bounce_chunk_size;
5205 const framecnt_t current_chunk = this_chunk - latency_skip;
5208 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5209 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5210 boost::shared_ptr<MidiSource> ms;
5213 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
5216 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5217 Source::Lock lock(ms->mutex());
5219 const MidiBuffer& buf = buffers.get_midi(0);
5220 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
5221 Evoral::Event<framepos_t> ev = *i;
5222 ev.set_time(ev.time() - position);
5223 ms->append_event_frames(lock, ev, ms->timeline_position());
5230 /* post-roll, pick up delayed processor output */
5231 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5233 while (latency_skip && !itt.cancel) {
5234 this_chunk = min (latency_skip, bounce_chunk_size);
5235 latency_skip -= this_chunk;
5237 buffers.silence (this_chunk, 0);
5238 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
5241 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5242 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5245 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
5257 xnow = localtime (&now);
5259 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
5260 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5261 boost::shared_ptr<MidiSource> ms;
5264 afs->update_header (position, *xnow, now);
5265 afs->flush_header ();
5266 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5267 Source::Lock lock(ms->mutex());
5268 ms->mark_streaming_write_completed(lock);
5272 /* construct a region to represent the bounced material */
5276 plist.add (Properties::start, 0);
5277 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
5278 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
5280 result = RegionFactory::create (srcs, plist);
5286 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5287 (*src)->mark_for_remove ();
5288 (*src)->drop_references ();
5292 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5293 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5296 afs->done_with_peakfile_writes ();
5300 _bounce_processing_active = false;
5302 if (need_block_size_reset) {
5303 _engine.main_thread()->drop_buffers ();
5304 track.set_block_size (get_block_size());
5307 unblock_processing ();
5313 Session::gain_automation_buffer() const
5315 return ProcessThread::gain_automation_buffer ();
5319 Session::trim_automation_buffer() const
5321 return ProcessThread::trim_automation_buffer ();
5325 Session::send_gain_automation_buffer() const
5327 return ProcessThread::send_gain_automation_buffer ();
5331 Session::pan_automation_buffer() const
5333 return ProcessThread::pan_automation_buffer ();
5337 Session::get_silent_buffers (ChanCount count)
5339 return ProcessThread::get_silent_buffers (count);
5343 Session::get_scratch_buffers (ChanCount count, bool silence)
5345 return ProcessThread::get_scratch_buffers (count, silence);
5349 Session::get_route_buffers (ChanCount count, bool silence)
5351 return ProcessThread::get_route_buffers (count, silence);
5356 Session::get_mix_buffers (ChanCount count)
5358 return ProcessThread::get_mix_buffers (count);
5362 Session::ntracks () const
5365 boost::shared_ptr<RouteList> r = routes.reader ();
5367 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5368 if (boost::dynamic_pointer_cast<Track> (*i)) {
5377 Session::nbusses () const
5380 boost::shared_ptr<RouteList> r = routes.reader ();
5382 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5383 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
5392 Session::add_automation_list(AutomationList *al)
5394 automation_lists[al->id()] = al;
5397 /** @return true if there is at least one record-enabled track, otherwise false */
5399 Session::have_rec_enabled_track () const
5401 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
5405 Session::have_rec_disabled_track () const
5407 return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
5410 /** Update the state of our rec-enabled tracks flag */
5412 Session::update_route_record_state ()
5414 boost::shared_ptr<RouteList> rl = routes.reader ();
5415 RouteList::iterator i = rl->begin();
5416 while (i != rl->end ()) {
5418 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5419 if (tr && tr->record_enabled ()) {
5426 int const old = g_atomic_int_get (&_have_rec_enabled_track);
5428 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
5430 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
5431 RecordStateChanged (); /* EMIT SIGNAL */
5434 for (i = rl->begin(); i != rl->end (); ++i) {
5435 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5436 if (tr && !tr->record_enabled ()) {
5441 g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
5443 bool record_arm_state_changed = (old != g_atomic_int_get (&_have_rec_enabled_track) );
5445 if (record_status() == Recording && record_arm_state_changed ) {
5446 RecordArmStateChanged ();
5452 Session::listen_position_changed ()
5454 boost::shared_ptr<RouteList> r = routes.reader ();
5456 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5457 (*i)->listen_position_changed ();
5462 Session::solo_control_mode_changed ()
5464 /* cancel all solo or all listen when solo control mode changes */
5467 set_solo (get_routes(), false);
5468 } else if (listening()) {
5469 set_listen (get_routes(), false);
5473 /** Called when a property of one of our route groups changes */
5475 Session::route_group_property_changed (RouteGroup* rg)
5477 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
5480 /** Called when a route is added to one of our route groups */
5482 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5484 RouteAddedToRouteGroup (rg, r);
5487 /** Called when a route is removed from one of our route groups */
5489 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5491 update_route_record_state ();
5492 RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
5495 boost::shared_ptr<RouteList>
5496 Session::get_tracks () const
5498 boost::shared_ptr<RouteList> rl = routes.reader ();
5499 boost::shared_ptr<RouteList> tl (new RouteList);
5501 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
5502 if (boost::dynamic_pointer_cast<Track> (*r)) {
5503 if (!(*r)->is_auditioner()) {
5511 boost::shared_ptr<RouteList>
5512 Session::get_routes_with_regions_at (framepos_t const p) const
5514 boost::shared_ptr<RouteList> r = routes.reader ();
5515 boost::shared_ptr<RouteList> rl (new RouteList);
5517 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5518 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5523 boost::shared_ptr<Playlist> pl = tr->playlist ();
5528 if (pl->has_region_at (p)) {
5537 Session::goto_end ()
5539 if (_session_range_location) {
5540 request_locate (_session_range_location->end(), false);
5542 request_locate (0, false);
5547 Session::goto_start ()
5549 if (_session_range_location) {
5550 request_locate (_session_range_location->start(), false);
5552 request_locate (0, false);
5557 Session::current_start_frame () const
5559 return _session_range_location ? _session_range_location->start() : 0;
5563 Session::current_end_frame () const
5565 return _session_range_location ? _session_range_location->end() : 0;
5569 Session::add_session_range_location (framepos_t start, framepos_t end)
5571 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
5572 _locations->add (_session_range_location);
5576 Session::step_edit_status_change (bool yn)
5582 send = (_step_editors == 0);
5587 send = (_step_editors == 1);
5590 if (_step_editors > 0) {
5596 StepEditStatusChange (val);
5602 Session::start_time_changed (framepos_t old)
5604 /* Update the auto loop range to match the session range
5605 (unless the auto loop range has been changed by the user)
5608 Location* s = _locations->session_range_location ();
5613 Location* l = _locations->auto_loop_location ();
5615 if (l && l->start() == old) {
5616 l->set_start (s->start(), true);
5621 Session::end_time_changed (framepos_t old)
5623 /* Update the auto loop range to match the session range
5624 (unless the auto loop range has been changed by the user)
5627 Location* s = _locations->session_range_location ();
5632 Location* l = _locations->auto_loop_location ();
5634 if (l && l->end() == old) {
5635 l->set_end (s->end(), true);
5639 std::vector<std::string>
5640 Session::source_search_path (DataType type) const
5644 if (session_dirs.size() == 1) {
5646 case DataType::AUDIO:
5647 sp.push_back (_session_dir->sound_path());
5649 case DataType::MIDI:
5650 sp.push_back (_session_dir->midi_path());
5654 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
5655 SessionDirectory sdir (i->path);
5657 case DataType::AUDIO:
5658 sp.push_back (sdir.sound_path());
5660 case DataType::MIDI:
5661 sp.push_back (sdir.midi_path());
5667 if (type == DataType::AUDIO) {
5668 const string sound_path_2X = _session_dir->sound_path_2X();
5669 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
5670 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
5671 sp.push_back (sound_path_2X);
5676 // now check the explicit (possibly user-specified) search path
5679 case DataType::AUDIO:
5680 sp += Searchpath(config.get_audio_search_path ());
5682 case DataType::MIDI:
5683 sp += Searchpath(config.get_midi_search_path ());
5691 Session::ensure_search_path_includes (const string& path, DataType type)
5700 case DataType::AUDIO:
5701 sp += Searchpath(config.get_audio_search_path ());
5703 case DataType::MIDI:
5704 sp += Searchpath (config.get_midi_search_path ());
5708 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
5709 /* No need to add this new directory if it has the same inode as
5710 an existing one; checking inode rather than name prevents duplicated
5711 directories when we are using symlinks.
5713 On Windows, I think we could just do if (*i == path) here.
5715 if (PBD::equivalent_paths (*i, path)) {
5723 case DataType::AUDIO:
5724 config.set_audio_search_path (sp.to_string());
5726 case DataType::MIDI:
5727 config.set_midi_search_path (sp.to_string());
5733 Session::remove_dir_from_search_path (const string& dir, DataType type)
5738 case DataType::AUDIO:
5739 sp = Searchpath(config.get_audio_search_path ());
5741 case DataType::MIDI:
5742 sp = Searchpath (config.get_midi_search_path ());
5749 case DataType::AUDIO:
5750 config.set_audio_search_path (sp.to_string());
5752 case DataType::MIDI:
5753 config.set_midi_search_path (sp.to_string());
5759 boost::shared_ptr<Speakers>
5760 Session::get_speakers()
5766 Session::unknown_processors () const
5770 boost::shared_ptr<RouteList> r = routes.reader ();
5771 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5772 list<string> t = (*i)->unknown_processors ();
5773 copy (t.begin(), t.end(), back_inserter (p));
5783 Session::update_latency (bool playback)
5785 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
5787 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
5791 boost::shared_ptr<RouteList> r = routes.reader ();
5792 framecnt_t max_latency = 0;
5795 /* reverse the list so that we work backwards from the last route to run to the first */
5796 RouteList* rl = routes.reader().get();
5797 r.reset (new RouteList (*rl));
5798 reverse (r->begin(), r->end());
5801 /* compute actual latency values for the given direction and store them all in per-port
5802 structures. this will also publish the same values (to JACK) so that computation of latency
5803 for routes can consistently use public latency values.
5806 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5807 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
5810 /* because we latency compensate playback, our published playback latencies should
5811 be the same for all output ports - all material played back by ardour has
5812 the same latency, whether its caused by plugins or by latency compensation. since
5813 these may differ from the values computed above, reset all playback port latencies
5817 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
5819 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5820 (*i)->set_public_port_latencies (max_latency, playback);
5825 post_playback_latency ();
5829 post_capture_latency ();
5832 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
5836 Session::post_playback_latency ()
5838 set_worst_playback_latency ();
5840 boost::shared_ptr<RouteList> r = routes.reader ();
5842 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5843 if (!(*i)->is_auditioner() && ((*i)->active())) {
5844 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
5848 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5849 (*i)->set_latency_compensation (_worst_track_latency);
5854 Session::post_capture_latency ()
5856 set_worst_capture_latency ();
5858 /* reflect any changes in capture latencies into capture offsets
5861 boost::shared_ptr<RouteList> rl = routes.reader();
5862 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5863 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5865 tr->set_capture_offset ();
5871 Session::initialize_latencies ()
5874 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5875 update_latency (false);
5876 update_latency (true);
5879 set_worst_io_latencies ();
5883 Session::set_worst_io_latencies ()
5885 set_worst_playback_latency ();
5886 set_worst_capture_latency ();
5890 Session::set_worst_playback_latency ()
5892 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5896 _worst_output_latency = 0;
5898 if (!_engine.connected()) {
5902 boost::shared_ptr<RouteList> r = routes.reader ();
5904 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5905 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
5908 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
5912 Session::set_worst_capture_latency ()
5914 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5918 _worst_input_latency = 0;
5920 if (!_engine.connected()) {
5924 boost::shared_ptr<RouteList> r = routes.reader ();
5926 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5927 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
5930 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
5934 Session::update_latency_compensation (bool force_whole_graph)
5936 bool some_track_latency_changed = false;
5938 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5942 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
5944 _worst_track_latency = 0;
5946 boost::shared_ptr<RouteList> r = routes.reader ();
5948 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5949 if (!(*i)->is_auditioner() && ((*i)->active())) {
5951 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
5952 some_track_latency_changed = true;
5954 _worst_track_latency = max (tl, _worst_track_latency);
5958 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
5959 (some_track_latency_changed ? "yes" : "no")));
5961 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
5963 if (some_track_latency_changed || force_whole_graph) {
5964 _engine.update_latencies ();
5968 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5969 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5973 tr->set_capture_offset ();
5978 Session::session_name_is_legal (const string& path)
5980 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
5982 for (int i = 0; illegal_chars[i]; ++i) {
5983 if (path.find (illegal_chars[i]) != string::npos) {
5984 return illegal_chars[i];
5992 Session::next_control_id () const
5996 /* the monitor bus remote ID is in a different
5997 * "namespace" than regular routes. its existence doesn't
5998 * affect normal (low) numbered routes.
6005 /* the same about masterbus in Waves Tracks */
6007 if (Profile->get_trx() && _master_out) {
6011 return nroutes() - subtract;
6015 Session::notify_remote_id_change ()
6017 if (deletion_in_progress()) {
6021 switch (Config->get_remote_model()) {
6023 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
6029 #ifdef USE_TRACKS_CODE_FEATURES
6030 /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
6031 * if track order has been changed by user
6033 reconnect_existing_routes(true, true);
6039 Session::sync_order_keys ()
6041 if (deletion_in_progress()) {
6045 /* tell everyone that something has happened to the sort keys
6046 and let them sync up with the change(s)
6047 this will give objects that manage the sort order keys the
6048 opportunity to keep them in sync if they wish to.
6051 DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
6053 reassign_track_numbers();
6055 Route::SyncOrderKeys (); /* EMIT SIGNAL */
6057 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
6061 Session::operation_in_progress (GQuark op) const
6063 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
6066 boost::shared_ptr<Port>
6067 Session::ltc_input_port () const
6069 return _ltc_input->nth (0);
6072 boost::shared_ptr<Port>
6073 Session::ltc_output_port () const
6075 return _ltc_output->nth (0);
6079 Session::reconnect_ltc_input ()
6083 string src = Config->get_ltc_source_port();
6085 _ltc_input->disconnect (this);
6087 if (src != _("None") && !src.empty()) {
6088 _ltc_input->nth (0)->connect (src);
6094 Session::reconnect_ltc_output ()
6099 string src = Config->get_ltc_sink_port();
6101 _ltc_output->disconnect (this);
6103 if (src != _("None") && !src.empty()) {
6104 _ltc_output->nth (0)->connect (src);