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.
26 #include <cstdio> /* sprintf(3) ... grrr */
32 #include <glibmm/threads.h>
33 #include <glibmm/miscutils.h>
34 #include <glibmm/fileutils.h>
36 #include <boost/algorithm/string/erase.hpp>
38 #include "pbd/basename.h"
39 #include "pbd/boost_debug.h"
40 #include "pbd/convert.h"
41 #include "pbd/convert.h"
42 #include "pbd/error.h"
43 #include "pbd/file_utils.h"
45 #include "pbd/search_path.h"
46 #include "pbd/stacktrace.h"
47 #include "pbd/stl_delete.h"
48 #include "pbd/replace_all.h"
49 #include "pbd/unwind.h"
51 #include "ardour/amp.h"
52 #include "ardour/analyser.h"
53 #include "ardour/async_midi_port.h"
54 #include "ardour/audio_buffer.h"
55 #include "ardour/audio_diskstream.h"
56 #include "ardour/audio_port.h"
57 #include "ardour/audio_track.h"
58 #include "ardour/audioengine.h"
59 #include "ardour/audiofilesource.h"
60 #include "ardour/auditioner.h"
61 #include "ardour/buffer_manager.h"
62 #include "ardour/buffer_set.h"
63 #include "ardour/bundle.h"
64 #include "ardour/butler.h"
65 #include "ardour/click.h"
66 #include "ardour/control_protocol_manager.h"
67 #include "ardour/data_type.h"
68 #include "ardour/debug.h"
69 #include "ardour/directory_names.h"
70 #ifdef USE_TRACKS_CODE_FEATURES
71 #include "ardour/engine_state_controller.h"
73 #include "ardour/filename_extensions.h"
74 #include "ardour/graph.h"
75 #include "ardour/midiport_manager.h"
76 #include "ardour/scene_changer.h"
77 #include "ardour/midi_patch_manager.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"
110 #include <glibmm/checksum.h>
119 using namespace ARDOUR;
122 bool Session::_disable_all_loaded_plugins = false;
123 bool Session::_bypass_all_loaded_plugins = false;
125 PBD::Signal1<int,uint32_t> Session::AudioEngineSetupRequired;
126 PBD::Signal1<void,std::string> Session::Dialog;
127 PBD::Signal0<int> Session::AskAboutPendingState;
128 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
129 PBD::Signal0<void> Session::SendFeedback;
130 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
132 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
133 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
134 PBD::Signal2<void,std::string, std::string> Session::Exported;
135 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
136 PBD::Signal0<void> Session::Quit;
137 PBD::Signal0<void> Session::FeedbackDetected;
138 PBD::Signal0<void> Session::SuccessfulGraphSort;
139 PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
141 const framecnt_t Session::bounce_chunk_size = 8192;
142 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
143 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
145 // seconds should be added after the region exceeds end marker
146 #ifdef USE_TRACKS_CODE_FEATURES
147 const uint32_t Session::session_end_shift = 5;
149 const uint32_t Session::session_end_shift = 0;
152 /** @param snapshot_name Snapshot name, without .ardour suffix */
153 Session::Session (AudioEngine &eng,
154 const string& fullpath,
155 const string& snapshot_name,
156 BusProfile* bus_profile,
158 : playlists (new SessionPlaylists)
160 , process_function (&Session::process_with_events)
161 , _bounce_processing_active (false)
162 , waiting_for_sync_offset (false)
163 , _base_frame_rate (0)
164 , _current_frame_rate (0)
165 , _nominal_frame_rate (0)
166 , transport_sub_state (0)
167 , _record_status (Disabled)
168 , _transport_frame (0)
169 , _session_range_location (0)
172 , _transport_speed (0)
173 , _default_transport_speed (1.0)
174 , _last_transport_speed (0)
175 , _target_transport_speed (0.0)
176 , auto_play_legal (false)
177 , _last_slave_transport_frame (0)
178 , maximum_output_latency (0)
179 , _requested_return_frame (-1)
180 , current_block_size (0)
181 , _worst_output_latency (0)
182 , _worst_input_latency (0)
183 , _worst_track_latency (0)
184 , _have_captured (false)
185 , _non_soloed_outs_muted (false)
187 , _solo_isolated_cnt (0)
189 , _was_seamless (Config->get_seamless_loop ())
190 , _under_nsm_control (false)
192 , delta_accumulator_cnt (0)
193 , average_slave_delta (1800) // !!! why 1800 ???
195 , have_first_delta_accumulator (false)
196 , _slave_state (Stopped)
197 , _mtc_active (false)
198 , _ltc_active (false)
199 , post_export_sync (false)
200 , post_export_position (0)
202 , _export_started (false)
203 , _export_rolling (false)
204 , _pre_export_mmc_enabled (false)
205 , _name (snapshot_name)
207 , _send_qf_mtc (false)
208 , _pframes_since_last_mtc (0)
209 , session_midi_feedback (0)
211 , loop_changing (false)
213 , _session_dir (new SessionDirectory (fullpath))
214 , _current_snapshot_name (snapshot_name)
216 , state_was_pending (false)
217 , _state_of_the_state (StateOfTheState(CannotSave|InitialConnecting|Loading))
219 , _save_queued (false)
220 , _last_roll_location (0)
221 , _last_roll_or_reversal_location (0)
222 , _last_record_location (0)
223 , pending_locate_roll (false)
224 , pending_locate_frame (0)
225 , pending_locate_flush (false)
226 , pending_abort (false)
227 , pending_auto_loop (false)
228 , _butler (new Butler (*this))
229 , _post_transport_work (0)
230 , cumulative_rf_motion (0)
232 , _locations (new Locations (*this))
233 , _ignore_skips_updates (false)
234 , _rt_thread_active (false)
235 , _rt_emit_pending (false)
237 , outbound_mtc_timecode_frame (0)
238 , next_quarter_frame_to_send (-1)
239 , _frames_per_timecode_frame (0)
240 , _frames_per_hour (0)
241 , _timecode_frames_per_hour (0)
242 , last_timecode_valid (false)
243 , last_timecode_when (0)
244 , _send_timecode_update (false)
256 , ltc_timecode_offset (0)
257 , ltc_timecode_negative_offset (false)
258 , midi_control_ui (0)
260 , _all_route_group (new RouteGroup (*this, "all"))
261 , routes (new RouteList)
262 , _adding_routes_in_progress (false)
263 , _reconnecting_routes_in_progress (false)
264 , _route_deletion_in_progress (false)
265 , destructive_index (0)
266 , _track_number_decimals(1)
267 , default_fade_steepness (0)
268 , default_fade_msecs (0)
269 , _total_free_4k_blocks (0)
270 , _total_free_4k_blocks_uncertain (false)
271 , no_questions_about_missing_files (false)
274 , _bundles (new BundleList)
275 , _bundle_xml_node (0)
279 , click_emphasis_data (0)
281 , click_emphasis_length (0)
282 , _clicks_cleared (0)
283 , _play_range (false)
284 , _range_selection (-1,-1)
285 , _object_selection (-1,-1)
287 , first_file_data_format_reset (true)
288 , first_file_header_format_reset (true)
289 , have_looped (false)
290 , _have_rec_enabled_track (false)
291 , _have_rec_disabled_track (true)
293 , _suspend_timecode_transmission (0)
294 , _speakers (new Speakers)
296 , ignore_route_processor_changes (false)
303 pthread_mutex_init (&_rt_emit_mutex, 0);
304 pthread_cond_init (&_rt_emit_cond, 0);
306 pre_engine_init (fullpath);
310 Stateful::loading_state_version = CURRENT_SESSION_FILE_VERSION;
312 #ifdef USE_TRACKS_CODE_FEATURES
313 sr = EngineStateController::instance()->get_current_sample_rate();
315 if (ensure_engine (sr)) {
317 throw SessionException (_("Cannot connect to audio/midi engine"));
320 if (create (mix_template, bus_profile)) {
322 throw SessionException (_("Session initialization failed"));
325 /* if a mix template was provided, then ::create() will
326 * have copied it into the session and we need to load it
327 * so that we have the state ready for ::set_state()
328 * after the engine is started.
330 * Note that we do NOT try to get the sample rate from
331 * the template at this time, though doing so would
332 * be easy if we decided this was an appropriate part
336 if (!mix_template.empty()) {
337 if (load_state (_current_snapshot_name)) {
338 throw SessionException (_("Failed to load template/snapshot state"));
340 store_recent_templates (mix_template);
343 /* load default session properties - if any */
348 if (load_state (_current_snapshot_name)) {
349 throw SessionException (_("Failed to load state"));
352 /* try to get sample rate from XML state so that we
353 * can influence the SR if we set up the audio
358 const XMLProperty* prop;
359 if ((prop = state_tree->root()->property (X_("sample-rate"))) != 0) {
360 sr = atoi (prop->value());
364 if (ensure_engine (sr)) {
366 throw SessionException (_("Cannot connect to audio/midi engine"));
370 if (post_engine_init ()) {
372 throw SessionException (_("Cannot configure audio/midi engine with session parameters"));
375 store_recent_sessions (_name, _path);
377 bool was_dirty = dirty();
379 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
381 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
382 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
385 DirtyChanged (); /* EMIT SIGNAL */
388 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
389 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
391 emit_thread_start ();
393 /* hook us up to the engine since we are now completely constructed */
395 BootMessage (_("Connect to engine"));
397 _engine.set_session (this);
398 _engine.reset_timebase ();
400 #ifdef USE_TRACKS_CODE_FEATURES
402 EngineStateController::instance()->set_session(this);
405 if ( ARDOUR::Profile->get_trx () ) {
407 /* Waves Tracks: fill session with tracks basing on the amount of inputs.
408 * each available input must have corresponding track when session starts.
411 uint32_t how_many (0);
413 std::vector<std::string> inputs;
414 EngineStateController::instance()->get_physical_audio_inputs(inputs);
416 how_many = inputs.size();
418 list<boost::shared_ptr<AudioTrack> > tracks;
420 // Track names after driver
421 if (Config->get_tracks_auto_naming() == NameAfterDriver) {
422 string track_name = "";
423 for (std::vector<string>::size_type i = 0; i < inputs.size(); ++i) {
425 track_name = inputs[i];
426 replace_all (track_name, "system:capture", "");
428 list<boost::shared_ptr<AudioTrack> > single_track = new_audio_track (1, 1, Normal, 0, 1, track_name);
429 tracks.insert(tracks.begin(), single_track.front());
431 } else { // Default track names
432 tracks = new_audio_track (1, 1, Normal, 0, how_many, string());
435 if (tracks.size() != how_many) {
437 throw failed_constructor ();
446 BootMessage (_("Session loading complete"));
458 Session::ensure_engine (uint32_t desired_sample_rate)
460 if (_engine.current_backend() == 0) {
461 /* backend is unknown ... */
462 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
463 if (r.get_value_or (-1) != 0) {
466 } else if (_engine.setup_required()) {
467 /* backend is known, but setup is needed */
468 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
469 if (r.get_value_or (-1) != 0) {
472 } else if (!_engine.running()) {
473 if (_engine.start()) {
478 /* at this point the engine should be running
481 if (!_engine.running()) {
485 return immediately_post_engine ();
490 Session::immediately_post_engine ()
492 /* Do various initializations that should take place directly after we
493 * know that the engine is running, but before we either create a
494 * session or set state for an existing one.
497 if (how_many_dsp_threads () > 1) {
498 /* For now, only create the graph if we are using >1 DSP threads, as
499 it is a bit slower than the old code with 1 thread.
501 _process_graph.reset (new Graph (*this));
504 /* every time we reconnect, recompute worst case output latencies */
506 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
508 if (synced_to_engine()) {
509 _engine.transport_stop ();
512 if (config.get_jack_time_master()) {
513 _engine.transport_locate (_transport_frame);
517 BootMessage (_("Set up LTC"));
519 BootMessage (_("Set up Click"));
521 BootMessage (_("Set up standard connections"));
525 catch (failed_constructor& err) {
529 /* TODO, connect in different thread. (PortRegisteredOrUnregistered may be in RT context)
531 _engine.PortRegisteredOrUnregistered.connect_same_thread (*this, boost::bind (&Session::setup_bundles, this));
539 vector<void*> debug_pointers;
541 /* if we got to here, leaving pending capture state around
545 remove_pending_capture_state ();
547 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
549 /* disconnect from any and all signals that we are connected to */
553 /* shutdown control surface protocols while we still have ports
554 and the engine to move data to any devices.
557 ControlProtocolManager::instance().drop_protocols ();
559 MIDI::Name::MidiPatchManager::instance().remove_search_path(session_directory().midi_patch_path());
561 _engine.remove_session ();
563 #ifdef USE_TRACKS_CODE_FEATURES
564 EngineStateController::instance()->remove_session();
567 /* deregister all ports - there will be no process or any other
568 * callbacks from the engine any more.
571 Port::PortDrop (); /* EMIT SIGNAL */
575 /* clear history so that no references to objects are held any more */
579 /* clear state tree so that no references to objects are held any more */
584 /* reset dynamic state version back to default */
586 Stateful::loading_state_version = 0;
588 _butler->drop_references ();
592 delete _all_route_group;
594 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
595 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
599 if (click_data != default_click) {
600 delete [] click_data;
603 if (click_emphasis_data != default_click_emphasis) {
604 delete [] click_emphasis_data;
609 /* need to remove auditioner before monitoring section
610 * otherwise it is re-connected */
613 /* drop references to routes held by the monitoring section
614 * specifically _monitor_out aux/listen references */
615 remove_monitor_section();
617 /* clear out any pending dead wood from RCU managed objects */
622 AudioDiskstream::free_working_buffers();
624 /* tell everyone who is still standing that we're about to die */
627 /* tell everyone to drop references and delete objects as we go */
629 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
630 RegionFactory::delete_all_regions ();
632 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
634 /* reset these three references to special routes before we do the usual route delete thing */
636 _master_out.reset ();
637 _monitor_out.reset ();
640 RCUWriter<RouteList> writer (routes);
641 boost::shared_ptr<RouteList> r = writer.get_copy ();
643 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
644 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
645 (*i)->drop_references ();
649 /* writer goes out of scope and updates master */
654 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
655 Glib::Threads::Mutex::Lock lm (source_lock);
656 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
657 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
658 i->second->drop_references ();
664 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
667 emit_thread_terminate ();
669 pthread_cond_destroy (&_rt_emit_cond);
670 pthread_mutex_destroy (&_rt_emit_mutex);
672 delete _scene_changer; _scene_changer = 0;
673 delete midi_control_ui; midi_control_ui = 0;
675 delete _mmc; _mmc = 0;
676 delete _midi_ports; _midi_ports = 0;
677 delete _locations; _locations = 0;
681 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
683 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
684 boost_debug_list_ptrs ();
689 Session::setup_ltc ()
693 _ltc_input.reset (new IO (*this, X_("LTC In"), IO::Input));
694 _ltc_output.reset (new IO (*this, X_("LTC Out"), IO::Output));
696 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC In"))) != 0) {
697 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
700 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
701 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
703 reconnect_ltc_input ();
706 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC Out"))) != 0) {
707 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
710 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
711 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
713 reconnect_ltc_output ();
716 /* fix up names of LTC ports because we don't want the normal
717 * IO style of NAME/TYPE-{in,out}N
720 _ltc_input->nth (0)->set_name (X_("LTC-in"));
721 _ltc_output->nth (0)->set_name (X_("LTC-out"));
725 Session::setup_click ()
728 _click_io.reset (new ClickIO (*this, X_("Click")));
729 _click_gain.reset (new Amp (*this));
730 _click_gain->activate ();
732 setup_click_state (state_tree->root());
734 setup_click_state (0);
739 Session::setup_click_state (const XMLNode* node)
741 const XMLNode* child = 0;
743 if (node && (child = find_named_node (*node, "Click")) != 0) {
745 /* existing state for Click */
748 if (Stateful::loading_state_version < 3000) {
749 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
751 const XMLNodeList& children (child->children());
752 XMLNodeList::const_iterator i = children.begin();
753 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
755 if (i != children.end()) {
756 c = _click_gain->set_state (**i, Stateful::loading_state_version);
762 _clicking = Config->get_clicking ();
766 error << _("could not setup Click I/O") << endmsg;
773 /* default state for Click: dual-mono to first 2 physical outputs */
776 _engine.get_physical_outputs (DataType::AUDIO, outs);
778 for (uint32_t physport = 0; physport < 2; ++physport) {
779 if (outs.size() > physport) {
780 if (_click_io->add_port (outs[physport], this)) {
781 // relax, even though its an error
786 if (_click_io->n_ports () > ChanCount::ZERO) {
787 _clicking = Config->get_clicking ();
793 Session::setup_bundles ()
797 RCUWriter<BundleList> writer (_bundles);
798 boost::shared_ptr<BundleList> b = writer.get_copy ();
799 for (BundleList::iterator i = b->begin(); i != b->end();) {
800 if (boost::dynamic_pointer_cast<UserBundle>(*i)) {
808 vector<string> inputs[DataType::num_types];
809 vector<string> outputs[DataType::num_types];
810 for (uint32_t i = 0; i < DataType::num_types; ++i) {
811 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
812 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
815 /* Create a set of Bundle objects that map
816 to the physical I/O currently available. We create both
817 mono and stereo bundles, so that the common cases of mono
818 and stereo tracks get bundles to put in their mixer strip
819 in / out menus. There may be a nicer way of achieving that;
820 it doesn't really scale that well to higher channel counts
823 /* mono output bundles */
825 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
827 std::string pn = _engine.get_pretty_name_by_name (outputs[DataType::AUDIO][np]);
829 snprintf (buf, sizeof (buf), _("out %s"), pn.c_str());
831 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
834 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
835 c->add_channel (_("mono"), DataType::AUDIO);
836 c->set_port (0, outputs[DataType::AUDIO][np]);
838 add_bundle (c, false);
841 /* stereo output bundles */
843 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
844 if (np + 1 < outputs[DataType::AUDIO].size()) {
846 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
847 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
848 c->add_channel (_("L"), DataType::AUDIO);
849 c->set_port (0, outputs[DataType::AUDIO][np]);
850 c->add_channel (_("R"), DataType::AUDIO);
851 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
853 add_bundle (c, false);
857 /* mono input bundles */
859 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
861 std::string pn = _engine.get_pretty_name_by_name (inputs[DataType::AUDIO][np]);
863 snprintf (buf, sizeof (buf), _("in %s"), pn.c_str());
865 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
868 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
869 c->add_channel (_("mono"), DataType::AUDIO);
870 c->set_port (0, inputs[DataType::AUDIO][np]);
872 add_bundle (c, false);
875 /* stereo input bundles */
877 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
878 if (np + 1 < inputs[DataType::AUDIO].size()) {
880 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
882 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
883 c->add_channel (_("L"), DataType::AUDIO);
884 c->set_port (0, inputs[DataType::AUDIO][np]);
885 c->add_channel (_("R"), DataType::AUDIO);
886 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
888 add_bundle (c, false);
892 /* MIDI input bundles */
894 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
895 string n = inputs[DataType::MIDI][np];
896 std::string pn = _engine.get_pretty_name_by_name (n);
900 boost::erase_first (n, X_("alsa_pcm:"));
902 boost::shared_ptr<Bundle> c (new Bundle (n, false));
903 c->add_channel ("", DataType::MIDI);
904 c->set_port (0, inputs[DataType::MIDI][np]);
905 add_bundle (c, false);
908 /* MIDI output bundles */
910 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
911 string n = outputs[DataType::MIDI][np];
912 std::string pn = _engine.get_pretty_name_by_name (n);
916 boost::erase_first (n, X_("alsa_pcm:"));
918 boost::shared_ptr<Bundle> c (new Bundle (n, true));
919 c->add_channel ("", DataType::MIDI);
920 c->set_port (0, outputs[DataType::MIDI][np]);
921 add_bundle (c, false);
924 // we trust the backend to only calls us if there's a change
925 BundleAddedOrRemoved (); /* EMIT SIGNAL */
929 Session::auto_connect_master_bus ()
931 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
935 // Waves Tracks: Do not connect master bas for Tracks if AutoConnectMaster option is not set
936 // In this case it means "Multi Out" output mode
937 if (ARDOUR::Profile->get_trx() && !(Config->get_output_auto_connect() & AutoConnectMaster) ) {
941 /* if requested auto-connect the outputs to the first N physical ports.
944 uint32_t limit = _master_out->n_outputs().n_total();
945 vector<string> outputs[DataType::num_types];
947 for (uint32_t i = 0; i < DataType::num_types; ++i) {
948 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
951 for (uint32_t n = 0; n < limit; ++n) {
952 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
954 if (outputs[p->type()].size() > n) {
955 connect_to = outputs[p->type()][n];
958 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
959 if (_master_out->output()->connect (p, connect_to, this)) {
960 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
969 Session::remove_monitor_section ()
971 if (!_monitor_out || Profile->get_trx()) {
975 /* force reversion to Solo-In-Place */
976 Config->set_solo_control_is_listen_control (false);
978 /* if we are auditioning, cancel it ... this is a workaround
979 to a problem (auditioning does not execute the process graph,
980 which is needed to remove routes when using >1 core for processing)
985 /* Hold process lock while doing this so that we don't hear bits and
986 * pieces of audio as we work on each route.
989 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
991 /* Connect tracks to monitor section. Note that in an
992 existing session, the internal sends will already exist, but we want the
993 routes to notice that they connect to the control out specifically.
997 boost::shared_ptr<RouteList> r = routes.reader ();
998 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1000 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
1002 if ((*x)->is_monitor()) {
1004 } else if ((*x)->is_master()) {
1007 (*x)->remove_aux_or_listen (_monitor_out);
1012 remove_route (_monitor_out);
1013 auto_connect_master_bus ();
1016 auditioner->connect ();
1021 Session::add_monitor_section ()
1025 if (_monitor_out || !_master_out || Profile->get_trx()) {
1029 boost::shared_ptr<Route> r (new Route (*this, _("Monitor"), Route::MonitorOut, DataType::AUDIO));
1035 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1036 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
1039 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1040 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1041 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1043 error << _("Cannot create monitor section. 'Monitor' Port name is not unique.") << endmsg;
1048 add_routes (rl, false, false, false);
1050 assert (_monitor_out);
1052 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
1053 are undefined, at best.
1056 uint32_t limit = _monitor_out->n_inputs().n_audio();
1060 /* connect the inputs to the master bus outputs. this
1061 * represents a separate data feed from the internal sends from
1062 * each route. as of jan 2011, it allows the monitor section to
1063 * conditionally ignore either the internal sends or the normal
1064 * input feed, but we should really find a better way to do
1068 _master_out->output()->disconnect (this);
1070 for (uint32_t n = 0; n < limit; ++n) {
1071 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1072 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1075 string connect_to = o->name();
1076 if (_monitor_out->input()->connect (p, connect_to, this)) {
1077 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1085 /* if monitor section is not connected, connect it to physical outs
1088 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
1090 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1092 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1095 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1097 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1098 Config->get_monitor_bus_preferred_bundle())
1104 /* Monitor bus is audio only */
1106 vector<string> outputs[DataType::num_types];
1108 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1109 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1112 uint32_t mod = outputs[DataType::AUDIO].size();
1113 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1117 for (uint32_t n = 0; n < limit; ++n) {
1119 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1121 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1122 connect_to = outputs[DataType::AUDIO][n % mod];
1125 if (!connect_to.empty()) {
1126 if (_monitor_out->output()->connect (p, connect_to, this)) {
1127 error << string_compose (
1128 _("cannot connect control output %1 to %2"),
1139 /* Hold process lock while doing this so that we don't hear bits and
1140 * pieces of audio as we work on each route.
1143 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1145 /* Connect tracks to monitor section. Note that in an
1146 existing session, the internal sends will already exist, but we want the
1147 routes to notice that they connect to the control out specifically.
1151 boost::shared_ptr<RouteList> rls = routes.reader ();
1153 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1155 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1157 if ((*x)->is_monitor()) {
1159 } else if ((*x)->is_master()) {
1162 (*x)->enable_monitor_send ();
1167 auditioner->connect ();
1172 Session::reset_monitor_section ()
1174 /* Process lock should be held by the caller.*/
1176 if (!_monitor_out || Profile->get_trx()) {
1180 uint32_t limit = _master_out->n_outputs().n_audio();
1182 /* connect the inputs to the master bus outputs. this
1183 * represents a separate data feed from the internal sends from
1184 * each route. as of jan 2011, it allows the monitor section to
1185 * conditionally ignore either the internal sends or the normal
1186 * input feed, but we should really find a better way to do
1190 _master_out->output()->disconnect (this);
1191 _monitor_out->output()->disconnect (this);
1193 _monitor_out->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1194 _monitor_out->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1196 for (uint32_t n = 0; n < limit; ++n) {
1197 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1198 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1201 string connect_to = o->name();
1202 if (_monitor_out->input()->connect (p, connect_to, this)) {
1203 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1210 /* connect monitor section to physical outs
1213 if (Config->get_auto_connect_standard_busses()) {
1215 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1217 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1220 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1222 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1223 Config->get_monitor_bus_preferred_bundle())
1229 /* Monitor bus is audio only */
1231 vector<string> outputs[DataType::num_types];
1233 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1234 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1237 uint32_t mod = outputs[DataType::AUDIO].size();
1238 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1242 for (uint32_t n = 0; n < limit; ++n) {
1244 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1246 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1247 connect_to = outputs[DataType::AUDIO][n % mod];
1250 if (!connect_to.empty()) {
1251 if (_monitor_out->output()->connect (p, connect_to, this)) {
1252 error << string_compose (
1253 _("cannot connect control output %1 to %2"),
1264 /* Connect tracks to monitor section. Note that in an
1265 existing session, the internal sends will already exist, but we want the
1266 routes to notice that they connect to the control out specifically.
1270 boost::shared_ptr<RouteList> rls = routes.reader ();
1272 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1274 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1276 if ((*x)->is_monitor()) {
1278 } else if ((*x)->is_master()) {
1281 (*x)->enable_monitor_send ();
1287 Session::hookup_io ()
1289 /* stop graph reordering notifications from
1290 causing resorts, etc.
1293 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
1297 /* we delay creating the auditioner till now because
1298 it makes its own connections to ports.
1302 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
1304 throw failed_constructor ();
1306 a->use_new_diskstream ();
1310 catch (failed_constructor& err) {
1311 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
1315 /* load bundles, which we may have postponed earlier on */
1316 if (_bundle_xml_node) {
1317 load_bundles (*_bundle_xml_node);
1318 delete _bundle_xml_node;
1321 /* Tell all IO objects to connect themselves together */
1323 IO::enable_connecting ();
1325 /* Now tell all "floating" ports to connect to whatever
1326 they should be connected to.
1329 AudioEngine::instance()->reconnect_ports ();
1331 /* Anyone who cares about input state, wake up and do something */
1333 IOConnectionsComplete (); /* EMIT SIGNAL */
1335 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
1337 /* now handle the whole enchilada as if it was one
1338 graph reorder event.
1343 /* update the full solo state, which can't be
1344 correctly determined on a per-route basis, but
1345 needs the global overview that only the session
1349 update_route_solo_state ();
1353 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
1355 boost::shared_ptr<Track> track = wp.lock ();
1360 boost::shared_ptr<Playlist> playlist;
1362 if ((playlist = track->playlist()) != 0) {
1363 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
1364 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
1365 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
1370 Session::record_enabling_legal () const
1372 /* this used to be in here, but survey says.... we don't need to restrict it */
1373 // if (record_status() == Recording) {
1377 if (Config->get_all_safe()) {
1384 Session::set_track_monitor_input_status (bool yn)
1386 boost::shared_ptr<RouteList> rl = routes.reader ();
1387 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1388 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1389 if (tr && tr->record_enabled ()) {
1390 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1391 tr->request_input_monitoring (yn);
1397 Session::auto_punch_start_changed (Location* location)
1399 replace_event (SessionEvent::PunchIn, location->start());
1401 if (get_record_enabled() && config.get_punch_in()) {
1402 /* capture start has been changed, so save new pending state */
1403 save_state ("", true);
1408 Session::auto_punch_end_changed (Location* location)
1410 framepos_t when_to_stop = location->end();
1411 // when_to_stop += _worst_output_latency + _worst_input_latency;
1412 replace_event (SessionEvent::PunchOut, when_to_stop);
1416 Session::auto_punch_changed (Location* location)
1418 framepos_t when_to_stop = location->end();
1420 replace_event (SessionEvent::PunchIn, location->start());
1421 //when_to_stop += _worst_output_latency + _worst_input_latency;
1422 replace_event (SessionEvent::PunchOut, when_to_stop);
1425 /** @param loc A loop location.
1426 * @param pos Filled in with the start time of the required fade-out (in session frames).
1427 * @param length Filled in with the length of the required fade-out.
1430 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
1432 pos = max (loc->start(), loc->end() - 64);
1433 length = loc->end() - pos;
1437 Session::auto_loop_changed (Location* location)
1439 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1442 auto_loop_declick_range (location, dcp, dcl);
1444 if (transport_rolling() && play_loop) {
1446 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1448 // if (_transport_frame > location->end()) {
1450 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1451 // relocate to beginning of loop
1452 clear_events (SessionEvent::LocateRoll);
1454 request_locate (location->start(), true);
1457 else if (Config->get_seamless_loop() && !loop_changing) {
1459 // schedule a locate-roll to refill the diskstreams at the
1460 // previous loop end
1461 loop_changing = true;
1463 if (location->end() > last_loopend) {
1464 clear_events (SessionEvent::LocateRoll);
1465 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1471 clear_events (SessionEvent::AutoLoopDeclick);
1472 clear_events (SessionEvent::AutoLoop);
1475 /* possibly move playhead if not rolling; if we are rolling we'll move
1476 to the loop start on stop if that is appropriate.
1481 if (!transport_rolling() && select_playhead_priority_target (pos)) {
1482 if (pos == location->start()) {
1483 request_locate (pos);
1488 last_loopend = location->end();
1493 Session::set_auto_punch_location (Location* location)
1497 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1498 punch_connections.drop_connections();
1499 existing->set_auto_punch (false, this);
1500 remove_event (existing->start(), SessionEvent::PunchIn);
1501 clear_events (SessionEvent::PunchOut);
1502 auto_punch_location_changed (0);
1507 if (location == 0) {
1511 if (location->end() <= location->start()) {
1512 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1516 punch_connections.drop_connections ();
1518 location->StartChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, location));
1519 location->EndChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, location));
1520 location->Changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, location));
1522 location->set_auto_punch (true, this);
1524 auto_punch_changed (location);
1526 auto_punch_location_changed (location);
1530 Session::set_session_extents (framepos_t start, framepos_t end)
1533 if ((existing = _locations->session_range_location()) == 0) {
1534 //if there is no existing session, we need to make a new session location (should never happen)
1535 existing = new Location (*this, 0, 0, _("session"), Location::IsSessionRange);
1539 error << _("Session: you can't use that location for session start/end)") << endmsg;
1543 existing->set( start, end );
1549 Session::set_auto_loop_location (Location* location)
1553 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1554 loop_connections.drop_connections ();
1555 existing->set_auto_loop (false, this);
1556 remove_event (existing->end(), SessionEvent::AutoLoop);
1559 auto_loop_declick_range (existing, dcp, dcl);
1560 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1561 auto_loop_location_changed (0);
1566 if (location == 0) {
1570 if (location->end() <= location->start()) {
1571 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1575 last_loopend = location->end();
1577 loop_connections.drop_connections ();
1579 location->StartChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1580 location->EndChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1581 location->Changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1582 location->FlagsChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1584 location->set_auto_loop (true, this);
1586 if (Config->get_loop_is_mode() && play_loop && Config->get_seamless_loop()) {
1587 // set all tracks to use internal looping
1588 boost::shared_ptr<RouteList> rl = routes.reader ();
1589 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1590 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1591 if (tr && !tr->hidden()) {
1592 tr->set_loop (location);
1597 /* take care of our stuff first */
1599 auto_loop_changed (location);
1601 /* now tell everyone else */
1603 auto_loop_location_changed (location);
1607 Session::update_marks (Location*)
1613 Session::update_skips (Location* loc, bool consolidate)
1615 if (_ignore_skips_updates) {
1619 Locations::LocationList skips;
1622 PBD::Unwinder<bool> uw (_ignore_skips_updates, true);
1623 consolidate_skips (loc);
1626 sync_locations_to_skips ();
1632 Session::consolidate_skips (Location* loc)
1634 Locations::LocationList all_locations = _locations->list ();
1636 for (Locations::LocationList::iterator l = all_locations.begin(); l != all_locations.end(); ) {
1638 if (!(*l)->is_skip ()) {
1643 /* don't test against self */
1650 switch (Evoral::coverage ((*l)->start(), (*l)->end(), loc->start(), loc->end())) {
1651 case Evoral::OverlapInternal:
1652 case Evoral::OverlapExternal:
1653 case Evoral::OverlapStart:
1654 case Evoral::OverlapEnd:
1655 /* adjust new location to cover existing one */
1656 loc->set_start (min (loc->start(), (*l)->start()));
1657 loc->set_end (max (loc->end(), (*l)->end()));
1658 /* we don't need this one any more */
1659 _locations->remove (*l);
1660 /* the location has been deleted, so remove reference to it in our local list */
1661 l = all_locations.erase (l);
1664 case Evoral::OverlapNone:
1672 Session::sync_locations_to_skips ()
1674 /* This happens asynchronously (in the audioengine thread). After the clear is done, we will call
1675 * Session::_sync_locations_to_skips() from the audioengine thread.
1677 clear_events (SessionEvent::Skip, boost::bind (&Session::_sync_locations_to_skips, this));
1681 Session::_sync_locations_to_skips ()
1683 /* called as a callback after existing Skip events have been cleared from a realtime audioengine thread */
1685 Locations::LocationList const & locs (_locations->list());
1687 for (Locations::LocationList::const_iterator i = locs.begin(); i != locs.end(); ++i) {
1689 Location* location = *i;
1691 if (location->is_skip() && location->is_skipping()) {
1692 SessionEvent* ev = new SessionEvent (SessionEvent::Skip, SessionEvent::Add, location->start(), location->end(), 1.0);
1700 Session::location_added (Location *location)
1702 if (location->is_auto_punch()) {
1703 set_auto_punch_location (location);
1706 if (location->is_auto_loop()) {
1707 set_auto_loop_location (location);
1710 if (location->is_session_range()) {
1711 /* no need for any signal handling or event setting with the session range,
1712 because we keep a direct reference to it and use its start/end directly.
1714 _session_range_location = location;
1717 if (location->is_mark()) {
1718 /* listen for per-location signals that require us to do any * global updates for marks */
1720 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1721 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1722 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1723 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1726 if (location->is_skip()) {
1727 /* listen for per-location signals that require us to update skip-locate events */
1729 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1730 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1731 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1732 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, false));
1734 update_skips (location, true);
1741 Session::location_removed (Location *location)
1743 if (location->is_auto_loop()) {
1744 set_auto_loop_location (0);
1745 set_track_loop (false);
1748 if (location->is_auto_punch()) {
1749 set_auto_punch_location (0);
1752 if (location->is_session_range()) {
1753 /* this is never supposed to happen */
1754 error << _("programming error: session range removed!") << endl;
1757 if (location->is_skip()) {
1759 update_skips (location, false);
1766 Session::locations_changed ()
1768 _locations->apply (*this, &Session::_locations_changed);
1772 Session::_locations_changed (const Locations::LocationList& locations)
1774 /* There was some mass-change in the Locations object.
1776 We might be re-adding a location here but it doesn't actually matter
1777 for all the locations that the Session takes an interest in.
1781 PBD::Unwinder<bool> protect_ignore_skip_updates (_ignore_skips_updates, true);
1782 for (Locations::LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
1783 location_added (*i);
1787 update_skips (NULL, false);
1791 Session::enable_record ()
1793 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1794 /* no recording at anything except normal speed */
1799 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1801 if (rs == Recording) {
1805 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1807 _last_record_location = _transport_frame;
1808 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1810 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1811 set_track_monitor_input_status (true);
1814 RecordStateChanged ();
1821 Session::disable_record (bool rt_context, bool force)
1825 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1827 if (!Config->get_latched_record_enable () || force) {
1828 g_atomic_int_set (&_record_status, Disabled);
1829 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1831 if (rs == Recording) {
1832 g_atomic_int_set (&_record_status, Enabled);
1836 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1837 set_track_monitor_input_status (false);
1840 RecordStateChanged (); /* emit signal */
1843 remove_pending_capture_state ();
1849 Session::step_back_from_record ()
1851 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1853 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1854 set_track_monitor_input_status (false);
1857 RecordStateChanged (); /* emit signal */
1862 Session::maybe_enable_record ()
1864 if (_step_editors > 0) {
1868 g_atomic_int_set (&_record_status, Enabled);
1870 /* This function is currently called from somewhere other than an RT thread.
1871 This save_state() call therefore doesn't impact anything. Doing it here
1872 means that we save pending state of which sources the next record will use,
1873 which gives us some chance of recovering from a crash during the record.
1876 save_state ("", true);
1878 if (_transport_speed) {
1879 if (!config.get_punch_in()) {
1883 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1884 RecordStateChanged (); /* EMIT SIGNAL */
1891 Session::audible_frame () const
1897 offset = worst_playback_latency ();
1899 if (synced_to_engine()) {
1900 /* Note: this is basically just sync-to-JACK */
1901 tf = _engine.transport_frame();
1903 tf = _transport_frame;
1908 if (!non_realtime_work_pending()) {
1912 /* Check to see if we have passed the first guaranteed
1913 audible frame past our last start position. if not,
1914 return that last start point because in terms
1915 of audible frames, we have not moved yet.
1917 `Start position' in this context means the time we last
1918 either started, located, or changed transport direction.
1921 if (_transport_speed > 0.0f) {
1923 if (!play_loop || !have_looped) {
1924 if (tf < _last_roll_or_reversal_location + offset) {
1925 return _last_roll_or_reversal_location;
1933 } else if (_transport_speed < 0.0f) {
1935 /* XXX wot? no backward looping? */
1937 if (tf > _last_roll_or_reversal_location - offset) {
1938 return _last_roll_or_reversal_location;
1950 Session::set_frame_rate (framecnt_t frames_per_second)
1952 /** \fn void Session::set_frame_size(framecnt_t)
1953 the AudioEngine object that calls this guarantees
1954 that it will not be called while we are also in
1955 ::process(). Its fine to do things that block
1959 _base_frame_rate = frames_per_second;
1960 _nominal_frame_rate = frames_per_second;
1965 reset_write_sources (false);
1967 // XXX we need some equivalent to this, somehow
1968 // SndFileSource::setup_standard_crossfades (frames_per_second);
1972 /* XXX need to reset/reinstantiate all LADSPA plugins */
1976 Session::set_block_size (pframes_t nframes)
1978 /* the AudioEngine guarantees
1979 that it will not be called while we are also in
1980 ::process(). It is therefore fine to do things that block
1985 current_block_size = nframes;
1989 boost::shared_ptr<RouteList> r = routes.reader ();
1991 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1992 (*i)->set_block_size (nframes);
1995 boost::shared_ptr<RouteList> rl = routes.reader ();
1996 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1997 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1999 tr->set_block_size (nframes);
2003 set_worst_io_latencies ();
2009 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
2011 boost::shared_ptr<Route> r2;
2013 if (r1->feeds (rbase) && rbase->feeds (r1)) {
2014 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
2018 /* make a copy of the existing list of routes that feed r1 */
2020 Route::FedBy existing (r1->fed_by());
2022 /* for each route that feeds r1, recurse, marking it as feeding
2026 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
2027 if (!(r2 = i->r.lock ())) {
2028 /* (*i) went away, ignore it */
2032 /* r2 is a route that feeds r1 which somehow feeds base. mark
2033 base as being fed by r2
2036 rbase->add_fed_by (r2, i->sends_only);
2040 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
2044 if (r1->feeds (r2) && r2->feeds (r1)) {
2048 /* now recurse, so that we can mark base as being fed by
2049 all routes that feed r2
2052 trace_terminal (r2, rbase);
2059 Session::resort_routes ()
2061 /* don't do anything here with signals emitted
2062 by Routes during initial setup or while we
2063 are being destroyed.
2066 if (_state_of_the_state & (InitialConnecting | Deletion)) {
2070 if (_route_deletion_in_progress) {
2075 RCUWriter<RouteList> writer (routes);
2076 boost::shared_ptr<RouteList> r = writer.get_copy ();
2077 resort_routes_using (r);
2078 /* writer goes out of scope and forces update */
2082 boost::shared_ptr<RouteList> rl = routes.reader ();
2083 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2084 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
2086 const Route::FedBy& fb ((*i)->fed_by());
2088 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
2089 boost::shared_ptr<Route> sf = f->r.lock();
2091 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
2099 /** This is called whenever we need to rebuild the graph of how we will process
2101 * @param r List of routes, in any order.
2105 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
2107 /* We are going to build a directed graph of our routes;
2108 this is where the edges of that graph are put.
2113 /* Go through all routes doing two things:
2115 * 1. Collect the edges of the route graph. Each of these edges
2116 * is a pair of routes, one of which directly feeds the other
2117 * either by a JACK connection or by an internal send.
2119 * 2. Begin the process of making routes aware of which other
2120 * routes directly or indirectly feed them. This information
2121 * is used by the solo code.
2124 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2126 /* Clear out the route's list of direct or indirect feeds */
2127 (*i)->clear_fed_by ();
2129 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
2131 bool via_sends_only;
2133 /* See if this *j feeds *i according to the current state of the JACK
2134 connections and internal sends.
2136 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
2137 /* add the edge to the graph (part #1) */
2138 edges.add (*j, *i, via_sends_only);
2139 /* tell the route (for part #2) */
2140 (*i)->add_fed_by (*j, via_sends_only);
2145 /* Attempt a topological sort of the route graph */
2146 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
2148 if (sorted_routes) {
2149 /* We got a satisfactory topological sort, so there is no feedback;
2152 Note: the process graph rechain does not require a
2153 topologically-sorted list, but hey ho.
2155 if (_process_graph) {
2156 _process_graph->rechain (sorted_routes, edges);
2159 _current_route_graph = edges;
2161 /* Complete the building of the routes' lists of what directly
2162 or indirectly feeds them.
2164 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2165 trace_terminal (*i, *i);
2168 *r = *sorted_routes;
2171 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
2172 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2173 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
2174 (*i)->name(), (*i)->order_key ()));
2178 SuccessfulGraphSort (); /* EMIT SIGNAL */
2181 /* The topological sort failed, so we have a problem. Tell everyone
2182 and stick to the old graph; this will continue to be processed, so
2183 until the feedback is fixed, what is played back will not quite
2184 reflect what is actually connected. Note also that we do not
2185 do trace_terminal here, as it would fail due to an endless recursion,
2186 so the solo code will think that everything is still connected
2190 FeedbackDetected (); /* EMIT SIGNAL */
2195 /** Find a route name starting with \a base, maybe followed by the
2196 * lowest \a id. \a id will always be added if \a definitely_add_number
2197 * is true on entry; otherwise it will only be added if required
2198 * to make the name unique.
2200 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
2201 * The available route name with the lowest ID will be used, and \a id
2202 * will be set to the ID.
2204 * \return false if a route name could not be found, and \a track_name
2205 * and \a id do not reflect a free route name.
2208 Session::find_route_name (string const & base, uint32_t& id, string& name, bool definitely_add_number)
2210 /* the base may conflict with ports that do not belong to existing
2211 routes, but hidden objects like the click track. So check port names
2212 before anything else.
2215 for (vector<string>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
2216 if (base == *reserved) {
2217 definitely_add_number = true;
2225 if (!definitely_add_number && route_by_name (base) == 0) {
2226 /* juse use the base */
2232 name = string_compose ("%1 %2", base, id);
2234 if (route_by_name (name) == 0) {
2240 } while (id < (UINT_MAX-1));
2245 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
2247 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
2249 in = ChanCount::ZERO;
2250 out = ChanCount::ZERO;
2252 boost::shared_ptr<RouteList> r = routes.reader ();
2254 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2255 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2256 if (tr && !tr->is_auditioner()) {
2257 in += tr->n_inputs();
2258 out += tr->n_outputs();
2264 Session::default_track_name_pattern (DataType t)
2267 case DataType::AUDIO:
2268 if (Profile->get_trx()) {
2275 case DataType::MIDI:
2282 /** Caller must not hold process lock
2283 * @param name_template string to use for the start of the name, or "" to use "MIDI".
2284 * @param instrument plugin info for the instrument to insert pre-fader, if any
2286 list<boost::shared_ptr<MidiTrack> >
2287 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
2288 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
2291 uint32_t track_id = 0;
2293 RouteList new_routes;
2294 list<boost::shared_ptr<MidiTrack> > ret;
2296 const string name_pattern = default_track_name_pattern (DataType::MIDI);
2297 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
2300 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, use_number)) {
2301 error << "cannot find name for new midi track" << endmsg;
2305 boost::shared_ptr<MidiTrack> track;
2308 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
2310 if (track->init ()) {
2314 track->use_new_diskstream();
2316 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2317 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2320 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2321 if (track->input()->ensure_io (input, false, this)) {
2322 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
2326 if (track->output()->ensure_io (output, false, this)) {
2327 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
2332 track->non_realtime_input_change();
2335 route_group->add (track);
2338 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2340 if (Config->get_remote_model() == UserOrdered) {
2341 track->set_remote_control_id (next_control_id());
2344 new_routes.push_back (track);
2345 ret.push_back (track);
2347 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2350 catch (failed_constructor &err) {
2351 error << _("Session: could not create new midi track.") << endmsg;
2355 catch (AudioEngine::PortRegistrationFailure& pfe) {
2357 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;
2365 if (!new_routes.empty()) {
2366 StateProtector sp (this);
2367 if (Profile->get_trx()) {
2368 add_routes (new_routes, false, false, false);
2370 add_routes (new_routes, true, true, false);
2374 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
2375 PluginPtr plugin = instrument->load (*this);
2376 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2377 (*r)->add_processor (p, PreFader);
2387 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2389 boost::shared_ptr<Route> midi_track (wmt.lock());
2395 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2397 if (change.after.n_audio() <= change.before.n_audio()) {
2401 /* new audio ports: make sure the audio goes somewhere useful,
2402 unless the user has no-auto-connect selected.
2404 The existing ChanCounts don't matter for this call as they are only
2405 to do with matching input and output indices, and we are only changing
2411 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
2415 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
2416 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
2417 * @param output_start As \a input_start, but for outputs.
2420 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
2421 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
2423 if (!IO::connecting_legal) {
2427 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2433 /* If both inputs and outputs are auto-connected to physical ports,
2434 use the max of input and output offsets to ensure auto-connected
2435 port numbers always match up (e.g. the first audio input and the
2436 first audio output of the route will have the same physical
2437 port number). Otherwise just use the lowest input or output
2441 DEBUG_TRACE (DEBUG::Graph,
2442 string_compose("Auto-connect: existing in = %1 out = %2\n",
2443 existing_inputs, existing_outputs));
2445 const bool in_out_physical =
2446 (Config->get_input_auto_connect() & AutoConnectPhysical)
2447 && (Config->get_output_auto_connect() & AutoConnectPhysical)
2450 const ChanCount in_offset = in_out_physical
2451 ? ChanCount::max(existing_inputs, existing_outputs)
2454 const ChanCount out_offset = in_out_physical
2455 ? ChanCount::max(existing_inputs, existing_outputs)
2458 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2459 vector<string> physinputs;
2460 vector<string> physoutputs;
2462 _engine.get_physical_outputs (*t, physoutputs);
2463 _engine.get_physical_inputs (*t, physinputs);
2465 if (!physinputs.empty() && connect_inputs) {
2466 uint32_t nphysical_in = physinputs.size();
2468 DEBUG_TRACE (DEBUG::Graph,
2469 string_compose("There are %1 physical inputs of type %2\n",
2472 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
2475 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
2476 DEBUG_TRACE (DEBUG::Graph,
2477 string_compose("Get index %1 + %2 % %3 = %4\n",
2478 in_offset.get(*t), i, nphysical_in,
2479 (in_offset.get(*t) + i) % nphysical_in));
2480 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
2483 DEBUG_TRACE (DEBUG::Graph,
2484 string_compose("Connect route %1 IN to %2\n",
2485 route->name(), port));
2487 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
2491 ChanCount one_added (*t, 1);
2492 existing_inputs += one_added;
2496 if (!physoutputs.empty()) {
2497 uint32_t nphysical_out = physoutputs.size();
2498 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
2502 * do not create new connections if we reached the limit of physical outputs
2506 if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
2507 ARDOUR::Profile->get_trx () &&
2508 existing_outputs.get(*t) == nphysical_out ) {
2512 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
2513 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
2514 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
2515 /* master bus is audio only */
2516 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
2517 port = _master_out->input()->ports().port(*t,
2518 i % _master_out->input()->n_ports().get(*t))->name();
2522 DEBUG_TRACE (DEBUG::Graph,
2523 string_compose("Connect route %1 OUT to %2\n",
2524 route->name(), port));
2526 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
2530 ChanCount one_added (*t, 1);
2531 existing_outputs += one_added;
2537 #ifdef USE_TRACKS_CODE_FEATURES
2540 compare_routes_by_remote_id (const boost::shared_ptr<Route>& route1, const boost::shared_ptr<Route>& route2)
2542 return route1->remote_control_id() < route2->remote_control_id();
2546 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2548 // it is not allowed to perform connection
2549 if (!IO::connecting_legal) {
2553 // if we are deleting routes we will call this once at the end
2554 if (_route_deletion_in_progress) {
2558 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2564 // We need to disconnect the route's inputs and outputs first
2565 // basing on autoconnect configuration
2566 bool reconnectIputs = !(Config->get_input_auto_connect() & ManualConnect) && reconnect_inputs;
2567 bool reconnectOutputs = !(Config->get_output_auto_connect() & ManualConnect) && reconnect_outputs;
2569 ChanCount existing_inputs;
2570 ChanCount existing_outputs;
2571 count_existing_track_channels (existing_inputs, existing_outputs);
2573 //ChanCount inputs = ChanCount::ZERO;
2574 //ChanCount outputs = ChanCount::ZERO;
2576 RouteList existing_routes = *routes.reader ();
2577 existing_routes.sort (compare_routes_by_remote_id);
2580 PBD::Unwinder<bool> protect_ignore_changes (_reconnecting_routes_in_progress, true);
2582 vector<string> physinputs;
2583 vector<string> physoutputs;
2585 EngineStateController::instance()->get_physical_audio_outputs(physoutputs);
2586 EngineStateController::instance()->get_physical_audio_inputs(physinputs);
2588 uint32_t input_n = 0;
2589 uint32_t output_n = 0;
2590 RouteList::iterator rIter = existing_routes.begin();
2591 const AutoConnectOption current_input_auto_connection (Config->get_input_auto_connect());
2592 const AutoConnectOption current_output_auto_connection (Config->get_output_auto_connect());
2593 for (; rIter != existing_routes.end(); ++rIter) {
2594 if (*rIter == _master_out || *rIter == _monitor_out ) {
2598 if (current_output_auto_connection == AutoConnectPhysical) {
2599 (*rIter)->amp()->deactivate();
2600 } else if (current_output_auto_connection == AutoConnectMaster) {
2601 (*rIter)->amp()->activate();
2604 if (reconnectIputs) {
2605 (*rIter)->input()->disconnect (this); //GZ: check this; could be heavy
2607 for (uint32_t route_input_n = 0; route_input_n < (*rIter)->n_inputs().get(DataType::AUDIO); ++route_input_n) {
2609 if (current_input_auto_connection & AutoConnectPhysical) {
2611 if ( input_n == physinputs.size() ) {
2615 string port = physinputs[input_n];
2617 if (port.empty() ) {
2618 error << "Physical Input number "<< input_n << " is unavailable and cannot be connected" << endmsg;
2621 //GZ: check this; could be heavy
2622 (*rIter)->input()->connect ((*rIter)->input()->ports().port(DataType::AUDIO, route_input_n), port, this);
2628 if (reconnectOutputs) {
2630 //normalize route ouptuts: reduce the amount outputs to be equal to the amount of inputs
2631 if (current_output_auto_connection & AutoConnectPhysical) {
2633 //GZ: check this; could be heavy
2634 (*rIter)->output()->disconnect (this);
2635 size_t route_inputs_count = (*rIter)->n_inputs().get(DataType::AUDIO);
2637 //GZ: check this; could be heavy
2638 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, route_inputs_count), false, this );
2640 } else if (current_output_auto_connection & AutoConnectMaster){
2642 if (!reconnect_master) {
2646 //GZ: check this; could be heavy
2647 (*rIter)->output()->disconnect (this);
2650 uint32_t master_inputs_count = _master_out->n_inputs().get(DataType::AUDIO);
2651 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, master_inputs_count), false, this );
2653 error << error << "Master bus is not available" << endmsg;
2658 for (uint32_t route_output_n = 0; route_output_n < (*rIter)->n_outputs().get(DataType::AUDIO); ++route_output_n) {
2659 if (current_output_auto_connection & AutoConnectPhysical) {
2661 if ( output_n == physoutputs.size() ) {
2665 string port = physoutputs[output_n];
2667 if (port.empty() ) {
2668 error << "Physical Output number "<< output_n << " is unavailable and cannot be connected" << endmsg;
2671 //GZ: check this; could be heavy
2672 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2675 } else if (current_output_auto_connection & AutoConnectMaster) {
2677 if ( route_output_n == _master_out->n_inputs().get(DataType::AUDIO) ) {
2681 // connect to master bus
2682 string port = _master_out->input()->ports().port(DataType::AUDIO, route_output_n)->name();
2684 if (port.empty() ) {
2685 error << "MasterBus Input number "<< route_output_n << " is unavailable and cannot be connected" << endmsg;
2689 //GZ: check this; could be heavy
2690 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2696 //auto_connect_route (*rIter, inputs, outputs, false, reconnectIputs);
2699 _master_out->output()->disconnect (this);
2700 auto_connect_master_bus ();
2705 session_routes_reconnected (); /* EMIT SIGNAL */
2709 Session::reconnect_midi_scene_ports(bool inputs)
2713 boost::shared_ptr<MidiPort> scene_in_ptr = scene_in();
2715 scene_in_ptr->disconnect_all ();
2717 std::vector<EngineStateController::MidiPortState> midi_port_states;
2718 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2720 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2722 for (; state_iter != midi_port_states.end(); ++state_iter) {
2723 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2724 scene_in_ptr->connect (state_iter->name);
2731 boost::shared_ptr<MidiPort> scene_out_ptr = scene_out();
2733 if (scene_out_ptr ) {
2734 scene_out_ptr->disconnect_all ();
2736 std::vector<EngineStateController::MidiPortState> midi_port_states;
2737 EngineStateController::instance()->get_physical_midi_output_states (midi_port_states);
2739 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2741 for (; state_iter != midi_port_states.end(); ++state_iter) {
2742 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2743 scene_out_ptr->connect (state_iter->name);
2751 Session::reconnect_mtc_ports ()
2753 boost::shared_ptr<MidiPort> mtc_in_ptr = _midi_ports->mtc_input_port();
2759 mtc_in_ptr->disconnect_all ();
2761 std::vector<EngineStateController::MidiPortState> midi_port_states;
2762 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2764 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2766 for (; state_iter != midi_port_states.end(); ++state_iter) {
2767 if (state_iter->available && state_iter->mtc_in) {
2768 mtc_in_ptr->connect (state_iter->name);
2772 if (!_midi_ports->mtc_input_port ()->connected () &&
2773 config.get_external_sync () &&
2774 (Config->get_sync_source () == MTC) ) {
2775 config.set_external_sync (false);
2778 if ( ARDOUR::Profile->get_trx () ) {
2779 // Tracks need this signal to update timecode_source_dropdown
2780 MtcOrLtcInputPortChanged (); //emit signal
2785 Session::reconnect_mmc_ports(bool inputs)
2787 if (inputs ) { // get all enabled midi input ports
2789 boost::shared_ptr<MidiPort> mmc_in_ptr = _midi_ports->mmc_in();
2791 mmc_in_ptr->disconnect_all ();
2792 std::vector<std::string> enabled_midi_inputs;
2793 EngineStateController::instance()->get_physical_midi_inputs (enabled_midi_inputs);
2795 std::vector<std::string>::iterator port_iter = enabled_midi_inputs.begin();
2797 for (; port_iter != enabled_midi_inputs.end(); ++port_iter) {
2798 mmc_in_ptr->connect (*port_iter);
2802 } else { // get all enabled midi output ports
2804 boost::shared_ptr<MidiPort> mmc_out_ptr = _midi_ports->mmc_out();
2806 mmc_out_ptr->disconnect_all ();
2807 std::vector<std::string> enabled_midi_outputs;
2808 EngineStateController::instance()->get_physical_midi_outputs (enabled_midi_outputs);
2810 std::vector<std::string>::iterator port_iter = enabled_midi_outputs.begin();
2812 for (; port_iter != enabled_midi_outputs.end(); ++port_iter) {
2813 mmc_out_ptr->connect (*port_iter);
2821 /** Caller must not hold process lock
2822 * @param name_template string to use for the start of the name, or "" to use "Audio".
2824 list< boost::shared_ptr<AudioTrack> >
2825 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
2826 uint32_t how_many, string name_template)
2829 uint32_t track_id = 0;
2831 RouteList new_routes;
2832 list<boost::shared_ptr<AudioTrack> > ret;
2834 const string name_pattern = default_track_name_pattern (DataType::AUDIO);
2835 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
2839 if (!find_route_name (name_template.empty() ? _(name_pattern.c_str()) : name_template, ++track_id, track_name, use_number)) {
2840 error << "cannot find name for new audio track" << endmsg;
2844 boost::shared_ptr<AudioTrack> track;
2847 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
2849 if (track->init ()) {
2853 if (ARDOUR::Profile->get_trx ()) {
2854 // TRACKS considers it's not a USE CASE, it's
2855 // a piece of behavior of the session model:
2857 // Gain for a newly created route depends on
2858 // the current output_auto_connect mode:
2860 // 0 for Stereo Out mode
2862 if (Config->get_output_auto_connect() & AutoConnectMaster) {
2863 track->set_gain (dB_to_coefficient (0), 0);
2867 track->use_new_diskstream();
2869 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2870 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2873 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2875 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2876 error << string_compose (
2877 _("cannot configure %1 in/%2 out configuration for new audio track"),
2878 input_channels, output_channels)
2883 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2884 error << string_compose (
2885 _("cannot configure %1 in/%2 out configuration for new audio track"),
2886 input_channels, output_channels)
2893 route_group->add (track);
2896 track->non_realtime_input_change();
2898 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2899 if (Config->get_remote_model() == UserOrdered) {
2900 track->set_remote_control_id (next_control_id());
2903 new_routes.push_back (track);
2904 ret.push_back (track);
2906 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2909 catch (failed_constructor &err) {
2910 error << _("Session: could not create new audio track.") << endmsg;
2914 catch (AudioEngine::PortRegistrationFailure& pfe) {
2916 error << pfe.what() << endmsg;
2924 if (!new_routes.empty()) {
2925 StateProtector sp (this);
2926 if (Profile->get_trx()) {
2927 add_routes (new_routes, false, false, false);
2929 add_routes (new_routes, true, true, false);
2936 /** Caller must not hold process lock.
2937 * @param name_template string to use for the start of the name, or "" to use "Bus".
2940 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
2943 uint32_t bus_id = 0;
2947 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
2950 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, use_number)) {
2951 error << "cannot find name for new audio bus" << endmsg;
2956 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
2962 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2963 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
2966 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2968 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2969 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2970 input_channels, output_channels)
2976 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2977 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2978 input_channels, output_channels)
2985 route_group->add (bus);
2987 if (Config->get_remote_model() == UserOrdered) {
2988 bus->set_remote_control_id (next_control_id());
2991 bus->add_internal_return ();
2993 ret.push_back (bus);
2995 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
3001 catch (failed_constructor &err) {
3002 error << _("Session: could not create new audio route.") << endmsg;
3006 catch (AudioEngine::PortRegistrationFailure& pfe) {
3007 error << pfe.what() << endmsg;
3017 StateProtector sp (this);
3018 if (Profile->get_trx()) {
3019 add_routes (ret, false, false, false);
3021 add_routes (ret, false, true, true); // autoconnect // outputs only
3030 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base)
3033 uint32_t control_id;
3035 uint32_t number = 0;
3036 const uint32_t being_added = how_many;
3038 if (!tree.read (template_path.c_str())) {
3042 XMLNode* node = tree.root();
3044 IO::disable_connecting ();
3046 control_id = next_control_id ();
3050 XMLNode node_copy (*node);
3052 /* Remove IDs of everything so that new ones are used */
3053 node_copy.remove_property_recursively (X_("id"));
3058 if (!name_base.empty()) {
3060 /* if we're adding more than one routes, force
3061 * all the names of the new routes to be
3062 * numbered, via the final parameter.
3065 if (!find_route_name (name_base.c_str(), ++number, name, (being_added > 1))) {
3066 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3072 string const route_name = node_copy.property(X_("name"))->value ();
3074 /* generate a new name by adding a number to the end of the template name */
3075 if (!find_route_name (route_name.c_str(), ++number, name, true)) {
3076 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3077 abort(); /*NOTREACHED*/
3081 /* set this name in the XML description that we are about to use */
3082 Route::set_name_in_state (node_copy, name);
3084 /* trim bitslots from listen sends so that new ones are used */
3085 XMLNodeList children = node_copy.children ();
3086 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
3087 if ((*i)->name() == X_("Processor")) {
3088 XMLProperty* role = (*i)->property (X_("role"));
3089 if (role && role->value() == X_("Listen")) {
3090 (*i)->remove_property (X_("bitslot"));
3095 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
3098 error << _("Session: cannot create track/bus from template description") << endmsg;
3102 if (boost::dynamic_pointer_cast<Track>(route)) {
3103 /* force input/output change signals so that the new diskstream
3104 picks up the configuration of the route. During session
3105 loading this normally happens in a different way.
3108 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3110 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
3111 change.after = route->input()->n_ports();
3112 route->input()->changed (change, this);
3113 change.after = route->output()->n_ports();
3114 route->output()->changed (change, this);
3117 route->set_remote_control_id (control_id);
3120 ret.push_back (route);
3122 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
3125 catch (failed_constructor &err) {
3126 error << _("Session: could not create new route from template") << endmsg;
3130 catch (AudioEngine::PortRegistrationFailure& pfe) {
3131 error << pfe.what() << endmsg;
3140 StateProtector sp (this);
3141 if (Profile->get_trx()) {
3142 add_routes (ret, false, false, false);
3144 add_routes (ret, true, true, false);
3146 IO::enable_connecting ();
3153 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
3156 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
3157 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
3160 error << _("Adding new tracks/busses failed") << endmsg;
3165 update_latency (true);
3166 update_latency (false);
3171 save_state (_current_snapshot_name);
3174 reassign_track_numbers();
3176 update_route_record_state ();
3178 RouteAdded (new_routes); /* EMIT SIGNAL */
3182 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
3184 ChanCount existing_inputs;
3185 ChanCount existing_outputs;
3186 uint32_t order = next_control_id();
3188 if (_order_hint > -1) {
3189 order = _order_hint;
3193 count_existing_track_channels (existing_inputs, existing_outputs);
3196 RCUWriter<RouteList> writer (routes);
3197 boost::shared_ptr<RouteList> r = writer.get_copy ();
3198 r->insert (r->end(), new_routes.begin(), new_routes.end());
3200 /* if there is no control out and we're not in the middle of loading,
3201 resort the graph here. if there is a control out, we will resort
3202 toward the end of this method. if we are in the middle of loading,
3203 we will resort when done.
3206 if (!_monitor_out && IO::connecting_legal) {
3207 resort_routes_using (r);
3211 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3213 boost::weak_ptr<Route> wpr (*x);
3214 boost::shared_ptr<Route> r (*x);
3216 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _2, wpr));
3217 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _3, wpr));
3218 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
3219 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
3220 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
3221 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
3223 if (r->is_master()) {
3227 if (r->is_monitor()) {
3231 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
3233 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
3234 track_playlist_changed (boost::weak_ptr<Track> (tr));
3235 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
3237 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
3239 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
3240 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
3245 if (input_auto_connect || output_auto_connect) {
3246 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
3249 /* order keys are a GUI responsibility but we need to set up
3250 reasonable defaults because they also affect the remote control
3251 ID in most situations.
3254 if (!r->has_order_key ()) {
3255 if (r->is_auditioner()) {
3256 /* use an arbitrarily high value */
3257 r->set_order_key (UINT_MAX);
3259 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
3260 r->set_order_key (order);
3268 if (_monitor_out && IO::connecting_legal) {
3269 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
3271 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3272 if ((*x)->is_monitor()) {
3274 } else if ((*x)->is_master()) {
3277 (*x)->enable_monitor_send ();
3284 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
3286 boost::shared_ptr<RouteList> r = routes.reader ();
3287 boost::shared_ptr<Send> s;
3289 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3290 if ((s = (*i)->internal_send_for (dest)) != 0) {
3291 s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO);
3297 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
3299 boost::shared_ptr<RouteList> r = routes.reader ();
3300 boost::shared_ptr<Send> s;
3302 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3303 if ((s = (*i)->internal_send_for (dest)) != 0) {
3304 s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY);
3310 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
3312 boost::shared_ptr<RouteList> r = routes.reader ();
3313 boost::shared_ptr<Send> s;
3315 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3316 if ((s = (*i)->internal_send_for (dest)) != 0) {
3317 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
3322 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
3324 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
3326 boost::shared_ptr<RouteList> r = routes.reader ();
3327 boost::shared_ptr<RouteList> t (new RouteList);
3329 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3330 /* no MIDI sends because there are no MIDI busses yet */
3331 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
3336 add_internal_sends (dest, p, t);
3340 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
3342 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
3343 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
3348 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
3350 add_internal_send (dest, sender->before_processor_for_index (index), sender);
3354 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
3356 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
3360 if (!dest->internal_return()) {
3361 dest->add_internal_return ();
3364 sender->add_aux_send (dest, before);
3371 Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
3373 { // RCU Writer scope
3374 PBD::Unwinder<bool> uw_flag (_route_deletion_in_progress, true);
3375 RCUWriter<RouteList> writer (routes);
3376 boost::shared_ptr<RouteList> rs = writer.get_copy ();
3379 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3381 if (*iter == _master_out) {
3385 (*iter)->set_solo (false, this);
3389 /* deleting the master out seems like a dumb
3390 idea, but its more of a UI policy issue
3394 if (*iter == _master_out) {
3395 _master_out = boost::shared_ptr<Route> ();
3398 if (*iter == _monitor_out) {
3399 _monitor_out.reset ();
3402 // We need to disconnect the route's inputs and outputs
3404 (*iter)->input()->disconnect (0);
3405 (*iter)->output()->disconnect (0);
3407 /* if the route had internal sends sending to it, remove them */
3408 if ((*iter)->internal_return()) {
3410 boost::shared_ptr<RouteList> r = routes.reader ();
3411 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3412 boost::shared_ptr<Send> s = (*i)->internal_send_for (*iter);
3414 (*i)->remove_processor (s);
3419 /* if the monitoring section had a pointer to this route, remove it */
3420 if (_monitor_out && !(*iter)->is_master() && !(*iter)->is_monitor()) {
3421 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3422 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
3423 (*iter)->remove_aux_or_listen (_monitor_out);
3426 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*iter);
3427 if (mt && mt->step_editing()) {
3428 if (_step_editors > 0) {
3434 /* writer goes out of scope, forces route list update */
3436 } // end of RCU Writer scope
3438 update_route_solo_state ();
3439 RouteAddedOrRemoved (false); /* EMIT SIGNAL */
3440 update_latency_compensation ();
3443 /* Re-sort routes to remove the graph's current references to the one that is
3444 * going away, then flush old references out of the graph.
3445 * Wave Tracks: reconnect routes
3448 #ifdef USE_TRACKS_CODE_FEATURES
3449 reconnect_existing_routes(true, false);
3451 routes.flush (); // maybe unsafe, see below.
3455 if (_process_graph) {
3456 _process_graph->clear_other_chain ();
3459 /* get rid of it from the dead wood collection in the route list manager */
3460 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
3464 /* try to cause everyone to drop their references
3465 * and unregister ports from the backend
3468 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3469 (*iter)->drop_references ();
3472 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
3474 /* save the new state of the world */
3476 if (save_state (_current_snapshot_name)) {
3477 save_history (_current_snapshot_name);
3480 reassign_track_numbers();
3481 update_route_record_state ();
3485 Session::remove_route (boost::shared_ptr<Route> route)
3487 boost::shared_ptr<RouteList> rl (new RouteList);
3488 rl->push_back (route);
3493 Session::route_mute_changed (void* /*src*/)
3499 Session::route_listen_changed (bool group_override, boost::weak_ptr<Route> wpr)
3501 boost::shared_ptr<Route> route = wpr.lock();
3503 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_listen_changed")) << endmsg;
3507 if (route->listening_via_monitor ()) {
3509 if (Config->get_exclusive_solo()) {
3510 /* new listen: disable all other listen, except solo-grouped channels */
3511 RouteGroup* rg = route->route_group ();
3512 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
3513 if (group_override && rg) {
3514 leave_group_alone = !leave_group_alone;
3516 boost::shared_ptr<RouteList> r = routes.reader ();
3517 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3518 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() || (leave_group_alone && ((*i)->route_group() == rg))) {
3521 (*i)->set_listen (false, this, group_override);
3527 } else if (_listen_cnt > 0) {
3532 update_route_solo_state ();
3535 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3537 boost::shared_ptr<Route> route = wpr.lock ();
3540 /* should not happen */
3541 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_isolated_changed")) << endmsg;
3545 bool send_changed = false;
3547 if (route->solo_isolated()) {
3548 if (_solo_isolated_cnt == 0) {
3549 send_changed = true;
3551 _solo_isolated_cnt++;
3552 } else if (_solo_isolated_cnt > 0) {
3553 _solo_isolated_cnt--;
3554 if (_solo_isolated_cnt == 0) {
3555 send_changed = true;
3560 IsolatedChanged (); /* EMIT SIGNAL */
3565 Session::route_solo_changed (bool self_solo_change, bool group_override, boost::weak_ptr<Route> wpr)
3567 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
3569 if (!self_solo_change) {
3570 // session doesn't care about changes to soloed-by-others
3574 boost::shared_ptr<Route> route = wpr.lock ();
3577 boost::shared_ptr<RouteList> r = routes.reader ();
3580 if (route->self_soloed()) {
3586 RouteGroup* rg = route->route_group ();
3587 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
3588 if (group_override && rg) {
3589 leave_group_alone = !leave_group_alone;
3591 if (delta == 1 && Config->get_exclusive_solo()) {
3593 /* new solo: disable all other solos, but not the group if its solo-enabled */
3595 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3596 if ((*i) == route || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3597 (leave_group_alone && ((*i)->route_group() == rg))) {
3600 (*i)->set_solo (false, this, group_override);
3604 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3606 RouteList uninvolved;
3608 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
3610 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3611 bool via_sends_only;
3612 bool in_signal_flow;
3614 if ((*i) == route || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3615 (leave_group_alone && ((*i)->route_group() == rg))) {
3619 in_signal_flow = false;
3621 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3623 if ((*i)->feeds (route, &via_sends_only)) {
3624 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3625 if (!via_sends_only) {
3626 if (!route->soloed_by_others_upstream()) {
3627 (*i)->mod_solo_by_others_downstream (delta);
3629 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others upstream\n");
3632 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3634 in_signal_flow = true;
3636 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3639 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3641 if (route->feeds (*i, &via_sends_only)) {
3642 /* propagate solo upstream only if routing other than
3643 sends is involved, but do consider the other route
3644 (*i) to be part of the signal flow even if only
3647 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3651 route->soloed_by_others_downstream(),
3652 route->soloed_by_others_upstream()));
3653 if (!via_sends_only) {
3654 //NB. Triggers Invert Push, which handles soloed by downstream
3655 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3656 (*i)->mod_solo_by_others_upstream (delta);
3658 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3660 in_signal_flow = true;
3662 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3665 if (!in_signal_flow) {
3666 uninvolved.push_back (*i);
3670 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3672 update_route_solo_state (r);
3674 /* now notify that the mute state of the routes not involved in the signal
3675 pathway of the just-solo-changed route may have altered.
3678 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3679 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
3680 (*i)->act_on_mute ();
3681 (*i)->mute_changed (this);
3684 SoloChanged (); /* EMIT SIGNAL */
3689 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
3691 /* now figure out if anything that matters is soloed (or is "listening")*/
3693 bool something_soloed = false;
3694 uint32_t listeners = 0;
3695 uint32_t isolated = 0;
3698 r = routes.reader();
3701 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3702 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
3703 something_soloed = true;
3706 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
3707 if (Config->get_solo_control_is_listen_control()) {
3710 (*i)->set_listen (false, this);
3714 if ((*i)->solo_isolated()) {
3719 if (something_soloed != _non_soloed_outs_muted) {
3720 _non_soloed_outs_muted = something_soloed;
3721 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
3724 _listen_cnt = listeners;
3726 if (isolated != _solo_isolated_cnt) {
3727 _solo_isolated_cnt = isolated;
3728 IsolatedChanged (); /* EMIT SIGNAL */
3731 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
3732 something_soloed, listeners, isolated));
3735 boost::shared_ptr<RouteList>
3736 Session::get_routes_with_internal_returns() const
3738 boost::shared_ptr<RouteList> r = routes.reader ();
3739 boost::shared_ptr<RouteList> rl (new RouteList);
3741 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3742 if ((*i)->internal_return ()) {
3750 Session::io_name_is_legal (const std::string& name)
3752 boost::shared_ptr<RouteList> r = routes.reader ();
3754 for (vector<string>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
3755 if (name == *reserved) {
3760 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3761 if ((*i)->name() == name) {
3765 if ((*i)->has_io_processor_named (name)) {
3774 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
3777 vector<string> connections;
3779 /* if we are passed only a single route and we're not told to turn
3780 * others off, then just do the simple thing.
3783 if (flip_others == false && rl->size() == 1) {
3784 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
3786 mt->set_input_active (onoff);
3791 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
3793 PortSet& ps ((*rt)->input()->ports());
3795 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
3796 p->get_connections (connections);
3799 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
3800 routes_using_input_from (*s, rl2);
3803 /* scan all relevant routes to see if others are on or off */
3805 bool others_are_already_on = false;
3807 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3809 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3815 if ((*r) != (*rt)) {
3816 if (mt->input_active()) {
3817 others_are_already_on = true;
3820 /* this one needs changing */
3821 mt->set_input_active (onoff);
3827 /* globally reverse other routes */
3829 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3830 if ((*r) != (*rt)) {
3831 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3833 mt->set_input_active (!others_are_already_on);
3842 Session::routes_using_input_from (const string& str, RouteList& rl)
3844 boost::shared_ptr<RouteList> r = routes.reader();
3846 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3847 if ((*i)->input()->connected_to (str)) {
3853 boost::shared_ptr<Route>
3854 Session::route_by_name (string name)
3856 boost::shared_ptr<RouteList> r = routes.reader ();
3858 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3859 if ((*i)->name() == name) {
3864 return boost::shared_ptr<Route> ((Route*) 0);
3867 boost::shared_ptr<Route>
3868 Session::route_by_id (PBD::ID id)
3870 boost::shared_ptr<RouteList> r = routes.reader ();
3872 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3873 if ((*i)->id() == id) {
3878 return boost::shared_ptr<Route> ((Route*) 0);
3881 boost::shared_ptr<Track>
3882 Session::track_by_diskstream_id (PBD::ID id)
3884 boost::shared_ptr<RouteList> r = routes.reader ();
3886 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3887 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3888 if (t && t->using_diskstream_id (id)) {
3893 return boost::shared_ptr<Track> ();
3896 boost::shared_ptr<Route>
3897 Session::route_by_remote_id (uint32_t id)
3899 boost::shared_ptr<RouteList> r = routes.reader ();
3901 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3902 if ((*i)->remote_control_id() == id) {
3907 return boost::shared_ptr<Route> ((Route*) 0);
3912 Session::reassign_track_numbers ()
3916 RouteList r (*(routes.reader ()));
3917 SignalOrderRouteSorter sorter;
3920 StateProtector sp (this);
3922 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3923 if (boost::dynamic_pointer_cast<Track> (*i)) {
3924 (*i)->set_track_number(++tn);
3926 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
3927 (*i)->set_track_number(--bn);
3930 const uint32_t decimals = ceilf (log10f (tn + 1));
3931 const bool decimals_changed = _track_number_decimals != decimals;
3932 _track_number_decimals = decimals;
3934 if (decimals_changed && config.get_track_name_number ()) {
3935 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3936 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3938 t->resync_track_name();
3941 // trigger GUI re-layout
3942 config.ParameterChanged("track-name-number");
3947 Session::playlist_region_added (boost::weak_ptr<Region> w)
3949 boost::shared_ptr<Region> r = w.lock ();
3954 /* These are the operations that are currently in progress... */
3955 list<GQuark> curr = _current_trans_quarks;
3958 /* ...and these are the operations during which we want to update
3959 the session range location markers.
3962 ops.push_back (Operations::capture);
3963 ops.push_back (Operations::paste);
3964 ops.push_back (Operations::duplicate_region);
3965 ops.push_back (Operations::insert_file);
3966 ops.push_back (Operations::insert_region);
3967 ops.push_back (Operations::drag_region_brush);
3968 ops.push_back (Operations::region_drag);
3969 ops.push_back (Operations::selection_grab);
3970 ops.push_back (Operations::region_fill);
3971 ops.push_back (Operations::fill_selection);
3972 ops.push_back (Operations::create_region);
3973 ops.push_back (Operations::region_copy);
3974 ops.push_back (Operations::fixed_time_region_copy);
3977 /* See if any of the current operations match the ones that we want */
3979 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
3981 /* If so, update the session range markers */
3983 maybe_update_session_range (r->position (), r->last_frame ());
3987 /** Update the session range markers if a is before the current start or
3988 * b is after the current end.
3991 Session::maybe_update_session_range (framepos_t a, framepos_t b)
3993 if (_state_of_the_state & Loading) {
3997 framepos_t session_end_marker_shift_samples = session_end_shift * _nominal_frame_rate;
3999 if (_session_range_location == 0) {
4001 set_session_range_location (a, b + session_end_marker_shift_samples);
4005 if (a < _session_range_location->start()) {
4006 _session_range_location->set_start (a);
4009 if (b > _session_range_location->end()) {
4010 _session_range_location->set_end (b);
4016 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
4018 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4019 maybe_update_session_range (i->to, i->to + i->length);
4024 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
4026 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4027 maybe_update_session_range (i->from, i->to);
4031 /* Region management */
4033 boost::shared_ptr<Region>
4034 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
4036 const RegionFactory::RegionMap& regions (RegionFactory::regions());
4037 RegionFactory::RegionMap::const_iterator i;
4038 boost::shared_ptr<Region> region;
4040 Glib::Threads::Mutex::Lock lm (region_lock);
4042 for (i = regions.begin(); i != regions.end(); ++i) {
4046 if (region->whole_file()) {
4048 if (child->source_equivalent (region)) {
4054 return boost::shared_ptr<Region> ();
4058 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
4060 set<boost::shared_ptr<Region> > relevant_regions;
4062 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
4063 RegionFactory::get_regions_using_source (*s, relevant_regions);
4066 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
4067 set<boost::shared_ptr<Region> >::iterator tmp;
4072 playlists->destroy_region (*r);
4073 RegionFactory::map_remove (*r);
4075 (*r)->drop_sources ();
4076 (*r)->drop_references ();
4078 relevant_regions.erase (r);
4083 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
4086 Glib::Threads::Mutex::Lock ls (source_lock);
4087 /* remove from the main source list */
4088 sources.erase ((*s)->id());
4091 (*s)->mark_for_remove ();
4092 (*s)->drop_references ();
4101 Session::remove_last_capture ()
4103 list<boost::shared_ptr<Source> > srcs;
4105 boost::shared_ptr<RouteList> rl = routes.reader ();
4106 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4107 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4112 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
4115 srcs.insert (srcs.end(), l.begin(), l.end());
4120 destroy_sources (srcs);
4122 save_state (_current_snapshot_name);
4127 /* Source Management */
4130 Session::add_source (boost::shared_ptr<Source> source)
4132 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
4133 pair<SourceMap::iterator,bool> result;
4135 entry.first = source->id();
4136 entry.second = source;
4139 Glib::Threads::Mutex::Lock lm (source_lock);
4140 result = sources.insert (entry);
4143 if (result.second) {
4145 /* yay, new source */
4147 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
4150 if (!fs->within_session()) {
4151 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
4157 boost::shared_ptr<AudioFileSource> afs;
4159 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
4160 if (Config->get_auto_analyse_audio()) {
4161 Analyser::queue_source_for_analysis (source, false);
4165 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
4170 Session::remove_source (boost::weak_ptr<Source> src)
4172 if (_state_of_the_state & Deletion) {
4176 SourceMap::iterator i;
4177 boost::shared_ptr<Source> source = src.lock();
4184 Glib::Threads::Mutex::Lock lm (source_lock);
4186 if ((i = sources.find (source->id())) != sources.end()) {
4191 if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
4193 /* save state so we don't end up with a session file
4194 referring to non-existent sources.
4197 save_state (_current_snapshot_name);
4201 boost::shared_ptr<Source>
4202 Session::source_by_id (const PBD::ID& id)
4204 Glib::Threads::Mutex::Lock lm (source_lock);
4205 SourceMap::iterator i;
4206 boost::shared_ptr<Source> source;
4208 if ((i = sources.find (id)) != sources.end()) {
4215 boost::shared_ptr<AudioFileSource>
4216 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
4218 /* Restricted to audio files because only audio sources have channel
4222 Glib::Threads::Mutex::Lock lm (source_lock);
4224 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
4225 boost::shared_ptr<AudioFileSource> afs
4226 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
4228 if (afs && afs->path() == path && chn == afs->channel()) {
4233 return boost::shared_ptr<AudioFileSource>();
4236 boost::shared_ptr<MidiSource>
4237 Session::midi_source_by_path (const std::string& path) const
4239 /* Restricted to MIDI files because audio sources require a channel
4240 for unique identification, in addition to a path.
4243 Glib::Threads::Mutex::Lock lm (source_lock);
4245 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
4246 boost::shared_ptr<MidiSource> ms
4247 = boost::dynamic_pointer_cast<MidiSource>(s->second);
4248 boost::shared_ptr<FileSource> fs
4249 = boost::dynamic_pointer_cast<FileSource>(s->second);
4251 if (ms && fs && fs->path() == path) {
4256 return boost::shared_ptr<MidiSource>();
4260 Session::count_sources_by_origin (const string& path)
4263 Glib::Threads::Mutex::Lock lm (source_lock);
4265 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
4266 boost::shared_ptr<FileSource> fs
4267 = boost::dynamic_pointer_cast<FileSource>(i->second);
4269 if (fs && fs->origin() == path) {
4278 peak_file_helper (const string& peak_path, const string& file_path, const string& file_base, bool hash) {
4280 std::string checksum = Glib::Checksum::compute_checksum(Glib::Checksum::CHECKSUM_SHA1, file_path + G_DIR_SEPARATOR + file_base);
4281 return Glib::build_filename (peak_path, checksum + peakfile_suffix);
4283 return Glib::build_filename (peak_path, file_base + peakfile_suffix);
4288 Session::construct_peak_filepath (const string& filepath, const bool in_session, const bool old_peak_name) const
4290 string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
4292 if (Glib::path_is_absolute (filepath)) {
4294 /* rip the session dir from the audiofile source */
4296 string session_path;
4297 bool in_another_session = true;
4299 if (filepath.find (interchange_dir_string) != string::npos) {
4301 session_path = Glib::path_get_dirname (filepath); /* now ends in audiofiles */
4302 session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
4303 session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
4304 session_path = Glib::path_get_dirname (session_path); /* now has session path */
4306 /* see if it is within our session */
4308 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4309 if (i->path == session_path) {
4310 in_another_session = false;
4315 in_another_session = false;
4319 if (in_another_session) {
4320 SessionDirectory sd (session_path);
4321 return peak_file_helper (sd.peak_path(), "", Glib::path_get_basename (filepath), !old_peak_name);
4325 /* 1) if file belongs to this session
4326 * it may be a relative path (interchange/...)
4327 * or just basename (session_state, remove source)
4328 * -> just use the basename
4330 std::string filename = Glib::path_get_basename (filepath);
4333 /* 2) if the file is outside our session dir:
4334 * (imported but not copied) add the path for check-summming */
4336 path = Glib::path_get_dirname (filepath);
4339 return peak_file_helper (_session_dir->peak_path(), path, Glib::path_get_basename (filepath), !old_peak_name);
4343 Session::new_audio_source_path_for_embedded (const std::string& path)
4347 * we know that the filename is already unique because it exists
4348 * out in the filesystem.
4350 * However, when we bring it into the session, we could get a
4353 * Eg. two embedded files:
4358 * When merged into session, these collide.
4360 * There will not be a conflict with in-memory sources
4361 * because when the source was created we already picked
4362 * a unique name for it.
4364 * This collision is not likely to be common, but we have to guard
4365 * against it. So, if there is a collision, take the md5 hash of the
4366 * the path, and use that as the filename instead.
4369 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4370 string base = Glib::path_get_basename (path);
4371 string newpath = Glib::build_filename (sdir.sound_path(), base);
4373 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4377 md5.digestString (path.c_str());
4378 md5.writeToString ();
4379 base = md5.digestChars;
4381 string ext = get_suffix (path);
4388 newpath = Glib::build_filename (sdir.sound_path(), base);
4390 /* if this collides, we're screwed */
4392 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4393 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
4402 /** Return true if there are no audio file sources that use @param name as
4403 * the filename component of their path.
4405 * Return false otherwise.
4407 * This method MUST ONLY be used to check in-session, mono files since it
4408 * hard-codes the channel of the audio file source we are looking for as zero.
4410 * If/when Ardour supports native files in non-mono formats, the logic here
4411 * will need to be revisited.
4414 Session::audio_source_name_is_unique (const string& name)
4416 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
4417 vector<space_and_path>::iterator i;
4418 uint32_t existing = 0;
4420 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4422 /* note that we search *without* the extension so that
4423 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
4424 in the event that this new name is required for
4425 a file format change.
4428 const string spath = *i;
4430 if (matching_unsuffixed_filename_exists_in (spath, name)) {
4435 /* it is possible that we have the path already
4436 * assigned to a source that has not yet been written
4437 * (ie. the write source for a diskstream). we have to
4438 * check this in order to make sure that our candidate
4439 * path isn't used again, because that can lead to
4440 * two Sources point to the same file with different
4441 * notions of their removability.
4445 string possible_path = Glib::build_filename (spath, name);
4447 if (audio_source_by_path_and_channel (possible_path, 0)) {
4453 return (existing == 0);
4457 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)
4460 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4462 if (Profile->get_trx() && destructive) {
4464 sstr << setfill ('0') << setw (4) << cnt;
4465 sstr << legalized_base;
4467 sstr << legalized_base;
4469 if (take_required || related_exists) {
4481 } else if (nchan > 2) {
4486 /* XXX what? more than 26 channels! */
4497 /** Return a unique name based on \a base for a new internal audio source */
4499 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
4502 string possible_name;
4503 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
4505 bool some_related_source_name_exists = false;
4507 legalized = legalize_for_path (base);
4509 // Find a "version" of the base name that doesn't exist in any of the possible directories.
4511 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
4513 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
4515 if (audio_source_name_is_unique (possible_name)) {
4519 some_related_source_name_exists = true;
4522 error << string_compose(
4523 _("There are already %1 recordings for %2, which I consider too many."),
4524 limit, base) << endmsg;
4526 throw failed_constructor();
4530 /* We've established that the new name does not exist in any session
4531 * directory, so now find out which one we should use for this new
4535 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4537 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
4542 /** Return a unique name based on `base` for a new internal MIDI source */
4544 Session::new_midi_source_path (const string& base)
4547 char buf[PATH_MAX+1];
4548 const uint32_t limit = 10000;
4550 string possible_path;
4551 string possible_name;
4554 legalized = legalize_for_path (base);
4556 // Find a "version" of the file name that doesn't exist in any of the possible directories.
4557 std::vector<string> sdirs = source_search_path(DataType::MIDI);
4559 /* - the main session folder is the first in the vector.
4560 * - after checking all locations for file-name uniqueness,
4561 * we keep the one from the last iteration as new file name
4562 * - midi files are small and should just be kept in the main session-folder
4564 * -> reverse the array, check main session folder last and use that as location
4567 std::reverse(sdirs.begin(), sdirs.end());
4569 for (cnt = 1; cnt <= limit; ++cnt) {
4571 vector<space_and_path>::iterator i;
4572 uint32_t existing = 0;
4574 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4576 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
4577 possible_name = buf;
4579 possible_path = Glib::build_filename (*i, possible_name);
4581 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
4585 if (midi_source_by_path (possible_path)) {
4590 if (existing == 0) {
4595 error << string_compose(
4596 _("There are already %1 recordings for %2, which I consider too many."),
4597 limit, base) << endmsg;
4603 /* No need to "find best location" for software/app-based RAID, because
4604 MIDI is so small that we always put it in the same place.
4607 return possible_path;
4611 /** Create a new within-session audio source */
4612 boost::shared_ptr<AudioFileSource>
4613 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
4615 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
4617 if (!path.empty()) {
4618 return boost::dynamic_pointer_cast<AudioFileSource> (
4619 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate(), true, true));
4621 throw failed_constructor ();
4625 /** Create a new within-session MIDI source */
4626 boost::shared_ptr<MidiSource>
4627 Session::create_midi_source_for_session (string const & basic_name)
4629 const string path = new_midi_source_path (basic_name);
4631 if (!path.empty()) {
4632 return boost::dynamic_pointer_cast<SMFSource> (
4633 SourceFactory::createWritable (
4634 DataType::MIDI, *this, path, false, frame_rate()));
4636 throw failed_constructor ();
4640 /** Create a new within-session MIDI source */
4641 boost::shared_ptr<MidiSource>
4642 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
4644 /* the caller passes in the track the source will be used in,
4645 so that we can keep the numbering sane.
4647 Rationale: a track with the name "Foo" that has had N
4648 captures carried out so far will ALREADY have a write source
4649 named "Foo-N+1.mid" waiting to be used for the next capture.
4651 If we call new_midi_source_name() we will get "Foo-N+2". But
4652 there is no region corresponding to "Foo-N+1", so when
4653 "Foo-N+2" appears in the track, the gap presents the user
4654 with odd behaviour - why did it skip past Foo-N+1?
4656 We could explain this to the user in some odd way, but
4657 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
4660 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
4663 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
4665 std::string name = track->steal_write_source_name ();
4668 return boost::shared_ptr<MidiSource>();
4671 /* MIDI files are small, just put them in the first location of the
4672 session source search path.
4675 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
4677 return boost::dynamic_pointer_cast<SMFSource> (
4678 SourceFactory::createWritable (
4679 DataType::MIDI, *this, path, false, frame_rate()));
4684 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
4686 if (playlist->hidden()) {
4690 playlists->add (playlist);
4693 playlist->release();
4700 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
4702 if (_state_of_the_state & Deletion) {
4706 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
4712 playlists->remove (playlist);
4718 Session::set_audition (boost::shared_ptr<Region> r)
4720 pending_audition_region = r;
4721 add_post_transport_work (PostTransportAudition);
4722 _butler->schedule_transport_work ();
4726 Session::audition_playlist ()
4728 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4729 ev->region.reset ();
4734 Session::non_realtime_set_audition ()
4736 assert (pending_audition_region);
4737 auditioner->audition_region (pending_audition_region);
4738 pending_audition_region.reset ();
4739 AuditionActive (true); /* EMIT SIGNAL */
4743 Session::audition_region (boost::shared_ptr<Region> r)
4745 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4751 Session::cancel_audition ()
4756 if (auditioner->auditioning()) {
4757 auditioner->cancel_audition ();
4758 AuditionActive (false); /* EMIT SIGNAL */
4763 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
4765 if (a->is_monitor()) {
4768 if (b->is_monitor()) {
4771 return a->order_key () < b->order_key ();
4775 Session::is_auditioning () const
4777 /* can be called before we have an auditioner object */
4779 return auditioner->auditioning();
4786 Session::graph_reordered ()
4788 /* don't do this stuff if we are setting up connections
4789 from a set_state() call or creating new tracks. Ditto for deletion.
4792 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _reconnecting_routes_in_progress || _route_deletion_in_progress) {
4796 /* every track/bus asked for this to be handled but it was deferred because
4797 we were connecting. do it now.
4800 request_input_change_handling ();
4804 /* force all diskstreams to update their capture offset values to
4805 reflect any changes in latencies within the graph.
4808 boost::shared_ptr<RouteList> rl = routes.reader ();
4809 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4810 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4812 tr->set_capture_offset ();
4817 /** @return Number of frames that there is disk space available to write,
4820 boost::optional<framecnt_t>
4821 Session::available_capture_duration ()
4823 Glib::Threads::Mutex::Lock lm (space_lock);
4825 if (_total_free_4k_blocks_uncertain) {
4826 return boost::optional<framecnt_t> ();
4829 float sample_bytes_on_disk = 4.0; // keep gcc happy
4831 switch (config.get_native_file_data_format()) {
4833 sample_bytes_on_disk = 4.0;
4837 sample_bytes_on_disk = 3.0;
4841 sample_bytes_on_disk = 2.0;
4845 /* impossible, but keep some gcc versions happy */
4846 fatal << string_compose (_("programming error: %1"),
4847 X_("illegal native file data format"))
4849 abort(); /*NOTREACHED*/
4852 double scale = 4096.0 / sample_bytes_on_disk;
4854 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
4855 return max_framecnt;
4858 return (framecnt_t) floor (_total_free_4k_blocks * scale);
4862 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
4865 RCUWriter<BundleList> writer (_bundles);
4866 boost::shared_ptr<BundleList> b = writer.get_copy ();
4867 b->push_back (bundle);
4871 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4878 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
4880 bool removed = false;
4883 RCUWriter<BundleList> writer (_bundles);
4884 boost::shared_ptr<BundleList> b = writer.get_copy ();
4885 BundleList::iterator i = find (b->begin(), b->end(), bundle);
4887 if (i != b->end()) {
4894 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4900 boost::shared_ptr<Bundle>
4901 Session::bundle_by_name (string name) const
4903 boost::shared_ptr<BundleList> b = _bundles.reader ();
4905 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
4906 if ((*i)->name() == name) {
4911 return boost::shared_ptr<Bundle> ();
4915 Session::tempo_map_changed (const PropertyChange&)
4919 playlists->update_after_tempo_map_change ();
4921 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
4927 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
4929 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
4930 (*i)->recompute_frames_from_bbt ();
4934 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
4935 * the given count with the current block size.
4938 Session::ensure_buffers (ChanCount howmany)
4940 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
4944 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
4946 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4947 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
4952 Session::next_insert_id ()
4954 /* this doesn't really loop forever. just think about it */
4957 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
4958 if (!insert_bitset[n]) {
4959 insert_bitset[n] = true;
4965 /* none available, so resize and try again */
4967 insert_bitset.resize (insert_bitset.size() + 16, false);
4972 Session::next_send_id ()
4974 /* this doesn't really loop forever. just think about it */
4977 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
4978 if (!send_bitset[n]) {
4979 send_bitset[n] = true;
4985 /* none available, so resize and try again */
4987 send_bitset.resize (send_bitset.size() + 16, false);
4992 Session::next_aux_send_id ()
4994 /* this doesn't really loop forever. just think about it */
4997 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
4998 if (!aux_send_bitset[n]) {
4999 aux_send_bitset[n] = true;
5005 /* none available, so resize and try again */
5007 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
5012 Session::next_return_id ()
5014 /* this doesn't really loop forever. just think about it */
5017 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
5018 if (!return_bitset[n]) {
5019 return_bitset[n] = true;
5025 /* none available, so resize and try again */
5027 return_bitset.resize (return_bitset.size() + 16, false);
5032 Session::mark_send_id (uint32_t id)
5034 if (id >= send_bitset.size()) {
5035 send_bitset.resize (id+16, false);
5037 if (send_bitset[id]) {
5038 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
5040 send_bitset[id] = true;
5044 Session::mark_aux_send_id (uint32_t id)
5046 if (id >= aux_send_bitset.size()) {
5047 aux_send_bitset.resize (id+16, false);
5049 if (aux_send_bitset[id]) {
5050 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
5052 aux_send_bitset[id] = true;
5056 Session::mark_return_id (uint32_t id)
5058 if (id >= return_bitset.size()) {
5059 return_bitset.resize (id+16, false);
5061 if (return_bitset[id]) {
5062 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
5064 return_bitset[id] = true;
5068 Session::mark_insert_id (uint32_t id)
5070 if (id >= insert_bitset.size()) {
5071 insert_bitset.resize (id+16, false);
5073 if (insert_bitset[id]) {
5074 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
5076 insert_bitset[id] = true;
5080 Session::unmark_send_id (uint32_t id)
5082 if (id < send_bitset.size()) {
5083 send_bitset[id] = false;
5088 Session::unmark_aux_send_id (uint32_t id)
5090 if (id < aux_send_bitset.size()) {
5091 aux_send_bitset[id] = false;
5096 Session::unmark_return_id (uint32_t id)
5098 if (id < return_bitset.size()) {
5099 return_bitset[id] = false;
5104 Session::unmark_insert_id (uint32_t id)
5106 if (id < insert_bitset.size()) {
5107 insert_bitset[id] = false;
5112 Session::reset_native_file_format ()
5114 boost::shared_ptr<RouteList> rl = routes.reader ();
5116 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5117 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5119 /* don't save state as we do this, there's no point
5121 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
5122 tr->reset_write_sources (false);
5123 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
5129 Session::route_name_unique (string n) const
5131 boost::shared_ptr<RouteList> r = routes.reader ();
5133 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5134 if ((*i)->name() == n) {
5143 Session::route_name_internal (string n) const
5145 if (auditioner && auditioner->name() == n) {
5149 if (_click_io && _click_io->name() == n) {
5157 Session::freeze_all (InterThreadInfo& itt)
5159 boost::shared_ptr<RouteList> r = routes.reader ();
5161 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5163 boost::shared_ptr<Track> t;
5165 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
5166 /* XXX this is wrong because itt.progress will keep returning to zero at the start
5176 boost::shared_ptr<Region>
5177 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
5178 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
5179 InterThreadInfo& itt,
5180 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
5181 bool for_export, bool for_freeze)
5183 boost::shared_ptr<Region> result;
5184 boost::shared_ptr<Playlist> playlist;
5185 boost::shared_ptr<Source> source;
5186 ChanCount diskstream_channels (track.n_channels());
5187 framepos_t position;
5188 framecnt_t this_chunk;
5190 framepos_t latency_skip;
5192 framepos_t len = end - start;
5193 bool need_block_size_reset = false;
5194 ChanCount const max_proc = track.max_processor_streams ();
5195 string legal_playlist_name;
5196 string possible_path;
5199 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
5200 end, start) << endmsg;
5204 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
5205 include_endpoint, for_export, for_freeze);
5207 if (diskstream_channels.n(track.data_type()) < 1) {
5208 error << _("Cannot write a range with no data.") << endmsg;
5212 // block all process callback handling
5214 block_processing ();
5217 // synchronize with AudioEngine::process_callback()
5218 // make sure processing is not currently running
5219 // and processing_blocked() is honored before
5220 // acquiring thread buffers
5221 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5224 _bounce_processing_active = true;
5226 /* call tree *MUST* hold route_lock */
5228 if ((playlist = track.playlist()) == 0) {
5232 legal_playlist_name = legalize_for_path (playlist->name());
5234 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
5236 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
5237 string path = ((track.data_type() == DataType::AUDIO)
5238 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
5239 : new_midi_source_path (legal_playlist_name));
5246 source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
5249 catch (failed_constructor& err) {
5250 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
5254 srcs.push_back (source);
5257 /* tell redirects that care that we are about to use a much larger
5258 * blocksize. this will flush all plugins too, so that they are ready
5259 * to be used for this process.
5262 need_block_size_reset = true;
5263 track.set_block_size (bounce_chunk_size);
5264 _engine.main_thread()->get_buffers ();
5268 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5270 /* create a set of reasonably-sized buffers */
5271 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5272 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
5274 buffers.set_count (max_proc);
5276 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5277 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5278 boost::shared_ptr<MidiSource> ms;
5280 afs->prepare_for_peakfile_writes ();
5281 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5282 Source::Lock lock(ms->mutex());
5283 ms->mark_streaming_write_started(lock);
5287 while (to_do && !itt.cancel) {
5289 this_chunk = min (to_do, bounce_chunk_size);
5291 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
5295 start += this_chunk;
5296 to_do -= this_chunk;
5297 itt.progress = (float) (1.0 - ((double) to_do / len));
5299 if (latency_skip >= bounce_chunk_size) {
5300 latency_skip -= bounce_chunk_size;
5304 const framecnt_t current_chunk = this_chunk - latency_skip;
5307 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5308 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5309 boost::shared_ptr<MidiSource> ms;
5312 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
5315 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5316 Source::Lock lock(ms->mutex());
5318 const MidiBuffer& buf = buffers.get_midi(0);
5319 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
5320 Evoral::Event<framepos_t> ev = *i;
5321 ev.set_time(ev.time() - position);
5322 ms->append_event_frames(lock, ev, ms->timeline_position());
5329 /* post-roll, pick up delayed processor output */
5330 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5332 while (latency_skip && !itt.cancel) {
5333 this_chunk = min (latency_skip, bounce_chunk_size);
5334 latency_skip -= this_chunk;
5336 buffers.silence (this_chunk, 0);
5337 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
5340 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5341 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5344 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
5356 xnow = localtime (&now);
5358 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
5359 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5360 boost::shared_ptr<MidiSource> ms;
5363 afs->update_header (position, *xnow, now);
5364 afs->flush_header ();
5365 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5366 Source::Lock lock(ms->mutex());
5367 ms->mark_streaming_write_completed(lock);
5371 /* construct a region to represent the bounced material */
5375 plist.add (Properties::start, 0);
5376 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
5377 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
5379 result = RegionFactory::create (srcs, plist);
5385 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5386 (*src)->mark_for_remove ();
5387 (*src)->drop_references ();
5391 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5392 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5395 afs->done_with_peakfile_writes ();
5399 _bounce_processing_active = false;
5401 if (need_block_size_reset) {
5402 _engine.main_thread()->drop_buffers ();
5403 track.set_block_size (get_block_size());
5406 unblock_processing ();
5412 Session::gain_automation_buffer() const
5414 return ProcessThread::gain_automation_buffer ();
5418 Session::trim_automation_buffer() const
5420 return ProcessThread::trim_automation_buffer ();
5424 Session::send_gain_automation_buffer() const
5426 return ProcessThread::send_gain_automation_buffer ();
5430 Session::pan_automation_buffer() const
5432 return ProcessThread::pan_automation_buffer ();
5436 Session::get_silent_buffers (ChanCount count)
5438 return ProcessThread::get_silent_buffers (count);
5442 Session::get_scratch_buffers (ChanCount count, bool silence)
5444 return ProcessThread::get_scratch_buffers (count, silence);
5448 Session::get_route_buffers (ChanCount count, bool silence)
5450 return ProcessThread::get_route_buffers (count, silence);
5455 Session::get_mix_buffers (ChanCount count)
5457 return ProcessThread::get_mix_buffers (count);
5461 Session::ntracks () const
5464 boost::shared_ptr<RouteList> r = routes.reader ();
5466 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5467 if (boost::dynamic_pointer_cast<Track> (*i)) {
5476 Session::nbusses () const
5479 boost::shared_ptr<RouteList> r = routes.reader ();
5481 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5482 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
5491 Session::add_automation_list(AutomationList *al)
5493 automation_lists[al->id()] = al;
5496 /** @return true if there is at least one record-enabled track, otherwise false */
5498 Session::have_rec_enabled_track () const
5500 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
5504 Session::have_rec_disabled_track () const
5506 return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
5509 /** Update the state of our rec-enabled tracks flag */
5511 Session::update_route_record_state ()
5513 boost::shared_ptr<RouteList> rl = routes.reader ();
5514 RouteList::iterator i = rl->begin();
5515 while (i != rl->end ()) {
5517 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5518 if (tr && tr->record_enabled ()) {
5525 int const old = g_atomic_int_get (&_have_rec_enabled_track);
5527 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
5529 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
5530 RecordStateChanged (); /* EMIT SIGNAL */
5533 for (i = rl->begin(); i != rl->end (); ++i) {
5534 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5535 if (tr && !tr->record_enabled ()) {
5540 g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
5542 bool record_arm_state_changed = (old != g_atomic_int_get (&_have_rec_enabled_track) );
5544 if (record_status() == Recording && record_arm_state_changed ) {
5545 RecordArmStateChanged ();
5551 Session::listen_position_changed ()
5553 boost::shared_ptr<RouteList> r = routes.reader ();
5555 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5556 (*i)->listen_position_changed ();
5561 Session::solo_control_mode_changed ()
5563 /* cancel all solo or all listen when solo control mode changes */
5566 set_solo (get_routes(), false);
5567 } else if (listening()) {
5568 set_listen (get_routes(), false);
5572 /** Called when a property of one of our route groups changes */
5574 Session::route_group_property_changed (RouteGroup* rg)
5576 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
5579 /** Called when a route is added to one of our route groups */
5581 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5583 RouteAddedToRouteGroup (rg, r);
5586 /** Called when a route is removed from one of our route groups */
5588 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5590 update_route_record_state ();
5591 RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
5594 boost::shared_ptr<RouteList>
5595 Session::get_tracks () const
5597 boost::shared_ptr<RouteList> rl = routes.reader ();
5598 boost::shared_ptr<RouteList> tl (new RouteList);
5600 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
5601 if (boost::dynamic_pointer_cast<Track> (*r)) {
5602 if (!(*r)->is_auditioner()) {
5610 boost::shared_ptr<RouteList>
5611 Session::get_routes_with_regions_at (framepos_t const p) const
5613 boost::shared_ptr<RouteList> r = routes.reader ();
5614 boost::shared_ptr<RouteList> rl (new RouteList);
5616 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5617 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5622 boost::shared_ptr<Playlist> pl = tr->playlist ();
5627 if (pl->has_region_at (p)) {
5636 Session::goto_end ()
5638 if (_session_range_location) {
5639 request_locate (_session_range_location->end(), false);
5641 request_locate (0, false);
5646 Session::goto_start ()
5648 if (_session_range_location) {
5649 request_locate (_session_range_location->start(), false);
5651 request_locate (0, false);
5656 Session::current_start_frame () const
5658 return _session_range_location ? _session_range_location->start() : 0;
5662 Session::current_end_frame () const
5664 return _session_range_location ? _session_range_location->end() : 0;
5668 Session::set_session_range_location (framepos_t start, framepos_t end)
5670 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
5671 _locations->add (_session_range_location);
5675 Session::step_edit_status_change (bool yn)
5681 send = (_step_editors == 0);
5686 send = (_step_editors == 1);
5689 if (_step_editors > 0) {
5695 StepEditStatusChange (val);
5701 Session::start_time_changed (framepos_t old)
5703 /* Update the auto loop range to match the session range
5704 (unless the auto loop range has been changed by the user)
5707 Location* s = _locations->session_range_location ();
5712 Location* l = _locations->auto_loop_location ();
5714 if (l && l->start() == old) {
5715 l->set_start (s->start(), true);
5720 Session::end_time_changed (framepos_t old)
5722 /* Update the auto loop range to match the session range
5723 (unless the auto loop range has been changed by the user)
5726 Location* s = _locations->session_range_location ();
5731 Location* l = _locations->auto_loop_location ();
5733 if (l && l->end() == old) {
5734 l->set_end (s->end(), true);
5738 std::vector<std::string>
5739 Session::source_search_path (DataType type) const
5743 if (session_dirs.size() == 1) {
5745 case DataType::AUDIO:
5746 sp.push_back (_session_dir->sound_path());
5748 case DataType::MIDI:
5749 sp.push_back (_session_dir->midi_path());
5753 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
5754 SessionDirectory sdir (i->path);
5756 case DataType::AUDIO:
5757 sp.push_back (sdir.sound_path());
5759 case DataType::MIDI:
5760 sp.push_back (sdir.midi_path());
5766 if (type == DataType::AUDIO) {
5767 const string sound_path_2X = _session_dir->sound_path_2X();
5768 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
5769 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
5770 sp.push_back (sound_path_2X);
5775 // now check the explicit (possibly user-specified) search path
5778 case DataType::AUDIO:
5779 sp += Searchpath(config.get_audio_search_path ());
5781 case DataType::MIDI:
5782 sp += Searchpath(config.get_midi_search_path ());
5790 Session::ensure_search_path_includes (const string& path, DataType type)
5799 case DataType::AUDIO:
5800 sp += Searchpath(config.get_audio_search_path ());
5802 case DataType::MIDI:
5803 sp += Searchpath (config.get_midi_search_path ());
5807 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
5808 /* No need to add this new directory if it has the same inode as
5809 an existing one; checking inode rather than name prevents duplicated
5810 directories when we are using symlinks.
5812 On Windows, I think we could just do if (*i == path) here.
5814 if (PBD::equivalent_paths (*i, path)) {
5822 case DataType::AUDIO:
5823 config.set_audio_search_path (sp.to_string());
5825 case DataType::MIDI:
5826 config.set_midi_search_path (sp.to_string());
5832 Session::remove_dir_from_search_path (const string& dir, DataType type)
5837 case DataType::AUDIO:
5838 sp = Searchpath(config.get_audio_search_path ());
5840 case DataType::MIDI:
5841 sp = Searchpath (config.get_midi_search_path ());
5848 case DataType::AUDIO:
5849 config.set_audio_search_path (sp.to_string());
5851 case DataType::MIDI:
5852 config.set_midi_search_path (sp.to_string());
5858 boost::shared_ptr<Speakers>
5859 Session::get_speakers()
5865 Session::unknown_processors () const
5869 boost::shared_ptr<RouteList> r = routes.reader ();
5870 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5871 list<string> t = (*i)->unknown_processors ();
5872 copy (t.begin(), t.end(), back_inserter (p));
5882 Session::update_latency (bool playback)
5884 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
5886 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
5890 boost::shared_ptr<RouteList> r = routes.reader ();
5891 framecnt_t max_latency = 0;
5894 /* reverse the list so that we work backwards from the last route to run to the first */
5895 RouteList* rl = routes.reader().get();
5896 r.reset (new RouteList (*rl));
5897 reverse (r->begin(), r->end());
5900 /* compute actual latency values for the given direction and store them all in per-port
5901 structures. this will also publish the same values (to JACK) so that computation of latency
5902 for routes can consistently use public latency values.
5905 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5906 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
5909 /* because we latency compensate playback, our published playback latencies should
5910 be the same for all output ports - all material played back by ardour has
5911 the same latency, whether its caused by plugins or by latency compensation. since
5912 these may differ from the values computed above, reset all playback port latencies
5916 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
5918 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5919 (*i)->set_public_port_latencies (max_latency, playback);
5924 post_playback_latency ();
5928 post_capture_latency ();
5931 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
5935 Session::post_playback_latency ()
5937 set_worst_playback_latency ();
5939 boost::shared_ptr<RouteList> r = routes.reader ();
5941 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5942 if (!(*i)->is_auditioner() && ((*i)->active())) {
5943 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
5947 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5948 (*i)->set_latency_compensation (_worst_track_latency);
5953 Session::post_capture_latency ()
5955 set_worst_capture_latency ();
5957 /* reflect any changes in capture latencies into capture offsets
5960 boost::shared_ptr<RouteList> rl = routes.reader();
5961 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5962 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5964 tr->set_capture_offset ();
5970 Session::initialize_latencies ()
5973 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5974 update_latency (false);
5975 update_latency (true);
5978 set_worst_io_latencies ();
5982 Session::set_worst_io_latencies ()
5984 set_worst_playback_latency ();
5985 set_worst_capture_latency ();
5989 Session::set_worst_playback_latency ()
5991 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5995 _worst_output_latency = 0;
5997 if (!_engine.connected()) {
6001 boost::shared_ptr<RouteList> r = routes.reader ();
6003 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6004 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
6007 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
6011 Session::set_worst_capture_latency ()
6013 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6017 _worst_input_latency = 0;
6019 if (!_engine.connected()) {
6023 boost::shared_ptr<RouteList> r = routes.reader ();
6025 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6026 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
6029 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
6033 Session::update_latency_compensation (bool force_whole_graph)
6035 bool some_track_latency_changed = false;
6037 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6041 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
6043 _worst_track_latency = 0;
6045 boost::shared_ptr<RouteList> r = routes.reader ();
6047 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6048 if (!(*i)->is_auditioner() && ((*i)->active())) {
6050 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
6051 some_track_latency_changed = true;
6053 _worst_track_latency = max (tl, _worst_track_latency);
6057 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
6058 (some_track_latency_changed ? "yes" : "no")));
6060 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
6062 if (some_track_latency_changed || force_whole_graph) {
6063 _engine.update_latencies ();
6067 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6068 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6072 tr->set_capture_offset ();
6077 Session::session_name_is_legal (const string& path)
6079 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
6081 for (int i = 0; illegal_chars[i]; ++i) {
6082 if (path.find (illegal_chars[i]) != string::npos) {
6083 return illegal_chars[i];
6091 Session::next_control_id () const
6095 /* the monitor bus remote ID is in a different
6096 * "namespace" than regular routes. its existence doesn't
6097 * affect normal (low) numbered routes.
6104 /* the same about masterbus in Waves Tracks */
6106 if (Profile->get_trx() && _master_out) {
6110 return nroutes() - subtract;
6114 Session::notify_remote_id_change ()
6116 if (deletion_in_progress()) {
6120 switch (Config->get_remote_model()) {
6122 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
6128 #ifdef USE_TRACKS_CODE_FEATURES
6129 /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
6130 * if track order has been changed by user
6132 reconnect_existing_routes(true, true);
6138 Session::sync_order_keys ()
6140 if (deletion_in_progress()) {
6144 /* tell everyone that something has happened to the sort keys
6145 and let them sync up with the change(s)
6146 this will give objects that manage the sort order keys the
6147 opportunity to keep them in sync if they wish to.
6150 DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
6152 reassign_track_numbers();
6154 Route::SyncOrderKeys (); /* EMIT SIGNAL */
6156 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
6160 Session::operation_in_progress (GQuark op) const
6162 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
6165 boost::shared_ptr<Port>
6166 Session::ltc_input_port () const
6168 return _ltc_input->nth (0);
6171 boost::shared_ptr<Port>
6172 Session::ltc_output_port () const
6174 return _ltc_output->nth (0);
6178 Session::reconnect_ltc_input ()
6182 string src = Config->get_ltc_source_port();
6184 _ltc_input->disconnect (this);
6186 if (src != _("None") && !src.empty()) {
6187 _ltc_input->nth (0)->connect (src);
6190 if ( ARDOUR::Profile->get_trx () ) {
6191 // Tracks need this signal to update timecode_source_dropdown
6192 MtcOrLtcInputPortChanged (); //emit signal
6198 Session::reconnect_ltc_output ()
6202 string src = Config->get_ltc_output_port();
6204 _ltc_output->disconnect (this);
6206 if (src != _("None") && !src.empty()) {
6207 _ltc_output->nth (0)->connect (src);
6213 Session::set_range_selection (framepos_t start, framepos_t end)
6215 _range_selection = Evoral::Range<framepos_t> (start, end);
6216 #ifdef USE_TRACKS_CODE_FEATURES
6217 follow_playhead_priority ();
6222 Session::set_object_selection (framepos_t start, framepos_t end)
6224 _object_selection = Evoral::Range<framepos_t> (start, end);
6225 #ifdef USE_TRACKS_CODE_FEATURES
6226 follow_playhead_priority ();
6231 Session::clear_range_selection ()
6233 _range_selection = Evoral::Range<framepos_t> (-1,-1);
6234 #ifdef USE_TRACKS_CODE_FEATURES
6235 follow_playhead_priority ();
6240 Session::clear_object_selection ()
6242 _object_selection = Evoral::Range<framepos_t> (-1,-1);
6243 #ifdef USE_TRACKS_CODE_FEATURES
6244 follow_playhead_priority ();