2 Copyright (C) 1999-2010 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #include <cstdio> /* sprintf(3) ... grrr */
33 #include <glibmm/threads.h>
34 #include <glibmm/miscutils.h>
35 #include <glibmm/fileutils.h>
37 #include <boost/algorithm/string/erase.hpp>
39 #include "pbd/basename.h"
40 #include "pbd/boost_debug.h"
41 #include "pbd/convert.h"
42 #include "pbd/convert.h"
43 #include "pbd/error.h"
44 #include "pbd/file_utils.h"
46 #include "pbd/search_path.h"
47 #include "pbd/stacktrace.h"
48 #include "pbd/stl_delete.h"
49 #include "pbd/replace_all.h"
50 #include "pbd/unwind.h"
52 #include "ardour/amp.h"
53 #include "ardour/analyser.h"
54 #include "ardour/async_midi_port.h"
55 #include "ardour/audio_buffer.h"
56 #include "ardour/audio_diskstream.h"
57 #include "ardour/audio_port.h"
58 #include "ardour/audio_track.h"
59 #include "ardour/audioengine.h"
60 #include "ardour/audiofilesource.h"
61 #include "ardour/auditioner.h"
62 #include "ardour/buffer_manager.h"
63 #include "ardour/buffer_set.h"
64 #include "ardour/bundle.h"
65 #include "ardour/butler.h"
66 #include "ardour/click.h"
67 #include "ardour/control_protocol_manager.h"
68 #include "ardour/data_type.h"
69 #include "ardour/debug.h"
70 #include "ardour/directory_names.h"
71 #ifdef USE_TRACKS_CODE_FEATURES
72 #include "ardour/engine_state_controller.h"
74 #include "ardour/filename_extensions.h"
75 #include "ardour/graph.h"
76 #include "ardour/midiport_manager.h"
77 #include "ardour/scene_changer.h"
78 #include "ardour/midi_track.h"
79 #include "ardour/midi_ui.h"
80 #include "ardour/operations.h"
81 #include "ardour/playlist.h"
82 #include "ardour/plugin.h"
83 #include "ardour/plugin_insert.h"
84 #include "ardour/process_thread.h"
85 #include "ardour/profile.h"
86 #include "ardour/rc_configuration.h"
87 #include "ardour/recent_sessions.h"
88 #include "ardour/region.h"
89 #include "ardour/region_factory.h"
90 #include "ardour/route_graph.h"
91 #include "ardour/route_group.h"
92 #include "ardour/route_sorters.h"
93 #include "ardour/send.h"
94 #include "ardour/session.h"
95 #include "ardour/session_directory.h"
96 #include "ardour/session_playlists.h"
97 #include "ardour/smf_source.h"
98 #include "ardour/source_factory.h"
99 #include "ardour/speakers.h"
100 #include "ardour/tempo.h"
101 #include "ardour/track.h"
102 #include "ardour/user_bundle.h"
103 #include "ardour/utils.h"
105 #include "midi++/port.h"
106 #include "midi++/mmc.h"
117 using namespace ARDOUR;
120 bool Session::_disable_all_loaded_plugins = false;
122 PBD::Signal1<int,uint32_t> Session::AudioEngineSetupRequired;
123 PBD::Signal1<void,std::string> Session::Dialog;
124 PBD::Signal0<int> Session::AskAboutPendingState;
125 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
126 PBD::Signal0<void> Session::SendFeedback;
127 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
129 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
130 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
131 PBD::Signal2<void,std::string, std::string> Session::Exported;
132 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
133 PBD::Signal0<void> Session::Quit;
134 PBD::Signal0<void> Session::FeedbackDetected;
135 PBD::Signal0<void> Session::SuccessfulGraphSort;
136 PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
138 const framecnt_t Session::bounce_chunk_size = 65536;
139 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
140 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
142 /** @param snapshot_name Snapshot name, without .ardour suffix */
143 Session::Session (AudioEngine &eng,
144 const string& fullpath,
145 const string& snapshot_name,
146 BusProfile* bus_profile,
148 : playlists (new SessionPlaylists)
150 , process_function (&Session::process_with_events)
151 , _bounce_processing_active (false)
152 , waiting_for_sync_offset (false)
153 , _base_frame_rate (0)
154 , _current_frame_rate (0)
155 , _nominal_frame_rate (0)
156 , transport_sub_state (0)
157 , _record_status (Disabled)
158 , _transport_frame (0)
159 , _session_range_location (0)
162 , _transport_speed (0)
163 , _default_transport_speed (1.0)
164 , _last_transport_speed (0)
165 , _target_transport_speed (0.0)
166 , auto_play_legal (false)
167 , _last_slave_transport_frame (0)
168 , maximum_output_latency (0)
169 , _requested_return_frame (-1)
170 , current_block_size (0)
171 , _worst_output_latency (0)
172 , _worst_input_latency (0)
173 , _worst_track_latency (0)
174 , _have_captured (false)
175 , _non_soloed_outs_muted (false)
177 , _solo_isolated_cnt (0)
179 , _was_seamless (Config->get_seamless_loop ())
180 , _under_nsm_control (false)
182 , delta_accumulator_cnt (0)
183 , average_slave_delta (1800) // !!! why 1800 ???
185 , have_first_delta_accumulator (false)
186 , _slave_state (Stopped)
187 , _mtc_active (false)
188 , post_export_sync (false)
189 , post_export_position (0)
191 , _export_started (false)
192 , _export_rolling (false)
193 , _pre_export_mmc_enabled (false)
194 , _name (snapshot_name)
196 , _send_qf_mtc (false)
197 , _pframes_since_last_mtc (0)
198 , session_midi_feedback (0)
200 , loop_changing (false)
202 , _session_dir (new SessionDirectory (fullpath))
203 , _current_snapshot_name (snapshot_name)
205 , state_was_pending (false)
206 , _state_of_the_state (StateOfTheState(CannotSave|InitialConnecting|Loading))
208 , _save_queued (false)
209 , _last_roll_location (0)
210 , _last_roll_or_reversal_location (0)
211 , _last_record_location (0)
212 , pending_locate_roll (false)
213 , pending_locate_frame (0)
214 , pending_locate_flush (false)
215 , pending_abort (false)
216 , pending_auto_loop (false)
217 , _butler (new Butler (*this))
218 , _post_transport_work (0)
219 , cumulative_rf_motion (0)
221 , _locations (new Locations (*this))
222 , _ignore_skips_updates (false)
223 , _rt_thread_active (false)
224 , _rt_emit_pending (false)
226 , outbound_mtc_timecode_frame (0)
227 , next_quarter_frame_to_send (-1)
228 , _frames_per_timecode_frame (0)
229 , _frames_per_hour (0)
230 , _timecode_frames_per_hour (0)
231 , last_timecode_valid (false)
232 , last_timecode_when (0)
233 , _send_timecode_update (false)
245 , ltc_timecode_offset (0)
246 , ltc_timecode_negative_offset (false)
247 , midi_control_ui (0)
249 , _all_route_group (new RouteGroup (*this, "all"))
250 , routes (new RouteList)
251 , _adding_routes_in_progress (false)
252 , _reconnecting_routes_in_progress (false)
253 , _route_deletion_in_progress (false)
254 , destructive_index (0)
255 , _track_number_decimals(1)
256 , solo_update_disabled (false)
257 , default_fade_steepness (0)
258 , default_fade_msecs (0)
259 , _total_free_4k_blocks (0)
260 , _total_free_4k_blocks_uncertain (false)
261 , no_questions_about_missing_files (false)
264 , _bundles (new BundleList)
265 , _bundle_xml_node (0)
269 , click_emphasis_data (0)
271 , click_emphasis_length (0)
272 , _clicks_cleared (0)
273 , _play_range (false)
274 , _range_selection (-1,-1)
275 , _object_selection (-1,-1)
277 , first_file_data_format_reset (true)
278 , first_file_header_format_reset (true)
279 , have_looped (false)
280 , _have_rec_enabled_track (false)
281 , _have_rec_disabled_track (true)
283 , _suspend_timecode_transmission (0)
284 , _speakers (new Speakers)
286 , ignore_route_processor_changes (false)
293 pthread_mutex_init (&_rt_emit_mutex, 0);
294 pthread_cond_init (&_rt_emit_cond, 0);
296 pre_engine_init (fullpath);
300 #ifdef USE_TRACKS_CODE_FEATURES
301 sr = EngineStateController::instance()->get_current_sample_rate();
303 if (ensure_engine (sr)) {
305 throw failed_constructor ();
308 if (create (mix_template, bus_profile)) {
310 throw failed_constructor ();
313 /* if a mix template was provided, then ::create() will
314 * have copied it into the session and we need to load it
315 * so that we have the state ready for ::set_state()
316 * after the engine is started.
318 * Note that we do NOT try to get the sample rate from
319 * the template at this time, though doing so would
320 * be easy if we decided this was an appropriate part
324 if (!mix_template.empty()) {
325 if (load_state (_current_snapshot_name)) {
326 throw failed_constructor ();
328 store_recent_templates (mix_template);
331 /* load default session properties - if any */
336 if (load_state (_current_snapshot_name)) {
337 throw failed_constructor ();
340 /* try to get sample rate from XML state so that we
341 * can influence the SR if we set up the audio
346 const XMLProperty* prop;
347 if ((prop = state_tree->root()->property (X_("sample-rate"))) != 0) {
348 sr = atoi (prop->value());
352 if (ensure_engine (sr)) {
354 throw failed_constructor ();
358 if (post_engine_init ()) {
360 throw failed_constructor ();
363 store_recent_sessions (_name, _path);
365 bool was_dirty = dirty();
367 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
369 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
370 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
373 DirtyChanged (); /* EMIT SIGNAL */
376 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
377 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
381 emit_thread_start ();
383 /* hook us up to the engine since we are now completely constructed */
385 BootMessage (_("Connect to engine"));
387 _engine.set_session (this);
388 _engine.reset_timebase ();
390 #ifdef USE_TRACKS_CODE_FEATURES
392 EngineStateController::instance()->set_session(this);
395 if ( ARDOUR::Profile->get_trx () ) {
397 /* Waves Tracks: fill session with tracks basing on the amount of inputs.
398 * each available input must have corresponding track when session starts.
401 uint32_t how_many (0);
403 std::vector<std::string> inputs;
404 EngineStateController::instance()->get_physical_audio_inputs(inputs);
406 how_many = inputs.size();
408 list<boost::shared_ptr<AudioTrack> > tracks;
410 // Track names after driver
411 if (Config->get_tracks_auto_naming() == NameAfterDriver) {
412 string track_name = "";
413 for (std::vector<string>::size_type i = 0; i < inputs.size(); ++i) {
415 track_name = inputs[i];
416 replace_all (track_name, "system:capture", "");
418 list<boost::shared_ptr<AudioTrack> > single_track = new_audio_track (1, 1, Normal, 0, 1, track_name);
419 tracks.insert(tracks.begin(), single_track.front());
421 } else { // Default track names
422 tracks = new_audio_track (1, 1, Normal, 0, how_many, string());
425 if (tracks.size() != how_many) {
427 throw failed_constructor ();
436 BootMessage (_("Session loading complete"));
448 Session::ensure_engine (uint32_t desired_sample_rate)
450 if (_engine.current_backend() == 0) {
451 /* backend is unknown ... */
452 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
453 if (r.get_value_or (-1) != 0) {
456 } else if (_engine.setup_required()) {
457 /* backend is known, but setup is needed */
458 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
459 if (r.get_value_or (-1) != 0) {
462 } else if (!_engine.running()) {
463 if (_engine.start()) {
468 /* at this point the engine should be running
471 if (!_engine.running()) {
475 return immediately_post_engine ();
480 Session::immediately_post_engine ()
482 /* Do various initializations that should take place directly after we
483 * know that the engine is running, but before we either create a
484 * session or set state for an existing one.
487 if (how_many_dsp_threads () > 1) {
488 /* For now, only create the graph if we are using >1 DSP threads, as
489 it is a bit slower than the old code with 1 thread.
491 _process_graph.reset (new Graph (*this));
494 /* every time we reconnect, recompute worst case output latencies */
496 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
498 if (synced_to_engine()) {
499 _engine.transport_stop ();
502 if (config.get_jack_time_master()) {
503 _engine.transport_locate (_transport_frame);
507 BootMessage (_("Set up LTC"));
509 BootMessage (_("Set up Click"));
511 BootMessage (_("Set up standard connections"));
515 catch (failed_constructor& err) {
519 /* TODO, connect in different thread. (PortRegisteredOrUnregistered may be in RT context)
521 _engine.PortRegisteredOrUnregistered.connect_same_thread (*this, boost::bind (&Session::setup_bundles, this));
529 vector<void*> debug_pointers;
531 /* if we got to here, leaving pending capture state around
535 remove_pending_capture_state ();
537 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
539 /* disconnect from any and all signals that we are connected to */
543 _engine.remove_session ();
545 #ifdef USE_TRACKS_CODE_FEATURES
546 EngineStateController::instance()->remove_session();
549 /* deregister all ports - there will be no process or any other
550 * callbacks from the engine any more.
553 Port::PortDrop (); /* EMIT SIGNAL */
557 /* clear history so that no references to objects are held any more */
561 /* clear state tree so that no references to objects are held any more */
566 /* reset dynamic state version back to default */
568 Stateful::loading_state_version = 0;
570 _butler->drop_references ();
574 delete _all_route_group;
576 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
577 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
581 if (click_data != default_click) {
582 delete [] click_data;
585 if (click_emphasis_data != default_click_emphasis) {
586 delete [] click_emphasis_data;
591 /* need to remove auditioner before monitoring section
592 * otherwise it is re-connected */
595 /* drop references to routes held by the monitoring section
596 * specifically _monitor_out aux/listen references */
597 remove_monitor_section();
599 /* clear out any pending dead wood from RCU managed objects */
604 AudioDiskstream::free_working_buffers();
606 /* tell everyone who is still standing that we're about to die */
609 /* tell everyone to drop references and delete objects as we go */
611 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
612 RegionFactory::delete_all_regions ();
614 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
616 /* reset these three references to special routes before we do the usual route delete thing */
618 _master_out.reset ();
619 _monitor_out.reset ();
622 RCUWriter<RouteList> writer (routes);
623 boost::shared_ptr<RouteList> r = writer.get_copy ();
625 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
626 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
627 (*i)->drop_references ();
631 /* writer goes out of scope and updates master */
636 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
637 Glib::Threads::Mutex::Lock lm (source_lock);
638 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
639 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
640 i->second->drop_references ();
646 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
649 emit_thread_terminate ();
651 pthread_cond_destroy (&_rt_emit_cond);
652 pthread_mutex_destroy (&_rt_emit_mutex);
654 delete _scene_changer; _scene_changer = 0;
655 delete midi_control_ui; midi_control_ui = 0;
657 delete _mmc; _mmc = 0;
658 delete _midi_ports; _midi_ports = 0;
659 delete _locations; _locations = 0;
663 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
665 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
666 boost_debug_list_ptrs ();
671 Session::setup_ltc ()
675 _ltc_input.reset (new IO (*this, X_("LTC In"), IO::Input));
676 _ltc_output.reset (new IO (*this, X_("LTC Out"), IO::Output));
678 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC In"))) != 0) {
679 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
682 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
683 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
685 reconnect_ltc_input ();
688 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC Out"))) != 0) {
689 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
692 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
693 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
695 reconnect_ltc_output ();
698 /* fix up names of LTC ports because we don't want the normal
699 * IO style of NAME/TYPE-{in,out}N
702 _ltc_input->nth (0)->set_name (X_("LTC-in"));
703 _ltc_output->nth (0)->set_name (X_("LTC-out"));
707 Session::setup_click ()
710 _click_io.reset (new ClickIO (*this, X_("Click")));
711 _click_gain.reset (new Amp (*this));
712 _click_gain->activate ();
714 setup_click_state (state_tree->root());
716 setup_click_state (0);
721 Session::setup_click_state (const XMLNode* node)
723 const XMLNode* child = 0;
725 if (node && (child = find_named_node (*node, "Click")) != 0) {
727 /* existing state for Click */
730 if (Stateful::loading_state_version < 3000) {
731 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
733 const XMLNodeList& children (child->children());
734 XMLNodeList::const_iterator i = children.begin();
735 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
737 if (i != children.end()) {
738 c = _click_gain->set_state (**i, Stateful::loading_state_version);
744 _clicking = Config->get_clicking ();
748 error << _("could not setup Click I/O") << endmsg;
755 /* default state for Click: dual-mono to first 2 physical outputs */
758 _engine.get_physical_outputs (DataType::AUDIO, outs);
760 for (uint32_t physport = 0; physport < 2; ++physport) {
761 if (outs.size() > physport) {
762 if (_click_io->add_port (outs[physport], this)) {
763 // relax, even though its an error
768 if (_click_io->n_ports () > ChanCount::ZERO) {
769 _clicking = Config->get_clicking ();
775 Session::setup_bundles ()
779 RCUWriter<BundleList> writer (_bundles);
780 boost::shared_ptr<BundleList> b = writer.get_copy ();
781 for (BundleList::iterator i = b->begin(); i != b->end();) {
782 if (boost::dynamic_pointer_cast<UserBundle>(*i)) {
790 vector<string> inputs[DataType::num_types];
791 vector<string> outputs[DataType::num_types];
792 for (uint32_t i = 0; i < DataType::num_types; ++i) {
793 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
794 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
797 /* Create a set of Bundle objects that map
798 to the physical I/O currently available. We create both
799 mono and stereo bundles, so that the common cases of mono
800 and stereo tracks get bundles to put in their mixer strip
801 in / out menus. There may be a nicer way of achieving that;
802 it doesn't really scale that well to higher channel counts
805 /* mono output bundles */
807 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
809 std::string pn = _engine.get_pretty_name_by_name (outputs[DataType::AUDIO][np]);
811 snprintf (buf, sizeof (buf), _("out %s"), pn.substr(0,12).c_str());
813 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
816 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
817 c->add_channel (_("mono"), DataType::AUDIO);
818 c->set_port (0, outputs[DataType::AUDIO][np]);
820 add_bundle (c, false);
823 /* stereo output bundles */
825 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
826 if (np + 1 < outputs[DataType::AUDIO].size()) {
828 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
829 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
830 c->add_channel (_("L"), DataType::AUDIO);
831 c->set_port (0, outputs[DataType::AUDIO][np]);
832 c->add_channel (_("R"), DataType::AUDIO);
833 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
835 add_bundle (c, false);
839 /* mono input bundles */
841 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
843 std::string pn = _engine.get_pretty_name_by_name (inputs[DataType::AUDIO][np]);
845 snprintf (buf, sizeof (buf), _("in %s"), pn.substr(0,12).c_str());
847 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
850 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
851 c->add_channel (_("mono"), DataType::AUDIO);
852 c->set_port (0, inputs[DataType::AUDIO][np]);
854 add_bundle (c, false);
857 /* stereo input bundles */
859 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
860 if (np + 1 < inputs[DataType::AUDIO].size()) {
862 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
864 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
865 c->add_channel (_("L"), DataType::AUDIO);
866 c->set_port (0, inputs[DataType::AUDIO][np]);
867 c->add_channel (_("R"), DataType::AUDIO);
868 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
870 add_bundle (c, false);
874 /* MIDI input bundles */
876 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
877 string n = inputs[DataType::MIDI][np];
878 std::string pn = _engine.get_pretty_name_by_name (n);
882 boost::erase_first (n, X_("alsa_pcm:"));
884 boost::shared_ptr<Bundle> c (new Bundle (n, false));
885 c->add_channel ("", DataType::MIDI);
886 c->set_port (0, inputs[DataType::MIDI][np]);
887 add_bundle (c, false);
890 /* MIDI output bundles */
892 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
893 string n = outputs[DataType::MIDI][np];
894 std::string pn = _engine.get_pretty_name_by_name (n);
898 boost::erase_first (n, X_("alsa_pcm:"));
900 boost::shared_ptr<Bundle> c (new Bundle (n, true));
901 c->add_channel ("", DataType::MIDI);
902 c->set_port (0, outputs[DataType::MIDI][np]);
903 add_bundle (c, false);
906 // we trust the backend to only calls us if there's a change
907 BundleAddedOrRemoved (); /* EMIT SIGNAL */
911 Session::auto_connect_master_bus ()
913 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
917 // Waves Tracks: Do not connect master bas for Tracks if AutoConnectMaster option is not set
918 // In this case it means "Multi Out" output mode
919 if (ARDOUR::Profile->get_trx() && !(Config->get_output_auto_connect() & AutoConnectMaster) ) {
923 /* if requested auto-connect the outputs to the first N physical ports.
926 uint32_t limit = _master_out->n_outputs().n_total();
927 vector<string> outputs[DataType::num_types];
929 for (uint32_t i = 0; i < DataType::num_types; ++i) {
930 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
933 for (uint32_t n = 0; n < limit; ++n) {
934 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
936 if (outputs[p->type()].size() > n) {
937 connect_to = outputs[p->type()][n];
940 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
941 if (_master_out->output()->connect (p, connect_to, this)) {
942 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
951 Session::remove_monitor_section ()
953 if (!_monitor_out || Profile->get_trx()) {
957 /* force reversion to Solo-In-Place */
958 Config->set_solo_control_is_listen_control (false);
960 /* if we are auditioning, cancel it ... this is a workaround
961 to a problem (auditioning does not execute the process graph,
962 which is needed to remove routes when using >1 core for processing)
967 /* Hold process lock while doing this so that we don't hear bits and
968 * pieces of audio as we work on each route.
971 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
973 /* Connect tracks to monitor section. Note that in an
974 existing session, the internal sends will already exist, but we want the
975 routes to notice that they connect to the control out specifically.
979 boost::shared_ptr<RouteList> r = routes.reader ();
980 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
982 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
984 if ((*x)->is_monitor()) {
986 } else if ((*x)->is_master()) {
989 (*x)->remove_aux_or_listen (_monitor_out);
994 remove_route (_monitor_out);
995 auto_connect_master_bus ();
998 auditioner->connect ();
1003 Session::add_monitor_section ()
1007 if (_monitor_out || !_master_out || Profile->get_trx()) {
1011 boost::shared_ptr<Route> r (new Route (*this, _("Monitor"), Route::MonitorOut, DataType::AUDIO));
1017 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1018 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
1021 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1022 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1023 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1027 add_routes (rl, false, false, false);
1029 assert (_monitor_out);
1031 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
1032 are undefined, at best.
1035 uint32_t limit = _monitor_out->n_inputs().n_audio();
1039 /* connect the inputs to the master bus outputs. this
1040 * represents a separate data feed from the internal sends from
1041 * each route. as of jan 2011, it allows the monitor section to
1042 * conditionally ignore either the internal sends or the normal
1043 * input feed, but we should really find a better way to do
1047 _master_out->output()->disconnect (this);
1049 for (uint32_t n = 0; n < limit; ++n) {
1050 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1051 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1054 string connect_to = o->name();
1055 if (_monitor_out->input()->connect (p, connect_to, this)) {
1056 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1064 /* if monitor section is not connected, connect it to physical outs
1067 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
1069 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1071 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1074 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1076 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1077 Config->get_monitor_bus_preferred_bundle())
1083 /* Monitor bus is audio only */
1085 vector<string> outputs[DataType::num_types];
1087 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1088 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1091 uint32_t mod = outputs[DataType::AUDIO].size();
1092 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1096 for (uint32_t n = 0; n < limit; ++n) {
1098 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1100 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1101 connect_to = outputs[DataType::AUDIO][n % mod];
1104 if (!connect_to.empty()) {
1105 if (_monitor_out->output()->connect (p, connect_to, this)) {
1106 error << string_compose (
1107 _("cannot connect control output %1 to %2"),
1118 /* Hold process lock while doing this so that we don't hear bits and
1119 * pieces of audio as we work on each route.
1122 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1124 /* Connect tracks to monitor section. Note that in an
1125 existing session, the internal sends will already exist, but we want the
1126 routes to notice that they connect to the control out specifically.
1130 boost::shared_ptr<RouteList> rls = routes.reader ();
1132 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1134 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1136 if ((*x)->is_monitor()) {
1138 } else if ((*x)->is_master()) {
1141 (*x)->enable_monitor_send ();
1146 auditioner->connect ();
1151 Session::reset_monitor_section ()
1153 /* Process lock should be held by the caller.*/
1155 if (!_monitor_out || Profile->get_trx()) {
1159 uint32_t limit = _master_out->n_outputs().n_audio();
1161 /* connect the inputs to the master bus outputs. this
1162 * represents a separate data feed from the internal sends from
1163 * each route. as of jan 2011, it allows the monitor section to
1164 * conditionally ignore either the internal sends or the normal
1165 * input feed, but we should really find a better way to do
1169 _master_out->output()->disconnect (this);
1170 _monitor_out->output()->disconnect (this);
1172 _monitor_out->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1173 _monitor_out->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1175 for (uint32_t n = 0; n < limit; ++n) {
1176 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1177 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1180 string connect_to = o->name();
1181 if (_monitor_out->input()->connect (p, connect_to, this)) {
1182 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1189 /* connect monitor section to physical outs
1192 if (Config->get_auto_connect_standard_busses()) {
1194 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1196 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1199 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1201 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1202 Config->get_monitor_bus_preferred_bundle())
1208 /* Monitor bus is audio only */
1210 vector<string> outputs[DataType::num_types];
1212 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1213 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1216 uint32_t mod = outputs[DataType::AUDIO].size();
1217 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1221 for (uint32_t n = 0; n < limit; ++n) {
1223 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1225 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1226 connect_to = outputs[DataType::AUDIO][n % mod];
1229 if (!connect_to.empty()) {
1230 if (_monitor_out->output()->connect (p, connect_to, this)) {
1231 error << string_compose (
1232 _("cannot connect control output %1 to %2"),
1243 /* Connect tracks to monitor section. Note that in an
1244 existing session, the internal sends will already exist, but we want the
1245 routes to notice that they connect to the control out specifically.
1249 boost::shared_ptr<RouteList> rls = routes.reader ();
1251 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1253 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1255 if ((*x)->is_monitor()) {
1257 } else if ((*x)->is_master()) {
1260 (*x)->enable_monitor_send ();
1266 Session::hookup_io ()
1268 /* stop graph reordering notifications from
1269 causing resorts, etc.
1272 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
1276 /* we delay creating the auditioner till now because
1277 it makes its own connections to ports.
1281 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
1283 throw failed_constructor ();
1285 a->use_new_diskstream ();
1289 catch (failed_constructor& err) {
1290 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
1294 /* load bundles, which we may have postponed earlier on */
1295 if (_bundle_xml_node) {
1296 load_bundles (*_bundle_xml_node);
1297 delete _bundle_xml_node;
1300 /* Tell all IO objects to connect themselves together */
1302 IO::enable_connecting ();
1304 /* Now tell all "floating" ports to connect to whatever
1305 they should be connected to.
1308 AudioEngine::instance()->reconnect_ports ();
1310 /* Anyone who cares about input state, wake up and do something */
1312 IOConnectionsComplete (); /* EMIT SIGNAL */
1314 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
1316 /* now handle the whole enchilada as if it was one
1317 graph reorder event.
1322 /* update the full solo state, which can't be
1323 correctly determined on a per-route basis, but
1324 needs the global overview that only the session
1328 update_route_solo_state ();
1332 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
1334 boost::shared_ptr<Track> track = wp.lock ();
1339 boost::shared_ptr<Playlist> playlist;
1341 if ((playlist = track->playlist()) != 0) {
1342 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
1343 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
1344 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
1349 Session::record_enabling_legal () const
1351 /* this used to be in here, but survey says.... we don't need to restrict it */
1352 // if (record_status() == Recording) {
1356 if (Config->get_all_safe()) {
1363 Session::set_track_monitor_input_status (bool yn)
1365 boost::shared_ptr<RouteList> rl = routes.reader ();
1366 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1367 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1368 if (tr && tr->record_enabled ()) {
1369 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1370 tr->request_input_monitoring (yn);
1376 Session::auto_punch_start_changed (Location* location)
1378 replace_event (SessionEvent::PunchIn, location->start());
1380 if (get_record_enabled() && config.get_punch_in()) {
1381 /* capture start has been changed, so save new pending state */
1382 save_state ("", true);
1387 Session::auto_punch_end_changed (Location* location)
1389 framepos_t when_to_stop = location->end();
1390 // when_to_stop += _worst_output_latency + _worst_input_latency;
1391 replace_event (SessionEvent::PunchOut, when_to_stop);
1395 Session::auto_punch_changed (Location* location)
1397 framepos_t when_to_stop = location->end();
1399 replace_event (SessionEvent::PunchIn, location->start());
1400 //when_to_stop += _worst_output_latency + _worst_input_latency;
1401 replace_event (SessionEvent::PunchOut, when_to_stop);
1404 /** @param loc A loop location.
1405 * @param pos Filled in with the start time of the required fade-out (in session frames).
1406 * @param length Filled in with the length of the required fade-out.
1409 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
1411 pos = max (loc->start(), loc->end() - 64);
1412 length = loc->end() - pos;
1416 Session::auto_loop_changed (Location* location)
1418 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1421 auto_loop_declick_range (location, dcp, dcl);
1423 if (transport_rolling() && play_loop) {
1425 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1427 // if (_transport_frame > location->end()) {
1429 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1430 // relocate to beginning of loop
1431 clear_events (SessionEvent::LocateRoll);
1433 request_locate (location->start(), true);
1436 else if (Config->get_seamless_loop() && !loop_changing) {
1438 // schedule a locate-roll to refill the diskstreams at the
1439 // previous loop end
1440 loop_changing = true;
1442 if (location->end() > last_loopend) {
1443 clear_events (SessionEvent::LocateRoll);
1444 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1450 clear_events (SessionEvent::AutoLoopDeclick);
1451 clear_events (SessionEvent::AutoLoop);
1454 /* possibly move playhead if not rolling; if we are rolling we'll move
1455 to the loop start on stop if that is appropriate.
1460 if (!transport_rolling() && select_playhead_priority_target (pos)) {
1461 if (pos == location->start()) {
1462 request_locate (pos);
1467 last_loopend = location->end();
1472 Session::set_auto_punch_location (Location* location)
1476 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1477 punch_connections.drop_connections();
1478 existing->set_auto_punch (false, this);
1479 remove_event (existing->start(), SessionEvent::PunchIn);
1480 clear_events (SessionEvent::PunchOut);
1481 auto_punch_location_changed (0);
1486 if (location == 0) {
1490 if (location->end() <= location->start()) {
1491 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1495 punch_connections.drop_connections ();
1497 location->StartChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, location));
1498 location->EndChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, location));
1499 location->Changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, location));
1501 location->set_auto_punch (true, this);
1503 auto_punch_changed (location);
1505 auto_punch_location_changed (location);
1509 Session::set_session_extents (framepos_t start, framepos_t end)
1512 if ((existing = _locations->session_range_location()) == 0) {
1513 //if there is no existing session, we need to make a new session location (should never happen)
1514 existing = new Location (*this, 0, 0, _("session"), Location::IsSessionRange);
1518 error << _("Session: you can't use that location for session start/end)") << endmsg;
1522 existing->set( start, end );
1528 Session::set_auto_loop_location (Location* location)
1532 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1533 loop_connections.drop_connections ();
1534 existing->set_auto_loop (false, this);
1535 remove_event (existing->end(), SessionEvent::AutoLoop);
1538 auto_loop_declick_range (existing, dcp, dcl);
1539 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1540 auto_loop_location_changed (0);
1545 if (location == 0) {
1549 if (location->end() <= location->start()) {
1550 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1554 last_loopend = location->end();
1556 loop_connections.drop_connections ();
1558 location->StartChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1559 location->EndChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1560 location->Changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1561 location->FlagsChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1563 location->set_auto_loop (true, this);
1565 if (Config->get_loop_is_mode() && play_loop && Config->get_seamless_loop()) {
1566 // set all tracks to use internal looping
1567 boost::shared_ptr<RouteList> rl = routes.reader ();
1568 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1569 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1570 if (tr && !tr->hidden()) {
1571 tr->set_loop (location);
1576 /* take care of our stuff first */
1578 auto_loop_changed (location);
1580 /* now tell everyone else */
1582 auto_loop_location_changed (location);
1586 Session::update_marks (Location*)
1592 Session::update_skips (Location* loc, bool consolidate)
1594 if (_ignore_skips_updates) {
1598 Locations::LocationList skips;
1601 PBD::Unwinder<bool> uw (_ignore_skips_updates, true);
1602 consolidate_skips (loc);
1605 sync_locations_to_skips ();
1611 Session::consolidate_skips (Location* loc)
1613 Locations::LocationList all_locations = _locations->list ();
1615 for (Locations::LocationList::iterator l = all_locations.begin(); l != all_locations.end(); ) {
1617 if (!(*l)->is_skip ()) {
1622 /* don't test against self */
1629 switch (Evoral::coverage ((*l)->start(), (*l)->end(), loc->start(), loc->end())) {
1630 case Evoral::OverlapInternal:
1631 case Evoral::OverlapExternal:
1632 case Evoral::OverlapStart:
1633 case Evoral::OverlapEnd:
1634 /* adjust new location to cover existing one */
1635 loc->set_start (min (loc->start(), (*l)->start()));
1636 loc->set_end (max (loc->end(), (*l)->end()));
1637 /* we don't need this one any more */
1638 _locations->remove (*l);
1639 /* the location has been deleted, so remove reference to it in our local list */
1640 l = all_locations.erase (l);
1643 case Evoral::OverlapNone:
1651 Session::sync_locations_to_skips ()
1653 /* This happens asynchronously (in the audioengine thread). After the clear is done, we will call
1654 * Session::_sync_locations_to_skips() from the audioengine thread.
1656 clear_events (SessionEvent::Skip, boost::bind (&Session::_sync_locations_to_skips, this));
1660 Session::_sync_locations_to_skips ()
1662 /* called as a callback after existing Skip events have been cleared from a realtime audioengine thread */
1664 Locations::LocationList const & locs (_locations->list());
1666 for (Locations::LocationList::const_iterator i = locs.begin(); i != locs.end(); ++i) {
1668 Location* location = *i;
1670 if (location->is_skip() && location->is_skipping()) {
1671 SessionEvent* ev = new SessionEvent (SessionEvent::Skip, SessionEvent::Add, location->start(), location->end(), 1.0);
1679 Session::location_added (Location *location)
1681 if (location->is_auto_punch()) {
1682 set_auto_punch_location (location);
1685 if (location->is_auto_loop()) {
1686 set_auto_loop_location (location);
1689 if (location->is_session_range()) {
1690 /* no need for any signal handling or event setting with the session range,
1691 because we keep a direct reference to it and use its start/end directly.
1693 _session_range_location = location;
1696 if (location->is_mark()) {
1697 /* listen for per-location signals that require us to do any * global updates for marks */
1699 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1700 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1701 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1702 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1705 if (location->is_skip()) {
1706 /* listen for per-location signals that require us to update skip-locate events */
1708 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1709 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1710 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1711 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, false));
1713 update_skips (location, true);
1720 Session::location_removed (Location *location)
1722 if (location->is_auto_loop()) {
1723 set_auto_loop_location (0);
1724 set_track_loop (false);
1727 if (location->is_auto_punch()) {
1728 set_auto_punch_location (0);
1731 if (location->is_session_range()) {
1732 /* this is never supposed to happen */
1733 error << _("programming error: session range removed!") << endl;
1736 if (location->is_skip()) {
1738 update_skips (location, false);
1745 Session::locations_changed ()
1747 _locations->apply (*this, &Session::_locations_changed);
1751 Session::_locations_changed (const Locations::LocationList& locations)
1753 /* There was some mass-change in the Locations object.
1755 We might be re-adding a location here but it doesn't actually matter
1756 for all the locations that the Session takes an interest in.
1760 PBD::Unwinder<bool> protect_ignore_skip_updates (_ignore_skips_updates, true);
1761 for (Locations::LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
1762 location_added (*i);
1766 update_skips (NULL, false);
1770 Session::enable_record ()
1772 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1773 /* no recording at anything except normal speed */
1778 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1780 if (rs == Recording) {
1784 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1786 _last_record_location = _transport_frame;
1787 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1789 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1790 set_track_monitor_input_status (true);
1793 RecordStateChanged ();
1800 Session::disable_record (bool rt_context, bool force)
1804 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1806 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1807 g_atomic_int_set (&_record_status, Disabled);
1808 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1810 if (rs == Recording) {
1811 g_atomic_int_set (&_record_status, Enabled);
1815 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1816 set_track_monitor_input_status (false);
1819 RecordStateChanged (); /* emit signal */
1822 remove_pending_capture_state ();
1828 Session::step_back_from_record ()
1830 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1832 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1833 set_track_monitor_input_status (false);
1836 RecordStateChanged (); /* emit signal */
1841 Session::maybe_enable_record ()
1843 if (_step_editors > 0) {
1847 g_atomic_int_set (&_record_status, Enabled);
1849 /* This function is currently called from somewhere other than an RT thread.
1850 This save_state() call therefore doesn't impact anything. Doing it here
1851 means that we save pending state of which sources the next record will use,
1852 which gives us some chance of recovering from a crash during the record.
1855 save_state ("", true);
1857 if (Config->get_loop_is_mode()) {
1858 /* makes no sense to use loop play as mode when recording */
1859 request_play_loop (false);
1862 if (_transport_speed) {
1863 if (!config.get_punch_in()) {
1867 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1868 RecordStateChanged (); /* EMIT SIGNAL */
1875 Session::audible_frame () const
1881 offset = worst_playback_latency ();
1883 if (synced_to_engine()) {
1884 /* Note: this is basically just sync-to-JACK */
1885 tf = _engine.transport_frame();
1887 tf = _transport_frame;
1892 if (!non_realtime_work_pending()) {
1896 /* Check to see if we have passed the first guaranteed
1897 audible frame past our last start position. if not,
1898 return that last start point because in terms
1899 of audible frames, we have not moved yet.
1901 `Start position' in this context means the time we last
1902 either started, located, or changed transport direction.
1905 if (_transport_speed > 0.0f) {
1907 if (!play_loop || !have_looped) {
1908 if (tf < _last_roll_or_reversal_location + offset) {
1909 return _last_roll_or_reversal_location;
1917 } else if (_transport_speed < 0.0f) {
1919 /* XXX wot? no backward looping? */
1921 if (tf > _last_roll_or_reversal_location - offset) {
1922 return _last_roll_or_reversal_location;
1934 Session::set_frame_rate (framecnt_t frames_per_second)
1936 /** \fn void Session::set_frame_size(framecnt_t)
1937 the AudioEngine object that calls this guarantees
1938 that it will not be called while we are also in
1939 ::process(). Its fine to do things that block
1943 _base_frame_rate = frames_per_second;
1944 _nominal_frame_rate = frames_per_second;
1949 reset_write_sources (false);
1951 // XXX we need some equivalent to this, somehow
1952 // SndFileSource::setup_standard_crossfades (frames_per_second);
1956 /* XXX need to reset/reinstantiate all LADSPA plugins */
1960 Session::set_block_size (pframes_t nframes)
1962 /* the AudioEngine guarantees
1963 that it will not be called while we are also in
1964 ::process(). It is therefore fine to do things that block
1969 current_block_size = nframes;
1973 boost::shared_ptr<RouteList> r = routes.reader ();
1975 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1976 (*i)->set_block_size (nframes);
1979 boost::shared_ptr<RouteList> rl = routes.reader ();
1980 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1981 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1983 tr->set_block_size (nframes);
1987 set_worst_io_latencies ();
1993 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1995 boost::shared_ptr<Route> r2;
1997 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1998 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
2002 /* make a copy of the existing list of routes that feed r1 */
2004 Route::FedBy existing (r1->fed_by());
2006 /* for each route that feeds r1, recurse, marking it as feeding
2010 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
2011 if (!(r2 = i->r.lock ())) {
2012 /* (*i) went away, ignore it */
2016 /* r2 is a route that feeds r1 which somehow feeds base. mark
2017 base as being fed by r2
2020 rbase->add_fed_by (r2, i->sends_only);
2024 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
2028 if (r1->feeds (r2) && r2->feeds (r1)) {
2032 /* now recurse, so that we can mark base as being fed by
2033 all routes that feed r2
2036 trace_terminal (r2, rbase);
2043 Session::resort_routes ()
2045 /* don't do anything here with signals emitted
2046 by Routes during initial setup or while we
2047 are being destroyed.
2050 if (_state_of_the_state & (InitialConnecting | Deletion)) {
2055 RCUWriter<RouteList> writer (routes);
2056 boost::shared_ptr<RouteList> r = writer.get_copy ();
2057 resort_routes_using (r);
2058 /* writer goes out of scope and forces update */
2062 boost::shared_ptr<RouteList> rl = routes.reader ();
2063 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2064 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
2066 const Route::FedBy& fb ((*i)->fed_by());
2068 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
2069 boost::shared_ptr<Route> sf = f->r.lock();
2071 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
2079 /** This is called whenever we need to rebuild the graph of how we will process
2081 * @param r List of routes, in any order.
2085 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
2087 /* We are going to build a directed graph of our routes;
2088 this is where the edges of that graph are put.
2093 /* Go through all routes doing two things:
2095 * 1. Collect the edges of the route graph. Each of these edges
2096 * is a pair of routes, one of which directly feeds the other
2097 * either by a JACK connection or by an internal send.
2099 * 2. Begin the process of making routes aware of which other
2100 * routes directly or indirectly feed them. This information
2101 * is used by the solo code.
2104 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2106 /* Clear out the route's list of direct or indirect feeds */
2107 (*i)->clear_fed_by ();
2109 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
2111 bool via_sends_only;
2113 /* See if this *j feeds *i according to the current state of the JACK
2114 connections and internal sends.
2116 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
2117 /* add the edge to the graph (part #1) */
2118 edges.add (*j, *i, via_sends_only);
2119 /* tell the route (for part #2) */
2120 (*i)->add_fed_by (*j, via_sends_only);
2125 /* Attempt a topological sort of the route graph */
2126 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
2128 if (sorted_routes) {
2129 /* We got a satisfactory topological sort, so there is no feedback;
2132 Note: the process graph rechain does not require a
2133 topologically-sorted list, but hey ho.
2135 if (_process_graph) {
2136 _process_graph->rechain (sorted_routes, edges);
2139 _current_route_graph = edges;
2141 /* Complete the building of the routes' lists of what directly
2142 or indirectly feeds them.
2144 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2145 trace_terminal (*i, *i);
2148 *r = *sorted_routes;
2151 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
2152 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2153 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
2154 (*i)->name(), (*i)->order_key ()));
2158 SuccessfulGraphSort (); /* EMIT SIGNAL */
2161 /* The topological sort failed, so we have a problem. Tell everyone
2162 and stick to the old graph; this will continue to be processed, so
2163 until the feedback is fixed, what is played back will not quite
2164 reflect what is actually connected. Note also that we do not
2165 do trace_terminal here, as it would fail due to an endless recursion,
2166 so the solo code will think that everything is still connected
2170 FeedbackDetected (); /* EMIT SIGNAL */
2175 /** Find a route name starting with \a base, maybe followed by the
2176 * lowest \a id. \a id will always be added if \a definitely_add_number
2177 * is true on entry; otherwise it will only be added if required
2178 * to make the name unique.
2180 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
2181 * The available route name with the lowest ID will be used, and \a id
2182 * will be set to the ID.
2184 * \return false if a route name could not be found, and \a track_name
2185 * and \a id do not reflect a free route name.
2188 Session::find_route_name (string const & base, uint32_t& id, string& name, bool definitely_add_number)
2190 if (!definitely_add_number && route_by_name (base) == 0) {
2191 /* juse use the base */
2197 name = string_compose ("%1 %2", base, id);
2199 if (route_by_name (name) == 0) {
2205 } while (id < (UINT_MAX-1));
2210 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
2212 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
2214 in = ChanCount::ZERO;
2215 out = ChanCount::ZERO;
2217 boost::shared_ptr<RouteList> r = routes.reader ();
2219 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2220 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2221 if (tr && !tr->is_auditioner()) {
2222 in += tr->n_inputs();
2223 out += tr->n_outputs();
2228 /** Caller must not hold process lock
2229 * @param name_template string to use for the start of the name, or "" to use "MIDI".
2230 * @param instrument plugin info for the instrument to insert pre-fader, if any
2232 list<boost::shared_ptr<MidiTrack> >
2233 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
2234 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
2237 uint32_t track_id = 0;
2239 RouteList new_routes;
2240 list<boost::shared_ptr<MidiTrack> > ret;
2242 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
2245 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, use_number)) {
2246 error << "cannot find name for new midi track" << endmsg;
2250 boost::shared_ptr<MidiTrack> track;
2253 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
2255 if (track->init ()) {
2259 track->use_new_diskstream();
2261 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2262 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2265 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2266 if (track->input()->ensure_io (input, false, this)) {
2267 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
2271 if (track->output()->ensure_io (output, false, this)) {
2272 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
2277 track->non_realtime_input_change();
2280 route_group->add (track);
2283 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2285 if (Config->get_remote_model() == UserOrdered) {
2286 track->set_remote_control_id (next_control_id());
2289 new_routes.push_back (track);
2290 ret.push_back (track);
2292 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2295 catch (failed_constructor &err) {
2296 error << _("Session: could not create new midi track.") << endmsg;
2300 catch (AudioEngine::PortRegistrationFailure& pfe) {
2302 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;
2310 if (!new_routes.empty()) {
2311 StateProtector sp (this);
2312 if (Profile->get_trx()) {
2313 add_routes (new_routes, false, false, false);
2315 add_routes (new_routes, true, true, false);
2319 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
2320 PluginPtr plugin = instrument->load (*this);
2321 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2322 (*r)->add_processor (p, PreFader);
2332 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2334 boost::shared_ptr<Route> midi_track (wmt.lock());
2340 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2342 if (change.after.n_audio() <= change.before.n_audio()) {
2346 /* new audio ports: make sure the audio goes somewhere useful,
2347 unless the user has no-auto-connect selected.
2349 The existing ChanCounts don't matter for this call as they are only
2350 to do with matching input and output indices, and we are only changing
2356 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
2360 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
2361 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
2362 * @param output_start As \a input_start, but for outputs.
2365 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
2366 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
2368 if (!IO::connecting_legal) {
2372 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2378 /* If both inputs and outputs are auto-connected to physical ports,
2379 use the max of input and output offsets to ensure auto-connected
2380 port numbers always match up (e.g. the first audio input and the
2381 first audio output of the route will have the same physical
2382 port number). Otherwise just use the lowest input or output
2386 DEBUG_TRACE (DEBUG::Graph,
2387 string_compose("Auto-connect: existing in = %1 out = %2\n",
2388 existing_inputs, existing_outputs));
2390 const bool in_out_physical =
2391 (Config->get_input_auto_connect() & AutoConnectPhysical)
2392 && (Config->get_output_auto_connect() & AutoConnectPhysical)
2395 const ChanCount in_offset = in_out_physical
2396 ? ChanCount::max(existing_inputs, existing_outputs)
2399 const ChanCount out_offset = in_out_physical
2400 ? ChanCount::max(existing_inputs, existing_outputs)
2403 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2404 vector<string> physinputs;
2405 vector<string> physoutputs;
2407 _engine.get_physical_outputs (*t, physoutputs);
2408 _engine.get_physical_inputs (*t, physinputs);
2410 if (!physinputs.empty() && connect_inputs) {
2411 uint32_t nphysical_in = physinputs.size();
2413 DEBUG_TRACE (DEBUG::Graph,
2414 string_compose("There are %1 physical inputs of type %2\n",
2417 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
2420 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
2421 DEBUG_TRACE (DEBUG::Graph,
2422 string_compose("Get index %1 + %2 % %3 = %4\n",
2423 in_offset.get(*t), i, nphysical_in,
2424 (in_offset.get(*t) + i) % nphysical_in));
2425 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
2428 DEBUG_TRACE (DEBUG::Graph,
2429 string_compose("Connect route %1 IN to %2\n",
2430 route->name(), port));
2432 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
2436 ChanCount one_added (*t, 1);
2437 existing_inputs += one_added;
2441 if (!physoutputs.empty()) {
2442 uint32_t nphysical_out = physoutputs.size();
2443 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
2447 * do not create new connections if we reached the limit of physical outputs
2451 if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
2452 ARDOUR::Profile->get_trx () &&
2453 existing_outputs.get(*t) == nphysical_out ) {
2457 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
2458 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
2459 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
2460 /* master bus is audio only */
2461 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
2462 port = _master_out->input()->ports().port(*t,
2463 i % _master_out->input()->n_ports().get(*t))->name();
2467 DEBUG_TRACE (DEBUG::Graph,
2468 string_compose("Connect route %1 OUT to %2\n",
2469 route->name(), port));
2471 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
2475 ChanCount one_added (*t, 1);
2476 existing_outputs += one_added;
2482 #ifdef USE_TRACKS_CODE_FEATURES
2485 compare_routes_by_remote_id (const boost::shared_ptr<Route>& route1, const boost::shared_ptr<Route>& route2)
2487 return route1->remote_control_id() < route2->remote_control_id();
2491 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2493 // it is not allowed to perform connection
2494 if (!IO::connecting_legal) {
2498 // if we are deleting routes we will call this once at the end
2499 if (_route_deletion_in_progress) {
2503 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2509 // We need to disconnect the route's inputs and outputs first
2510 // basing on autoconnect configuration
2511 bool reconnectIputs = !(Config->get_input_auto_connect() & ManualConnect) && reconnect_inputs;
2512 bool reconnectOutputs = !(Config->get_output_auto_connect() & ManualConnect) && reconnect_outputs;
2514 ChanCount existing_inputs;
2515 ChanCount existing_outputs;
2516 count_existing_track_channels (existing_inputs, existing_outputs);
2518 //ChanCount inputs = ChanCount::ZERO;
2519 //ChanCount outputs = ChanCount::ZERO;
2521 RouteList existing_routes = *routes.reader ();
2522 existing_routes.sort (compare_routes_by_remote_id);
2525 PBD::Unwinder<bool> protect_ignore_changes (_reconnecting_routes_in_progress, true);
2527 vector<string> physinputs;
2528 vector<string> physoutputs;
2530 EngineStateController::instance()->get_physical_audio_outputs(physoutputs);
2531 EngineStateController::instance()->get_physical_audio_inputs(physinputs);
2533 uint32_t input_n = 0;
2534 uint32_t output_n = 0;
2535 RouteList::iterator rIter = existing_routes.begin();
2536 const AutoConnectOption current_input_auto_connection (Config->get_input_auto_connect());
2537 const AutoConnectOption current_output_auto_connection (Config->get_output_auto_connect());
2538 for (; rIter != existing_routes.end(); ++rIter) {
2539 if (*rIter == _master_out || *rIter == _monitor_out ) {
2543 if (current_output_auto_connection == AutoConnectPhysical) {
2544 (*rIter)->amp()->deactivate();
2545 } else if (current_output_auto_connection == AutoConnectMaster) {
2546 (*rIter)->amp()->activate();
2549 if (reconnectIputs) {
2550 (*rIter)->input()->disconnect (this); //GZ: check this; could be heavy
2552 for (uint32_t route_input_n = 0; route_input_n < (*rIter)->n_inputs().get(DataType::AUDIO); ++route_input_n) {
2554 if (current_input_auto_connection & AutoConnectPhysical) {
2556 if ( input_n == physinputs.size() ) {
2560 string port = physinputs[input_n];
2562 if (port.empty() ) {
2563 error << "Physical Input number "<< input_n << " is unavailable and cannot be connected" << endmsg;
2566 //GZ: check this; could be heavy
2567 (*rIter)->input()->connect ((*rIter)->input()->ports().port(DataType::AUDIO, route_input_n), port, this);
2573 if (reconnectOutputs) {
2575 //normalize route ouptuts: reduce the amount outputs to be equal to the amount of inputs
2576 if (current_output_auto_connection & AutoConnectPhysical) {
2578 //GZ: check this; could be heavy
2579 (*rIter)->output()->disconnect (this);
2580 size_t route_inputs_count = (*rIter)->n_inputs().get(DataType::AUDIO);
2582 //GZ: check this; could be heavy
2583 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, route_inputs_count), false, this );
2585 } else if (current_output_auto_connection & AutoConnectMaster){
2587 if (!reconnect_master) {
2591 //GZ: check this; could be heavy
2592 (*rIter)->output()->disconnect (this);
2595 uint32_t master_inputs_count = _master_out->n_inputs().get(DataType::AUDIO);
2596 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, master_inputs_count), false, this );
2598 error << error << "Master bus is not available" << endmsg;
2603 for (uint32_t route_output_n = 0; route_output_n < (*rIter)->n_outputs().get(DataType::AUDIO); ++route_output_n) {
2604 if (current_output_auto_connection & AutoConnectPhysical) {
2606 if ( output_n == physoutputs.size() ) {
2610 string port = physoutputs[output_n];
2612 if (port.empty() ) {
2613 error << "Physical Output number "<< output_n << " is unavailable and cannot be connected" << endmsg;
2616 //GZ: check this; could be heavy
2617 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2620 } else if (current_output_auto_connection & AutoConnectMaster) {
2622 if ( route_output_n == _master_out->n_inputs().get(DataType::AUDIO) ) {
2626 // connect to master bus
2627 string port = _master_out->input()->ports().port(DataType::AUDIO, route_output_n)->name();
2629 if (port.empty() ) {
2630 error << "MasterBus Input number "<< route_output_n << " is unavailable and cannot be connected" << endmsg;
2634 //GZ: check this; could be heavy
2635 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2641 //auto_connect_route (*rIter, inputs, outputs, false, reconnectIputs);
2644 _master_out->output()->disconnect (this);
2645 auto_connect_master_bus ();
2650 session_routes_reconnected (); /* EMIT SIGNAL */
2654 Session::reconnect_midi_scene_ports(bool inputs)
2658 boost::shared_ptr<MidiPort> scene_in_ptr = scene_in();
2660 scene_in_ptr->disconnect_all ();
2662 std::vector<EngineStateController::MidiPortState> midi_port_states;
2663 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2665 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2667 for (; state_iter != midi_port_states.end(); ++state_iter) {
2668 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2669 scene_in_ptr->connect (state_iter->name);
2676 boost::shared_ptr<MidiPort> scene_out_ptr = scene_out();
2678 if (scene_out_ptr ) {
2679 scene_out_ptr->disconnect_all ();
2681 std::vector<EngineStateController::MidiPortState> midi_port_states;
2682 EngineStateController::instance()->get_physical_midi_output_states (midi_port_states);
2684 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2686 for (; state_iter != midi_port_states.end(); ++state_iter) {
2687 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2688 scene_out_ptr->connect (state_iter->name);
2696 Session::reconnect_mtc_ports ()
2698 boost::shared_ptr<MidiPort> mtc_in_ptr = _midi_ports->mtc_input_port();
2704 mtc_in_ptr->disconnect_all ();
2706 std::vector<EngineStateController::MidiPortState> midi_port_states;
2707 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2709 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2711 for (; state_iter != midi_port_states.end(); ++state_iter) {
2712 if (state_iter->available && state_iter->mtc_in) {
2713 mtc_in_ptr->connect (state_iter->name);
2717 if (!_midi_ports->mtc_input_port ()->connected () &&
2718 config.get_external_sync () &&
2719 (Config->get_sync_source () == MTC) ) {
2720 config.set_external_sync (false);
2723 if ( ARDOUR::Profile->get_trx () ) {
2724 // Tracks need this signal to update timecode_source_dropdown
2725 MtcOrLtcInputPortChanged (); //emit signal
2730 Session::reconnect_mmc_ports(bool inputs)
2732 if (inputs ) { // get all enabled midi input ports
2734 boost::shared_ptr<MidiPort> mmc_in_ptr = _midi_ports->mmc_in();
2736 mmc_in_ptr->disconnect_all ();
2737 std::vector<std::string> enabled_midi_inputs;
2738 EngineStateController::instance()->get_physical_midi_inputs (enabled_midi_inputs);
2740 std::vector<std::string>::iterator port_iter = enabled_midi_inputs.begin();
2742 for (; port_iter != enabled_midi_inputs.end(); ++port_iter) {
2743 mmc_in_ptr->connect (*port_iter);
2747 } else { // get all enabled midi output ports
2749 boost::shared_ptr<MidiPort> mmc_out_ptr = _midi_ports->mmc_out();
2751 mmc_out_ptr->disconnect_all ();
2752 std::vector<std::string> enabled_midi_outputs;
2753 EngineStateController::instance()->get_physical_midi_outputs (enabled_midi_outputs);
2755 std::vector<std::string>::iterator port_iter = enabled_midi_outputs.begin();
2757 for (; port_iter != enabled_midi_outputs.end(); ++port_iter) {
2758 mmc_out_ptr->connect (*port_iter);
2766 /** Caller must not hold process lock
2767 * @param name_template string to use for the start of the name, or "" to use "Audio".
2769 list< boost::shared_ptr<AudioTrack> >
2770 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
2771 uint32_t how_many, string name_template)
2774 uint32_t track_id = 0;
2776 RouteList new_routes;
2777 list<boost::shared_ptr<AudioTrack> > ret;
2779 string name_pattern;
2781 if (Profile->get_trx() ) {
2782 name_pattern = "Track ";
2784 name_pattern = "Audio ";
2787 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _(name_pattern.c_str() );
2791 if (!find_route_name (name_template.empty() ? _(name_pattern.c_str()) : name_template, ++track_id, track_name, use_number)) {
2792 error << "cannot find name for new audio track" << endmsg;
2796 boost::shared_ptr<AudioTrack> track;
2799 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
2801 if (track->init ()) {
2805 if (ARDOUR::Profile->get_trx ()) {
2806 // TRACKS considers it's not a USE CASE, it's
2807 // a piece of behavior of the session model:
2809 // Gain for a newly created route depends on
2810 // the current output_auto_connect mode:
2812 // 0 for Stereo Out mode
2814 if (Config->get_output_auto_connect() & AutoConnectMaster) {
2815 track->set_gain (dB_to_coefficient (0), 0);
2819 track->use_new_diskstream();
2821 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2822 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2825 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2827 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2828 error << string_compose (
2829 _("cannot configure %1 in/%2 out configuration for new audio track"),
2830 input_channels, output_channels)
2835 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2836 error << string_compose (
2837 _("cannot configure %1 in/%2 out configuration for new audio track"),
2838 input_channels, output_channels)
2845 route_group->add (track);
2848 track->non_realtime_input_change();
2850 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2851 if (Config->get_remote_model() == UserOrdered) {
2852 track->set_remote_control_id (next_control_id());
2855 new_routes.push_back (track);
2856 ret.push_back (track);
2858 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2861 catch (failed_constructor &err) {
2862 error << _("Session: could not create new audio track.") << endmsg;
2866 catch (AudioEngine::PortRegistrationFailure& pfe) {
2868 error << pfe.what() << endmsg;
2876 if (!new_routes.empty()) {
2877 StateProtector sp (this);
2878 if (Profile->get_trx()) {
2879 add_routes (new_routes, false, false, false);
2881 add_routes (new_routes, true, true, false);
2888 /** Caller must not hold process lock.
2889 * @param name_template string to use for the start of the name, or "" to use "Bus".
2892 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
2895 uint32_t bus_id = 0;
2899 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
2902 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, use_number)) {
2903 error << "cannot find name for new audio bus" << endmsg;
2908 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
2914 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2915 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
2918 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2920 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2921 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2922 input_channels, output_channels)
2928 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2929 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2930 input_channels, output_channels)
2937 route_group->add (bus);
2939 if (Config->get_remote_model() == UserOrdered) {
2940 bus->set_remote_control_id (next_control_id());
2943 bus->add_internal_return ();
2945 ret.push_back (bus);
2947 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2953 catch (failed_constructor &err) {
2954 error << _("Session: could not create new audio route.") << endmsg;
2958 catch (AudioEngine::PortRegistrationFailure& pfe) {
2959 error << pfe.what() << endmsg;
2969 StateProtector sp (this);
2970 if (Profile->get_trx()) {
2971 add_routes (ret, false, false, false);
2973 add_routes (ret, false, true, true); // autoconnect // outputs only
2982 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base)
2985 uint32_t control_id;
2987 uint32_t number = 0;
2988 const uint32_t being_added = how_many;
2990 if (!tree.read (template_path.c_str())) {
2994 XMLNode* node = tree.root();
2996 IO::disable_connecting ();
2998 control_id = next_control_id ();
3002 XMLNode node_copy (*node);
3004 /* Remove IDs of everything so that new ones are used */
3005 node_copy.remove_property_recursively (X_("id"));
3010 if (!name_base.empty()) {
3012 /* if we're adding more than one routes, force
3013 * all the names of the new routes to be
3014 * numbered, via the final parameter.
3017 if (!find_route_name (name_base.c_str(), ++number, name, (being_added > 1))) {
3018 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3024 string const route_name = node_copy.property(X_("name"))->value ();
3026 /* generate a new name by adding a number to the end of the template name */
3027 if (!find_route_name (route_name.c_str(), ++number, name, true)) {
3028 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3029 abort(); /*NOTREACHED*/
3033 /* set this name in the XML description that we are about to use */
3034 Route::set_name_in_state (node_copy, name);
3036 /* trim bitslots from listen sends so that new ones are used */
3037 XMLNodeList children = node_copy.children ();
3038 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
3039 if ((*i)->name() == X_("Processor")) {
3040 XMLProperty* role = (*i)->property (X_("role"));
3041 if (role && role->value() == X_("Listen")) {
3042 (*i)->remove_property (X_("bitslot"));
3047 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
3050 error << _("Session: cannot create track/bus from template description") << endmsg;
3054 if (boost::dynamic_pointer_cast<Track>(route)) {
3055 /* force input/output change signals so that the new diskstream
3056 picks up the configuration of the route. During session
3057 loading this normally happens in a different way.
3060 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3062 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
3063 change.after = route->input()->n_ports();
3064 route->input()->changed (change, this);
3065 change.after = route->output()->n_ports();
3066 route->output()->changed (change, this);
3069 route->set_remote_control_id (control_id);
3072 ret.push_back (route);
3074 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
3077 catch (failed_constructor &err) {
3078 error << _("Session: could not create new route from template") << endmsg;
3082 catch (AudioEngine::PortRegistrationFailure& pfe) {
3083 error << pfe.what() << endmsg;
3092 StateProtector sp (this);
3093 if (Profile->get_trx()) {
3094 add_routes (ret, false, false, false);
3096 add_routes (ret, true, true, false);
3098 IO::enable_connecting ();
3105 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
3108 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
3109 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
3112 error << _("Adding new tracks/busses failed") << endmsg;
3117 update_latency (true);
3118 update_latency (false);
3123 save_state (_current_snapshot_name);
3126 reassign_track_numbers();
3128 update_route_record_state ();
3130 RouteAdded (new_routes); /* EMIT SIGNAL */
3134 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
3136 ChanCount existing_inputs;
3137 ChanCount existing_outputs;
3138 uint32_t order = next_control_id();
3140 if (_order_hint > -1) {
3141 order = _order_hint;
3145 count_existing_track_channels (existing_inputs, existing_outputs);
3148 RCUWriter<RouteList> writer (routes);
3149 boost::shared_ptr<RouteList> r = writer.get_copy ();
3150 r->insert (r->end(), new_routes.begin(), new_routes.end());
3152 /* if there is no control out and we're not in the middle of loading,
3153 resort the graph here. if there is a control out, we will resort
3154 toward the end of this method. if we are in the middle of loading,
3155 we will resort when done.
3158 if (!_monitor_out && IO::connecting_legal) {
3159 resort_routes_using (r);
3163 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3165 boost::weak_ptr<Route> wpr (*x);
3166 boost::shared_ptr<Route> r (*x);
3168 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
3169 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
3170 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
3171 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
3172 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
3173 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
3175 if (r->is_master()) {
3179 if (r->is_monitor()) {
3183 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
3185 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
3186 track_playlist_changed (boost::weak_ptr<Track> (tr));
3187 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
3189 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
3191 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
3192 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
3197 if (input_auto_connect || output_auto_connect) {
3198 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
3201 /* order keys are a GUI responsibility but we need to set up
3202 reasonable defaults because they also affect the remote control
3203 ID in most situations.
3206 if (!r->has_order_key ()) {
3207 if (r->is_auditioner()) {
3208 /* use an arbitrarily high value */
3209 r->set_order_key (UINT_MAX);
3211 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
3212 r->set_order_key (order);
3220 if (_monitor_out && IO::connecting_legal) {
3221 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
3223 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3224 if ((*x)->is_monitor()) {
3226 } else if ((*x)->is_master()) {
3229 (*x)->enable_monitor_send ();
3236 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
3238 boost::shared_ptr<RouteList> r = routes.reader ();
3239 boost::shared_ptr<Send> s;
3241 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3242 if ((s = (*i)->internal_send_for (dest)) != 0) {
3243 s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO);
3249 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
3251 boost::shared_ptr<RouteList> r = routes.reader ();
3252 boost::shared_ptr<Send> s;
3254 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3255 if ((s = (*i)->internal_send_for (dest)) != 0) {
3256 s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY);
3262 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
3264 boost::shared_ptr<RouteList> r = routes.reader ();
3265 boost::shared_ptr<Send> s;
3267 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3268 if ((s = (*i)->internal_send_for (dest)) != 0) {
3269 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
3274 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
3276 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
3278 boost::shared_ptr<RouteList> r = routes.reader ();
3279 boost::shared_ptr<RouteList> t (new RouteList);
3281 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3282 /* no MIDI sends because there are no MIDI busses yet */
3283 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
3288 add_internal_sends (dest, p, t);
3292 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
3294 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
3295 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
3300 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
3302 add_internal_send (dest, sender->before_processor_for_index (index), sender);
3306 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
3308 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
3312 if (!dest->internal_return()) {
3313 dest->add_internal_return ();
3316 sender->add_aux_send (dest, before);
3323 Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
3325 { // RCU Writer scope
3326 RCUWriter<RouteList> writer (routes);
3327 boost::shared_ptr<RouteList> rs = writer.get_copy ();
3330 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3332 if (*iter == _master_out) {
3336 (*iter)->set_solo (false, this);
3340 /* deleting the master out seems like a dumb
3341 idea, but its more of a UI policy issue
3345 if (*iter == _master_out) {
3346 _master_out = boost::shared_ptr<Route> ();
3349 if (*iter == _monitor_out) {
3350 _monitor_out.reset ();
3353 update_route_solo_state ();
3355 // We need to disconnect the route's inputs and outputs
3357 (*iter)->input()->disconnect (0);
3358 (*iter)->output()->disconnect (0);
3360 /* if the route had internal sends sending to it, remove them */
3361 if ((*iter)->internal_return()) {
3363 boost::shared_ptr<RouteList> r = routes.reader ();
3364 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3365 boost::shared_ptr<Send> s = (*i)->internal_send_for (*iter);
3367 (*i)->remove_processor (s);
3372 /* if the monitoring section had a pointer to this route, remove it */
3373 if (_monitor_out && !(*iter)->is_master() && !(*iter)->is_monitor()) {
3374 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3375 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
3376 (*iter)->remove_aux_or_listen (_monitor_out);
3379 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*iter);
3380 if (mt && mt->step_editing()) {
3381 if (_step_editors > 0) {
3386 RouteAddedOrRemoved (false); /* EMIT SIGNAL */
3389 /* writer goes out of scope, forces route list update */
3391 } // end of RCU Writer scope
3393 update_latency_compensation ();
3396 /* Re-sort routes to remove the graph's current references to the one that is
3397 * going away, then flush old references out of the graph.
3398 * Wave Tracks: reconnect routes
3401 #ifdef USE_TRACKS_CODE_FEATURES
3402 reconnect_existing_routes(true, false);
3407 if (_process_graph) {
3408 _process_graph->clear_other_chain ();
3411 /* get rid of it from the dead wood collection in the route list manager */
3412 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
3416 /* try to cause everyone to drop their references
3417 * and unregister ports from the backend
3419 PBD::Unwinder<bool> uw_flag (_route_deletion_in_progress, true);
3421 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3422 (*iter)->drop_references ();
3425 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
3427 /* save the new state of the world */
3429 if (save_state (_current_snapshot_name)) {
3430 save_history (_current_snapshot_name);
3433 reassign_track_numbers();
3434 update_route_record_state ();
3438 Session::remove_route (boost::shared_ptr<Route> route)
3440 boost::shared_ptr<RouteList> rl (new RouteList);
3441 rl->push_back (route);
3446 Session::route_mute_changed (void* /*src*/)
3452 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3454 boost::shared_ptr<Route> route = wpr.lock();
3456 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
3460 if (route->listening_via_monitor ()) {
3462 if (Config->get_exclusive_solo()) {
3463 /* new listen: disable all other listen */
3464 boost::shared_ptr<RouteList> r = routes.reader ();
3465 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3466 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3469 (*i)->set_listen (false, this);
3475 } else if (_listen_cnt > 0) {
3480 update_route_solo_state ();
3483 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3485 boost::shared_ptr<Route> route = wpr.lock ();
3488 /* should not happen */
3489 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
3493 bool send_changed = false;
3495 if (route->solo_isolated()) {
3496 if (_solo_isolated_cnt == 0) {
3497 send_changed = true;
3499 _solo_isolated_cnt++;
3500 } else if (_solo_isolated_cnt > 0) {
3501 _solo_isolated_cnt--;
3502 if (_solo_isolated_cnt == 0) {
3503 send_changed = true;
3508 IsolatedChanged (); /* EMIT SIGNAL */
3513 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
3515 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
3517 if (!self_solo_change) {
3518 // session doesn't care about changes to soloed-by-others
3522 if (solo_update_disabled) {
3524 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
3528 boost::shared_ptr<Route> route = wpr.lock ();
3531 boost::shared_ptr<RouteList> r = routes.reader ();
3534 if (route->self_soloed()) {
3540 RouteGroup* rg = route->route_group ();
3541 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
3543 if (delta == 1 && Config->get_exclusive_solo()) {
3545 /* new solo: disable all other solos, but not the group if its solo-enabled */
3547 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3548 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3549 (leave_group_alone && ((*i)->route_group() == rg))) {
3552 (*i)->set_solo (false, this);
3556 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3558 solo_update_disabled = true;
3560 RouteList uninvolved;
3562 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
3564 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3565 bool via_sends_only;
3566 bool in_signal_flow;
3568 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3569 (leave_group_alone && ((*i)->route_group() == rg))) {
3573 in_signal_flow = false;
3575 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3577 if ((*i)->feeds (route, &via_sends_only)) {
3578 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3579 if (!via_sends_only) {
3580 if (!route->soloed_by_others_upstream()) {
3581 (*i)->mod_solo_by_others_downstream (delta);
3584 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3586 in_signal_flow = true;
3588 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3591 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3593 if (route->feeds (*i, &via_sends_only)) {
3594 /* propagate solo upstream only if routing other than
3595 sends is involved, but do consider the other route
3596 (*i) to be part of the signal flow even if only
3599 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3603 route->soloed_by_others_downstream(),
3604 route->soloed_by_others_upstream()));
3605 if (!via_sends_only) {
3606 if (!route->soloed_by_others_downstream()) {
3607 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3608 (*i)->mod_solo_by_others_upstream (delta);
3610 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
3613 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3615 in_signal_flow = true;
3617 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3620 if (!in_signal_flow) {
3621 uninvolved.push_back (*i);
3625 solo_update_disabled = false;
3626 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3628 update_route_solo_state (r);
3630 /* now notify that the mute state of the routes not involved in the signal
3631 pathway of the just-solo-changed route may have altered.
3634 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3635 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
3636 (*i)->act_on_mute ();
3637 (*i)->mute_changed (this);
3640 SoloChanged (); /* EMIT SIGNAL */
3645 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
3647 /* now figure out if anything that matters is soloed (or is "listening")*/
3649 bool something_soloed = false;
3650 uint32_t listeners = 0;
3651 uint32_t isolated = 0;
3654 r = routes.reader();
3657 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3658 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
3659 something_soloed = true;
3662 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
3663 if (Config->get_solo_control_is_listen_control()) {
3666 (*i)->set_listen (false, this);
3670 if ((*i)->solo_isolated()) {
3675 if (something_soloed != _non_soloed_outs_muted) {
3676 _non_soloed_outs_muted = something_soloed;
3677 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
3680 _listen_cnt = listeners;
3682 if (isolated != _solo_isolated_cnt) {
3683 _solo_isolated_cnt = isolated;
3684 IsolatedChanged (); /* EMIT SIGNAL */
3687 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
3688 something_soloed, listeners, isolated));
3691 boost::shared_ptr<RouteList>
3692 Session::get_routes_with_internal_returns() const
3694 boost::shared_ptr<RouteList> r = routes.reader ();
3695 boost::shared_ptr<RouteList> rl (new RouteList);
3697 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3698 if ((*i)->internal_return ()) {
3706 Session::io_name_is_legal (const std::string& name)
3708 boost::shared_ptr<RouteList> r = routes.reader ();
3710 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3711 if ((*i)->name() == name) {
3715 if ((*i)->has_io_processor_named (name)) {
3724 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
3727 vector<string> connections;
3729 /* if we are passed only a single route and we're not told to turn
3730 * others off, then just do the simple thing.
3733 if (flip_others == false && rl->size() == 1) {
3734 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
3736 mt->set_input_active (onoff);
3741 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
3743 PortSet& ps ((*rt)->input()->ports());
3745 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
3746 p->get_connections (connections);
3749 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
3750 routes_using_input_from (*s, rl2);
3753 /* scan all relevant routes to see if others are on or off */
3755 bool others_are_already_on = false;
3757 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3759 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3765 if ((*r) != (*rt)) {
3766 if (mt->input_active()) {
3767 others_are_already_on = true;
3770 /* this one needs changing */
3771 mt->set_input_active (onoff);
3777 /* globally reverse other routes */
3779 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3780 if ((*r) != (*rt)) {
3781 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3783 mt->set_input_active (!others_are_already_on);
3792 Session::routes_using_input_from (const string& str, RouteList& rl)
3794 boost::shared_ptr<RouteList> r = routes.reader();
3796 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3797 if ((*i)->input()->connected_to (str)) {
3803 boost::shared_ptr<Route>
3804 Session::route_by_name (string name)
3806 boost::shared_ptr<RouteList> r = routes.reader ();
3808 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3809 if ((*i)->name() == name) {
3814 return boost::shared_ptr<Route> ((Route*) 0);
3817 boost::shared_ptr<Route>
3818 Session::route_by_id (PBD::ID id)
3820 boost::shared_ptr<RouteList> r = routes.reader ();
3822 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3823 if ((*i)->id() == id) {
3828 return boost::shared_ptr<Route> ((Route*) 0);
3831 boost::shared_ptr<Track>
3832 Session::track_by_diskstream_id (PBD::ID id)
3834 boost::shared_ptr<RouteList> r = routes.reader ();
3836 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3837 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3838 if (t && t->using_diskstream_id (id)) {
3843 return boost::shared_ptr<Track> ();
3846 boost::shared_ptr<Route>
3847 Session::route_by_remote_id (uint32_t id)
3849 boost::shared_ptr<RouteList> r = routes.reader ();
3851 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3852 if ((*i)->remote_control_id() == id) {
3857 return boost::shared_ptr<Route> ((Route*) 0);
3862 Session::reassign_track_numbers ()
3866 RouteList r (*(routes.reader ()));
3867 SignalOrderRouteSorter sorter;
3870 StateProtector sp (this);
3872 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3873 if (boost::dynamic_pointer_cast<Track> (*i)) {
3874 (*i)->set_track_number(++tn);
3876 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
3877 (*i)->set_track_number(--bn);
3880 const uint32_t decimals = ceilf (log10f (tn + 1));
3881 const bool decimals_changed = _track_number_decimals != decimals;
3882 _track_number_decimals = decimals;
3884 if (decimals_changed && config.get_track_name_number ()) {
3885 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3886 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3888 t->resync_track_name();
3891 // trigger GUI re-layout
3892 config.ParameterChanged("track-name-number");
3897 Session::playlist_region_added (boost::weak_ptr<Region> w)
3899 boost::shared_ptr<Region> r = w.lock ();
3904 /* These are the operations that are currently in progress... */
3905 list<GQuark> curr = _current_trans_quarks;
3908 /* ...and these are the operations during which we want to update
3909 the session range location markers.
3912 ops.push_back (Operations::capture);
3913 ops.push_back (Operations::paste);
3914 ops.push_back (Operations::duplicate_region);
3915 ops.push_back (Operations::insert_file);
3916 ops.push_back (Operations::insert_region);
3917 ops.push_back (Operations::drag_region_brush);
3918 ops.push_back (Operations::region_drag);
3919 ops.push_back (Operations::selection_grab);
3920 ops.push_back (Operations::region_fill);
3921 ops.push_back (Operations::fill_selection);
3922 ops.push_back (Operations::create_region);
3923 ops.push_back (Operations::region_copy);
3924 ops.push_back (Operations::fixed_time_region_copy);
3927 /* See if any of the current operations match the ones that we want */
3929 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
3931 /* If so, update the session range markers */
3933 maybe_update_session_range (r->position (), r->last_frame ());
3937 /** Update the session range markers if a is before the current start or
3938 * b is after the current end.
3941 Session::maybe_update_session_range (framepos_t a, framepos_t b)
3943 if (_state_of_the_state & Loading) {
3947 if (_session_range_location == 0) {
3949 add_session_range_location (a, b);
3953 if (a < _session_range_location->start()) {
3954 _session_range_location->set_start (a);
3957 if (b > _session_range_location->end()) {
3958 _session_range_location->set_end (b);
3964 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
3966 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3967 maybe_update_session_range (i->to, i->to + i->length);
3972 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
3974 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3975 maybe_update_session_range (i->from, i->to);
3979 /* Region management */
3981 boost::shared_ptr<Region>
3982 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
3984 const RegionFactory::RegionMap& regions (RegionFactory::regions());
3985 RegionFactory::RegionMap::const_iterator i;
3986 boost::shared_ptr<Region> region;
3988 Glib::Threads::Mutex::Lock lm (region_lock);
3990 for (i = regions.begin(); i != regions.end(); ++i) {
3994 if (region->whole_file()) {
3996 if (child->source_equivalent (region)) {
4002 return boost::shared_ptr<Region> ();
4006 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
4008 set<boost::shared_ptr<Region> > relevant_regions;
4010 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
4011 RegionFactory::get_regions_using_source (*s, relevant_regions);
4014 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
4015 set<boost::shared_ptr<Region> >::iterator tmp;
4020 playlists->destroy_region (*r);
4021 RegionFactory::map_remove (*r);
4023 (*r)->drop_sources ();
4024 (*r)->drop_references ();
4026 relevant_regions.erase (r);
4031 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
4034 Glib::Threads::Mutex::Lock ls (source_lock);
4035 /* remove from the main source list */
4036 sources.erase ((*s)->id());
4039 (*s)->mark_for_remove ();
4040 (*s)->drop_references ();
4049 Session::remove_last_capture ()
4051 list<boost::shared_ptr<Source> > srcs;
4053 boost::shared_ptr<RouteList> rl = routes.reader ();
4054 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4055 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4060 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
4063 srcs.insert (srcs.end(), l.begin(), l.end());
4068 destroy_sources (srcs);
4070 save_state (_current_snapshot_name);
4075 /* Source Management */
4078 Session::add_source (boost::shared_ptr<Source> source)
4080 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
4081 pair<SourceMap::iterator,bool> result;
4083 entry.first = source->id();
4084 entry.second = source;
4087 Glib::Threads::Mutex::Lock lm (source_lock);
4088 result = sources.insert (entry);
4091 if (result.second) {
4093 /* yay, new source */
4095 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
4098 if (!fs->within_session()) {
4099 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
4105 boost::shared_ptr<AudioFileSource> afs;
4107 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
4108 if (Config->get_auto_analyse_audio()) {
4109 Analyser::queue_source_for_analysis (source, false);
4113 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
4118 Session::remove_source (boost::weak_ptr<Source> src)
4120 if (_state_of_the_state & Deletion) {
4124 SourceMap::iterator i;
4125 boost::shared_ptr<Source> source = src.lock();
4132 Glib::Threads::Mutex::Lock lm (source_lock);
4134 if ((i = sources.find (source->id())) != sources.end()) {
4139 if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
4141 /* save state so we don't end up with a session file
4142 referring to non-existent sources.
4145 save_state (_current_snapshot_name);
4149 boost::shared_ptr<Source>
4150 Session::source_by_id (const PBD::ID& id)
4152 Glib::Threads::Mutex::Lock lm (source_lock);
4153 SourceMap::iterator i;
4154 boost::shared_ptr<Source> source;
4156 if ((i = sources.find (id)) != sources.end()) {
4163 boost::shared_ptr<AudioFileSource>
4164 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
4166 /* Restricted to audio files because only audio sources have channel
4170 Glib::Threads::Mutex::Lock lm (source_lock);
4172 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
4173 boost::shared_ptr<AudioFileSource> afs
4174 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
4176 if (afs && afs->path() == path && chn == afs->channel()) {
4181 return boost::shared_ptr<AudioFileSource>();
4184 boost::shared_ptr<MidiSource>
4185 Session::midi_source_by_path (const std::string& path) const
4187 /* Restricted to MIDI files because audio sources require a channel
4188 for unique identification, in addition to a path.
4191 Glib::Threads::Mutex::Lock lm (source_lock);
4193 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
4194 boost::shared_ptr<MidiSource> ms
4195 = boost::dynamic_pointer_cast<MidiSource>(s->second);
4196 boost::shared_ptr<FileSource> fs
4197 = boost::dynamic_pointer_cast<FileSource>(s->second);
4199 if (ms && fs && fs->path() == path) {
4204 return boost::shared_ptr<MidiSource>();
4208 Session::count_sources_by_origin (const string& path)
4211 Glib::Threads::Mutex::Lock lm (source_lock);
4213 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
4214 boost::shared_ptr<FileSource> fs
4215 = boost::dynamic_pointer_cast<FileSource>(i->second);
4217 if (fs && fs->origin() == path) {
4226 Session::peak_path (string base) const
4228 if (Glib::path_is_absolute (base)) {
4230 /* rip the session dir from the audiofile source */
4232 string session_path;
4233 string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
4234 bool in_another_session = true;
4236 if (base.find (interchange_dir_string) != string::npos) {
4238 session_path = Glib::path_get_dirname (base); /* now ends in audiofiles */
4239 session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
4240 session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
4241 session_path = Glib::path_get_dirname (session_path); /* now has session path */
4243 /* see if it is within our session */
4245 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4246 if (i->path == session_path) {
4247 in_another_session = false;
4252 in_another_session = false;
4256 if (in_another_session) {
4257 SessionDirectory sd (session_path);
4258 return Glib::build_filename (sd.peak_path(), Glib::path_get_basename (base) + peakfile_suffix);
4262 base = Glib::path_get_basename (base);
4263 return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
4267 Session::new_audio_source_path_for_embedded (const std::string& path)
4271 * we know that the filename is already unique because it exists
4272 * out in the filesystem.
4274 * However, when we bring it into the session, we could get a
4277 * Eg. two embedded files:
4282 * When merged into session, these collide.
4284 * There will not be a conflict with in-memory sources
4285 * because when the source was created we already picked
4286 * a unique name for it.
4288 * This collision is not likely to be common, but we have to guard
4289 * against it. So, if there is a collision, take the md5 hash of the
4290 * the path, and use that as the filename instead.
4293 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4294 string base = Glib::path_get_basename (path);
4295 string newpath = Glib::build_filename (sdir.sound_path(), base);
4297 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4301 md5.digestString (path.c_str());
4302 md5.writeToString ();
4303 base = md5.digestChars;
4305 string ext = get_suffix (path);
4312 newpath = Glib::build_filename (sdir.sound_path(), base);
4314 /* if this collides, we're screwed */
4316 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4317 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
4326 /** Return true if there are no audio file sources that use @param name as
4327 * the filename component of their path.
4329 * Return false otherwise.
4331 * This method MUST ONLY be used to check in-session, mono files since it
4332 * hard-codes the channel of the audio file source we are looking for as zero.
4334 * If/when Ardour supports native files in non-mono formats, the logic here
4335 * will need to be revisited.
4338 Session::audio_source_name_is_unique (const string& name)
4340 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
4341 vector<space_and_path>::iterator i;
4342 uint32_t existing = 0;
4344 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4346 /* note that we search *without* the extension so that
4347 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
4348 in the event that this new name is required for
4349 a file format change.
4352 const string spath = *i;
4354 if (matching_unsuffixed_filename_exists_in (spath, name)) {
4359 /* it is possible that we have the path already
4360 * assigned to a source that has not yet been written
4361 * (ie. the write source for a diskstream). we have to
4362 * check this in order to make sure that our candidate
4363 * path isn't used again, because that can lead to
4364 * two Sources point to the same file with different
4365 * notions of their removability.
4369 string possible_path = Glib::build_filename (spath, name);
4371 if (audio_source_by_path_and_channel (possible_path, 0)) {
4377 return (existing == 0);
4381 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)
4384 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4386 if (Profile->get_trx() && destructive) {
4388 sstr << setfill ('0') << setw (4) << cnt;
4389 sstr << legalized_base;
4391 sstr << legalized_base;
4393 if (take_required || related_exists) {
4405 } else if (nchan > 2) {
4410 /* XXX what? more than 26 channels! */
4421 /** Return a unique name based on \a base for a new internal audio source */
4423 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
4426 string possible_name;
4427 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
4429 bool some_related_source_name_exists = false;
4431 legalized = legalize_for_path (base);
4433 // Find a "version" of the base name that doesn't exist in any of the possible directories.
4435 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
4437 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
4439 if (audio_source_name_is_unique (possible_name)) {
4443 some_related_source_name_exists = true;
4446 error << string_compose(
4447 _("There are already %1 recordings for %2, which I consider too many."),
4448 limit, base) << endmsg;
4450 throw failed_constructor();
4454 /* We've established that the new name does not exist in any session
4455 * directory, so now find out which one we should use for this new
4459 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4461 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
4466 /** Return a unique name based on `base` for a new internal MIDI source */
4468 Session::new_midi_source_path (const string& base)
4471 char buf[PATH_MAX+1];
4472 const uint32_t limit = 10000;
4474 string possible_path;
4475 string possible_name;
4478 legalized = legalize_for_path (base);
4480 // Find a "version" of the file name that doesn't exist in any of the possible directories.
4481 std::vector<string> sdirs = source_search_path(DataType::MIDI);
4483 /* - the main session folder is the first in the vector.
4484 * - after checking all locations for file-name uniqueness,
4485 * we keep the one from the last iteration as new file name
4486 * - midi files are small and should just be kept in the main session-folder
4488 * -> reverse the array, check main session folder last and use that as location
4491 std::reverse(sdirs.begin(), sdirs.end());
4493 for (cnt = 1; cnt <= limit; ++cnt) {
4495 vector<space_and_path>::iterator i;
4496 uint32_t existing = 0;
4498 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4500 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
4501 possible_name = buf;
4503 possible_path = Glib::build_filename (*i, possible_name);
4505 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
4509 if (midi_source_by_path (possible_path)) {
4514 if (existing == 0) {
4519 error << string_compose(
4520 _("There are already %1 recordings for %2, which I consider too many."),
4521 limit, base) << endmsg;
4527 /* No need to "find best location" for software/app-based RAID, because
4528 MIDI is so small that we always put it in the same place.
4531 return possible_path;
4535 /** Create a new within-session audio source */
4536 boost::shared_ptr<AudioFileSource>
4537 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
4539 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
4541 if (!path.empty()) {
4542 return boost::dynamic_pointer_cast<AudioFileSource> (
4543 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
4545 throw failed_constructor ();
4549 /** Create a new within-session MIDI source */
4550 boost::shared_ptr<MidiSource>
4551 Session::create_midi_source_for_session (string const & basic_name)
4553 const string path = new_midi_source_path (basic_name);
4555 if (!path.empty()) {
4556 return boost::dynamic_pointer_cast<SMFSource> (
4557 SourceFactory::createWritable (
4558 DataType::MIDI, *this, path, false, frame_rate()));
4560 throw failed_constructor ();
4564 /** Create a new within-session MIDI source */
4565 boost::shared_ptr<MidiSource>
4566 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
4568 /* the caller passes in the track the source will be used in,
4569 so that we can keep the numbering sane.
4571 Rationale: a track with the name "Foo" that has had N
4572 captures carried out so far will ALREADY have a write source
4573 named "Foo-N+1.mid" waiting to be used for the next capture.
4575 If we call new_midi_source_name() we will get "Foo-N+2". But
4576 there is no region corresponding to "Foo-N+1", so when
4577 "Foo-N+2" appears in the track, the gap presents the user
4578 with odd behaviour - why did it skip past Foo-N+1?
4580 We could explain this to the user in some odd way, but
4581 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
4584 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
4587 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
4589 std::string name = track->steal_write_source_name ();
4592 return boost::shared_ptr<MidiSource>();
4595 /* MIDI files are small, just put them in the first location of the
4596 session source search path.
4599 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
4601 return boost::dynamic_pointer_cast<SMFSource> (
4602 SourceFactory::createWritable (
4603 DataType::MIDI, *this, path, false, frame_rate()));
4608 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
4610 if (playlist->hidden()) {
4614 playlists->add (playlist);
4617 playlist->release();
4624 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
4626 if (_state_of_the_state & Deletion) {
4630 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
4636 playlists->remove (playlist);
4642 Session::set_audition (boost::shared_ptr<Region> r)
4644 pending_audition_region = r;
4645 add_post_transport_work (PostTransportAudition);
4646 _butler->schedule_transport_work ();
4650 Session::audition_playlist ()
4652 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4653 ev->region.reset ();
4658 Session::non_realtime_set_audition ()
4660 assert (pending_audition_region);
4661 auditioner->audition_region (pending_audition_region);
4662 pending_audition_region.reset ();
4663 AuditionActive (true); /* EMIT SIGNAL */
4667 Session::audition_region (boost::shared_ptr<Region> r)
4669 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4675 Session::cancel_audition ()
4680 if (auditioner->auditioning()) {
4681 auditioner->cancel_audition ();
4682 AuditionActive (false); /* EMIT SIGNAL */
4687 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
4689 if (a->is_monitor()) {
4692 if (b->is_monitor()) {
4695 return a->order_key () < b->order_key ();
4699 Session::is_auditioning () const
4701 /* can be called before we have an auditioner object */
4703 return auditioner->auditioning();
4710 Session::graph_reordered ()
4712 /* don't do this stuff if we are setting up connections
4713 from a set_state() call or creating new tracks. Ditto for deletion.
4716 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _reconnecting_routes_in_progress) {
4720 /* every track/bus asked for this to be handled but it was deferred because
4721 we were connecting. do it now.
4724 request_input_change_handling ();
4728 /* force all diskstreams to update their capture offset values to
4729 reflect any changes in latencies within the graph.
4732 boost::shared_ptr<RouteList> rl = routes.reader ();
4733 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4734 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4736 tr->set_capture_offset ();
4741 /** @return Number of frames that there is disk space available to write,
4744 boost::optional<framecnt_t>
4745 Session::available_capture_duration ()
4747 Glib::Threads::Mutex::Lock lm (space_lock);
4749 if (_total_free_4k_blocks_uncertain) {
4750 return boost::optional<framecnt_t> ();
4753 float sample_bytes_on_disk = 4.0; // keep gcc happy
4755 switch (config.get_native_file_data_format()) {
4757 sample_bytes_on_disk = 4.0;
4761 sample_bytes_on_disk = 3.0;
4765 sample_bytes_on_disk = 2.0;
4769 /* impossible, but keep some gcc versions happy */
4770 fatal << string_compose (_("programming error: %1"),
4771 X_("illegal native file data format"))
4773 abort(); /*NOTREACHED*/
4776 double scale = 4096.0 / sample_bytes_on_disk;
4778 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
4779 return max_framecnt;
4782 return (framecnt_t) floor (_total_free_4k_blocks * scale);
4786 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
4789 RCUWriter<BundleList> writer (_bundles);
4790 boost::shared_ptr<BundleList> b = writer.get_copy ();
4791 b->push_back (bundle);
4795 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4802 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
4804 bool removed = false;
4807 RCUWriter<BundleList> writer (_bundles);
4808 boost::shared_ptr<BundleList> b = writer.get_copy ();
4809 BundleList::iterator i = find (b->begin(), b->end(), bundle);
4811 if (i != b->end()) {
4818 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4824 boost::shared_ptr<Bundle>
4825 Session::bundle_by_name (string name) const
4827 boost::shared_ptr<BundleList> b = _bundles.reader ();
4829 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
4830 if ((*i)->name() == name) {
4835 return boost::shared_ptr<Bundle> ();
4839 Session::tempo_map_changed (const PropertyChange&)
4843 playlists->update_after_tempo_map_change ();
4845 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
4851 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
4853 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
4854 (*i)->recompute_frames_from_bbt ();
4858 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
4859 * the given count with the current block size.
4862 Session::ensure_buffers (ChanCount howmany)
4864 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
4868 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
4870 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4871 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
4876 Session::next_insert_id ()
4878 /* this doesn't really loop forever. just think about it */
4881 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
4882 if (!insert_bitset[n]) {
4883 insert_bitset[n] = true;
4889 /* none available, so resize and try again */
4891 insert_bitset.resize (insert_bitset.size() + 16, false);
4896 Session::next_send_id ()
4898 /* this doesn't really loop forever. just think about it */
4901 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
4902 if (!send_bitset[n]) {
4903 send_bitset[n] = true;
4909 /* none available, so resize and try again */
4911 send_bitset.resize (send_bitset.size() + 16, false);
4916 Session::next_aux_send_id ()
4918 /* this doesn't really loop forever. just think about it */
4921 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
4922 if (!aux_send_bitset[n]) {
4923 aux_send_bitset[n] = true;
4929 /* none available, so resize and try again */
4931 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
4936 Session::next_return_id ()
4938 /* this doesn't really loop forever. just think about it */
4941 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
4942 if (!return_bitset[n]) {
4943 return_bitset[n] = true;
4949 /* none available, so resize and try again */
4951 return_bitset.resize (return_bitset.size() + 16, false);
4956 Session::mark_send_id (uint32_t id)
4958 if (id >= send_bitset.size()) {
4959 send_bitset.resize (id+16, false);
4961 if (send_bitset[id]) {
4962 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
4964 send_bitset[id] = true;
4968 Session::mark_aux_send_id (uint32_t id)
4970 if (id >= aux_send_bitset.size()) {
4971 aux_send_bitset.resize (id+16, false);
4973 if (aux_send_bitset[id]) {
4974 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
4976 aux_send_bitset[id] = true;
4980 Session::mark_return_id (uint32_t id)
4982 if (id >= return_bitset.size()) {
4983 return_bitset.resize (id+16, false);
4985 if (return_bitset[id]) {
4986 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
4988 return_bitset[id] = true;
4992 Session::mark_insert_id (uint32_t id)
4994 if (id >= insert_bitset.size()) {
4995 insert_bitset.resize (id+16, false);
4997 if (insert_bitset[id]) {
4998 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
5000 insert_bitset[id] = true;
5004 Session::unmark_send_id (uint32_t id)
5006 if (id < send_bitset.size()) {
5007 send_bitset[id] = false;
5012 Session::unmark_aux_send_id (uint32_t id)
5014 if (id < aux_send_bitset.size()) {
5015 aux_send_bitset[id] = false;
5020 Session::unmark_return_id (uint32_t id)
5022 if (id < return_bitset.size()) {
5023 return_bitset[id] = false;
5028 Session::unmark_insert_id (uint32_t id)
5030 if (id < insert_bitset.size()) {
5031 insert_bitset[id] = false;
5036 Session::reset_native_file_format ()
5038 boost::shared_ptr<RouteList> rl = routes.reader ();
5040 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5041 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5043 /* don't save state as we do this, there's no point
5045 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
5046 tr->reset_write_sources (false);
5047 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
5053 Session::route_name_unique (string n) const
5055 boost::shared_ptr<RouteList> r = routes.reader ();
5057 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5058 if ((*i)->name() == n) {
5067 Session::route_name_internal (string n) const
5069 if (auditioner && auditioner->name() == n) {
5073 if (_click_io && _click_io->name() == n) {
5081 Session::freeze_all (InterThreadInfo& itt)
5083 boost::shared_ptr<RouteList> r = routes.reader ();
5085 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5087 boost::shared_ptr<Track> t;
5089 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
5090 /* XXX this is wrong because itt.progress will keep returning to zero at the start
5100 boost::shared_ptr<Region>
5101 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
5102 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
5103 InterThreadInfo& itt,
5104 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
5105 bool for_export, bool for_freeze)
5107 boost::shared_ptr<Region> result;
5108 boost::shared_ptr<Playlist> playlist;
5109 boost::shared_ptr<Source> source;
5110 ChanCount diskstream_channels (track.n_channels());
5111 framepos_t position;
5112 framecnt_t this_chunk;
5114 framepos_t latency_skip;
5116 framepos_t len = end - start;
5117 bool need_block_size_reset = false;
5118 ChanCount const max_proc = track.max_processor_streams ();
5119 string legal_playlist_name;
5120 string possible_path;
5123 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
5124 end, start) << endmsg;
5128 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
5129 include_endpoint, for_export, for_freeze);
5131 if (diskstream_channels.n(track.data_type()) < 1) {
5132 error << _("Cannot write a range with no data.") << endmsg;
5136 // block all process callback handling
5138 block_processing ();
5141 // synchronize with AudioEngine::process_callback()
5142 // make sure processing is not currently running
5143 // and processing_blocked() is honored before
5144 // acquiring thread buffers
5145 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5148 _bounce_processing_active = true;
5150 /* call tree *MUST* hold route_lock */
5152 if ((playlist = track.playlist()) == 0) {
5156 legal_playlist_name = legalize_for_path (playlist->name());
5158 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
5160 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
5161 string path = ((track.data_type() == DataType::AUDIO)
5162 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
5163 : new_midi_source_path (legal_playlist_name));
5170 source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
5173 catch (failed_constructor& err) {
5174 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
5178 srcs.push_back (source);
5181 /* tell redirects that care that we are about to use a much larger
5182 * blocksize. this will flush all plugins too, so that they are ready
5183 * to be used for this process.
5186 need_block_size_reset = true;
5187 track.set_block_size (bounce_chunk_size);
5188 _engine.main_thread()->get_buffers ();
5192 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5194 /* create a set of reasonably-sized buffers */
5195 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5196 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
5198 buffers.set_count (max_proc);
5200 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5201 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5202 boost::shared_ptr<MidiSource> ms;
5204 afs->prepare_for_peakfile_writes ();
5205 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5206 Source::Lock lock(ms->mutex());
5207 ms->mark_streaming_write_started(lock);
5211 while (to_do && !itt.cancel) {
5213 this_chunk = min (to_do, bounce_chunk_size);
5215 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
5219 start += this_chunk;
5220 to_do -= this_chunk;
5221 itt.progress = (float) (1.0 - ((double) to_do / len));
5223 if (latency_skip >= bounce_chunk_size) {
5224 latency_skip -= bounce_chunk_size;
5228 const framecnt_t current_chunk = this_chunk - latency_skip;
5231 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5232 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5233 boost::shared_ptr<MidiSource> ms;
5236 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
5239 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5240 Source::Lock lock(ms->mutex());
5242 const MidiBuffer& buf = buffers.get_midi(0);
5243 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
5244 Evoral::Event<framepos_t> ev = *i;
5245 ev.set_time(ev.time() - position);
5246 ms->append_event_frames(lock, ev, ms->timeline_position());
5253 /* post-roll, pick up delayed processor output */
5254 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5256 while (latency_skip && !itt.cancel) {
5257 this_chunk = min (latency_skip, bounce_chunk_size);
5258 latency_skip -= this_chunk;
5260 buffers.silence (this_chunk, 0);
5261 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
5264 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5265 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5268 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
5280 xnow = localtime (&now);
5282 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
5283 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5284 boost::shared_ptr<MidiSource> ms;
5287 afs->update_header (position, *xnow, now);
5288 afs->flush_header ();
5289 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5290 Source::Lock lock(ms->mutex());
5291 ms->mark_streaming_write_completed(lock);
5295 /* construct a region to represent the bounced material */
5299 plist.add (Properties::start, 0);
5300 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
5301 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
5303 result = RegionFactory::create (srcs, plist);
5309 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5310 (*src)->mark_for_remove ();
5311 (*src)->drop_references ();
5315 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5316 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5319 afs->done_with_peakfile_writes ();
5323 _bounce_processing_active = false;
5325 if (need_block_size_reset) {
5326 _engine.main_thread()->drop_buffers ();
5327 track.set_block_size (get_block_size());
5330 unblock_processing ();
5336 Session::gain_automation_buffer() const
5338 return ProcessThread::gain_automation_buffer ();
5342 Session::trim_automation_buffer() const
5344 return ProcessThread::trim_automation_buffer ();
5348 Session::send_gain_automation_buffer() const
5350 return ProcessThread::send_gain_automation_buffer ();
5354 Session::pan_automation_buffer() const
5356 return ProcessThread::pan_automation_buffer ();
5360 Session::get_silent_buffers (ChanCount count)
5362 return ProcessThread::get_silent_buffers (count);
5366 Session::get_scratch_buffers (ChanCount count, bool silence)
5368 return ProcessThread::get_scratch_buffers (count, silence);
5372 Session::get_route_buffers (ChanCount count, bool silence)
5374 return ProcessThread::get_route_buffers (count, silence);
5379 Session::get_mix_buffers (ChanCount count)
5381 return ProcessThread::get_mix_buffers (count);
5385 Session::ntracks () const
5388 boost::shared_ptr<RouteList> r = routes.reader ();
5390 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5391 if (boost::dynamic_pointer_cast<Track> (*i)) {
5400 Session::nbusses () const
5403 boost::shared_ptr<RouteList> r = routes.reader ();
5405 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5406 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
5415 Session::add_automation_list(AutomationList *al)
5417 automation_lists[al->id()] = al;
5420 /** @return true if there is at least one record-enabled track, otherwise false */
5422 Session::have_rec_enabled_track () const
5424 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
5428 Session::have_rec_disabled_track () const
5430 return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
5433 /** Update the state of our rec-enabled tracks flag */
5435 Session::update_route_record_state ()
5437 boost::shared_ptr<RouteList> rl = routes.reader ();
5438 RouteList::iterator i = rl->begin();
5439 while (i != rl->end ()) {
5441 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5442 if (tr && tr->record_enabled ()) {
5449 int const old = g_atomic_int_get (&_have_rec_enabled_track);
5451 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
5453 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
5454 RecordStateChanged (); /* EMIT SIGNAL */
5457 for (i = rl->begin(); i != rl->end (); ++i) {
5458 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5459 if (tr && !tr->record_enabled ()) {
5464 g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
5466 bool record_arm_state_changed = (old != g_atomic_int_get (&_have_rec_enabled_track) );
5468 if (record_status() == Recording && record_arm_state_changed ) {
5469 RecordArmStateChanged ();
5475 Session::listen_position_changed ()
5477 boost::shared_ptr<RouteList> r = routes.reader ();
5479 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5480 (*i)->listen_position_changed ();
5485 Session::solo_control_mode_changed ()
5487 /* cancel all solo or all listen when solo control mode changes */
5490 set_solo (get_routes(), false);
5491 } else if (listening()) {
5492 set_listen (get_routes(), false);
5496 /** Called when a property of one of our route groups changes */
5498 Session::route_group_property_changed (RouteGroup* rg)
5500 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
5503 /** Called when a route is added to one of our route groups */
5505 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5507 RouteAddedToRouteGroup (rg, r);
5510 /** Called when a route is removed from one of our route groups */
5512 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5514 update_route_record_state ();
5515 RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
5518 boost::shared_ptr<RouteList>
5519 Session::get_tracks () const
5521 boost::shared_ptr<RouteList> rl = routes.reader ();
5522 boost::shared_ptr<RouteList> tl (new RouteList);
5524 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
5525 if (boost::dynamic_pointer_cast<Track> (*r)) {
5526 if (!(*r)->is_auditioner()) {
5534 boost::shared_ptr<RouteList>
5535 Session::get_routes_with_regions_at (framepos_t const p) const
5537 boost::shared_ptr<RouteList> r = routes.reader ();
5538 boost::shared_ptr<RouteList> rl (new RouteList);
5540 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5541 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5546 boost::shared_ptr<Playlist> pl = tr->playlist ();
5551 if (pl->has_region_at (p)) {
5560 Session::goto_end ()
5562 if (_session_range_location) {
5563 request_locate (_session_range_location->end(), false);
5565 request_locate (0, false);
5570 Session::goto_start ()
5572 if (_session_range_location) {
5573 request_locate (_session_range_location->start(), false);
5575 request_locate (0, false);
5580 Session::current_start_frame () const
5582 return _session_range_location ? _session_range_location->start() : 0;
5586 Session::current_end_frame () const
5588 return _session_range_location ? _session_range_location->end() : 0;
5592 Session::add_session_range_location (framepos_t start, framepos_t end)
5594 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
5595 _locations->add (_session_range_location);
5599 Session::step_edit_status_change (bool yn)
5605 send = (_step_editors == 0);
5610 send = (_step_editors == 1);
5613 if (_step_editors > 0) {
5619 StepEditStatusChange (val);
5625 Session::start_time_changed (framepos_t old)
5627 /* Update the auto loop range to match the session range
5628 (unless the auto loop range has been changed by the user)
5631 Location* s = _locations->session_range_location ();
5636 Location* l = _locations->auto_loop_location ();
5638 if (l && l->start() == old) {
5639 l->set_start (s->start(), true);
5644 Session::end_time_changed (framepos_t old)
5646 /* Update the auto loop range to match the session range
5647 (unless the auto loop range has been changed by the user)
5650 Location* s = _locations->session_range_location ();
5655 Location* l = _locations->auto_loop_location ();
5657 if (l && l->end() == old) {
5658 l->set_end (s->end(), true);
5662 std::vector<std::string>
5663 Session::source_search_path (DataType type) const
5667 if (session_dirs.size() == 1) {
5669 case DataType::AUDIO:
5670 sp.push_back (_session_dir->sound_path());
5672 case DataType::MIDI:
5673 sp.push_back (_session_dir->midi_path());
5677 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
5678 SessionDirectory sdir (i->path);
5680 case DataType::AUDIO:
5681 sp.push_back (sdir.sound_path());
5683 case DataType::MIDI:
5684 sp.push_back (sdir.midi_path());
5690 if (type == DataType::AUDIO) {
5691 const string sound_path_2X = _session_dir->sound_path_2X();
5692 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
5693 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
5694 sp.push_back (sound_path_2X);
5699 // now check the explicit (possibly user-specified) search path
5702 case DataType::AUDIO:
5703 sp += Searchpath(config.get_audio_search_path ());
5705 case DataType::MIDI:
5706 sp += Searchpath(config.get_midi_search_path ());
5714 Session::ensure_search_path_includes (const string& path, DataType type)
5723 case DataType::AUDIO:
5724 sp += Searchpath(config.get_audio_search_path ());
5726 case DataType::MIDI:
5727 sp += Searchpath (config.get_midi_search_path ());
5731 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
5732 /* No need to add this new directory if it has the same inode as
5733 an existing one; checking inode rather than name prevents duplicated
5734 directories when we are using symlinks.
5736 On Windows, I think we could just do if (*i == path) here.
5738 if (PBD::equivalent_paths (*i, path)) {
5746 case DataType::AUDIO:
5747 config.set_audio_search_path (sp.to_string());
5749 case DataType::MIDI:
5750 config.set_midi_search_path (sp.to_string());
5756 Session::remove_dir_from_search_path (const string& dir, DataType type)
5761 case DataType::AUDIO:
5762 sp = Searchpath(config.get_audio_search_path ());
5764 case DataType::MIDI:
5765 sp = Searchpath (config.get_midi_search_path ());
5772 case DataType::AUDIO:
5773 config.set_audio_search_path (sp.to_string());
5775 case DataType::MIDI:
5776 config.set_midi_search_path (sp.to_string());
5782 boost::shared_ptr<Speakers>
5783 Session::get_speakers()
5789 Session::unknown_processors () const
5793 boost::shared_ptr<RouteList> r = routes.reader ();
5794 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5795 list<string> t = (*i)->unknown_processors ();
5796 copy (t.begin(), t.end(), back_inserter (p));
5806 Session::update_latency (bool playback)
5808 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
5810 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
5814 boost::shared_ptr<RouteList> r = routes.reader ();
5815 framecnt_t max_latency = 0;
5818 /* reverse the list so that we work backwards from the last route to run to the first */
5819 RouteList* rl = routes.reader().get();
5820 r.reset (new RouteList (*rl));
5821 reverse (r->begin(), r->end());
5824 /* compute actual latency values for the given direction and store them all in per-port
5825 structures. this will also publish the same values (to JACK) so that computation of latency
5826 for routes can consistently use public latency values.
5829 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5830 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
5833 /* because we latency compensate playback, our published playback latencies should
5834 be the same for all output ports - all material played back by ardour has
5835 the same latency, whether its caused by plugins or by latency compensation. since
5836 these may differ from the values computed above, reset all playback port latencies
5840 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
5842 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5843 (*i)->set_public_port_latencies (max_latency, playback);
5848 post_playback_latency ();
5852 post_capture_latency ();
5855 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
5859 Session::post_playback_latency ()
5861 set_worst_playback_latency ();
5863 boost::shared_ptr<RouteList> r = routes.reader ();
5865 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5866 if (!(*i)->is_auditioner() && ((*i)->active())) {
5867 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
5871 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5872 (*i)->set_latency_compensation (_worst_track_latency);
5877 Session::post_capture_latency ()
5879 set_worst_capture_latency ();
5881 /* reflect any changes in capture latencies into capture offsets
5884 boost::shared_ptr<RouteList> rl = routes.reader();
5885 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5886 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5888 tr->set_capture_offset ();
5894 Session::initialize_latencies ()
5897 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5898 update_latency (false);
5899 update_latency (true);
5902 set_worst_io_latencies ();
5906 Session::set_worst_io_latencies ()
5908 set_worst_playback_latency ();
5909 set_worst_capture_latency ();
5913 Session::set_worst_playback_latency ()
5915 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5919 _worst_output_latency = 0;
5921 if (!_engine.connected()) {
5925 boost::shared_ptr<RouteList> r = routes.reader ();
5927 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5928 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
5931 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
5935 Session::set_worst_capture_latency ()
5937 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5941 _worst_input_latency = 0;
5943 if (!_engine.connected()) {
5947 boost::shared_ptr<RouteList> r = routes.reader ();
5949 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5950 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
5953 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
5957 Session::update_latency_compensation (bool force_whole_graph)
5959 bool some_track_latency_changed = false;
5961 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5965 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
5967 _worst_track_latency = 0;
5969 boost::shared_ptr<RouteList> r = routes.reader ();
5971 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5972 if (!(*i)->is_auditioner() && ((*i)->active())) {
5974 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
5975 some_track_latency_changed = true;
5977 _worst_track_latency = max (tl, _worst_track_latency);
5981 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
5982 (some_track_latency_changed ? "yes" : "no")));
5984 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
5986 if (some_track_latency_changed || force_whole_graph) {
5987 _engine.update_latencies ();
5991 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5992 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5996 tr->set_capture_offset ();
6001 Session::session_name_is_legal (const string& path)
6003 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
6005 for (int i = 0; illegal_chars[i]; ++i) {
6006 if (path.find (illegal_chars[i]) != string::npos) {
6007 return illegal_chars[i];
6015 Session::next_control_id () const
6019 /* the monitor bus remote ID is in a different
6020 * "namespace" than regular routes. its existence doesn't
6021 * affect normal (low) numbered routes.
6028 /* the same about masterbus in Waves Tracks */
6030 if (Profile->get_trx() && _master_out) {
6034 return nroutes() - subtract;
6038 Session::notify_remote_id_change ()
6040 if (deletion_in_progress()) {
6044 switch (Config->get_remote_model()) {
6046 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
6052 #ifdef USE_TRACKS_CODE_FEATURES
6053 /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
6054 * if track order has been changed by user
6056 reconnect_existing_routes(true, true);
6062 Session::sync_order_keys ()
6064 if (deletion_in_progress()) {
6068 /* tell everyone that something has happened to the sort keys
6069 and let them sync up with the change(s)
6070 this will give objects that manage the sort order keys the
6071 opportunity to keep them in sync if they wish to.
6074 DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
6076 reassign_track_numbers();
6078 Route::SyncOrderKeys (); /* EMIT SIGNAL */
6080 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
6084 Session::operation_in_progress (GQuark op) const
6086 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
6089 boost::shared_ptr<Port>
6090 Session::ltc_input_port () const
6092 return _ltc_input->nth (0);
6095 boost::shared_ptr<Port>
6096 Session::ltc_output_port () const
6098 return _ltc_output->nth (0);
6102 Session::reconnect_ltc_input ()
6106 string src = Config->get_ltc_source_port();
6108 _ltc_input->disconnect (this);
6110 if (src != _("None") && !src.empty()) {
6111 _ltc_input->nth (0)->connect (src);
6117 Session::reconnect_ltc_output ()
6122 string src = Config->get_ltc_sink_port();
6124 _ltc_output->disconnect (this);
6126 if (src != _("None") && !src.empty()) {
6127 _ltc_output->nth (0)->connect (src);
6134 Session::set_range_selection (framepos_t start, framepos_t end)
6136 _range_selection = Evoral::Range<framepos_t> (start, end);
6137 follow_playhead_priority ();
6141 Session::set_object_selection (framepos_t start, framepos_t end)
6143 _object_selection = Evoral::Range<framepos_t> (start, end);
6144 follow_playhead_priority ();
6148 Session::clear_range_selection ()
6150 _range_selection = Evoral::Range<framepos_t> (-1,-1);
6151 follow_playhead_priority ();
6155 Session::clear_object_selection ()
6157 _object_selection = Evoral::Range<framepos_t> (-1,-1);
6158 follow_playhead_priority ();