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 last_loopend = location->end();
1459 Session::set_auto_punch_location (Location* location)
1463 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1464 punch_connections.drop_connections();
1465 existing->set_auto_punch (false, this);
1466 remove_event (existing->start(), SessionEvent::PunchIn);
1467 clear_events (SessionEvent::PunchOut);
1468 auto_punch_location_changed (0);
1473 if (location == 0) {
1477 if (location->end() <= location->start()) {
1478 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1482 punch_connections.drop_connections ();
1484 location->StartChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, location));
1485 location->EndChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, location));
1486 location->Changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, location));
1488 location->set_auto_punch (true, this);
1490 auto_punch_changed (location);
1492 auto_punch_location_changed (location);
1496 Session::set_session_extents (framepos_t start, framepos_t end)
1499 if ((existing = _locations->session_range_location()) == 0) {
1500 //if there is no existing session, we need to make a new session location (should never happen)
1501 existing = new Location (*this, 0, 0, _("session"), Location::IsSessionRange);
1505 error << _("Session: you can't use that location for session start/end)") << endmsg;
1509 existing->set( start, end );
1515 Session::set_auto_loop_location (Location* location)
1519 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1520 loop_connections.drop_connections ();
1521 existing->set_auto_loop (false, this);
1522 remove_event (existing->end(), SessionEvent::AutoLoop);
1525 auto_loop_declick_range (existing, dcp, dcl);
1526 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1527 auto_loop_location_changed (0);
1532 if (location == 0) {
1536 if (location->end() <= location->start()) {
1537 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1541 last_loopend = location->end();
1543 loop_connections.drop_connections ();
1545 location->StartChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1546 location->EndChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1547 location->Changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1548 location->FlagsChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1550 location->set_auto_loop (true, this);
1552 if (Config->get_loop_is_mode() && play_loop && Config->get_seamless_loop()) {
1553 // set all tracks to use internal looping
1554 boost::shared_ptr<RouteList> rl = routes.reader ();
1555 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1556 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1557 if (tr && !tr->hidden()) {
1558 tr->set_loop (location);
1563 /* take care of our stuff first */
1565 auto_loop_changed (location);
1567 /* now tell everyone else */
1569 auto_loop_location_changed (location);
1573 Session::update_marks (Location*)
1579 Session::update_skips (Location* loc, bool consolidate)
1581 if (_ignore_skips_updates) {
1585 Locations::LocationList skips;
1588 PBD::Unwinder<bool> uw (_ignore_skips_updates, true);
1589 consolidate_skips (loc);
1592 sync_locations_to_skips ();
1598 Session::consolidate_skips (Location* loc)
1600 Locations::LocationList all_locations = _locations->list ();
1602 for (Locations::LocationList::iterator l = all_locations.begin(); l != all_locations.end(); ) {
1604 if (!(*l)->is_skip ()) {
1609 /* don't test against self */
1616 switch (Evoral::coverage ((*l)->start(), (*l)->end(), loc->start(), loc->end())) {
1617 case Evoral::OverlapInternal:
1618 case Evoral::OverlapExternal:
1619 case Evoral::OverlapStart:
1620 case Evoral::OverlapEnd:
1621 /* adjust new location to cover existing one */
1622 loc->set_start (min (loc->start(), (*l)->start()));
1623 loc->set_end (max (loc->end(), (*l)->end()));
1624 /* we don't need this one any more */
1625 _locations->remove (*l);
1626 /* the location has been deleted, so remove reference to it in our local list */
1627 l = all_locations.erase (l);
1630 case Evoral::OverlapNone:
1638 Session::sync_locations_to_skips ()
1640 /* This happens asynchronously (in the audioengine thread). After the clear is done, we will call
1641 * Session::_sync_locations_to_skips() from the audioengine thread.
1643 clear_events (SessionEvent::Skip, boost::bind (&Session::_sync_locations_to_skips, this));
1647 Session::_sync_locations_to_skips ()
1649 /* called as a callback after existing Skip events have been cleared from a realtime audioengine thread */
1651 Locations::LocationList const & locs (_locations->list());
1653 for (Locations::LocationList::const_iterator i = locs.begin(); i != locs.end(); ++i) {
1655 Location* location = *i;
1657 if (location->is_skip() && location->is_skipping()) {
1658 SessionEvent* ev = new SessionEvent (SessionEvent::Skip, SessionEvent::Add, location->start(), location->end(), 1.0);
1666 Session::location_added (Location *location)
1668 if (location->is_auto_punch()) {
1669 set_auto_punch_location (location);
1672 if (location->is_auto_loop()) {
1673 set_auto_loop_location (location);
1676 if (location->is_session_range()) {
1677 /* no need for any signal handling or event setting with the session range,
1678 because we keep a direct reference to it and use its start/end directly.
1680 _session_range_location = location;
1683 if (location->is_mark()) {
1684 /* listen for per-location signals that require us to do any * global updates for marks */
1686 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1687 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1688 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1689 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1692 if (location->is_skip()) {
1693 /* listen for per-location signals that require us to update skip-locate events */
1695 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1696 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1697 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1698 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, false));
1700 update_skips (location, true);
1707 Session::location_removed (Location *location)
1709 if (location->is_auto_loop()) {
1710 set_auto_loop_location (0);
1711 set_track_loop (false);
1714 if (location->is_auto_punch()) {
1715 set_auto_punch_location (0);
1718 if (location->is_session_range()) {
1719 /* this is never supposed to happen */
1720 error << _("programming error: session range removed!") << endl;
1723 if (location->is_skip()) {
1725 update_skips (location, false);
1732 Session::locations_changed ()
1734 _locations->apply (*this, &Session::_locations_changed);
1738 Session::_locations_changed (const Locations::LocationList& locations)
1740 /* There was some mass-change in the Locations object.
1742 We might be re-adding a location here but it doesn't actually matter
1743 for all the locations that the Session takes an interest in.
1747 PBD::Unwinder<bool> protect_ignore_skip_updates (_ignore_skips_updates, true);
1748 for (Locations::LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
1749 location_added (*i);
1753 update_skips (NULL, false);
1757 Session::enable_record ()
1759 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1760 /* no recording at anything except normal speed */
1765 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1767 if (rs == Recording) {
1771 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1773 _last_record_location = _transport_frame;
1774 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1776 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1777 set_track_monitor_input_status (true);
1780 RecordStateChanged ();
1787 Session::disable_record (bool rt_context, bool force)
1791 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1793 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1794 g_atomic_int_set (&_record_status, Disabled);
1795 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1797 if (rs == Recording) {
1798 g_atomic_int_set (&_record_status, Enabled);
1802 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1803 set_track_monitor_input_status (false);
1806 RecordStateChanged (); /* emit signal */
1809 remove_pending_capture_state ();
1815 Session::step_back_from_record ()
1817 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1819 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1820 set_track_monitor_input_status (false);
1823 RecordStateChanged (); /* emit signal */
1828 Session::maybe_enable_record ()
1830 if (_step_editors > 0) {
1834 g_atomic_int_set (&_record_status, Enabled);
1836 /* This function is currently called from somewhere other than an RT thread.
1837 This save_state() call therefore doesn't impact anything. Doing it here
1838 means that we save pending state of which sources the next record will use,
1839 which gives us some chance of recovering from a crash during the record.
1842 save_state ("", true);
1844 if (_transport_speed) {
1845 if (!config.get_punch_in()) {
1849 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1850 RecordStateChanged (); /* EMIT SIGNAL */
1857 Session::audible_frame () const
1863 offset = worst_playback_latency ();
1865 if (synced_to_engine()) {
1866 /* Note: this is basically just sync-to-JACK */
1867 tf = _engine.transport_frame();
1869 tf = _transport_frame;
1874 if (!non_realtime_work_pending()) {
1878 /* Check to see if we have passed the first guaranteed
1879 audible frame past our last start position. if not,
1880 return that last start point because in terms
1881 of audible frames, we have not moved yet.
1883 `Start position' in this context means the time we last
1884 either started, located, or changed transport direction.
1887 if (_transport_speed > 0.0f) {
1889 if (!play_loop || !have_looped) {
1890 if (tf < _last_roll_or_reversal_location + offset) {
1891 return _last_roll_or_reversal_location;
1899 } else if (_transport_speed < 0.0f) {
1901 /* XXX wot? no backward looping? */
1903 if (tf > _last_roll_or_reversal_location - offset) {
1904 return _last_roll_or_reversal_location;
1916 Session::set_frame_rate (framecnt_t frames_per_second)
1918 /** \fn void Session::set_frame_size(framecnt_t)
1919 the AudioEngine object that calls this guarantees
1920 that it will not be called while we are also in
1921 ::process(). Its fine to do things that block
1925 _base_frame_rate = frames_per_second;
1926 _nominal_frame_rate = frames_per_second;
1931 reset_write_sources (false);
1933 // XXX we need some equivalent to this, somehow
1934 // SndFileSource::setup_standard_crossfades (frames_per_second);
1938 /* XXX need to reset/reinstantiate all LADSPA plugins */
1942 Session::set_block_size (pframes_t nframes)
1944 /* the AudioEngine guarantees
1945 that it will not be called while we are also in
1946 ::process(). It is therefore fine to do things that block
1951 current_block_size = nframes;
1955 boost::shared_ptr<RouteList> r = routes.reader ();
1957 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1958 (*i)->set_block_size (nframes);
1961 boost::shared_ptr<RouteList> rl = routes.reader ();
1962 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1963 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1965 tr->set_block_size (nframes);
1969 set_worst_io_latencies ();
1975 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1977 boost::shared_ptr<Route> r2;
1979 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1980 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1984 /* make a copy of the existing list of routes that feed r1 */
1986 Route::FedBy existing (r1->fed_by());
1988 /* for each route that feeds r1, recurse, marking it as feeding
1992 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1993 if (!(r2 = i->r.lock ())) {
1994 /* (*i) went away, ignore it */
1998 /* r2 is a route that feeds r1 which somehow feeds base. mark
1999 base as being fed by r2
2002 rbase->add_fed_by (r2, i->sends_only);
2006 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
2010 if (r1->feeds (r2) && r2->feeds (r1)) {
2014 /* now recurse, so that we can mark base as being fed by
2015 all routes that feed r2
2018 trace_terminal (r2, rbase);
2025 Session::resort_routes ()
2027 /* don't do anything here with signals emitted
2028 by Routes during initial setup or while we
2029 are being destroyed.
2032 if (_state_of_the_state & (InitialConnecting | Deletion)) {
2037 RCUWriter<RouteList> writer (routes);
2038 boost::shared_ptr<RouteList> r = writer.get_copy ();
2039 resort_routes_using (r);
2040 /* writer goes out of scope and forces update */
2044 boost::shared_ptr<RouteList> rl = routes.reader ();
2045 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2046 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
2048 const Route::FedBy& fb ((*i)->fed_by());
2050 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
2051 boost::shared_ptr<Route> sf = f->r.lock();
2053 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
2061 /** This is called whenever we need to rebuild the graph of how we will process
2063 * @param r List of routes, in any order.
2067 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
2069 /* We are going to build a directed graph of our routes;
2070 this is where the edges of that graph are put.
2075 /* Go through all routes doing two things:
2077 * 1. Collect the edges of the route graph. Each of these edges
2078 * is a pair of routes, one of which directly feeds the other
2079 * either by a JACK connection or by an internal send.
2081 * 2. Begin the process of making routes aware of which other
2082 * routes directly or indirectly feed them. This information
2083 * is used by the solo code.
2086 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2088 /* Clear out the route's list of direct or indirect feeds */
2089 (*i)->clear_fed_by ();
2091 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
2093 bool via_sends_only;
2095 /* See if this *j feeds *i according to the current state of the JACK
2096 connections and internal sends.
2098 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
2099 /* add the edge to the graph (part #1) */
2100 edges.add (*j, *i, via_sends_only);
2101 /* tell the route (for part #2) */
2102 (*i)->add_fed_by (*j, via_sends_only);
2107 /* Attempt a topological sort of the route graph */
2108 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
2110 if (sorted_routes) {
2111 /* We got a satisfactory topological sort, so there is no feedback;
2114 Note: the process graph rechain does not require a
2115 topologically-sorted list, but hey ho.
2117 if (_process_graph) {
2118 _process_graph->rechain (sorted_routes, edges);
2121 _current_route_graph = edges;
2123 /* Complete the building of the routes' lists of what directly
2124 or indirectly feeds them.
2126 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2127 trace_terminal (*i, *i);
2130 *r = *sorted_routes;
2133 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
2134 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2135 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
2136 (*i)->name(), (*i)->order_key ()));
2140 SuccessfulGraphSort (); /* EMIT SIGNAL */
2143 /* The topological sort failed, so we have a problem. Tell everyone
2144 and stick to the old graph; this will continue to be processed, so
2145 until the feedback is fixed, what is played back will not quite
2146 reflect what is actually connected. Note also that we do not
2147 do trace_terminal here, as it would fail due to an endless recursion,
2148 so the solo code will think that everything is still connected
2152 FeedbackDetected (); /* EMIT SIGNAL */
2157 /** Find a route name starting with \a base, maybe followed by the
2158 * lowest \a id. \a id will always be added if \a definitely_add_number
2159 * is true on entry; otherwise it will only be added if required
2160 * to make the name unique.
2162 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
2163 * The available route name with the lowest ID will be used, and \a id
2164 * will be set to the ID.
2166 * \return false if a route name could not be found, and \a track_name
2167 * and \a id do not reflect a free route name.
2170 Session::find_route_name (string const & base, uint32_t& id, string& name, bool definitely_add_number)
2172 if (!definitely_add_number && route_by_name (base) == 0) {
2173 /* juse use the base */
2179 name = string_compose ("%1 %2", base, id);
2181 if (route_by_name (name) == 0) {
2187 } while (id < (UINT_MAX-1));
2192 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
2194 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
2196 in = ChanCount::ZERO;
2197 out = ChanCount::ZERO;
2199 boost::shared_ptr<RouteList> r = routes.reader ();
2201 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2202 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2203 if (tr && !tr->is_auditioner()) {
2204 in += tr->n_inputs();
2205 out += tr->n_outputs();
2210 /** Caller must not hold process lock
2211 * @param name_template string to use for the start of the name, or "" to use "MIDI".
2212 * @param instrument plugin info for the instrument to insert pre-fader, if any
2214 list<boost::shared_ptr<MidiTrack> >
2215 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
2216 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
2219 uint32_t track_id = 0;
2221 RouteList new_routes;
2222 list<boost::shared_ptr<MidiTrack> > ret;
2224 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
2227 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, use_number)) {
2228 error << "cannot find name for new midi track" << endmsg;
2232 boost::shared_ptr<MidiTrack> track;
2235 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
2237 if (track->init ()) {
2241 track->use_new_diskstream();
2243 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2244 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2247 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2248 if (track->input()->ensure_io (input, false, this)) {
2249 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
2253 if (track->output()->ensure_io (output, false, this)) {
2254 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
2259 track->non_realtime_input_change();
2262 route_group->add (track);
2265 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2267 if (Config->get_remote_model() == UserOrdered) {
2268 track->set_remote_control_id (next_control_id());
2271 new_routes.push_back (track);
2272 ret.push_back (track);
2274 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2277 catch (failed_constructor &err) {
2278 error << _("Session: could not create new midi track.") << endmsg;
2282 catch (AudioEngine::PortRegistrationFailure& pfe) {
2284 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;
2292 if (!new_routes.empty()) {
2293 StateProtector sp (this);
2294 if (Profile->get_trx()) {
2295 add_routes (new_routes, false, false, false);
2297 add_routes (new_routes, true, true, false);
2301 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
2302 PluginPtr plugin = instrument->load (*this);
2303 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2304 (*r)->add_processor (p, PreFader);
2314 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2316 boost::shared_ptr<Route> midi_track (wmt.lock());
2322 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2324 if (change.after.n_audio() <= change.before.n_audio()) {
2328 /* new audio ports: make sure the audio goes somewhere useful,
2329 unless the user has no-auto-connect selected.
2331 The existing ChanCounts don't matter for this call as they are only
2332 to do with matching input and output indices, and we are only changing
2338 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
2342 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
2343 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
2344 * @param output_start As \a input_start, but for outputs.
2347 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
2348 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
2350 if (!IO::connecting_legal) {
2354 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2360 /* If both inputs and outputs are auto-connected to physical ports,
2361 use the max of input and output offsets to ensure auto-connected
2362 port numbers always match up (e.g. the first audio input and the
2363 first audio output of the route will have the same physical
2364 port number). Otherwise just use the lowest input or output
2368 DEBUG_TRACE (DEBUG::Graph,
2369 string_compose("Auto-connect: existing in = %1 out = %2\n",
2370 existing_inputs, existing_outputs));
2372 const bool in_out_physical =
2373 (Config->get_input_auto_connect() & AutoConnectPhysical)
2374 && (Config->get_output_auto_connect() & AutoConnectPhysical)
2377 const ChanCount in_offset = in_out_physical
2378 ? ChanCount::max(existing_inputs, existing_outputs)
2381 const ChanCount out_offset = in_out_physical
2382 ? ChanCount::max(existing_inputs, existing_outputs)
2385 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2386 vector<string> physinputs;
2387 vector<string> physoutputs;
2389 _engine.get_physical_outputs (*t, physoutputs);
2390 _engine.get_physical_inputs (*t, physinputs);
2392 if (!physinputs.empty() && connect_inputs) {
2393 uint32_t nphysical_in = physinputs.size();
2395 DEBUG_TRACE (DEBUG::Graph,
2396 string_compose("There are %1 physical inputs of type %2\n",
2399 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
2402 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
2403 DEBUG_TRACE (DEBUG::Graph,
2404 string_compose("Get index %1 + %2 % %3 = %4\n",
2405 in_offset.get(*t), i, nphysical_in,
2406 (in_offset.get(*t) + i) % nphysical_in));
2407 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
2410 DEBUG_TRACE (DEBUG::Graph,
2411 string_compose("Connect route %1 IN to %2\n",
2412 route->name(), port));
2414 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
2418 ChanCount one_added (*t, 1);
2419 existing_inputs += one_added;
2423 if (!physoutputs.empty()) {
2424 uint32_t nphysical_out = physoutputs.size();
2425 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
2429 * do not create new connections if we reached the limit of physical outputs
2433 if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
2434 ARDOUR::Profile->get_trx () &&
2435 existing_outputs.get(*t) == nphysical_out ) {
2439 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
2440 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
2441 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
2442 /* master bus is audio only */
2443 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
2444 port = _master_out->input()->ports().port(*t,
2445 i % _master_out->input()->n_ports().get(*t))->name();
2449 DEBUG_TRACE (DEBUG::Graph,
2450 string_compose("Connect route %1 OUT to %2\n",
2451 route->name(), port));
2453 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
2457 ChanCount one_added (*t, 1);
2458 existing_outputs += one_added;
2464 #ifdef USE_TRACKS_CODE_FEATURES
2467 compare_routes_by_remote_id (const boost::shared_ptr<Route>& route1, const boost::shared_ptr<Route>& route2)
2469 return route1->remote_control_id() < route2->remote_control_id();
2473 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2475 // it is not allowed to perform connection
2476 if (!IO::connecting_legal) {
2480 // if we are deleting routes we will call this once at the end
2481 if (_route_deletion_in_progress) {
2485 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2491 // We need to disconnect the route's inputs and outputs first
2492 // basing on autoconnect configuration
2493 bool reconnectIputs = !(Config->get_input_auto_connect() & ManualConnect) && reconnect_inputs;
2494 bool reconnectOutputs = !(Config->get_output_auto_connect() & ManualConnect) && reconnect_outputs;
2496 ChanCount existing_inputs;
2497 ChanCount existing_outputs;
2498 count_existing_track_channels (existing_inputs, existing_outputs);
2500 //ChanCount inputs = ChanCount::ZERO;
2501 //ChanCount outputs = ChanCount::ZERO;
2503 RouteList existing_routes = *routes.reader ();
2504 existing_routes.sort (compare_routes_by_remote_id);
2507 PBD::Unwinder<bool> protect_ignore_changes (_reconnecting_routes_in_progress, true);
2509 vector<string> physinputs;
2510 vector<string> physoutputs;
2512 EngineStateController::instance()->get_physical_audio_outputs(physoutputs);
2513 EngineStateController::instance()->get_physical_audio_inputs(physinputs);
2515 uint32_t input_n = 0;
2516 uint32_t output_n = 0;
2517 RouteList::iterator rIter = existing_routes.begin();
2518 const AutoConnectOption current_input_auto_connection (Config->get_input_auto_connect());
2519 const AutoConnectOption current_output_auto_connection (Config->get_output_auto_connect());
2520 for (; rIter != existing_routes.end(); ++rIter) {
2521 if (*rIter == _master_out || *rIter == _monitor_out ) {
2525 if (current_output_auto_connection == AutoConnectPhysical) {
2526 (*rIter)->amp()->deactivate();
2527 } else if (current_output_auto_connection == AutoConnectMaster) {
2528 (*rIter)->amp()->activate();
2531 if (reconnectIputs) {
2532 (*rIter)->input()->disconnect (this); //GZ: check this; could be heavy
2534 for (uint32_t route_input_n = 0; route_input_n < (*rIter)->n_inputs().get(DataType::AUDIO); ++route_input_n) {
2536 if (current_input_auto_connection & AutoConnectPhysical) {
2538 if ( input_n == physinputs.size() ) {
2542 string port = physinputs[input_n];
2544 if (port.empty() ) {
2545 error << "Physical Input number "<< input_n << " is unavailable and cannot be connected" << endmsg;
2548 //GZ: check this; could be heavy
2549 (*rIter)->input()->connect ((*rIter)->input()->ports().port(DataType::AUDIO, route_input_n), port, this);
2555 if (reconnectOutputs) {
2557 //normalize route ouptuts: reduce the amount outputs to be equal to the amount of inputs
2558 if (current_output_auto_connection & AutoConnectPhysical) {
2560 //GZ: check this; could be heavy
2561 (*rIter)->output()->disconnect (this);
2562 size_t route_inputs_count = (*rIter)->n_inputs().get(DataType::AUDIO);
2564 //GZ: check this; could be heavy
2565 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, route_inputs_count), false, this );
2567 } else if (current_output_auto_connection & AutoConnectMaster){
2569 if (!reconnect_master) {
2573 //GZ: check this; could be heavy
2574 (*rIter)->output()->disconnect (this);
2577 uint32_t master_inputs_count = _master_out->n_inputs().get(DataType::AUDIO);
2578 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, master_inputs_count), false, this );
2580 error << error << "Master bus is not available" << endmsg;
2585 for (uint32_t route_output_n = 0; route_output_n < (*rIter)->n_outputs().get(DataType::AUDIO); ++route_output_n) {
2586 if (current_output_auto_connection & AutoConnectPhysical) {
2588 if ( output_n == physoutputs.size() ) {
2592 string port = physoutputs[output_n];
2594 if (port.empty() ) {
2595 error << "Physical Output number "<< output_n << " is unavailable and cannot be connected" << endmsg;
2598 //GZ: check this; could be heavy
2599 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2602 } else if (current_output_auto_connection & AutoConnectMaster) {
2604 if ( route_output_n == _master_out->n_inputs().get(DataType::AUDIO) ) {
2608 // connect to master bus
2609 string port = _master_out->input()->ports().port(DataType::AUDIO, route_output_n)->name();
2611 if (port.empty() ) {
2612 error << "MasterBus Input number "<< route_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);
2623 //auto_connect_route (*rIter, inputs, outputs, false, reconnectIputs);
2626 _master_out->output()->disconnect (this);
2627 auto_connect_master_bus ();
2632 session_routes_reconnected (); /* EMIT SIGNAL */
2636 Session::reconnect_midi_scene_ports(bool inputs)
2640 boost::shared_ptr<MidiPort> scene_in_ptr = scene_in();
2642 scene_in_ptr->disconnect_all ();
2644 std::vector<EngineStateController::MidiPortState> midi_port_states;
2645 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2647 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2649 for (; state_iter != midi_port_states.end(); ++state_iter) {
2650 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2651 scene_in_ptr->connect (state_iter->name);
2658 boost::shared_ptr<MidiPort> scene_out_ptr = scene_out();
2660 if (scene_out_ptr ) {
2661 scene_out_ptr->disconnect_all ();
2663 std::vector<EngineStateController::MidiPortState> midi_port_states;
2664 EngineStateController::instance()->get_physical_midi_output_states (midi_port_states);
2666 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2668 for (; state_iter != midi_port_states.end(); ++state_iter) {
2669 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2670 scene_out_ptr->connect (state_iter->name);
2678 Session::reconnect_mtc_ports ()
2680 boost::shared_ptr<MidiPort> mtc_in_ptr = _midi_ports->mtc_input_port();
2686 mtc_in_ptr->disconnect_all ();
2688 std::vector<EngineStateController::MidiPortState> midi_port_states;
2689 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2691 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2693 for (; state_iter != midi_port_states.end(); ++state_iter) {
2694 if (state_iter->available && state_iter->mtc_in) {
2695 mtc_in_ptr->connect (state_iter->name);
2699 if (!_midi_ports->mtc_input_port ()->connected () &&
2700 config.get_external_sync () &&
2701 (Config->get_sync_source () == MTC) ) {
2702 config.set_external_sync (false);
2705 if ( ARDOUR::Profile->get_trx () ) {
2706 // Tracks need this signal to update timecode_source_dropdown
2707 MtcOrLtcInputPortChanged (); //emit signal
2712 Session::reconnect_mmc_ports(bool inputs)
2714 if (inputs ) { // get all enabled midi input ports
2716 boost::shared_ptr<MidiPort> mmc_in_ptr = _midi_ports->mmc_in();
2718 mmc_in_ptr->disconnect_all ();
2719 std::vector<std::string> enabled_midi_inputs;
2720 EngineStateController::instance()->get_physical_midi_inputs (enabled_midi_inputs);
2722 std::vector<std::string>::iterator port_iter = enabled_midi_inputs.begin();
2724 for (; port_iter != enabled_midi_inputs.end(); ++port_iter) {
2725 mmc_in_ptr->connect (*port_iter);
2729 } else { // get all enabled midi output ports
2731 boost::shared_ptr<MidiPort> mmc_out_ptr = _midi_ports->mmc_out();
2733 mmc_out_ptr->disconnect_all ();
2734 std::vector<std::string> enabled_midi_outputs;
2735 EngineStateController::instance()->get_physical_midi_outputs (enabled_midi_outputs);
2737 std::vector<std::string>::iterator port_iter = enabled_midi_outputs.begin();
2739 for (; port_iter != enabled_midi_outputs.end(); ++port_iter) {
2740 mmc_out_ptr->connect (*port_iter);
2748 /** Caller must not hold process lock
2749 * @param name_template string to use for the start of the name, or "" to use "Audio".
2751 list< boost::shared_ptr<AudioTrack> >
2752 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
2753 uint32_t how_many, string name_template)
2756 uint32_t track_id = 0;
2758 RouteList new_routes;
2759 list<boost::shared_ptr<AudioTrack> > ret;
2761 string name_pattern;
2763 if (Profile->get_trx() ) {
2764 name_pattern = "Track ";
2766 name_pattern = "Audio ";
2769 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _(name_pattern.c_str() );
2773 if (!find_route_name (name_template.empty() ? _(name_pattern.c_str()) : name_template, ++track_id, track_name, use_number)) {
2774 error << "cannot find name for new audio track" << endmsg;
2778 boost::shared_ptr<AudioTrack> track;
2781 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
2783 if (track->init ()) {
2787 if (ARDOUR::Profile->get_trx ()) {
2788 // TRACKS considers it's not a USE CASE, it's
2789 // a piece of behavior of the session model:
2791 // Gain for a newly created route depends on
2792 // the current output_auto_connect mode:
2794 // 0 for Stereo Out mode
2796 if (Config->get_output_auto_connect() & AutoConnectMaster) {
2797 track->set_gain (dB_to_coefficient (0), 0);
2801 track->use_new_diskstream();
2803 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2804 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2807 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2809 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2810 error << string_compose (
2811 _("cannot configure %1 in/%2 out configuration for new audio track"),
2812 input_channels, output_channels)
2817 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2818 error << string_compose (
2819 _("cannot configure %1 in/%2 out configuration for new audio track"),
2820 input_channels, output_channels)
2827 route_group->add (track);
2830 track->non_realtime_input_change();
2832 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2833 if (Config->get_remote_model() == UserOrdered) {
2834 track->set_remote_control_id (next_control_id());
2837 new_routes.push_back (track);
2838 ret.push_back (track);
2840 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2843 catch (failed_constructor &err) {
2844 error << _("Session: could not create new audio track.") << endmsg;
2848 catch (AudioEngine::PortRegistrationFailure& pfe) {
2850 error << pfe.what() << endmsg;
2858 if (!new_routes.empty()) {
2859 StateProtector sp (this);
2860 if (Profile->get_trx()) {
2861 add_routes (new_routes, false, false, false);
2863 add_routes (new_routes, true, true, false);
2870 /** Caller must not hold process lock.
2871 * @param name_template string to use for the start of the name, or "" to use "Bus".
2874 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
2877 uint32_t bus_id = 0;
2881 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
2884 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, use_number)) {
2885 error << "cannot find name for new audio bus" << endmsg;
2890 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
2896 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2897 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
2900 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2902 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2903 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2904 input_channels, output_channels)
2910 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2911 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2912 input_channels, output_channels)
2919 route_group->add (bus);
2921 if (Config->get_remote_model() == UserOrdered) {
2922 bus->set_remote_control_id (next_control_id());
2925 bus->add_internal_return ();
2927 ret.push_back (bus);
2929 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2935 catch (failed_constructor &err) {
2936 error << _("Session: could not create new audio route.") << endmsg;
2940 catch (AudioEngine::PortRegistrationFailure& pfe) {
2941 error << pfe.what() << endmsg;
2951 StateProtector sp (this);
2952 if (Profile->get_trx()) {
2953 add_routes (ret, false, false, false);
2955 add_routes (ret, false, true, true); // autoconnect // outputs only
2964 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base)
2967 uint32_t control_id;
2969 uint32_t number = 0;
2970 const uint32_t being_added = how_many;
2972 if (!tree.read (template_path.c_str())) {
2976 XMLNode* node = tree.root();
2978 IO::disable_connecting ();
2980 control_id = next_control_id ();
2984 XMLNode node_copy (*node);
2986 /* Remove IDs of everything so that new ones are used */
2987 node_copy.remove_property_recursively (X_("id"));
2992 if (!name_base.empty()) {
2994 /* if we're adding more than one routes, force
2995 * all the names of the new routes to be
2996 * numbered, via the final parameter.
2999 if (!find_route_name (name_base.c_str(), ++number, name, (being_added > 1))) {
3000 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3006 string const route_name = node_copy.property(X_("name"))->value ();
3008 /* generate a new name by adding a number to the end of the template name */
3009 if (!find_route_name (route_name.c_str(), ++number, name, true)) {
3010 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3011 abort(); /*NOTREACHED*/
3015 /* set this name in the XML description that we are about to use */
3016 Route::set_name_in_state (node_copy, name);
3018 /* trim bitslots from listen sends so that new ones are used */
3019 XMLNodeList children = node_copy.children ();
3020 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
3021 if ((*i)->name() == X_("Processor")) {
3022 XMLProperty* role = (*i)->property (X_("role"));
3023 if (role && role->value() == X_("Listen")) {
3024 (*i)->remove_property (X_("bitslot"));
3029 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
3032 error << _("Session: cannot create track/bus from template description") << endmsg;
3036 if (boost::dynamic_pointer_cast<Track>(route)) {
3037 /* force input/output change signals so that the new diskstream
3038 picks up the configuration of the route. During session
3039 loading this normally happens in a different way.
3042 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3044 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
3045 change.after = route->input()->n_ports();
3046 route->input()->changed (change, this);
3047 change.after = route->output()->n_ports();
3048 route->output()->changed (change, this);
3051 route->set_remote_control_id (control_id);
3054 ret.push_back (route);
3056 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
3059 catch (failed_constructor &err) {
3060 error << _("Session: could not create new route from template") << endmsg;
3064 catch (AudioEngine::PortRegistrationFailure& pfe) {
3065 error << pfe.what() << endmsg;
3074 StateProtector sp (this);
3075 if (Profile->get_trx()) {
3076 add_routes (ret, false, false, false);
3078 add_routes (ret, true, true, false);
3080 IO::enable_connecting ();
3087 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
3090 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
3091 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
3094 error << _("Adding new tracks/busses failed") << endmsg;
3099 update_latency (true);
3100 update_latency (false);
3105 save_state (_current_snapshot_name);
3108 reassign_track_numbers();
3110 update_route_record_state ();
3112 RouteAdded (new_routes); /* EMIT SIGNAL */
3116 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
3118 ChanCount existing_inputs;
3119 ChanCount existing_outputs;
3120 uint32_t order = next_control_id();
3122 if (_order_hint > -1) {
3123 order = _order_hint;
3127 count_existing_track_channels (existing_inputs, existing_outputs);
3130 RCUWriter<RouteList> writer (routes);
3131 boost::shared_ptr<RouteList> r = writer.get_copy ();
3132 r->insert (r->end(), new_routes.begin(), new_routes.end());
3134 /* if there is no control out and we're not in the middle of loading,
3135 resort the graph here. if there is a control out, we will resort
3136 toward the end of this method. if we are in the middle of loading,
3137 we will resort when done.
3140 if (!_monitor_out && IO::connecting_legal) {
3141 resort_routes_using (r);
3145 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3147 boost::weak_ptr<Route> wpr (*x);
3148 boost::shared_ptr<Route> r (*x);
3150 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
3151 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
3152 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
3153 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
3154 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
3155 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
3157 if (r->is_master()) {
3161 if (r->is_monitor()) {
3165 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
3167 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
3168 track_playlist_changed (boost::weak_ptr<Track> (tr));
3169 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
3171 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
3173 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
3174 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
3179 if (input_auto_connect || output_auto_connect) {
3180 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
3183 /* order keys are a GUI responsibility but we need to set up
3184 reasonable defaults because they also affect the remote control
3185 ID in most situations.
3188 if (!r->has_order_key ()) {
3189 if (r->is_auditioner()) {
3190 /* use an arbitrarily high value */
3191 r->set_order_key (UINT_MAX);
3193 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
3194 r->set_order_key (order);
3202 if (_monitor_out && IO::connecting_legal) {
3203 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
3205 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3206 if ((*x)->is_monitor()) {
3208 } else if ((*x)->is_master()) {
3211 (*x)->enable_monitor_send ();
3218 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
3220 boost::shared_ptr<RouteList> r = routes.reader ();
3221 boost::shared_ptr<Send> s;
3223 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3224 if ((s = (*i)->internal_send_for (dest)) != 0) {
3225 s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO);
3231 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
3233 boost::shared_ptr<RouteList> r = routes.reader ();
3234 boost::shared_ptr<Send> s;
3236 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3237 if ((s = (*i)->internal_send_for (dest)) != 0) {
3238 s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY);
3244 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
3246 boost::shared_ptr<RouteList> r = routes.reader ();
3247 boost::shared_ptr<Send> s;
3249 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3250 if ((s = (*i)->internal_send_for (dest)) != 0) {
3251 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
3256 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
3258 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
3260 boost::shared_ptr<RouteList> r = routes.reader ();
3261 boost::shared_ptr<RouteList> t (new RouteList);
3263 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3264 /* no MIDI sends because there are no MIDI busses yet */
3265 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
3270 add_internal_sends (dest, p, t);
3274 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
3276 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
3277 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
3282 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
3284 add_internal_send (dest, sender->before_processor_for_index (index), sender);
3288 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
3290 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
3294 if (!dest->internal_return()) {
3295 dest->add_internal_return ();
3298 sender->add_aux_send (dest, before);
3305 Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
3307 { // RCU Writer scope
3308 RCUWriter<RouteList> writer (routes);
3309 boost::shared_ptr<RouteList> rs = writer.get_copy ();
3312 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3314 if (*iter == _master_out) {
3318 (*iter)->set_solo (false, this);
3322 /* deleting the master out seems like a dumb
3323 idea, but its more of a UI policy issue
3327 if (*iter == _master_out) {
3328 _master_out = boost::shared_ptr<Route> ();
3331 if (*iter == _monitor_out) {
3332 _monitor_out.reset ();
3335 update_route_solo_state ();
3337 // We need to disconnect the route's inputs and outputs
3339 (*iter)->input()->disconnect (0);
3340 (*iter)->output()->disconnect (0);
3342 /* if the route had internal sends sending to it, remove them */
3343 if ((*iter)->internal_return()) {
3345 boost::shared_ptr<RouteList> r = routes.reader ();
3346 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3347 boost::shared_ptr<Send> s = (*i)->internal_send_for (*iter);
3349 (*i)->remove_processor (s);
3354 /* if the monitoring section had a pointer to this route, remove it */
3355 if (_monitor_out && !(*iter)->is_master() && !(*iter)->is_monitor()) {
3356 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3357 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
3358 (*iter)->remove_aux_or_listen (_monitor_out);
3361 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*iter);
3362 if (mt && mt->step_editing()) {
3363 if (_step_editors > 0) {
3368 RouteAddedOrRemoved (false); /* EMIT SIGNAL */
3371 /* writer goes out of scope, forces route list update */
3373 } // end of RCU Writer scope
3375 update_latency_compensation ();
3378 /* Re-sort routes to remove the graph's current references to the one that is
3379 * going away, then flush old references out of the graph.
3380 * Wave Tracks: reconnect routes
3383 #ifdef USE_TRACKS_CODE_FEATURES
3384 reconnect_existing_routes(true, false);
3389 if (_process_graph) {
3390 _process_graph->clear_other_chain ();
3393 /* get rid of it from the dead wood collection in the route list manager */
3394 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
3398 /* try to cause everyone to drop their references
3399 * and unregister ports from the backend
3401 PBD::Unwinder<bool> uw_flag (_route_deletion_in_progress, true);
3403 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3404 (*iter)->drop_references ();
3407 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
3409 /* save the new state of the world */
3411 if (save_state (_current_snapshot_name)) {
3412 save_history (_current_snapshot_name);
3415 reassign_track_numbers();
3416 update_route_record_state ();
3420 Session::remove_route (boost::shared_ptr<Route> route)
3422 boost::shared_ptr<RouteList> rl (new RouteList);
3423 rl->push_back (route);
3428 Session::route_mute_changed (void* /*src*/)
3434 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3436 boost::shared_ptr<Route> route = wpr.lock();
3438 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
3442 if (route->listening_via_monitor ()) {
3444 if (Config->get_exclusive_solo()) {
3445 /* new listen: disable all other listen */
3446 boost::shared_ptr<RouteList> r = routes.reader ();
3447 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3448 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3451 (*i)->set_listen (false, this);
3457 } else if (_listen_cnt > 0) {
3462 update_route_solo_state ();
3465 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3467 boost::shared_ptr<Route> route = wpr.lock ();
3470 /* should not happen */
3471 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
3475 bool send_changed = false;
3477 if (route->solo_isolated()) {
3478 if (_solo_isolated_cnt == 0) {
3479 send_changed = true;
3481 _solo_isolated_cnt++;
3482 } else if (_solo_isolated_cnt > 0) {
3483 _solo_isolated_cnt--;
3484 if (_solo_isolated_cnt == 0) {
3485 send_changed = true;
3490 IsolatedChanged (); /* EMIT SIGNAL */
3495 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
3497 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
3499 if (!self_solo_change) {
3500 // session doesn't care about changes to soloed-by-others
3504 if (solo_update_disabled) {
3506 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
3510 boost::shared_ptr<Route> route = wpr.lock ();
3513 boost::shared_ptr<RouteList> r = routes.reader ();
3516 if (route->self_soloed()) {
3522 RouteGroup* rg = route->route_group ();
3523 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
3525 if (delta == 1 && Config->get_exclusive_solo()) {
3527 /* new solo: disable all other solos, but not the group if its solo-enabled */
3529 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3530 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3531 (leave_group_alone && ((*i)->route_group() == rg))) {
3534 (*i)->set_solo (false, this);
3538 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3540 solo_update_disabled = true;
3542 RouteList uninvolved;
3544 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
3546 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3547 bool via_sends_only;
3548 bool in_signal_flow;
3550 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3551 (leave_group_alone && ((*i)->route_group() == rg))) {
3555 in_signal_flow = false;
3557 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3559 if ((*i)->feeds (route, &via_sends_only)) {
3560 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3561 if (!via_sends_only) {
3562 if (!route->soloed_by_others_upstream()) {
3563 (*i)->mod_solo_by_others_downstream (delta);
3566 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3568 in_signal_flow = true;
3570 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3573 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3575 if (route->feeds (*i, &via_sends_only)) {
3576 /* propagate solo upstream only if routing other than
3577 sends is involved, but do consider the other route
3578 (*i) to be part of the signal flow even if only
3581 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3585 route->soloed_by_others_downstream(),
3586 route->soloed_by_others_upstream()));
3587 if (!via_sends_only) {
3588 if (!route->soloed_by_others_downstream()) {
3589 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3590 (*i)->mod_solo_by_others_upstream (delta);
3592 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
3595 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3597 in_signal_flow = true;
3599 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3602 if (!in_signal_flow) {
3603 uninvolved.push_back (*i);
3607 solo_update_disabled = false;
3608 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3610 update_route_solo_state (r);
3612 /* now notify that the mute state of the routes not involved in the signal
3613 pathway of the just-solo-changed route may have altered.
3616 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3617 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
3618 (*i)->act_on_mute ();
3619 (*i)->mute_changed (this);
3622 SoloChanged (); /* EMIT SIGNAL */
3627 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
3629 /* now figure out if anything that matters is soloed (or is "listening")*/
3631 bool something_soloed = false;
3632 uint32_t listeners = 0;
3633 uint32_t isolated = 0;
3636 r = routes.reader();
3639 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3640 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
3641 something_soloed = true;
3644 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
3645 if (Config->get_solo_control_is_listen_control()) {
3648 (*i)->set_listen (false, this);
3652 if ((*i)->solo_isolated()) {
3657 if (something_soloed != _non_soloed_outs_muted) {
3658 _non_soloed_outs_muted = something_soloed;
3659 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
3662 _listen_cnt = listeners;
3664 if (isolated != _solo_isolated_cnt) {
3665 _solo_isolated_cnt = isolated;
3666 IsolatedChanged (); /* EMIT SIGNAL */
3669 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
3670 something_soloed, listeners, isolated));
3673 boost::shared_ptr<RouteList>
3674 Session::get_routes_with_internal_returns() const
3676 boost::shared_ptr<RouteList> r = routes.reader ();
3677 boost::shared_ptr<RouteList> rl (new RouteList);
3679 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3680 if ((*i)->internal_return ()) {
3688 Session::io_name_is_legal (const std::string& name)
3690 boost::shared_ptr<RouteList> r = routes.reader ();
3692 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3693 if ((*i)->name() == name) {
3697 if ((*i)->has_io_processor_named (name)) {
3706 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
3709 vector<string> connections;
3711 /* if we are passed only a single route and we're not told to turn
3712 * others off, then just do the simple thing.
3715 if (flip_others == false && rl->size() == 1) {
3716 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
3718 mt->set_input_active (onoff);
3723 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
3725 PortSet& ps ((*rt)->input()->ports());
3727 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
3728 p->get_connections (connections);
3731 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
3732 routes_using_input_from (*s, rl2);
3735 /* scan all relevant routes to see if others are on or off */
3737 bool others_are_already_on = false;
3739 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3741 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3747 if ((*r) != (*rt)) {
3748 if (mt->input_active()) {
3749 others_are_already_on = true;
3752 /* this one needs changing */
3753 mt->set_input_active (onoff);
3759 /* globally reverse other routes */
3761 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3762 if ((*r) != (*rt)) {
3763 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3765 mt->set_input_active (!others_are_already_on);
3774 Session::routes_using_input_from (const string& str, RouteList& rl)
3776 boost::shared_ptr<RouteList> r = routes.reader();
3778 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3779 if ((*i)->input()->connected_to (str)) {
3785 boost::shared_ptr<Route>
3786 Session::route_by_name (string name)
3788 boost::shared_ptr<RouteList> r = routes.reader ();
3790 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3791 if ((*i)->name() == name) {
3796 return boost::shared_ptr<Route> ((Route*) 0);
3799 boost::shared_ptr<Route>
3800 Session::route_by_id (PBD::ID id)
3802 boost::shared_ptr<RouteList> r = routes.reader ();
3804 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3805 if ((*i)->id() == id) {
3810 return boost::shared_ptr<Route> ((Route*) 0);
3813 boost::shared_ptr<Track>
3814 Session::track_by_diskstream_id (PBD::ID id)
3816 boost::shared_ptr<RouteList> r = routes.reader ();
3818 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3819 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3820 if (t && t->using_diskstream_id (id)) {
3825 return boost::shared_ptr<Track> ();
3828 boost::shared_ptr<Route>
3829 Session::route_by_remote_id (uint32_t id)
3831 boost::shared_ptr<RouteList> r = routes.reader ();
3833 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3834 if ((*i)->remote_control_id() == id) {
3839 return boost::shared_ptr<Route> ((Route*) 0);
3844 Session::reassign_track_numbers ()
3848 RouteList r (*(routes.reader ()));
3849 SignalOrderRouteSorter sorter;
3852 StateProtector sp (this);
3854 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3855 if (boost::dynamic_pointer_cast<Track> (*i)) {
3856 (*i)->set_track_number(++tn);
3858 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
3859 (*i)->set_track_number(--bn);
3862 const uint32_t decimals = ceilf (log10f (tn + 1));
3863 const bool decimals_changed = _track_number_decimals != decimals;
3864 _track_number_decimals = decimals;
3866 if (decimals_changed && config.get_track_name_number ()) {
3867 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3868 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3870 t->resync_track_name();
3873 // trigger GUI re-layout
3874 config.ParameterChanged("track-name-number");
3879 Session::playlist_region_added (boost::weak_ptr<Region> w)
3881 boost::shared_ptr<Region> r = w.lock ();
3886 /* These are the operations that are currently in progress... */
3887 list<GQuark> curr = _current_trans_quarks;
3890 /* ...and these are the operations during which we want to update
3891 the session range location markers.
3894 ops.push_back (Operations::capture);
3895 ops.push_back (Operations::paste);
3896 ops.push_back (Operations::duplicate_region);
3897 ops.push_back (Operations::insert_file);
3898 ops.push_back (Operations::insert_region);
3899 ops.push_back (Operations::drag_region_brush);
3900 ops.push_back (Operations::region_drag);
3901 ops.push_back (Operations::selection_grab);
3902 ops.push_back (Operations::region_fill);
3903 ops.push_back (Operations::fill_selection);
3904 ops.push_back (Operations::create_region);
3905 ops.push_back (Operations::region_copy);
3906 ops.push_back (Operations::fixed_time_region_copy);
3909 /* See if any of the current operations match the ones that we want */
3911 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
3913 /* If so, update the session range markers */
3915 maybe_update_session_range (r->position (), r->last_frame ());
3919 /** Update the session range markers if a is before the current start or
3920 * b is after the current end.
3923 Session::maybe_update_session_range (framepos_t a, framepos_t b)
3925 if (_state_of_the_state & Loading) {
3929 if (_session_range_location == 0) {
3931 add_session_range_location (a, b);
3935 if (a < _session_range_location->start()) {
3936 _session_range_location->set_start (a);
3939 if (b > _session_range_location->end()) {
3940 _session_range_location->set_end (b);
3946 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
3948 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3949 maybe_update_session_range (i->to, i->to + i->length);
3954 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
3956 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3957 maybe_update_session_range (i->from, i->to);
3961 /* Region management */
3963 boost::shared_ptr<Region>
3964 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
3966 const RegionFactory::RegionMap& regions (RegionFactory::regions());
3967 RegionFactory::RegionMap::const_iterator i;
3968 boost::shared_ptr<Region> region;
3970 Glib::Threads::Mutex::Lock lm (region_lock);
3972 for (i = regions.begin(); i != regions.end(); ++i) {
3976 if (region->whole_file()) {
3978 if (child->source_equivalent (region)) {
3984 return boost::shared_ptr<Region> ();
3988 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
3990 set<boost::shared_ptr<Region> > relevant_regions;
3992 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
3993 RegionFactory::get_regions_using_source (*s, relevant_regions);
3996 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
3997 set<boost::shared_ptr<Region> >::iterator tmp;
4002 playlists->destroy_region (*r);
4003 RegionFactory::map_remove (*r);
4005 (*r)->drop_sources ();
4006 (*r)->drop_references ();
4008 relevant_regions.erase (r);
4013 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
4016 Glib::Threads::Mutex::Lock ls (source_lock);
4017 /* remove from the main source list */
4018 sources.erase ((*s)->id());
4021 (*s)->mark_for_remove ();
4022 (*s)->drop_references ();
4031 Session::remove_last_capture ()
4033 list<boost::shared_ptr<Source> > srcs;
4035 boost::shared_ptr<RouteList> rl = routes.reader ();
4036 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4037 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4042 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
4045 srcs.insert (srcs.end(), l.begin(), l.end());
4050 destroy_sources (srcs);
4052 save_state (_current_snapshot_name);
4057 /* Source Management */
4060 Session::add_source (boost::shared_ptr<Source> source)
4062 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
4063 pair<SourceMap::iterator,bool> result;
4065 entry.first = source->id();
4066 entry.second = source;
4069 Glib::Threads::Mutex::Lock lm (source_lock);
4070 result = sources.insert (entry);
4073 if (result.second) {
4075 /* yay, new source */
4077 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
4080 if (!fs->within_session()) {
4081 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
4087 boost::shared_ptr<AudioFileSource> afs;
4089 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
4090 if (Config->get_auto_analyse_audio()) {
4091 Analyser::queue_source_for_analysis (source, false);
4095 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
4100 Session::remove_source (boost::weak_ptr<Source> src)
4102 if (_state_of_the_state & Deletion) {
4106 SourceMap::iterator i;
4107 boost::shared_ptr<Source> source = src.lock();
4114 Glib::Threads::Mutex::Lock lm (source_lock);
4116 if ((i = sources.find (source->id())) != sources.end()) {
4121 if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
4123 /* save state so we don't end up with a session file
4124 referring to non-existent sources.
4127 save_state (_current_snapshot_name);
4131 boost::shared_ptr<Source>
4132 Session::source_by_id (const PBD::ID& id)
4134 Glib::Threads::Mutex::Lock lm (source_lock);
4135 SourceMap::iterator i;
4136 boost::shared_ptr<Source> source;
4138 if ((i = sources.find (id)) != sources.end()) {
4145 boost::shared_ptr<AudioFileSource>
4146 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
4148 /* Restricted to audio files because only audio sources have channel
4152 Glib::Threads::Mutex::Lock lm (source_lock);
4154 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
4155 boost::shared_ptr<AudioFileSource> afs
4156 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
4158 if (afs && afs->path() == path && chn == afs->channel()) {
4163 return boost::shared_ptr<AudioFileSource>();
4166 boost::shared_ptr<MidiSource>
4167 Session::midi_source_by_path (const std::string& path) const
4169 /* Restricted to MIDI files because audio sources require a channel
4170 for unique identification, in addition to a path.
4173 Glib::Threads::Mutex::Lock lm (source_lock);
4175 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
4176 boost::shared_ptr<MidiSource> ms
4177 = boost::dynamic_pointer_cast<MidiSource>(s->second);
4178 boost::shared_ptr<FileSource> fs
4179 = boost::dynamic_pointer_cast<FileSource>(s->second);
4181 if (ms && fs && fs->path() == path) {
4186 return boost::shared_ptr<MidiSource>();
4190 Session::count_sources_by_origin (const string& path)
4193 Glib::Threads::Mutex::Lock lm (source_lock);
4195 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
4196 boost::shared_ptr<FileSource> fs
4197 = boost::dynamic_pointer_cast<FileSource>(i->second);
4199 if (fs && fs->origin() == path) {
4208 Session::peak_path (string base) const
4210 if (Glib::path_is_absolute (base)) {
4212 /* rip the session dir from the audiofile source */
4214 string session_path;
4215 string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
4216 bool in_another_session = true;
4218 if (base.find (interchange_dir_string) != string::npos) {
4220 session_path = Glib::path_get_dirname (base); /* now ends in audiofiles */
4221 session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
4222 session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
4223 session_path = Glib::path_get_dirname (session_path); /* now has session path */
4225 /* see if it is within our session */
4227 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4228 if (i->path == session_path) {
4229 in_another_session = false;
4234 in_another_session = false;
4238 if (in_another_session) {
4239 SessionDirectory sd (session_path);
4240 return Glib::build_filename (sd.peak_path(), Glib::path_get_basename (base) + peakfile_suffix);
4244 base = Glib::path_get_basename (base);
4245 return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
4249 Session::new_audio_source_path_for_embedded (const std::string& path)
4253 * we know that the filename is already unique because it exists
4254 * out in the filesystem.
4256 * However, when we bring it into the session, we could get a
4259 * Eg. two embedded files:
4264 * When merged into session, these collide.
4266 * There will not be a conflict with in-memory sources
4267 * because when the source was created we already picked
4268 * a unique name for it.
4270 * This collision is not likely to be common, but we have to guard
4271 * against it. So, if there is a collision, take the md5 hash of the
4272 * the path, and use that as the filename instead.
4275 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4276 string base = Glib::path_get_basename (path);
4277 string newpath = Glib::build_filename (sdir.sound_path(), base);
4279 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4283 md5.digestString (path.c_str());
4284 md5.writeToString ();
4285 base = md5.digestChars;
4287 string ext = get_suffix (path);
4294 newpath = Glib::build_filename (sdir.sound_path(), base);
4296 /* if this collides, we're screwed */
4298 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4299 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
4308 /** Return true if there are no audio file sources that use @param name as
4309 * the filename component of their path.
4311 * Return false otherwise.
4313 * This method MUST ONLY be used to check in-session, mono files since it
4314 * hard-codes the channel of the audio file source we are looking for as zero.
4316 * If/when Ardour supports native files in non-mono formats, the logic here
4317 * will need to be revisited.
4320 Session::audio_source_name_is_unique (const string& name)
4322 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
4323 vector<space_and_path>::iterator i;
4324 uint32_t existing = 0;
4326 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4328 /* note that we search *without* the extension so that
4329 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
4330 in the event that this new name is required for
4331 a file format change.
4334 const string spath = *i;
4336 if (matching_unsuffixed_filename_exists_in (spath, name)) {
4341 /* it is possible that we have the path already
4342 * assigned to a source that has not yet been written
4343 * (ie. the write source for a diskstream). we have to
4344 * check this in order to make sure that our candidate
4345 * path isn't used again, because that can lead to
4346 * two Sources point to the same file with different
4347 * notions of their removability.
4351 string possible_path = Glib::build_filename (spath, name);
4353 if (audio_source_by_path_and_channel (possible_path, 0)) {
4359 return (existing == 0);
4363 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)
4366 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4368 if (Profile->get_trx() && destructive) {
4370 sstr << setfill ('0') << setw (4) << cnt;
4371 sstr << legalized_base;
4373 sstr << legalized_base;
4375 if (take_required || related_exists) {
4387 } else if (nchan > 2) {
4392 /* XXX what? more than 26 channels! */
4403 /** Return a unique name based on \a base for a new internal audio source */
4405 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
4408 string possible_name;
4409 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
4411 bool some_related_source_name_exists = false;
4413 legalized = legalize_for_path (base);
4415 // Find a "version" of the base name that doesn't exist in any of the possible directories.
4417 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
4419 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
4421 if (audio_source_name_is_unique (possible_name)) {
4425 some_related_source_name_exists = true;
4428 error << string_compose(
4429 _("There are already %1 recordings for %2, which I consider too many."),
4430 limit, base) << endmsg;
4432 throw failed_constructor();
4436 /* We've established that the new name does not exist in any session
4437 * directory, so now find out which one we should use for this new
4441 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4443 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
4448 /** Return a unique name based on `base` for a new internal MIDI source */
4450 Session::new_midi_source_path (const string& base)
4453 char buf[PATH_MAX+1];
4454 const uint32_t limit = 10000;
4456 string possible_path;
4457 string possible_name;
4460 legalized = legalize_for_path (base);
4462 // Find a "version" of the file name that doesn't exist in any of the possible directories.
4463 std::vector<string> sdirs = source_search_path(DataType::MIDI);
4465 /* - the main session folder is the first in the vector.
4466 * - after checking all locations for file-name uniqueness,
4467 * we keep the one from the last iteration as new file name
4468 * - midi files are small and should just be kept in the main session-folder
4470 * -> reverse the array, check main session folder last and use that as location
4473 std::reverse(sdirs.begin(), sdirs.end());
4475 for (cnt = 1; cnt <= limit; ++cnt) {
4477 vector<space_and_path>::iterator i;
4478 uint32_t existing = 0;
4480 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4482 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
4483 possible_name = buf;
4485 possible_path = Glib::build_filename (*i, possible_name);
4487 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
4491 if (midi_source_by_path (possible_path)) {
4496 if (existing == 0) {
4501 error << string_compose(
4502 _("There are already %1 recordings for %2, which I consider too many."),
4503 limit, base) << endmsg;
4509 /* No need to "find best location" for software/app-based RAID, because
4510 MIDI is so small that we always put it in the same place.
4513 return possible_path;
4517 /** Create a new within-session audio source */
4518 boost::shared_ptr<AudioFileSource>
4519 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
4521 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
4523 if (!path.empty()) {
4524 return boost::dynamic_pointer_cast<AudioFileSource> (
4525 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
4527 throw failed_constructor ();
4531 /** Create a new within-session MIDI source */
4532 boost::shared_ptr<MidiSource>
4533 Session::create_midi_source_for_session (string const & basic_name)
4535 const string path = new_midi_source_path (basic_name);
4537 if (!path.empty()) {
4538 return boost::dynamic_pointer_cast<SMFSource> (
4539 SourceFactory::createWritable (
4540 DataType::MIDI, *this, path, false, frame_rate()));
4542 throw failed_constructor ();
4546 /** Create a new within-session MIDI source */
4547 boost::shared_ptr<MidiSource>
4548 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
4550 /* the caller passes in the track the source will be used in,
4551 so that we can keep the numbering sane.
4553 Rationale: a track with the name "Foo" that has had N
4554 captures carried out so far will ALREADY have a write source
4555 named "Foo-N+1.mid" waiting to be used for the next capture.
4557 If we call new_midi_source_name() we will get "Foo-N+2". But
4558 there is no region corresponding to "Foo-N+1", so when
4559 "Foo-N+2" appears in the track, the gap presents the user
4560 with odd behaviour - why did it skip past Foo-N+1?
4562 We could explain this to the user in some odd way, but
4563 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
4566 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
4569 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
4571 std::string name = track->steal_write_source_name ();
4574 return boost::shared_ptr<MidiSource>();
4577 /* MIDI files are small, just put them in the first location of the
4578 session source search path.
4581 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
4583 return boost::dynamic_pointer_cast<SMFSource> (
4584 SourceFactory::createWritable (
4585 DataType::MIDI, *this, path, false, frame_rate()));
4590 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
4592 if (playlist->hidden()) {
4596 playlists->add (playlist);
4599 playlist->release();
4606 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
4608 if (_state_of_the_state & Deletion) {
4612 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
4618 playlists->remove (playlist);
4624 Session::set_audition (boost::shared_ptr<Region> r)
4626 pending_audition_region = r;
4627 add_post_transport_work (PostTransportAudition);
4628 _butler->schedule_transport_work ();
4632 Session::audition_playlist ()
4634 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4635 ev->region.reset ();
4640 Session::non_realtime_set_audition ()
4642 assert (pending_audition_region);
4643 auditioner->audition_region (pending_audition_region);
4644 pending_audition_region.reset ();
4645 AuditionActive (true); /* EMIT SIGNAL */
4649 Session::audition_region (boost::shared_ptr<Region> r)
4651 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4657 Session::cancel_audition ()
4662 if (auditioner->auditioning()) {
4663 auditioner->cancel_audition ();
4664 AuditionActive (false); /* EMIT SIGNAL */
4669 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
4671 if (a->is_monitor()) {
4674 if (b->is_monitor()) {
4677 return a->order_key () < b->order_key ();
4681 Session::is_auditioning () const
4683 /* can be called before we have an auditioner object */
4685 return auditioner->auditioning();
4692 Session::graph_reordered ()
4694 /* don't do this stuff if we are setting up connections
4695 from a set_state() call or creating new tracks. Ditto for deletion.
4698 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _reconnecting_routes_in_progress) {
4702 /* every track/bus asked for this to be handled but it was deferred because
4703 we were connecting. do it now.
4706 request_input_change_handling ();
4710 /* force all diskstreams to update their capture offset values to
4711 reflect any changes in latencies within the graph.
4714 boost::shared_ptr<RouteList> rl = routes.reader ();
4715 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4716 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4718 tr->set_capture_offset ();
4723 /** @return Number of frames that there is disk space available to write,
4726 boost::optional<framecnt_t>
4727 Session::available_capture_duration ()
4729 Glib::Threads::Mutex::Lock lm (space_lock);
4731 if (_total_free_4k_blocks_uncertain) {
4732 return boost::optional<framecnt_t> ();
4735 float sample_bytes_on_disk = 4.0; // keep gcc happy
4737 switch (config.get_native_file_data_format()) {
4739 sample_bytes_on_disk = 4.0;
4743 sample_bytes_on_disk = 3.0;
4747 sample_bytes_on_disk = 2.0;
4751 /* impossible, but keep some gcc versions happy */
4752 fatal << string_compose (_("programming error: %1"),
4753 X_("illegal native file data format"))
4755 abort(); /*NOTREACHED*/
4758 double scale = 4096.0 / sample_bytes_on_disk;
4760 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
4761 return max_framecnt;
4764 return (framecnt_t) floor (_total_free_4k_blocks * scale);
4768 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
4771 RCUWriter<BundleList> writer (_bundles);
4772 boost::shared_ptr<BundleList> b = writer.get_copy ();
4773 b->push_back (bundle);
4777 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4784 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
4786 bool removed = false;
4789 RCUWriter<BundleList> writer (_bundles);
4790 boost::shared_ptr<BundleList> b = writer.get_copy ();
4791 BundleList::iterator i = find (b->begin(), b->end(), bundle);
4793 if (i != b->end()) {
4800 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4806 boost::shared_ptr<Bundle>
4807 Session::bundle_by_name (string name) const
4809 boost::shared_ptr<BundleList> b = _bundles.reader ();
4811 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
4812 if ((*i)->name() == name) {
4817 return boost::shared_ptr<Bundle> ();
4821 Session::tempo_map_changed (const PropertyChange&)
4825 playlists->update_after_tempo_map_change ();
4827 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
4833 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
4835 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
4836 (*i)->recompute_frames_from_bbt ();
4840 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
4841 * the given count with the current block size.
4844 Session::ensure_buffers (ChanCount howmany)
4846 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
4850 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
4852 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4853 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
4858 Session::next_insert_id ()
4860 /* this doesn't really loop forever. just think about it */
4863 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
4864 if (!insert_bitset[n]) {
4865 insert_bitset[n] = true;
4871 /* none available, so resize and try again */
4873 insert_bitset.resize (insert_bitset.size() + 16, false);
4878 Session::next_send_id ()
4880 /* this doesn't really loop forever. just think about it */
4883 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
4884 if (!send_bitset[n]) {
4885 send_bitset[n] = true;
4891 /* none available, so resize and try again */
4893 send_bitset.resize (send_bitset.size() + 16, false);
4898 Session::next_aux_send_id ()
4900 /* this doesn't really loop forever. just think about it */
4903 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
4904 if (!aux_send_bitset[n]) {
4905 aux_send_bitset[n] = true;
4911 /* none available, so resize and try again */
4913 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
4918 Session::next_return_id ()
4920 /* this doesn't really loop forever. just think about it */
4923 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
4924 if (!return_bitset[n]) {
4925 return_bitset[n] = true;
4931 /* none available, so resize and try again */
4933 return_bitset.resize (return_bitset.size() + 16, false);
4938 Session::mark_send_id (uint32_t id)
4940 if (id >= send_bitset.size()) {
4941 send_bitset.resize (id+16, false);
4943 if (send_bitset[id]) {
4944 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
4946 send_bitset[id] = true;
4950 Session::mark_aux_send_id (uint32_t id)
4952 if (id >= aux_send_bitset.size()) {
4953 aux_send_bitset.resize (id+16, false);
4955 if (aux_send_bitset[id]) {
4956 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
4958 aux_send_bitset[id] = true;
4962 Session::mark_return_id (uint32_t id)
4964 if (id >= return_bitset.size()) {
4965 return_bitset.resize (id+16, false);
4967 if (return_bitset[id]) {
4968 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
4970 return_bitset[id] = true;
4974 Session::mark_insert_id (uint32_t id)
4976 if (id >= insert_bitset.size()) {
4977 insert_bitset.resize (id+16, false);
4979 if (insert_bitset[id]) {
4980 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
4982 insert_bitset[id] = true;
4986 Session::unmark_send_id (uint32_t id)
4988 if (id < send_bitset.size()) {
4989 send_bitset[id] = false;
4994 Session::unmark_aux_send_id (uint32_t id)
4996 if (id < aux_send_bitset.size()) {
4997 aux_send_bitset[id] = false;
5002 Session::unmark_return_id (uint32_t id)
5004 if (id < return_bitset.size()) {
5005 return_bitset[id] = false;
5010 Session::unmark_insert_id (uint32_t id)
5012 if (id < insert_bitset.size()) {
5013 insert_bitset[id] = false;
5018 Session::reset_native_file_format ()
5020 boost::shared_ptr<RouteList> rl = routes.reader ();
5022 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5023 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5025 /* don't save state as we do this, there's no point
5027 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
5028 tr->reset_write_sources (false);
5029 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
5035 Session::route_name_unique (string n) const
5037 boost::shared_ptr<RouteList> r = routes.reader ();
5039 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5040 if ((*i)->name() == n) {
5049 Session::route_name_internal (string n) const
5051 if (auditioner && auditioner->name() == n) {
5055 if (_click_io && _click_io->name() == n) {
5063 Session::freeze_all (InterThreadInfo& itt)
5065 boost::shared_ptr<RouteList> r = routes.reader ();
5067 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5069 boost::shared_ptr<Track> t;
5071 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
5072 /* XXX this is wrong because itt.progress will keep returning to zero at the start
5082 boost::shared_ptr<Region>
5083 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
5084 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
5085 InterThreadInfo& itt,
5086 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
5087 bool for_export, bool for_freeze)
5089 boost::shared_ptr<Region> result;
5090 boost::shared_ptr<Playlist> playlist;
5091 boost::shared_ptr<Source> source;
5092 ChanCount diskstream_channels (track.n_channels());
5093 framepos_t position;
5094 framecnt_t this_chunk;
5096 framepos_t latency_skip;
5098 framepos_t len = end - start;
5099 bool need_block_size_reset = false;
5100 ChanCount const max_proc = track.max_processor_streams ();
5101 string legal_playlist_name;
5102 string possible_path;
5105 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
5106 end, start) << endmsg;
5110 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
5111 include_endpoint, for_export, for_freeze);
5113 if (diskstream_channels.n(track.data_type()) < 1) {
5114 error << _("Cannot write a range with no data.") << endmsg;
5118 // block all process callback handling
5120 block_processing ();
5123 // synchronize with AudioEngine::process_callback()
5124 // make sure processing is not currently running
5125 // and processing_blocked() is honored before
5126 // acquiring thread buffers
5127 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5130 _bounce_processing_active = true;
5132 /* call tree *MUST* hold route_lock */
5134 if ((playlist = track.playlist()) == 0) {
5138 legal_playlist_name = legalize_for_path (playlist->name());
5140 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
5142 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
5143 string path = ((track.data_type() == DataType::AUDIO)
5144 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
5145 : new_midi_source_path (legal_playlist_name));
5152 source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
5155 catch (failed_constructor& err) {
5156 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
5160 srcs.push_back (source);
5163 /* tell redirects that care that we are about to use a much larger
5164 * blocksize. this will flush all plugins too, so that they are ready
5165 * to be used for this process.
5168 need_block_size_reset = true;
5169 track.set_block_size (bounce_chunk_size);
5170 _engine.main_thread()->get_buffers ();
5174 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5176 /* create a set of reasonably-sized buffers */
5177 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5178 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
5180 buffers.set_count (max_proc);
5182 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5183 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5184 boost::shared_ptr<MidiSource> ms;
5186 afs->prepare_for_peakfile_writes ();
5187 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5188 Source::Lock lock(ms->mutex());
5189 ms->mark_streaming_write_started(lock);
5193 while (to_do && !itt.cancel) {
5195 this_chunk = min (to_do, bounce_chunk_size);
5197 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
5201 start += this_chunk;
5202 to_do -= this_chunk;
5203 itt.progress = (float) (1.0 - ((double) to_do / len));
5205 if (latency_skip >= bounce_chunk_size) {
5206 latency_skip -= bounce_chunk_size;
5210 const framecnt_t current_chunk = this_chunk - latency_skip;
5213 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5214 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5215 boost::shared_ptr<MidiSource> ms;
5218 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
5221 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5222 Source::Lock lock(ms->mutex());
5224 const MidiBuffer& buf = buffers.get_midi(0);
5225 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
5226 Evoral::Event<framepos_t> ev = *i;
5227 ev.set_time(ev.time() - position);
5228 ms->append_event_frames(lock, ev, ms->timeline_position());
5235 /* post-roll, pick up delayed processor output */
5236 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5238 while (latency_skip && !itt.cancel) {
5239 this_chunk = min (latency_skip, bounce_chunk_size);
5240 latency_skip -= this_chunk;
5242 buffers.silence (this_chunk, 0);
5243 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
5246 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5247 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5250 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
5262 xnow = localtime (&now);
5264 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
5265 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5266 boost::shared_ptr<MidiSource> ms;
5269 afs->update_header (position, *xnow, now);
5270 afs->flush_header ();
5271 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5272 Source::Lock lock(ms->mutex());
5273 ms->mark_streaming_write_completed(lock);
5277 /* construct a region to represent the bounced material */
5281 plist.add (Properties::start, 0);
5282 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
5283 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
5285 result = RegionFactory::create (srcs, plist);
5291 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5292 (*src)->mark_for_remove ();
5293 (*src)->drop_references ();
5297 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5298 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5301 afs->done_with_peakfile_writes ();
5305 _bounce_processing_active = false;
5307 if (need_block_size_reset) {
5308 _engine.main_thread()->drop_buffers ();
5309 track.set_block_size (get_block_size());
5312 unblock_processing ();
5318 Session::gain_automation_buffer() const
5320 return ProcessThread::gain_automation_buffer ();
5324 Session::trim_automation_buffer() const
5326 return ProcessThread::trim_automation_buffer ();
5330 Session::send_gain_automation_buffer() const
5332 return ProcessThread::send_gain_automation_buffer ();
5336 Session::pan_automation_buffer() const
5338 return ProcessThread::pan_automation_buffer ();
5342 Session::get_silent_buffers (ChanCount count)
5344 return ProcessThread::get_silent_buffers (count);
5348 Session::get_scratch_buffers (ChanCount count, bool silence)
5350 return ProcessThread::get_scratch_buffers (count, silence);
5354 Session::get_route_buffers (ChanCount count, bool silence)
5356 return ProcessThread::get_route_buffers (count, silence);
5361 Session::get_mix_buffers (ChanCount count)
5363 return ProcessThread::get_mix_buffers (count);
5367 Session::ntracks () const
5370 boost::shared_ptr<RouteList> r = routes.reader ();
5372 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5373 if (boost::dynamic_pointer_cast<Track> (*i)) {
5382 Session::nbusses () const
5385 boost::shared_ptr<RouteList> r = routes.reader ();
5387 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5388 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
5397 Session::add_automation_list(AutomationList *al)
5399 automation_lists[al->id()] = al;
5402 /** @return true if there is at least one record-enabled track, otherwise false */
5404 Session::have_rec_enabled_track () const
5406 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
5410 Session::have_rec_disabled_track () const
5412 return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
5415 /** Update the state of our rec-enabled tracks flag */
5417 Session::update_route_record_state ()
5419 boost::shared_ptr<RouteList> rl = routes.reader ();
5420 RouteList::iterator i = rl->begin();
5421 while (i != rl->end ()) {
5423 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5424 if (tr && tr->record_enabled ()) {
5431 int const old = g_atomic_int_get (&_have_rec_enabled_track);
5433 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
5435 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
5436 RecordStateChanged (); /* EMIT SIGNAL */
5439 for (i = rl->begin(); i != rl->end (); ++i) {
5440 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5441 if (tr && !tr->record_enabled ()) {
5446 g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
5448 bool record_arm_state_changed = (old != g_atomic_int_get (&_have_rec_enabled_track) );
5450 if (record_status() == Recording && record_arm_state_changed ) {
5451 RecordArmStateChanged ();
5457 Session::listen_position_changed ()
5459 boost::shared_ptr<RouteList> r = routes.reader ();
5461 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5462 (*i)->listen_position_changed ();
5467 Session::solo_control_mode_changed ()
5469 /* cancel all solo or all listen when solo control mode changes */
5472 set_solo (get_routes(), false);
5473 } else if (listening()) {
5474 set_listen (get_routes(), false);
5478 /** Called when a property of one of our route groups changes */
5480 Session::route_group_property_changed (RouteGroup* rg)
5482 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
5485 /** Called when a route is added to one of our route groups */
5487 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5489 RouteAddedToRouteGroup (rg, r);
5492 /** Called when a route is removed from one of our route groups */
5494 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5496 update_route_record_state ();
5497 RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
5500 boost::shared_ptr<RouteList>
5501 Session::get_tracks () const
5503 boost::shared_ptr<RouteList> rl = routes.reader ();
5504 boost::shared_ptr<RouteList> tl (new RouteList);
5506 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
5507 if (boost::dynamic_pointer_cast<Track> (*r)) {
5508 if (!(*r)->is_auditioner()) {
5516 boost::shared_ptr<RouteList>
5517 Session::get_routes_with_regions_at (framepos_t const p) const
5519 boost::shared_ptr<RouteList> r = routes.reader ();
5520 boost::shared_ptr<RouteList> rl (new RouteList);
5522 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5523 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5528 boost::shared_ptr<Playlist> pl = tr->playlist ();
5533 if (pl->has_region_at (p)) {
5542 Session::goto_end ()
5544 if (_session_range_location) {
5545 request_locate (_session_range_location->end(), false);
5547 request_locate (0, false);
5552 Session::goto_start ()
5554 if (_session_range_location) {
5555 request_locate (_session_range_location->start(), false);
5557 request_locate (0, false);
5562 Session::current_start_frame () const
5564 return _session_range_location ? _session_range_location->start() : 0;
5568 Session::current_end_frame () const
5570 return _session_range_location ? _session_range_location->end() : 0;
5574 Session::add_session_range_location (framepos_t start, framepos_t end)
5576 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
5577 _locations->add (_session_range_location);
5581 Session::step_edit_status_change (bool yn)
5587 send = (_step_editors == 0);
5592 send = (_step_editors == 1);
5595 if (_step_editors > 0) {
5601 StepEditStatusChange (val);
5607 Session::start_time_changed (framepos_t old)
5609 /* Update the auto loop range to match the session range
5610 (unless the auto loop range has been changed by the user)
5613 Location* s = _locations->session_range_location ();
5618 Location* l = _locations->auto_loop_location ();
5620 if (l && l->start() == old) {
5621 l->set_start (s->start(), true);
5626 Session::end_time_changed (framepos_t old)
5628 /* Update the auto loop range to match the session range
5629 (unless the auto loop range has been changed by the user)
5632 Location* s = _locations->session_range_location ();
5637 Location* l = _locations->auto_loop_location ();
5639 if (l && l->end() == old) {
5640 l->set_end (s->end(), true);
5644 std::vector<std::string>
5645 Session::source_search_path (DataType type) const
5649 if (session_dirs.size() == 1) {
5651 case DataType::AUDIO:
5652 sp.push_back (_session_dir->sound_path());
5654 case DataType::MIDI:
5655 sp.push_back (_session_dir->midi_path());
5659 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
5660 SessionDirectory sdir (i->path);
5662 case DataType::AUDIO:
5663 sp.push_back (sdir.sound_path());
5665 case DataType::MIDI:
5666 sp.push_back (sdir.midi_path());
5672 if (type == DataType::AUDIO) {
5673 const string sound_path_2X = _session_dir->sound_path_2X();
5674 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
5675 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
5676 sp.push_back (sound_path_2X);
5681 // now check the explicit (possibly user-specified) search path
5684 case DataType::AUDIO:
5685 sp += Searchpath(config.get_audio_search_path ());
5687 case DataType::MIDI:
5688 sp += Searchpath(config.get_midi_search_path ());
5696 Session::ensure_search_path_includes (const string& path, DataType type)
5705 case DataType::AUDIO:
5706 sp += Searchpath(config.get_audio_search_path ());
5708 case DataType::MIDI:
5709 sp += Searchpath (config.get_midi_search_path ());
5713 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
5714 /* No need to add this new directory if it has the same inode as
5715 an existing one; checking inode rather than name prevents duplicated
5716 directories when we are using symlinks.
5718 On Windows, I think we could just do if (*i == path) here.
5720 if (PBD::equivalent_paths (*i, path)) {
5728 case DataType::AUDIO:
5729 config.set_audio_search_path (sp.to_string());
5731 case DataType::MIDI:
5732 config.set_midi_search_path (sp.to_string());
5738 Session::remove_dir_from_search_path (const string& dir, DataType type)
5743 case DataType::AUDIO:
5744 sp = Searchpath(config.get_audio_search_path ());
5746 case DataType::MIDI:
5747 sp = Searchpath (config.get_midi_search_path ());
5754 case DataType::AUDIO:
5755 config.set_audio_search_path (sp.to_string());
5757 case DataType::MIDI:
5758 config.set_midi_search_path (sp.to_string());
5764 boost::shared_ptr<Speakers>
5765 Session::get_speakers()
5771 Session::unknown_processors () const
5775 boost::shared_ptr<RouteList> r = routes.reader ();
5776 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5777 list<string> t = (*i)->unknown_processors ();
5778 copy (t.begin(), t.end(), back_inserter (p));
5788 Session::update_latency (bool playback)
5790 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
5792 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
5796 boost::shared_ptr<RouteList> r = routes.reader ();
5797 framecnt_t max_latency = 0;
5800 /* reverse the list so that we work backwards from the last route to run to the first */
5801 RouteList* rl = routes.reader().get();
5802 r.reset (new RouteList (*rl));
5803 reverse (r->begin(), r->end());
5806 /* compute actual latency values for the given direction and store them all in per-port
5807 structures. this will also publish the same values (to JACK) so that computation of latency
5808 for routes can consistently use public latency values.
5811 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5812 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
5815 /* because we latency compensate playback, our published playback latencies should
5816 be the same for all output ports - all material played back by ardour has
5817 the same latency, whether its caused by plugins or by latency compensation. since
5818 these may differ from the values computed above, reset all playback port latencies
5822 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
5824 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5825 (*i)->set_public_port_latencies (max_latency, playback);
5830 post_playback_latency ();
5834 post_capture_latency ();
5837 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
5841 Session::post_playback_latency ()
5843 set_worst_playback_latency ();
5845 boost::shared_ptr<RouteList> r = routes.reader ();
5847 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5848 if (!(*i)->is_auditioner() && ((*i)->active())) {
5849 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
5853 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5854 (*i)->set_latency_compensation (_worst_track_latency);
5859 Session::post_capture_latency ()
5861 set_worst_capture_latency ();
5863 /* reflect any changes in capture latencies into capture offsets
5866 boost::shared_ptr<RouteList> rl = routes.reader();
5867 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5868 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5870 tr->set_capture_offset ();
5876 Session::initialize_latencies ()
5879 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5880 update_latency (false);
5881 update_latency (true);
5884 set_worst_io_latencies ();
5888 Session::set_worst_io_latencies ()
5890 set_worst_playback_latency ();
5891 set_worst_capture_latency ();
5895 Session::set_worst_playback_latency ()
5897 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5901 _worst_output_latency = 0;
5903 if (!_engine.connected()) {
5907 boost::shared_ptr<RouteList> r = routes.reader ();
5909 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5910 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
5913 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
5917 Session::set_worst_capture_latency ()
5919 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5923 _worst_input_latency = 0;
5925 if (!_engine.connected()) {
5929 boost::shared_ptr<RouteList> r = routes.reader ();
5931 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5932 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
5935 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
5939 Session::update_latency_compensation (bool force_whole_graph)
5941 bool some_track_latency_changed = false;
5943 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5947 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
5949 _worst_track_latency = 0;
5951 boost::shared_ptr<RouteList> r = routes.reader ();
5953 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5954 if (!(*i)->is_auditioner() && ((*i)->active())) {
5956 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
5957 some_track_latency_changed = true;
5959 _worst_track_latency = max (tl, _worst_track_latency);
5963 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
5964 (some_track_latency_changed ? "yes" : "no")));
5966 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
5968 if (some_track_latency_changed || force_whole_graph) {
5969 _engine.update_latencies ();
5973 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5974 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5978 tr->set_capture_offset ();
5983 Session::session_name_is_legal (const string& path)
5985 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
5987 for (int i = 0; illegal_chars[i]; ++i) {
5988 if (path.find (illegal_chars[i]) != string::npos) {
5989 return illegal_chars[i];
5997 Session::next_control_id () const
6001 /* the monitor bus remote ID is in a different
6002 * "namespace" than regular routes. its existence doesn't
6003 * affect normal (low) numbered routes.
6010 /* the same about masterbus in Waves Tracks */
6012 if (Profile->get_trx() && _master_out) {
6016 return nroutes() - subtract;
6020 Session::notify_remote_id_change ()
6022 if (deletion_in_progress()) {
6026 switch (Config->get_remote_model()) {
6028 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
6034 #ifdef USE_TRACKS_CODE_FEATURES
6035 /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
6036 * if track order has been changed by user
6038 reconnect_existing_routes(true, true);
6044 Session::sync_order_keys ()
6046 if (deletion_in_progress()) {
6050 /* tell everyone that something has happened to the sort keys
6051 and let them sync up with the change(s)
6052 this will give objects that manage the sort order keys the
6053 opportunity to keep them in sync if they wish to.
6056 DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
6058 reassign_track_numbers();
6060 Route::SyncOrderKeys (); /* EMIT SIGNAL */
6062 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
6066 Session::operation_in_progress (GQuark op) const
6068 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
6071 boost::shared_ptr<Port>
6072 Session::ltc_input_port () const
6074 return _ltc_input->nth (0);
6077 boost::shared_ptr<Port>
6078 Session::ltc_output_port () const
6080 return _ltc_output->nth (0);
6084 Session::reconnect_ltc_input ()
6088 string src = Config->get_ltc_source_port();
6090 _ltc_input->disconnect (this);
6092 if (src != _("None") && !src.empty()) {
6093 _ltc_input->nth (0)->connect (src);
6099 Session::reconnect_ltc_output ()
6104 string src = Config->get_ltc_sink_port();
6106 _ltc_output->disconnect (this);
6108 if (src != _("None") && !src.empty()) {
6109 _ltc_output->nth (0)->connect (src);
6116 Session::set_range_selection (framepos_t start, framepos_t end)
6118 cerr << "set range selection " << start << " .. " << end << endl;
6119 _range_selection = Evoral::Range<framepos_t> (start, end);
6120 follow_playhead_priority ();
6124 Session::set_object_selection (framepos_t start, framepos_t end)
6126 _object_selection = Evoral::Range<framepos_t> (start, end);
6127 follow_playhead_priority ();
6131 Session::clear_range_selection ()
6133 _range_selection = Evoral::Range<framepos_t> (-1,-1);
6134 follow_playhead_priority ();
6138 Session::clear_object_selection ()
6140 _object_selection = Evoral::Range<framepos_t> (-1,-1);
6141 follow_playhead_priority ();