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_track.h"
78 #include "ardour/midi_ui.h"
79 #include "ardour/operations.h"
80 #include "ardour/playlist.h"
81 #include "ardour/plugin.h"
82 #include "ardour/plugin_insert.h"
83 #include "ardour/process_thread.h"
84 #include "ardour/profile.h"
85 #include "ardour/rc_configuration.h"
86 #include "ardour/recent_sessions.h"
87 #include "ardour/region.h"
88 #include "ardour/region_factory.h"
89 #include "ardour/route_graph.h"
90 #include "ardour/route_group.h"
91 #include "ardour/route_sorters.h"
92 #include "ardour/send.h"
93 #include "ardour/session.h"
94 #include "ardour/session_directory.h"
95 #include "ardour/session_playlists.h"
96 #include "ardour/smf_source.h"
97 #include "ardour/source_factory.h"
98 #include "ardour/speakers.h"
99 #include "ardour/tempo.h"
100 #include "ardour/track.h"
101 #include "ardour/user_bundle.h"
102 #include "ardour/utils.h"
104 #include "midi++/port.h"
105 #include "midi++/mmc.h"
109 #include <glibmm/checksum.h>
118 using namespace ARDOUR;
121 bool Session::_disable_all_loaded_plugins = false;
122 bool Session::_bypass_all_loaded_plugins = false;
124 PBD::Signal1<int,uint32_t> Session::AudioEngineSetupRequired;
125 PBD::Signal1<void,std::string> Session::Dialog;
126 PBD::Signal0<int> Session::AskAboutPendingState;
127 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
128 PBD::Signal0<void> Session::SendFeedback;
129 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
131 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
132 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
133 PBD::Signal2<void,std::string, std::string> Session::Exported;
134 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
135 PBD::Signal0<void> Session::Quit;
136 PBD::Signal0<void> Session::FeedbackDetected;
137 PBD::Signal0<void> Session::SuccessfulGraphSort;
138 PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
140 const framecnt_t Session::bounce_chunk_size = 8192;
141 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
142 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
144 // seconds should be added after the region exceeds end marker
145 #ifdef USE_TRACKS_CODE_FEATURES
146 const uint32_t Session::session_end_shift = 5;
148 const uint32_t Session::session_end_shift = 0;
151 /** @param snapshot_name Snapshot name, without .ardour suffix */
152 Session::Session (AudioEngine &eng,
153 const string& fullpath,
154 const string& snapshot_name,
155 BusProfile* bus_profile,
157 : playlists (new SessionPlaylists)
159 , process_function (&Session::process_with_events)
160 , _bounce_processing_active (false)
161 , waiting_for_sync_offset (false)
162 , _base_frame_rate (0)
163 , _current_frame_rate (0)
164 , _nominal_frame_rate (0)
165 , transport_sub_state (0)
166 , _record_status (Disabled)
167 , _transport_frame (0)
168 , _session_range_location (0)
171 , _transport_speed (0)
172 , _default_transport_speed (1.0)
173 , _last_transport_speed (0)
174 , _target_transport_speed (0.0)
175 , auto_play_legal (false)
176 , _last_slave_transport_frame (0)
177 , maximum_output_latency (0)
178 , _requested_return_frame (-1)
179 , current_block_size (0)
180 , _worst_output_latency (0)
181 , _worst_input_latency (0)
182 , _worst_track_latency (0)
183 , _have_captured (false)
184 , _non_soloed_outs_muted (false)
186 , _solo_isolated_cnt (0)
188 , _was_seamless (Config->get_seamless_loop ())
189 , _under_nsm_control (false)
191 , delta_accumulator_cnt (0)
192 , average_slave_delta (1800) // !!! why 1800 ???
194 , have_first_delta_accumulator (false)
195 , _slave_state (Stopped)
196 , _mtc_active (false)
197 , _ltc_active (false)
198 , post_export_sync (false)
199 , post_export_position (0)
201 , _export_started (false)
202 , _export_rolling (false)
203 , _pre_export_mmc_enabled (false)
204 , _name (snapshot_name)
206 , _send_qf_mtc (false)
207 , _pframes_since_last_mtc (0)
208 , session_midi_feedback (0)
210 , loop_changing (false)
212 , _session_dir (new SessionDirectory (fullpath))
213 , _current_snapshot_name (snapshot_name)
215 , state_was_pending (false)
216 , _state_of_the_state (StateOfTheState(CannotSave|InitialConnecting|Loading))
218 , _save_queued (false)
219 , _last_roll_location (0)
220 , _last_roll_or_reversal_location (0)
221 , _last_record_location (0)
222 , pending_locate_roll (false)
223 , pending_locate_frame (0)
224 , pending_locate_flush (false)
225 , pending_abort (false)
226 , pending_auto_loop (false)
227 , _butler (new Butler (*this))
228 , _post_transport_work (0)
229 , cumulative_rf_motion (0)
231 , _locations (new Locations (*this))
232 , _ignore_skips_updates (false)
233 , _rt_thread_active (false)
234 , _rt_emit_pending (false)
236 , outbound_mtc_timecode_frame (0)
237 , next_quarter_frame_to_send (-1)
238 , _frames_per_timecode_frame (0)
239 , _frames_per_hour (0)
240 , _timecode_frames_per_hour (0)
241 , last_timecode_valid (false)
242 , last_timecode_when (0)
243 , _send_timecode_update (false)
255 , ltc_timecode_offset (0)
256 , ltc_timecode_negative_offset (false)
257 , midi_control_ui (0)
259 , _all_route_group (new RouteGroup (*this, "all"))
260 , routes (new RouteList)
261 , _adding_routes_in_progress (false)
262 , _reconnecting_routes_in_progress (false)
263 , _route_deletion_in_progress (false)
264 , destructive_index (0)
265 , _track_number_decimals(1)
266 , default_fade_steepness (0)
267 , default_fade_msecs (0)
268 , _total_free_4k_blocks (0)
269 , _total_free_4k_blocks_uncertain (false)
270 , no_questions_about_missing_files (false)
273 , _bundles (new BundleList)
274 , _bundle_xml_node (0)
278 , click_emphasis_data (0)
280 , click_emphasis_length (0)
281 , _clicks_cleared (0)
282 , _play_range (false)
283 , _range_selection (-1,-1)
284 , _object_selection (-1,-1)
286 , first_file_data_format_reset (true)
287 , first_file_header_format_reset (true)
288 , have_looped (false)
289 , _have_rec_enabled_track (false)
290 , _have_rec_disabled_track (true)
292 , _suspend_timecode_transmission (0)
293 , _speakers (new Speakers)
295 , ignore_route_processor_changes (false)
302 pthread_mutex_init (&_rt_emit_mutex, 0);
303 pthread_cond_init (&_rt_emit_cond, 0);
305 pre_engine_init (fullpath);
309 Stateful::loading_state_version = CURRENT_SESSION_FILE_VERSION;
311 #ifdef USE_TRACKS_CODE_FEATURES
312 sr = EngineStateController::instance()->get_current_sample_rate();
314 if (ensure_engine (sr)) {
316 throw SessionException (_("Cannot connect to audio/midi engine"));
319 if (create (mix_template, bus_profile)) {
321 throw SessionException (_("Session initialization failed"));
324 /* if a mix template was provided, then ::create() will
325 * have copied it into the session and we need to load it
326 * so that we have the state ready for ::set_state()
327 * after the engine is started.
329 * Note that we do NOT try to get the sample rate from
330 * the template at this time, though doing so would
331 * be easy if we decided this was an appropriate part
335 if (!mix_template.empty()) {
336 if (load_state (_current_snapshot_name)) {
337 throw SessionException (_("Failed to load template/snapshot state"));
339 store_recent_templates (mix_template);
342 /* load default session properties - if any */
347 if (load_state (_current_snapshot_name)) {
348 throw SessionException (_("Failed to load state"));
351 /* try to get sample rate from XML state so that we
352 * can influence the SR if we set up the audio
357 const XMLProperty* prop;
358 if ((prop = state_tree->root()->property (X_("sample-rate"))) != 0) {
359 sr = atoi (prop->value());
363 if (ensure_engine (sr)) {
365 throw SessionException (_("Cannot connect to audio/midi engine"));
369 if (post_engine_init ()) {
371 throw SessionException (_("Cannot configure audio/midi engine with session parameters"));
374 store_recent_sessions (_name, _path);
376 bool was_dirty = dirty();
378 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
380 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
381 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
384 DirtyChanged (); /* EMIT SIGNAL */
387 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
388 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
390 emit_thread_start ();
392 /* hook us up to the engine since we are now completely constructed */
394 BootMessage (_("Connect to engine"));
396 _engine.set_session (this);
397 _engine.reset_timebase ();
399 #ifdef USE_TRACKS_CODE_FEATURES
401 EngineStateController::instance()->set_session(this);
404 if ( ARDOUR::Profile->get_trx () ) {
406 /* Waves Tracks: fill session with tracks basing on the amount of inputs.
407 * each available input must have corresponding track when session starts.
410 uint32_t how_many (0);
412 std::vector<std::string> inputs;
413 EngineStateController::instance()->get_physical_audio_inputs(inputs);
415 how_many = inputs.size();
417 list<boost::shared_ptr<AudioTrack> > tracks;
419 // Track names after driver
420 if (Config->get_tracks_auto_naming() == NameAfterDriver) {
421 string track_name = "";
422 for (std::vector<string>::size_type i = 0; i < inputs.size(); ++i) {
424 track_name = inputs[i];
425 replace_all (track_name, "system:capture", "");
427 list<boost::shared_ptr<AudioTrack> > single_track = new_audio_track (1, 1, Normal, 0, 1, track_name);
428 tracks.insert(tracks.begin(), single_track.front());
430 } else { // Default track names
431 tracks = new_audio_track (1, 1, Normal, 0, how_many, string());
434 if (tracks.size() != how_many) {
436 throw failed_constructor ();
445 BootMessage (_("Session loading complete"));
457 Session::ensure_engine (uint32_t desired_sample_rate)
459 if (_engine.current_backend() == 0) {
460 /* backend is unknown ... */
461 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
462 if (r.get_value_or (-1) != 0) {
465 } else if (_engine.setup_required()) {
466 /* backend is known, but setup is needed */
467 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
468 if (r.get_value_or (-1) != 0) {
471 } else if (!_engine.running()) {
472 if (_engine.start()) {
477 /* at this point the engine should be running
480 if (!_engine.running()) {
484 return immediately_post_engine ();
489 Session::immediately_post_engine ()
491 /* Do various initializations that should take place directly after we
492 * know that the engine is running, but before we either create a
493 * session or set state for an existing one.
496 if (how_many_dsp_threads () > 1) {
497 /* For now, only create the graph if we are using >1 DSP threads, as
498 it is a bit slower than the old code with 1 thread.
500 _process_graph.reset (new Graph (*this));
503 /* every time we reconnect, recompute worst case output latencies */
505 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
507 if (synced_to_engine()) {
508 _engine.transport_stop ();
511 if (config.get_jack_time_master()) {
512 _engine.transport_locate (_transport_frame);
516 BootMessage (_("Set up LTC"));
518 BootMessage (_("Set up Click"));
520 BootMessage (_("Set up standard connections"));
524 catch (failed_constructor& err) {
528 /* TODO, connect in different thread. (PortRegisteredOrUnregistered may be in RT context)
530 _engine.PortRegisteredOrUnregistered.connect_same_thread (*this, boost::bind (&Session::setup_bundles, this));
538 vector<void*> debug_pointers;
540 /* if we got to here, leaving pending capture state around
544 remove_pending_capture_state ();
546 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
548 /* disconnect from any and all signals that we are connected to */
552 /* shutdown control surface protocols while we still have ports
553 and the engine to move data to any devices.
556 ControlProtocolManager::instance().drop_protocols ();
558 _engine.remove_session ();
560 #ifdef USE_TRACKS_CODE_FEATURES
561 EngineStateController::instance()->remove_session();
564 /* deregister all ports - there will be no process or any other
565 * callbacks from the engine any more.
568 Port::PortDrop (); /* EMIT SIGNAL */
572 /* clear history so that no references to objects are held any more */
576 /* clear state tree so that no references to objects are held any more */
581 /* reset dynamic state version back to default */
583 Stateful::loading_state_version = 0;
585 _butler->drop_references ();
589 delete _all_route_group;
591 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
592 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
596 if (click_data != default_click) {
597 delete [] click_data;
600 if (click_emphasis_data != default_click_emphasis) {
601 delete [] click_emphasis_data;
606 /* need to remove auditioner before monitoring section
607 * otherwise it is re-connected */
610 /* drop references to routes held by the monitoring section
611 * specifically _monitor_out aux/listen references */
612 remove_monitor_section();
614 /* clear out any pending dead wood from RCU managed objects */
619 AudioDiskstream::free_working_buffers();
621 /* tell everyone who is still standing that we're about to die */
624 /* tell everyone to drop references and delete objects as we go */
626 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
627 RegionFactory::delete_all_regions ();
629 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
631 /* reset these three references to special routes before we do the usual route delete thing */
633 _master_out.reset ();
634 _monitor_out.reset ();
637 RCUWriter<RouteList> writer (routes);
638 boost::shared_ptr<RouteList> r = writer.get_copy ();
640 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
641 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
642 (*i)->drop_references ();
646 /* writer goes out of scope and updates master */
651 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
652 Glib::Threads::Mutex::Lock lm (source_lock);
653 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
654 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
655 i->second->drop_references ();
661 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
664 emit_thread_terminate ();
666 pthread_cond_destroy (&_rt_emit_cond);
667 pthread_mutex_destroy (&_rt_emit_mutex);
669 delete _scene_changer; _scene_changer = 0;
670 delete midi_control_ui; midi_control_ui = 0;
672 delete _mmc; _mmc = 0;
673 delete _midi_ports; _midi_ports = 0;
674 delete _locations; _locations = 0;
678 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
680 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
681 boost_debug_list_ptrs ();
686 Session::setup_ltc ()
690 _ltc_input.reset (new IO (*this, X_("LTC In"), IO::Input));
691 _ltc_output.reset (new IO (*this, X_("LTC Out"), IO::Output));
693 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC In"))) != 0) {
694 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
697 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
698 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
700 reconnect_ltc_input ();
703 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC Out"))) != 0) {
704 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
707 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
708 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
710 reconnect_ltc_output ();
713 /* fix up names of LTC ports because we don't want the normal
714 * IO style of NAME/TYPE-{in,out}N
717 _ltc_input->nth (0)->set_name (X_("LTC-in"));
718 _ltc_output->nth (0)->set_name (X_("LTC-out"));
722 Session::setup_click ()
725 _click_io.reset (new ClickIO (*this, X_("Click")));
726 _click_gain.reset (new Amp (*this));
727 _click_gain->activate ();
729 setup_click_state (state_tree->root());
731 setup_click_state (0);
736 Session::setup_click_state (const XMLNode* node)
738 const XMLNode* child = 0;
740 if (node && (child = find_named_node (*node, "Click")) != 0) {
742 /* existing state for Click */
745 if (Stateful::loading_state_version < 3000) {
746 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
748 const XMLNodeList& children (child->children());
749 XMLNodeList::const_iterator i = children.begin();
750 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
752 if (i != children.end()) {
753 c = _click_gain->set_state (**i, Stateful::loading_state_version);
759 _clicking = Config->get_clicking ();
763 error << _("could not setup Click I/O") << endmsg;
770 /* default state for Click: dual-mono to first 2 physical outputs */
773 _engine.get_physical_outputs (DataType::AUDIO, outs);
775 for (uint32_t physport = 0; physport < 2; ++physport) {
776 if (outs.size() > physport) {
777 if (_click_io->add_port (outs[physport], this)) {
778 // relax, even though its an error
783 if (_click_io->n_ports () > ChanCount::ZERO) {
784 _clicking = Config->get_clicking ();
790 Session::setup_bundles ()
794 RCUWriter<BundleList> writer (_bundles);
795 boost::shared_ptr<BundleList> b = writer.get_copy ();
796 for (BundleList::iterator i = b->begin(); i != b->end();) {
797 if (boost::dynamic_pointer_cast<UserBundle>(*i)) {
805 vector<string> inputs[DataType::num_types];
806 vector<string> outputs[DataType::num_types];
807 for (uint32_t i = 0; i < DataType::num_types; ++i) {
808 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
809 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
812 /* Create a set of Bundle objects that map
813 to the physical I/O currently available. We create both
814 mono and stereo bundles, so that the common cases of mono
815 and stereo tracks get bundles to put in their mixer strip
816 in / out menus. There may be a nicer way of achieving that;
817 it doesn't really scale that well to higher channel counts
820 /* mono output bundles */
822 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
824 std::string pn = _engine.get_pretty_name_by_name (outputs[DataType::AUDIO][np]);
826 snprintf (buf, sizeof (buf), _("out %s"), pn.c_str());
828 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
831 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
832 c->add_channel (_("mono"), DataType::AUDIO);
833 c->set_port (0, outputs[DataType::AUDIO][np]);
835 add_bundle (c, false);
838 /* stereo output bundles */
840 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
841 if (np + 1 < outputs[DataType::AUDIO].size()) {
843 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
844 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
845 c->add_channel (_("L"), DataType::AUDIO);
846 c->set_port (0, outputs[DataType::AUDIO][np]);
847 c->add_channel (_("R"), DataType::AUDIO);
848 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
850 add_bundle (c, false);
854 /* mono input bundles */
856 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
858 std::string pn = _engine.get_pretty_name_by_name (inputs[DataType::AUDIO][np]);
860 snprintf (buf, sizeof (buf), _("in %s"), pn.c_str());
862 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
865 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
866 c->add_channel (_("mono"), DataType::AUDIO);
867 c->set_port (0, inputs[DataType::AUDIO][np]);
869 add_bundle (c, false);
872 /* stereo input bundles */
874 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
875 if (np + 1 < inputs[DataType::AUDIO].size()) {
877 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
879 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
880 c->add_channel (_("L"), DataType::AUDIO);
881 c->set_port (0, inputs[DataType::AUDIO][np]);
882 c->add_channel (_("R"), DataType::AUDIO);
883 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
885 add_bundle (c, false);
889 /* MIDI input bundles */
891 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
892 string n = inputs[DataType::MIDI][np];
893 std::string pn = _engine.get_pretty_name_by_name (n);
897 boost::erase_first (n, X_("alsa_pcm:"));
899 boost::shared_ptr<Bundle> c (new Bundle (n, false));
900 c->add_channel ("", DataType::MIDI);
901 c->set_port (0, inputs[DataType::MIDI][np]);
902 add_bundle (c, false);
905 /* MIDI output bundles */
907 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
908 string n = outputs[DataType::MIDI][np];
909 std::string pn = _engine.get_pretty_name_by_name (n);
913 boost::erase_first (n, X_("alsa_pcm:"));
915 boost::shared_ptr<Bundle> c (new Bundle (n, true));
916 c->add_channel ("", DataType::MIDI);
917 c->set_port (0, outputs[DataType::MIDI][np]);
918 add_bundle (c, false);
921 // we trust the backend to only calls us if there's a change
922 BundleAddedOrRemoved (); /* EMIT SIGNAL */
926 Session::auto_connect_master_bus ()
928 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
932 // Waves Tracks: Do not connect master bas for Tracks if AutoConnectMaster option is not set
933 // In this case it means "Multi Out" output mode
934 if (ARDOUR::Profile->get_trx() && !(Config->get_output_auto_connect() & AutoConnectMaster) ) {
938 /* if requested auto-connect the outputs to the first N physical ports.
941 uint32_t limit = _master_out->n_outputs().n_total();
942 vector<string> outputs[DataType::num_types];
944 for (uint32_t i = 0; i < DataType::num_types; ++i) {
945 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
948 for (uint32_t n = 0; n < limit; ++n) {
949 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
951 if (outputs[p->type()].size() > n) {
952 connect_to = outputs[p->type()][n];
955 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
956 if (_master_out->output()->connect (p, connect_to, this)) {
957 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
966 Session::remove_monitor_section ()
968 if (!_monitor_out || Profile->get_trx()) {
972 /* force reversion to Solo-In-Place */
973 Config->set_solo_control_is_listen_control (false);
975 /* if we are auditioning, cancel it ... this is a workaround
976 to a problem (auditioning does not execute the process graph,
977 which is needed to remove routes when using >1 core for processing)
982 /* Hold process lock while doing this so that we don't hear bits and
983 * pieces of audio as we work on each route.
986 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
988 /* Connect tracks to monitor section. Note that in an
989 existing session, the internal sends will already exist, but we want the
990 routes to notice that they connect to the control out specifically.
994 boost::shared_ptr<RouteList> r = routes.reader ();
995 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
997 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
999 if ((*x)->is_monitor()) {
1001 } else if ((*x)->is_master()) {
1004 (*x)->remove_aux_or_listen (_monitor_out);
1009 remove_route (_monitor_out);
1010 auto_connect_master_bus ();
1013 auditioner->connect ();
1018 Session::add_monitor_section ()
1022 if (_monitor_out || !_master_out || Profile->get_trx()) {
1026 boost::shared_ptr<Route> r (new Route (*this, _("Monitor"), Route::MonitorOut, DataType::AUDIO));
1032 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1033 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
1036 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1037 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1038 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1040 error << _("Cannot create monitor section. 'Monitor' Port name is not unique.") << endmsg;
1045 add_routes (rl, false, false, false);
1047 assert (_monitor_out);
1049 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
1050 are undefined, at best.
1053 uint32_t limit = _monitor_out->n_inputs().n_audio();
1057 /* connect the inputs to the master bus outputs. this
1058 * represents a separate data feed from the internal sends from
1059 * each route. as of jan 2011, it allows the monitor section to
1060 * conditionally ignore either the internal sends or the normal
1061 * input feed, but we should really find a better way to do
1065 _master_out->output()->disconnect (this);
1067 for (uint32_t n = 0; n < limit; ++n) {
1068 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1069 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1072 string connect_to = o->name();
1073 if (_monitor_out->input()->connect (p, connect_to, this)) {
1074 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1082 /* if monitor section is not connected, connect it to physical outs
1085 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
1087 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1089 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1092 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1094 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1095 Config->get_monitor_bus_preferred_bundle())
1101 /* Monitor bus is audio only */
1103 vector<string> outputs[DataType::num_types];
1105 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1106 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1109 uint32_t mod = outputs[DataType::AUDIO].size();
1110 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1114 for (uint32_t n = 0; n < limit; ++n) {
1116 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1118 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1119 connect_to = outputs[DataType::AUDIO][n % mod];
1122 if (!connect_to.empty()) {
1123 if (_monitor_out->output()->connect (p, connect_to, this)) {
1124 error << string_compose (
1125 _("cannot connect control output %1 to %2"),
1136 /* Hold process lock while doing this so that we don't hear bits and
1137 * pieces of audio as we work on each route.
1140 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1142 /* Connect tracks to monitor section. Note that in an
1143 existing session, the internal sends will already exist, but we want the
1144 routes to notice that they connect to the control out specifically.
1148 boost::shared_ptr<RouteList> rls = routes.reader ();
1150 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1152 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1154 if ((*x)->is_monitor()) {
1156 } else if ((*x)->is_master()) {
1159 (*x)->enable_monitor_send ();
1164 auditioner->connect ();
1169 Session::reset_monitor_section ()
1171 /* Process lock should be held by the caller.*/
1173 if (!_monitor_out || Profile->get_trx()) {
1177 uint32_t limit = _master_out->n_outputs().n_audio();
1179 /* connect the inputs to the master bus outputs. this
1180 * represents a separate data feed from the internal sends from
1181 * each route. as of jan 2011, it allows the monitor section to
1182 * conditionally ignore either the internal sends or the normal
1183 * input feed, but we should really find a better way to do
1187 _master_out->output()->disconnect (this);
1188 _monitor_out->output()->disconnect (this);
1190 _monitor_out->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1191 _monitor_out->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1193 for (uint32_t n = 0; n < limit; ++n) {
1194 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1195 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1198 string connect_to = o->name();
1199 if (_monitor_out->input()->connect (p, connect_to, this)) {
1200 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1207 /* connect monitor section to physical outs
1210 if (Config->get_auto_connect_standard_busses()) {
1212 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1214 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1217 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1219 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1220 Config->get_monitor_bus_preferred_bundle())
1226 /* Monitor bus is audio only */
1228 vector<string> outputs[DataType::num_types];
1230 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1231 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1234 uint32_t mod = outputs[DataType::AUDIO].size();
1235 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1239 for (uint32_t n = 0; n < limit; ++n) {
1241 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1243 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1244 connect_to = outputs[DataType::AUDIO][n % mod];
1247 if (!connect_to.empty()) {
1248 if (_monitor_out->output()->connect (p, connect_to, this)) {
1249 error << string_compose (
1250 _("cannot connect control output %1 to %2"),
1261 /* Connect tracks to monitor section. Note that in an
1262 existing session, the internal sends will already exist, but we want the
1263 routes to notice that they connect to the control out specifically.
1267 boost::shared_ptr<RouteList> rls = routes.reader ();
1269 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1271 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1273 if ((*x)->is_monitor()) {
1275 } else if ((*x)->is_master()) {
1278 (*x)->enable_monitor_send ();
1284 Session::hookup_io ()
1286 /* stop graph reordering notifications from
1287 causing resorts, etc.
1290 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
1294 /* we delay creating the auditioner till now because
1295 it makes its own connections to ports.
1299 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
1301 throw failed_constructor ();
1303 a->use_new_diskstream ();
1307 catch (failed_constructor& err) {
1308 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
1312 /* load bundles, which we may have postponed earlier on */
1313 if (_bundle_xml_node) {
1314 load_bundles (*_bundle_xml_node);
1315 delete _bundle_xml_node;
1318 /* Tell all IO objects to connect themselves together */
1320 IO::enable_connecting ();
1322 /* Now tell all "floating" ports to connect to whatever
1323 they should be connected to.
1326 AudioEngine::instance()->reconnect_ports ();
1328 /* Anyone who cares about input state, wake up and do something */
1330 IOConnectionsComplete (); /* EMIT SIGNAL */
1332 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
1334 /* now handle the whole enchilada as if it was one
1335 graph reorder event.
1340 /* update the full solo state, which can't be
1341 correctly determined on a per-route basis, but
1342 needs the global overview that only the session
1346 update_route_solo_state ();
1350 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
1352 boost::shared_ptr<Track> track = wp.lock ();
1357 boost::shared_ptr<Playlist> playlist;
1359 if ((playlist = track->playlist()) != 0) {
1360 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
1361 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
1362 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
1367 Session::record_enabling_legal () const
1369 /* this used to be in here, but survey says.... we don't need to restrict it */
1370 // if (record_status() == Recording) {
1374 if (Config->get_all_safe()) {
1381 Session::set_track_monitor_input_status (bool yn)
1383 boost::shared_ptr<RouteList> rl = routes.reader ();
1384 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1385 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1386 if (tr && tr->record_enabled ()) {
1387 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1388 tr->request_input_monitoring (yn);
1394 Session::auto_punch_start_changed (Location* location)
1396 replace_event (SessionEvent::PunchIn, location->start());
1398 if (get_record_enabled() && config.get_punch_in()) {
1399 /* capture start has been changed, so save new pending state */
1400 save_state ("", true);
1405 Session::auto_punch_end_changed (Location* location)
1407 framepos_t when_to_stop = location->end();
1408 // when_to_stop += _worst_output_latency + _worst_input_latency;
1409 replace_event (SessionEvent::PunchOut, when_to_stop);
1413 Session::auto_punch_changed (Location* location)
1415 framepos_t when_to_stop = location->end();
1417 replace_event (SessionEvent::PunchIn, location->start());
1418 //when_to_stop += _worst_output_latency + _worst_input_latency;
1419 replace_event (SessionEvent::PunchOut, when_to_stop);
1422 /** @param loc A loop location.
1423 * @param pos Filled in with the start time of the required fade-out (in session frames).
1424 * @param length Filled in with the length of the required fade-out.
1427 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
1429 pos = max (loc->start(), loc->end() - 64);
1430 length = loc->end() - pos;
1434 Session::auto_loop_changed (Location* location)
1436 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1439 auto_loop_declick_range (location, dcp, dcl);
1441 if (transport_rolling() && play_loop) {
1443 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1445 // if (_transport_frame > location->end()) {
1447 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1448 // relocate to beginning of loop
1449 clear_events (SessionEvent::LocateRoll);
1451 request_locate (location->start(), true);
1454 else if (Config->get_seamless_loop() && !loop_changing) {
1456 // schedule a locate-roll to refill the diskstreams at the
1457 // previous loop end
1458 loop_changing = true;
1460 if (location->end() > last_loopend) {
1461 clear_events (SessionEvent::LocateRoll);
1462 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1468 clear_events (SessionEvent::AutoLoopDeclick);
1469 clear_events (SessionEvent::AutoLoop);
1472 /* possibly move playhead if not rolling; if we are rolling we'll move
1473 to the loop start on stop if that is appropriate.
1478 if (!transport_rolling() && select_playhead_priority_target (pos)) {
1479 if (pos == location->start()) {
1480 request_locate (pos);
1485 last_loopend = location->end();
1490 Session::set_auto_punch_location (Location* location)
1494 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1495 punch_connections.drop_connections();
1496 existing->set_auto_punch (false, this);
1497 remove_event (existing->start(), SessionEvent::PunchIn);
1498 clear_events (SessionEvent::PunchOut);
1499 auto_punch_location_changed (0);
1504 if (location == 0) {
1508 if (location->end() <= location->start()) {
1509 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1513 punch_connections.drop_connections ();
1515 location->StartChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, location));
1516 location->EndChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, location));
1517 location->Changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, location));
1519 location->set_auto_punch (true, this);
1521 auto_punch_changed (location);
1523 auto_punch_location_changed (location);
1527 Session::set_session_extents (framepos_t start, framepos_t end)
1530 if ((existing = _locations->session_range_location()) == 0) {
1531 //if there is no existing session, we need to make a new session location (should never happen)
1532 existing = new Location (*this, 0, 0, _("session"), Location::IsSessionRange);
1536 error << _("Session: you can't use that location for session start/end)") << endmsg;
1540 existing->set( start, end );
1546 Session::set_auto_loop_location (Location* location)
1550 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1551 loop_connections.drop_connections ();
1552 existing->set_auto_loop (false, this);
1553 remove_event (existing->end(), SessionEvent::AutoLoop);
1556 auto_loop_declick_range (existing, dcp, dcl);
1557 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1558 auto_loop_location_changed (0);
1563 if (location == 0) {
1567 if (location->end() <= location->start()) {
1568 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1572 last_loopend = location->end();
1574 loop_connections.drop_connections ();
1576 location->StartChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1577 location->EndChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1578 location->Changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1579 location->FlagsChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1581 location->set_auto_loop (true, this);
1583 if (Config->get_loop_is_mode() && play_loop && Config->get_seamless_loop()) {
1584 // set all tracks to use internal looping
1585 boost::shared_ptr<RouteList> rl = routes.reader ();
1586 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1587 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1588 if (tr && !tr->hidden()) {
1589 tr->set_loop (location);
1594 /* take care of our stuff first */
1596 auto_loop_changed (location);
1598 /* now tell everyone else */
1600 auto_loop_location_changed (location);
1604 Session::update_marks (Location*)
1610 Session::update_skips (Location* loc, bool consolidate)
1612 if (_ignore_skips_updates) {
1616 Locations::LocationList skips;
1619 PBD::Unwinder<bool> uw (_ignore_skips_updates, true);
1620 consolidate_skips (loc);
1623 sync_locations_to_skips ();
1629 Session::consolidate_skips (Location* loc)
1631 Locations::LocationList all_locations = _locations->list ();
1633 for (Locations::LocationList::iterator l = all_locations.begin(); l != all_locations.end(); ) {
1635 if (!(*l)->is_skip ()) {
1640 /* don't test against self */
1647 switch (Evoral::coverage ((*l)->start(), (*l)->end(), loc->start(), loc->end())) {
1648 case Evoral::OverlapInternal:
1649 case Evoral::OverlapExternal:
1650 case Evoral::OverlapStart:
1651 case Evoral::OverlapEnd:
1652 /* adjust new location to cover existing one */
1653 loc->set_start (min (loc->start(), (*l)->start()));
1654 loc->set_end (max (loc->end(), (*l)->end()));
1655 /* we don't need this one any more */
1656 _locations->remove (*l);
1657 /* the location has been deleted, so remove reference to it in our local list */
1658 l = all_locations.erase (l);
1661 case Evoral::OverlapNone:
1669 Session::sync_locations_to_skips ()
1671 /* This happens asynchronously (in the audioengine thread). After the clear is done, we will call
1672 * Session::_sync_locations_to_skips() from the audioengine thread.
1674 clear_events (SessionEvent::Skip, boost::bind (&Session::_sync_locations_to_skips, this));
1678 Session::_sync_locations_to_skips ()
1680 /* called as a callback after existing Skip events have been cleared from a realtime audioengine thread */
1682 Locations::LocationList const & locs (_locations->list());
1684 for (Locations::LocationList::const_iterator i = locs.begin(); i != locs.end(); ++i) {
1686 Location* location = *i;
1688 if (location->is_skip() && location->is_skipping()) {
1689 SessionEvent* ev = new SessionEvent (SessionEvent::Skip, SessionEvent::Add, location->start(), location->end(), 1.0);
1697 Session::location_added (Location *location)
1699 if (location->is_auto_punch()) {
1700 set_auto_punch_location (location);
1703 if (location->is_auto_loop()) {
1704 set_auto_loop_location (location);
1707 if (location->is_session_range()) {
1708 /* no need for any signal handling or event setting with the session range,
1709 because we keep a direct reference to it and use its start/end directly.
1711 _session_range_location = location;
1714 if (location->is_mark()) {
1715 /* listen for per-location signals that require us to do any * global updates for marks */
1717 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1718 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1719 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1720 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1723 if (location->is_skip()) {
1724 /* listen for per-location signals that require us to update skip-locate events */
1726 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1727 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1728 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1729 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, false));
1731 update_skips (location, true);
1738 Session::location_removed (Location *location)
1740 if (location->is_auto_loop()) {
1741 set_auto_loop_location (0);
1742 set_track_loop (false);
1745 if (location->is_auto_punch()) {
1746 set_auto_punch_location (0);
1749 if (location->is_session_range()) {
1750 /* this is never supposed to happen */
1751 error << _("programming error: session range removed!") << endl;
1754 if (location->is_skip()) {
1756 update_skips (location, false);
1763 Session::locations_changed ()
1765 _locations->apply (*this, &Session::_locations_changed);
1769 Session::_locations_changed (const Locations::LocationList& locations)
1771 /* There was some mass-change in the Locations object.
1773 We might be re-adding a location here but it doesn't actually matter
1774 for all the locations that the Session takes an interest in.
1778 PBD::Unwinder<bool> protect_ignore_skip_updates (_ignore_skips_updates, true);
1779 for (Locations::LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
1780 location_added (*i);
1784 update_skips (NULL, false);
1788 Session::enable_record ()
1790 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1791 /* no recording at anything except normal speed */
1796 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1798 if (rs == Recording) {
1802 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1804 _last_record_location = _transport_frame;
1805 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1807 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1808 set_track_monitor_input_status (true);
1811 RecordStateChanged ();
1818 Session::disable_record (bool rt_context, bool force)
1822 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1824 if (!Config->get_latched_record_enable () || force) {
1825 g_atomic_int_set (&_record_status, Disabled);
1826 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1828 if (rs == Recording) {
1829 g_atomic_int_set (&_record_status, Enabled);
1833 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1834 set_track_monitor_input_status (false);
1837 RecordStateChanged (); /* emit signal */
1840 remove_pending_capture_state ();
1846 Session::step_back_from_record ()
1848 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1850 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1851 set_track_monitor_input_status (false);
1854 RecordStateChanged (); /* emit signal */
1859 Session::maybe_enable_record ()
1861 if (_step_editors > 0) {
1865 g_atomic_int_set (&_record_status, Enabled);
1867 /* This function is currently called from somewhere other than an RT thread.
1868 This save_state() call therefore doesn't impact anything. Doing it here
1869 means that we save pending state of which sources the next record will use,
1870 which gives us some chance of recovering from a crash during the record.
1873 save_state ("", true);
1875 if (_transport_speed) {
1876 if (!config.get_punch_in()) {
1880 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1881 RecordStateChanged (); /* EMIT SIGNAL */
1888 Session::audible_frame () const
1894 offset = worst_playback_latency ();
1896 if (synced_to_engine()) {
1897 /* Note: this is basically just sync-to-JACK */
1898 tf = _engine.transport_frame();
1900 tf = _transport_frame;
1905 if (!non_realtime_work_pending()) {
1909 /* Check to see if we have passed the first guaranteed
1910 audible frame past our last start position. if not,
1911 return that last start point because in terms
1912 of audible frames, we have not moved yet.
1914 `Start position' in this context means the time we last
1915 either started, located, or changed transport direction.
1918 if (_transport_speed > 0.0f) {
1920 if (!play_loop || !have_looped) {
1921 if (tf < _last_roll_or_reversal_location + offset) {
1922 return _last_roll_or_reversal_location;
1930 } else if (_transport_speed < 0.0f) {
1932 /* XXX wot? no backward looping? */
1934 if (tf > _last_roll_or_reversal_location - offset) {
1935 return _last_roll_or_reversal_location;
1947 Session::set_frame_rate (framecnt_t frames_per_second)
1949 /** \fn void Session::set_frame_size(framecnt_t)
1950 the AudioEngine object that calls this guarantees
1951 that it will not be called while we are also in
1952 ::process(). Its fine to do things that block
1956 _base_frame_rate = frames_per_second;
1957 _nominal_frame_rate = frames_per_second;
1962 reset_write_sources (false);
1964 // XXX we need some equivalent to this, somehow
1965 // SndFileSource::setup_standard_crossfades (frames_per_second);
1969 /* XXX need to reset/reinstantiate all LADSPA plugins */
1973 Session::set_block_size (pframes_t nframes)
1975 /* the AudioEngine guarantees
1976 that it will not be called while we are also in
1977 ::process(). It is therefore fine to do things that block
1982 current_block_size = nframes;
1986 boost::shared_ptr<RouteList> r = routes.reader ();
1988 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1989 (*i)->set_block_size (nframes);
1992 boost::shared_ptr<RouteList> rl = routes.reader ();
1993 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1994 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1996 tr->set_block_size (nframes);
2000 set_worst_io_latencies ();
2006 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
2008 boost::shared_ptr<Route> r2;
2010 if (r1->feeds (rbase) && rbase->feeds (r1)) {
2011 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
2015 /* make a copy of the existing list of routes that feed r1 */
2017 Route::FedBy existing (r1->fed_by());
2019 /* for each route that feeds r1, recurse, marking it as feeding
2023 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
2024 if (!(r2 = i->r.lock ())) {
2025 /* (*i) went away, ignore it */
2029 /* r2 is a route that feeds r1 which somehow feeds base. mark
2030 base as being fed by r2
2033 rbase->add_fed_by (r2, i->sends_only);
2037 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
2041 if (r1->feeds (r2) && r2->feeds (r1)) {
2045 /* now recurse, so that we can mark base as being fed by
2046 all routes that feed r2
2049 trace_terminal (r2, rbase);
2056 Session::resort_routes ()
2058 /* don't do anything here with signals emitted
2059 by Routes during initial setup or while we
2060 are being destroyed.
2063 if (_state_of_the_state & (InitialConnecting | Deletion)) {
2068 RCUWriter<RouteList> writer (routes);
2069 boost::shared_ptr<RouteList> r = writer.get_copy ();
2070 resort_routes_using (r);
2071 /* writer goes out of scope and forces update */
2075 boost::shared_ptr<RouteList> rl = routes.reader ();
2076 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2077 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
2079 const Route::FedBy& fb ((*i)->fed_by());
2081 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
2082 boost::shared_ptr<Route> sf = f->r.lock();
2084 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
2092 /** This is called whenever we need to rebuild the graph of how we will process
2094 * @param r List of routes, in any order.
2098 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
2100 /* We are going to build a directed graph of our routes;
2101 this is where the edges of that graph are put.
2106 /* Go through all routes doing two things:
2108 * 1. Collect the edges of the route graph. Each of these edges
2109 * is a pair of routes, one of which directly feeds the other
2110 * either by a JACK connection or by an internal send.
2112 * 2. Begin the process of making routes aware of which other
2113 * routes directly or indirectly feed them. This information
2114 * is used by the solo code.
2117 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2119 /* Clear out the route's list of direct or indirect feeds */
2120 (*i)->clear_fed_by ();
2122 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
2124 bool via_sends_only;
2126 /* See if this *j feeds *i according to the current state of the JACK
2127 connections and internal sends.
2129 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
2130 /* add the edge to the graph (part #1) */
2131 edges.add (*j, *i, via_sends_only);
2132 /* tell the route (for part #2) */
2133 (*i)->add_fed_by (*j, via_sends_only);
2138 /* Attempt a topological sort of the route graph */
2139 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
2141 if (sorted_routes) {
2142 /* We got a satisfactory topological sort, so there is no feedback;
2145 Note: the process graph rechain does not require a
2146 topologically-sorted list, but hey ho.
2148 if (_process_graph) {
2149 _process_graph->rechain (sorted_routes, edges);
2152 _current_route_graph = edges;
2154 /* Complete the building of the routes' lists of what directly
2155 or indirectly feeds them.
2157 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2158 trace_terminal (*i, *i);
2161 *r = *sorted_routes;
2164 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
2165 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2166 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
2167 (*i)->name(), (*i)->order_key ()));
2171 SuccessfulGraphSort (); /* EMIT SIGNAL */
2174 /* The topological sort failed, so we have a problem. Tell everyone
2175 and stick to the old graph; this will continue to be processed, so
2176 until the feedback is fixed, what is played back will not quite
2177 reflect what is actually connected. Note also that we do not
2178 do trace_terminal here, as it would fail due to an endless recursion,
2179 so the solo code will think that everything is still connected
2183 FeedbackDetected (); /* EMIT SIGNAL */
2188 /** Find a route name starting with \a base, maybe followed by the
2189 * lowest \a id. \a id will always be added if \a definitely_add_number
2190 * is true on entry; otherwise it will only be added if required
2191 * to make the name unique.
2193 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
2194 * The available route name with the lowest ID will be used, and \a id
2195 * will be set to the ID.
2197 * \return false if a route name could not be found, and \a track_name
2198 * and \a id do not reflect a free route name.
2201 Session::find_route_name (string const & base, uint32_t& id, string& name, bool definitely_add_number)
2203 /* the base may conflict with ports that do not belong to existing
2204 routes, but hidden objects like the click track. So check port names
2205 before anything else.
2208 for (vector<string>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
2209 if (base == *reserved) {
2210 definitely_add_number = true;
2218 if (!definitely_add_number && route_by_name (base) == 0) {
2219 /* juse use the base */
2225 name = string_compose ("%1 %2", base, id);
2227 if (route_by_name (name) == 0) {
2233 } while (id < (UINT_MAX-1));
2238 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
2240 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
2242 in = ChanCount::ZERO;
2243 out = ChanCount::ZERO;
2245 boost::shared_ptr<RouteList> r = routes.reader ();
2247 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2248 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2249 if (tr && !tr->is_auditioner()) {
2250 in += tr->n_inputs();
2251 out += tr->n_outputs();
2257 Session::default_track_name_pattern (DataType t)
2260 case DataType::AUDIO:
2261 if (Profile->get_trx()) {
2268 case DataType::MIDI:
2275 /** Caller must not hold process lock
2276 * @param name_template string to use for the start of the name, or "" to use "MIDI".
2277 * @param instrument plugin info for the instrument to insert pre-fader, if any
2279 list<boost::shared_ptr<MidiTrack> >
2280 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
2281 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
2284 uint32_t track_id = 0;
2286 RouteList new_routes;
2287 list<boost::shared_ptr<MidiTrack> > ret;
2289 const string name_pattern = default_track_name_pattern (DataType::MIDI);
2290 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
2293 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, use_number)) {
2294 error << "cannot find name for new midi track" << endmsg;
2298 boost::shared_ptr<MidiTrack> track;
2301 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
2303 if (track->init ()) {
2307 track->use_new_diskstream();
2309 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2310 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2313 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2314 if (track->input()->ensure_io (input, false, this)) {
2315 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
2319 if (track->output()->ensure_io (output, false, this)) {
2320 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
2325 track->non_realtime_input_change();
2328 route_group->add (track);
2331 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2333 if (Config->get_remote_model() == UserOrdered) {
2334 track->set_remote_control_id (next_control_id());
2337 new_routes.push_back (track);
2338 ret.push_back (track);
2340 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2343 catch (failed_constructor &err) {
2344 error << _("Session: could not create new midi track.") << endmsg;
2348 catch (AudioEngine::PortRegistrationFailure& pfe) {
2350 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;
2358 if (!new_routes.empty()) {
2359 StateProtector sp (this);
2360 if (Profile->get_trx()) {
2361 add_routes (new_routes, false, false, false);
2363 add_routes (new_routes, true, true, false);
2367 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
2368 PluginPtr plugin = instrument->load (*this);
2369 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2370 (*r)->add_processor (p, PreFader);
2380 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2382 boost::shared_ptr<Route> midi_track (wmt.lock());
2388 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2390 if (change.after.n_audio() <= change.before.n_audio()) {
2394 /* new audio ports: make sure the audio goes somewhere useful,
2395 unless the user has no-auto-connect selected.
2397 The existing ChanCounts don't matter for this call as they are only
2398 to do with matching input and output indices, and we are only changing
2404 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
2408 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
2409 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
2410 * @param output_start As \a input_start, but for outputs.
2413 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
2414 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
2416 if (!IO::connecting_legal) {
2420 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2426 /* If both inputs and outputs are auto-connected to physical ports,
2427 use the max of input and output offsets to ensure auto-connected
2428 port numbers always match up (e.g. the first audio input and the
2429 first audio output of the route will have the same physical
2430 port number). Otherwise just use the lowest input or output
2434 DEBUG_TRACE (DEBUG::Graph,
2435 string_compose("Auto-connect: existing in = %1 out = %2\n",
2436 existing_inputs, existing_outputs));
2438 const bool in_out_physical =
2439 (Config->get_input_auto_connect() & AutoConnectPhysical)
2440 && (Config->get_output_auto_connect() & AutoConnectPhysical)
2443 const ChanCount in_offset = in_out_physical
2444 ? ChanCount::max(existing_inputs, existing_outputs)
2447 const ChanCount out_offset = in_out_physical
2448 ? ChanCount::max(existing_inputs, existing_outputs)
2451 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2452 vector<string> physinputs;
2453 vector<string> physoutputs;
2455 _engine.get_physical_outputs (*t, physoutputs);
2456 _engine.get_physical_inputs (*t, physinputs);
2458 if (!physinputs.empty() && connect_inputs) {
2459 uint32_t nphysical_in = physinputs.size();
2461 DEBUG_TRACE (DEBUG::Graph,
2462 string_compose("There are %1 physical inputs of type %2\n",
2465 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
2468 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
2469 DEBUG_TRACE (DEBUG::Graph,
2470 string_compose("Get index %1 + %2 % %3 = %4\n",
2471 in_offset.get(*t), i, nphysical_in,
2472 (in_offset.get(*t) + i) % nphysical_in));
2473 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
2476 DEBUG_TRACE (DEBUG::Graph,
2477 string_compose("Connect route %1 IN to %2\n",
2478 route->name(), port));
2480 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
2484 ChanCount one_added (*t, 1);
2485 existing_inputs += one_added;
2489 if (!physoutputs.empty()) {
2490 uint32_t nphysical_out = physoutputs.size();
2491 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
2495 * do not create new connections if we reached the limit of physical outputs
2499 if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
2500 ARDOUR::Profile->get_trx () &&
2501 existing_outputs.get(*t) == nphysical_out ) {
2505 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
2506 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
2507 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
2508 /* master bus is audio only */
2509 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
2510 port = _master_out->input()->ports().port(*t,
2511 i % _master_out->input()->n_ports().get(*t))->name();
2515 DEBUG_TRACE (DEBUG::Graph,
2516 string_compose("Connect route %1 OUT to %2\n",
2517 route->name(), port));
2519 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
2523 ChanCount one_added (*t, 1);
2524 existing_outputs += one_added;
2530 #ifdef USE_TRACKS_CODE_FEATURES
2533 compare_routes_by_remote_id (const boost::shared_ptr<Route>& route1, const boost::shared_ptr<Route>& route2)
2535 return route1->remote_control_id() < route2->remote_control_id();
2539 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2541 // it is not allowed to perform connection
2542 if (!IO::connecting_legal) {
2546 // if we are deleting routes we will call this once at the end
2547 if (_route_deletion_in_progress) {
2551 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2557 // We need to disconnect the route's inputs and outputs first
2558 // basing on autoconnect configuration
2559 bool reconnectIputs = !(Config->get_input_auto_connect() & ManualConnect) && reconnect_inputs;
2560 bool reconnectOutputs = !(Config->get_output_auto_connect() & ManualConnect) && reconnect_outputs;
2562 ChanCount existing_inputs;
2563 ChanCount existing_outputs;
2564 count_existing_track_channels (existing_inputs, existing_outputs);
2566 //ChanCount inputs = ChanCount::ZERO;
2567 //ChanCount outputs = ChanCount::ZERO;
2569 RouteList existing_routes = *routes.reader ();
2570 existing_routes.sort (compare_routes_by_remote_id);
2573 PBD::Unwinder<bool> protect_ignore_changes (_reconnecting_routes_in_progress, true);
2575 vector<string> physinputs;
2576 vector<string> physoutputs;
2578 EngineStateController::instance()->get_physical_audio_outputs(physoutputs);
2579 EngineStateController::instance()->get_physical_audio_inputs(physinputs);
2581 uint32_t input_n = 0;
2582 uint32_t output_n = 0;
2583 RouteList::iterator rIter = existing_routes.begin();
2584 const AutoConnectOption current_input_auto_connection (Config->get_input_auto_connect());
2585 const AutoConnectOption current_output_auto_connection (Config->get_output_auto_connect());
2586 for (; rIter != existing_routes.end(); ++rIter) {
2587 if (*rIter == _master_out || *rIter == _monitor_out ) {
2591 if (current_output_auto_connection == AutoConnectPhysical) {
2592 (*rIter)->amp()->deactivate();
2593 } else if (current_output_auto_connection == AutoConnectMaster) {
2594 (*rIter)->amp()->activate();
2597 if (reconnectIputs) {
2598 (*rIter)->input()->disconnect (this); //GZ: check this; could be heavy
2600 for (uint32_t route_input_n = 0; route_input_n < (*rIter)->n_inputs().get(DataType::AUDIO); ++route_input_n) {
2602 if (current_input_auto_connection & AutoConnectPhysical) {
2604 if ( input_n == physinputs.size() ) {
2608 string port = physinputs[input_n];
2610 if (port.empty() ) {
2611 error << "Physical Input number "<< input_n << " is unavailable and cannot be connected" << endmsg;
2614 //GZ: check this; could be heavy
2615 (*rIter)->input()->connect ((*rIter)->input()->ports().port(DataType::AUDIO, route_input_n), port, this);
2621 if (reconnectOutputs) {
2623 //normalize route ouptuts: reduce the amount outputs to be equal to the amount of inputs
2624 if (current_output_auto_connection & AutoConnectPhysical) {
2626 //GZ: check this; could be heavy
2627 (*rIter)->output()->disconnect (this);
2628 size_t route_inputs_count = (*rIter)->n_inputs().get(DataType::AUDIO);
2630 //GZ: check this; could be heavy
2631 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, route_inputs_count), false, this );
2633 } else if (current_output_auto_connection & AutoConnectMaster){
2635 if (!reconnect_master) {
2639 //GZ: check this; could be heavy
2640 (*rIter)->output()->disconnect (this);
2643 uint32_t master_inputs_count = _master_out->n_inputs().get(DataType::AUDIO);
2644 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, master_inputs_count), false, this );
2646 error << error << "Master bus is not available" << endmsg;
2651 for (uint32_t route_output_n = 0; route_output_n < (*rIter)->n_outputs().get(DataType::AUDIO); ++route_output_n) {
2652 if (current_output_auto_connection & AutoConnectPhysical) {
2654 if ( output_n == physoutputs.size() ) {
2658 string port = physoutputs[output_n];
2660 if (port.empty() ) {
2661 error << "Physical Output number "<< output_n << " is unavailable and cannot be connected" << endmsg;
2664 //GZ: check this; could be heavy
2665 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2668 } else if (current_output_auto_connection & AutoConnectMaster) {
2670 if ( route_output_n == _master_out->n_inputs().get(DataType::AUDIO) ) {
2674 // connect to master bus
2675 string port = _master_out->input()->ports().port(DataType::AUDIO, route_output_n)->name();
2677 if (port.empty() ) {
2678 error << "MasterBus Input number "<< route_output_n << " is unavailable and cannot be connected" << endmsg;
2682 //GZ: check this; could be heavy
2683 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2689 //auto_connect_route (*rIter, inputs, outputs, false, reconnectIputs);
2692 _master_out->output()->disconnect (this);
2693 auto_connect_master_bus ();
2698 session_routes_reconnected (); /* EMIT SIGNAL */
2702 Session::reconnect_midi_scene_ports(bool inputs)
2706 boost::shared_ptr<MidiPort> scene_in_ptr = scene_in();
2708 scene_in_ptr->disconnect_all ();
2710 std::vector<EngineStateController::MidiPortState> midi_port_states;
2711 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2713 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2715 for (; state_iter != midi_port_states.end(); ++state_iter) {
2716 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2717 scene_in_ptr->connect (state_iter->name);
2724 boost::shared_ptr<MidiPort> scene_out_ptr = scene_out();
2726 if (scene_out_ptr ) {
2727 scene_out_ptr->disconnect_all ();
2729 std::vector<EngineStateController::MidiPortState> midi_port_states;
2730 EngineStateController::instance()->get_physical_midi_output_states (midi_port_states);
2732 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2734 for (; state_iter != midi_port_states.end(); ++state_iter) {
2735 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2736 scene_out_ptr->connect (state_iter->name);
2744 Session::reconnect_mtc_ports ()
2746 boost::shared_ptr<MidiPort> mtc_in_ptr = _midi_ports->mtc_input_port();
2752 mtc_in_ptr->disconnect_all ();
2754 std::vector<EngineStateController::MidiPortState> midi_port_states;
2755 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2757 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2759 for (; state_iter != midi_port_states.end(); ++state_iter) {
2760 if (state_iter->available && state_iter->mtc_in) {
2761 mtc_in_ptr->connect (state_iter->name);
2765 if (!_midi_ports->mtc_input_port ()->connected () &&
2766 config.get_external_sync () &&
2767 (Config->get_sync_source () == MTC) ) {
2768 config.set_external_sync (false);
2771 if ( ARDOUR::Profile->get_trx () ) {
2772 // Tracks need this signal to update timecode_source_dropdown
2773 MtcOrLtcInputPortChanged (); //emit signal
2778 Session::reconnect_mmc_ports(bool inputs)
2780 if (inputs ) { // get all enabled midi input ports
2782 boost::shared_ptr<MidiPort> mmc_in_ptr = _midi_ports->mmc_in();
2784 mmc_in_ptr->disconnect_all ();
2785 std::vector<std::string> enabled_midi_inputs;
2786 EngineStateController::instance()->get_physical_midi_inputs (enabled_midi_inputs);
2788 std::vector<std::string>::iterator port_iter = enabled_midi_inputs.begin();
2790 for (; port_iter != enabled_midi_inputs.end(); ++port_iter) {
2791 mmc_in_ptr->connect (*port_iter);
2795 } else { // get all enabled midi output ports
2797 boost::shared_ptr<MidiPort> mmc_out_ptr = _midi_ports->mmc_out();
2799 mmc_out_ptr->disconnect_all ();
2800 std::vector<std::string> enabled_midi_outputs;
2801 EngineStateController::instance()->get_physical_midi_outputs (enabled_midi_outputs);
2803 std::vector<std::string>::iterator port_iter = enabled_midi_outputs.begin();
2805 for (; port_iter != enabled_midi_outputs.end(); ++port_iter) {
2806 mmc_out_ptr->connect (*port_iter);
2814 /** Caller must not hold process lock
2815 * @param name_template string to use for the start of the name, or "" to use "Audio".
2817 list< boost::shared_ptr<AudioTrack> >
2818 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
2819 uint32_t how_many, string name_template)
2822 uint32_t track_id = 0;
2824 RouteList new_routes;
2825 list<boost::shared_ptr<AudioTrack> > ret;
2827 const string name_pattern = default_track_name_pattern (DataType::AUDIO);
2828 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
2832 if (!find_route_name (name_template.empty() ? _(name_pattern.c_str()) : name_template, ++track_id, track_name, use_number)) {
2833 error << "cannot find name for new audio track" << endmsg;
2837 boost::shared_ptr<AudioTrack> track;
2840 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
2842 if (track->init ()) {
2846 if (ARDOUR::Profile->get_trx ()) {
2847 // TRACKS considers it's not a USE CASE, it's
2848 // a piece of behavior of the session model:
2850 // Gain for a newly created route depends on
2851 // the current output_auto_connect mode:
2853 // 0 for Stereo Out mode
2855 if (Config->get_output_auto_connect() & AutoConnectMaster) {
2856 track->set_gain (dB_to_coefficient (0), 0);
2860 track->use_new_diskstream();
2862 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2863 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2866 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2868 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2869 error << string_compose (
2870 _("cannot configure %1 in/%2 out configuration for new audio track"),
2871 input_channels, output_channels)
2876 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2877 error << string_compose (
2878 _("cannot configure %1 in/%2 out configuration for new audio track"),
2879 input_channels, output_channels)
2886 route_group->add (track);
2889 track->non_realtime_input_change();
2891 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2892 if (Config->get_remote_model() == UserOrdered) {
2893 track->set_remote_control_id (next_control_id());
2896 new_routes.push_back (track);
2897 ret.push_back (track);
2899 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2902 catch (failed_constructor &err) {
2903 error << _("Session: could not create new audio track.") << endmsg;
2907 catch (AudioEngine::PortRegistrationFailure& pfe) {
2909 error << pfe.what() << endmsg;
2917 if (!new_routes.empty()) {
2918 StateProtector sp (this);
2919 if (Profile->get_trx()) {
2920 add_routes (new_routes, false, false, false);
2922 add_routes (new_routes, true, true, false);
2929 /** Caller must not hold process lock.
2930 * @param name_template string to use for the start of the name, or "" to use "Bus".
2933 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
2936 uint32_t bus_id = 0;
2940 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
2943 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, use_number)) {
2944 error << "cannot find name for new audio bus" << endmsg;
2949 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
2955 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2956 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
2959 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2961 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2962 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2963 input_channels, output_channels)
2969 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2970 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2971 input_channels, output_channels)
2978 route_group->add (bus);
2980 if (Config->get_remote_model() == UserOrdered) {
2981 bus->set_remote_control_id (next_control_id());
2984 bus->add_internal_return ();
2986 ret.push_back (bus);
2988 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2994 catch (failed_constructor &err) {
2995 error << _("Session: could not create new audio route.") << endmsg;
2999 catch (AudioEngine::PortRegistrationFailure& pfe) {
3000 error << pfe.what() << endmsg;
3010 StateProtector sp (this);
3011 if (Profile->get_trx()) {
3012 add_routes (ret, false, false, false);
3014 add_routes (ret, false, true, true); // autoconnect // outputs only
3023 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base)
3026 uint32_t control_id;
3028 uint32_t number = 0;
3029 const uint32_t being_added = how_many;
3031 if (!tree.read (template_path.c_str())) {
3035 XMLNode* node = tree.root();
3037 IO::disable_connecting ();
3039 control_id = next_control_id ();
3043 XMLNode node_copy (*node);
3045 /* Remove IDs of everything so that new ones are used */
3046 node_copy.remove_property_recursively (X_("id"));
3051 if (!name_base.empty()) {
3053 /* if we're adding more than one routes, force
3054 * all the names of the new routes to be
3055 * numbered, via the final parameter.
3058 if (!find_route_name (name_base.c_str(), ++number, name, (being_added > 1))) {
3059 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3065 string const route_name = node_copy.property(X_("name"))->value ();
3067 /* generate a new name by adding a number to the end of the template name */
3068 if (!find_route_name (route_name.c_str(), ++number, name, true)) {
3069 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3070 abort(); /*NOTREACHED*/
3074 /* set this name in the XML description that we are about to use */
3075 Route::set_name_in_state (node_copy, name);
3077 /* trim bitslots from listen sends so that new ones are used */
3078 XMLNodeList children = node_copy.children ();
3079 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
3080 if ((*i)->name() == X_("Processor")) {
3081 XMLProperty* role = (*i)->property (X_("role"));
3082 if (role && role->value() == X_("Listen")) {
3083 (*i)->remove_property (X_("bitslot"));
3088 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
3091 error << _("Session: cannot create track/bus from template description") << endmsg;
3095 if (boost::dynamic_pointer_cast<Track>(route)) {
3096 /* force input/output change signals so that the new diskstream
3097 picks up the configuration of the route. During session
3098 loading this normally happens in a different way.
3101 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3103 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
3104 change.after = route->input()->n_ports();
3105 route->input()->changed (change, this);
3106 change.after = route->output()->n_ports();
3107 route->output()->changed (change, this);
3110 route->set_remote_control_id (control_id);
3113 ret.push_back (route);
3115 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
3118 catch (failed_constructor &err) {
3119 error << _("Session: could not create new route from template") << endmsg;
3123 catch (AudioEngine::PortRegistrationFailure& pfe) {
3124 error << pfe.what() << endmsg;
3133 StateProtector sp (this);
3134 if (Profile->get_trx()) {
3135 add_routes (ret, false, false, false);
3137 add_routes (ret, true, true, false);
3139 IO::enable_connecting ();
3146 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
3149 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
3150 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
3153 error << _("Adding new tracks/busses failed") << endmsg;
3158 update_latency (true);
3159 update_latency (false);
3164 save_state (_current_snapshot_name);
3167 reassign_track_numbers();
3169 update_route_record_state ();
3171 RouteAdded (new_routes); /* EMIT SIGNAL */
3175 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
3177 ChanCount existing_inputs;
3178 ChanCount existing_outputs;
3179 uint32_t order = next_control_id();
3181 if (_order_hint > -1) {
3182 order = _order_hint;
3186 count_existing_track_channels (existing_inputs, existing_outputs);
3189 RCUWriter<RouteList> writer (routes);
3190 boost::shared_ptr<RouteList> r = writer.get_copy ();
3191 r->insert (r->end(), new_routes.begin(), new_routes.end());
3193 /* if there is no control out and we're not in the middle of loading,
3194 resort the graph here. if there is a control out, we will resort
3195 toward the end of this method. if we are in the middle of loading,
3196 we will resort when done.
3199 if (!_monitor_out && IO::connecting_legal) {
3200 resort_routes_using (r);
3204 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3206 boost::weak_ptr<Route> wpr (*x);
3207 boost::shared_ptr<Route> r (*x);
3209 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _2, wpr));
3210 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _3, wpr));
3211 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
3212 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
3213 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
3214 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
3216 if (r->is_master()) {
3220 if (r->is_monitor()) {
3224 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
3226 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
3227 track_playlist_changed (boost::weak_ptr<Track> (tr));
3228 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
3230 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
3232 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
3233 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
3238 if (input_auto_connect || output_auto_connect) {
3239 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
3242 /* order keys are a GUI responsibility but we need to set up
3243 reasonable defaults because they also affect the remote control
3244 ID in most situations.
3247 if (!r->has_order_key ()) {
3248 if (r->is_auditioner()) {
3249 /* use an arbitrarily high value */
3250 r->set_order_key (UINT_MAX);
3252 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
3253 r->set_order_key (order);
3261 if (_monitor_out && IO::connecting_legal) {
3262 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
3264 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3265 if ((*x)->is_monitor()) {
3267 } else if ((*x)->is_master()) {
3270 (*x)->enable_monitor_send ();
3277 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
3279 boost::shared_ptr<RouteList> r = routes.reader ();
3280 boost::shared_ptr<Send> s;
3282 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3283 if ((s = (*i)->internal_send_for (dest)) != 0) {
3284 s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO);
3290 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
3292 boost::shared_ptr<RouteList> r = routes.reader ();
3293 boost::shared_ptr<Send> s;
3295 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3296 if ((s = (*i)->internal_send_for (dest)) != 0) {
3297 s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY);
3303 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
3305 boost::shared_ptr<RouteList> r = routes.reader ();
3306 boost::shared_ptr<Send> s;
3308 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3309 if ((s = (*i)->internal_send_for (dest)) != 0) {
3310 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
3315 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
3317 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
3319 boost::shared_ptr<RouteList> r = routes.reader ();
3320 boost::shared_ptr<RouteList> t (new RouteList);
3322 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3323 /* no MIDI sends because there are no MIDI busses yet */
3324 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
3329 add_internal_sends (dest, p, t);
3333 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
3335 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
3336 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
3341 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
3343 add_internal_send (dest, sender->before_processor_for_index (index), sender);
3347 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
3349 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
3353 if (!dest->internal_return()) {
3354 dest->add_internal_return ();
3357 sender->add_aux_send (dest, before);
3364 Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
3366 PBD::Unwinder<bool> uw_flag (_route_deletion_in_progress, true);
3368 { // RCU Writer scope
3369 RCUWriter<RouteList> writer (routes);
3370 boost::shared_ptr<RouteList> rs = writer.get_copy ();
3373 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3375 if (*iter == _master_out) {
3379 (*iter)->set_solo (false, this);
3383 /* deleting the master out seems like a dumb
3384 idea, but its more of a UI policy issue
3388 if (*iter == _master_out) {
3389 _master_out = boost::shared_ptr<Route> ();
3392 if (*iter == _monitor_out) {
3393 _monitor_out.reset ();
3396 // We need to disconnect the route's inputs and outputs
3398 (*iter)->input()->disconnect (0);
3399 (*iter)->output()->disconnect (0);
3401 /* if the route had internal sends sending to it, remove them */
3402 if ((*iter)->internal_return()) {
3404 boost::shared_ptr<RouteList> r = routes.reader ();
3405 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3406 boost::shared_ptr<Send> s = (*i)->internal_send_for (*iter);
3408 (*i)->remove_processor (s);
3413 /* if the monitoring section had a pointer to this route, remove it */
3414 if (_monitor_out && !(*iter)->is_master() && !(*iter)->is_monitor()) {
3415 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3416 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
3417 (*iter)->remove_aux_or_listen (_monitor_out);
3420 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*iter);
3421 if (mt && mt->step_editing()) {
3422 if (_step_editors > 0) {
3428 /* writer goes out of scope, forces route list update */
3430 } // end of RCU Writer scope
3432 update_route_solo_state ();
3433 RouteAddedOrRemoved (false); /* EMIT SIGNAL */
3434 update_latency_compensation ();
3437 /* Re-sort routes to remove the graph's current references to the one that is
3438 * going away, then flush old references out of the graph.
3439 * Wave Tracks: reconnect routes
3442 #ifdef USE_TRACKS_CODE_FEATURES
3443 reconnect_existing_routes(true, false);
3445 routes.flush (); // maybe unsafe, see below.
3449 if (_process_graph) {
3450 _process_graph->clear_other_chain ();
3453 /* get rid of it from the dead wood collection in the route list manager */
3454 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
3458 /* try to cause everyone to drop their references
3459 * and unregister ports from the backend
3462 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3463 (*iter)->drop_references ();
3466 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
3468 /* save the new state of the world */
3470 if (save_state (_current_snapshot_name)) {
3471 save_history (_current_snapshot_name);
3474 reassign_track_numbers();
3475 update_route_record_state ();
3479 Session::remove_route (boost::shared_ptr<Route> route)
3481 boost::shared_ptr<RouteList> rl (new RouteList);
3482 rl->push_back (route);
3487 Session::route_mute_changed (void* /*src*/)
3493 Session::route_listen_changed (bool group_override, boost::weak_ptr<Route> wpr)
3495 boost::shared_ptr<Route> route = wpr.lock();
3497 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_listen_changed")) << endmsg;
3501 if (route->listening_via_monitor ()) {
3503 if (Config->get_exclusive_solo()) {
3504 /* new listen: disable all other listen, except solo-grouped channels */
3505 RouteGroup* rg = route->route_group ();
3506 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
3507 if (group_override && rg) {
3508 leave_group_alone = !leave_group_alone;
3510 boost::shared_ptr<RouteList> r = routes.reader ();
3511 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3512 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() || (leave_group_alone && ((*i)->route_group() == rg))) {
3515 (*i)->set_listen (false, this, group_override);
3521 } else if (_listen_cnt > 0) {
3526 update_route_solo_state ();
3529 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3531 boost::shared_ptr<Route> route = wpr.lock ();
3534 /* should not happen */
3535 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_isolated_changed")) << endmsg;
3539 bool send_changed = false;
3541 if (route->solo_isolated()) {
3542 if (_solo_isolated_cnt == 0) {
3543 send_changed = true;
3545 _solo_isolated_cnt++;
3546 } else if (_solo_isolated_cnt > 0) {
3547 _solo_isolated_cnt--;
3548 if (_solo_isolated_cnt == 0) {
3549 send_changed = true;
3554 IsolatedChanged (); /* EMIT SIGNAL */
3559 Session::route_solo_changed (bool self_solo_change, bool group_override, boost::weak_ptr<Route> wpr)
3561 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
3563 if (!self_solo_change) {
3564 // session doesn't care about changes to soloed-by-others
3568 boost::shared_ptr<Route> route = wpr.lock ();
3571 boost::shared_ptr<RouteList> r = routes.reader ();
3574 if (route->self_soloed()) {
3580 RouteGroup* rg = route->route_group ();
3581 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
3582 if (group_override && rg) {
3583 leave_group_alone = !leave_group_alone;
3585 if (delta == 1 && Config->get_exclusive_solo()) {
3587 /* new solo: disable all other solos, but not the group if its solo-enabled */
3589 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3590 if ((*i) == route || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3591 (leave_group_alone && ((*i)->route_group() == rg))) {
3594 (*i)->set_solo (false, this, group_override);
3598 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3600 RouteList uninvolved;
3602 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
3604 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3605 bool via_sends_only;
3606 bool in_signal_flow;
3608 if ((*i) == route || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3609 (leave_group_alone && ((*i)->route_group() == rg))) {
3613 in_signal_flow = false;
3615 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3617 if ((*i)->feeds (route, &via_sends_only)) {
3618 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3619 if (!via_sends_only) {
3620 if (!route->soloed_by_others_upstream()) {
3621 (*i)->mod_solo_by_others_downstream (delta);
3623 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others upstream\n");
3626 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3628 in_signal_flow = true;
3630 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3633 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3635 if (route->feeds (*i, &via_sends_only)) {
3636 /* propagate solo upstream only if routing other than
3637 sends is involved, but do consider the other route
3638 (*i) to be part of the signal flow even if only
3641 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3645 route->soloed_by_others_downstream(),
3646 route->soloed_by_others_upstream()));
3647 if (!via_sends_only) {
3648 //NB. Triggers Invert Push, which handles soloed by downstream
3649 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3650 (*i)->mod_solo_by_others_upstream (delta);
3652 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3654 in_signal_flow = true;
3656 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3659 if (!in_signal_flow) {
3660 uninvolved.push_back (*i);
3664 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3666 update_route_solo_state (r);
3668 /* now notify that the mute state of the routes not involved in the signal
3669 pathway of the just-solo-changed route may have altered.
3672 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3673 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
3674 (*i)->act_on_mute ();
3675 (*i)->mute_changed (this);
3678 SoloChanged (); /* EMIT SIGNAL */
3683 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
3685 /* now figure out if anything that matters is soloed (or is "listening")*/
3687 bool something_soloed = false;
3688 uint32_t listeners = 0;
3689 uint32_t isolated = 0;
3692 r = routes.reader();
3695 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3696 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
3697 something_soloed = true;
3700 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
3701 if (Config->get_solo_control_is_listen_control()) {
3704 (*i)->set_listen (false, this);
3708 if ((*i)->solo_isolated()) {
3713 if (something_soloed != _non_soloed_outs_muted) {
3714 _non_soloed_outs_muted = something_soloed;
3715 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
3718 _listen_cnt = listeners;
3720 if (isolated != _solo_isolated_cnt) {
3721 _solo_isolated_cnt = isolated;
3722 IsolatedChanged (); /* EMIT SIGNAL */
3725 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
3726 something_soloed, listeners, isolated));
3729 boost::shared_ptr<RouteList>
3730 Session::get_routes_with_internal_returns() const
3732 boost::shared_ptr<RouteList> r = routes.reader ();
3733 boost::shared_ptr<RouteList> rl (new RouteList);
3735 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3736 if ((*i)->internal_return ()) {
3744 Session::io_name_is_legal (const std::string& name)
3746 boost::shared_ptr<RouteList> r = routes.reader ();
3748 for (vector<string>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
3749 if (name == *reserved) {
3754 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3755 if ((*i)->name() == name) {
3759 if ((*i)->has_io_processor_named (name)) {
3768 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
3771 vector<string> connections;
3773 /* if we are passed only a single route and we're not told to turn
3774 * others off, then just do the simple thing.
3777 if (flip_others == false && rl->size() == 1) {
3778 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
3780 mt->set_input_active (onoff);
3785 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
3787 PortSet& ps ((*rt)->input()->ports());
3789 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
3790 p->get_connections (connections);
3793 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
3794 routes_using_input_from (*s, rl2);
3797 /* scan all relevant routes to see if others are on or off */
3799 bool others_are_already_on = false;
3801 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3803 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3809 if ((*r) != (*rt)) {
3810 if (mt->input_active()) {
3811 others_are_already_on = true;
3814 /* this one needs changing */
3815 mt->set_input_active (onoff);
3821 /* globally reverse other routes */
3823 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3824 if ((*r) != (*rt)) {
3825 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3827 mt->set_input_active (!others_are_already_on);
3836 Session::routes_using_input_from (const string& str, RouteList& rl)
3838 boost::shared_ptr<RouteList> r = routes.reader();
3840 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3841 if ((*i)->input()->connected_to (str)) {
3847 boost::shared_ptr<Route>
3848 Session::route_by_name (string name)
3850 boost::shared_ptr<RouteList> r = routes.reader ();
3852 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3853 if ((*i)->name() == name) {
3858 return boost::shared_ptr<Route> ((Route*) 0);
3861 boost::shared_ptr<Route>
3862 Session::route_by_id (PBD::ID id)
3864 boost::shared_ptr<RouteList> r = routes.reader ();
3866 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3867 if ((*i)->id() == id) {
3872 return boost::shared_ptr<Route> ((Route*) 0);
3875 boost::shared_ptr<Track>
3876 Session::track_by_diskstream_id (PBD::ID id)
3878 boost::shared_ptr<RouteList> r = routes.reader ();
3880 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3881 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3882 if (t && t->using_diskstream_id (id)) {
3887 return boost::shared_ptr<Track> ();
3890 boost::shared_ptr<Route>
3891 Session::route_by_remote_id (uint32_t id)
3893 boost::shared_ptr<RouteList> r = routes.reader ();
3895 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3896 if ((*i)->remote_control_id() == id) {
3901 return boost::shared_ptr<Route> ((Route*) 0);
3906 Session::reassign_track_numbers ()
3910 RouteList r (*(routes.reader ()));
3911 SignalOrderRouteSorter sorter;
3914 StateProtector sp (this);
3916 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3917 if (boost::dynamic_pointer_cast<Track> (*i)) {
3918 (*i)->set_track_number(++tn);
3920 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
3921 (*i)->set_track_number(--bn);
3924 const uint32_t decimals = ceilf (log10f (tn + 1));
3925 const bool decimals_changed = _track_number_decimals != decimals;
3926 _track_number_decimals = decimals;
3928 if (decimals_changed && config.get_track_name_number ()) {
3929 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3930 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3932 t->resync_track_name();
3935 // trigger GUI re-layout
3936 config.ParameterChanged("track-name-number");
3941 Session::playlist_region_added (boost::weak_ptr<Region> w)
3943 boost::shared_ptr<Region> r = w.lock ();
3948 /* These are the operations that are currently in progress... */
3949 list<GQuark> curr = _current_trans_quarks;
3952 /* ...and these are the operations during which we want to update
3953 the session range location markers.
3956 ops.push_back (Operations::capture);
3957 ops.push_back (Operations::paste);
3958 ops.push_back (Operations::duplicate_region);
3959 ops.push_back (Operations::insert_file);
3960 ops.push_back (Operations::insert_region);
3961 ops.push_back (Operations::drag_region_brush);
3962 ops.push_back (Operations::region_drag);
3963 ops.push_back (Operations::selection_grab);
3964 ops.push_back (Operations::region_fill);
3965 ops.push_back (Operations::fill_selection);
3966 ops.push_back (Operations::create_region);
3967 ops.push_back (Operations::region_copy);
3968 ops.push_back (Operations::fixed_time_region_copy);
3971 /* See if any of the current operations match the ones that we want */
3973 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
3975 /* If so, update the session range markers */
3977 maybe_update_session_range (r->position (), r->last_frame ());
3981 /** Update the session range markers if a is before the current start or
3982 * b is after the current end.
3985 Session::maybe_update_session_range (framepos_t a, framepos_t b)
3987 if (_state_of_the_state & Loading) {
3991 framepos_t session_end_marker_shift_samples = session_end_shift * _nominal_frame_rate;
3993 if (_session_range_location == 0) {
3995 set_session_range_location (a, b + session_end_marker_shift_samples);
3999 if (a < _session_range_location->start()) {
4000 _session_range_location->set_start (a);
4003 if (b > _session_range_location->end()) {
4004 _session_range_location->set_end (b);
4010 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
4012 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4013 maybe_update_session_range (i->to, i->to + i->length);
4018 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
4020 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4021 maybe_update_session_range (i->from, i->to);
4025 /* Region management */
4027 boost::shared_ptr<Region>
4028 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
4030 const RegionFactory::RegionMap& regions (RegionFactory::regions());
4031 RegionFactory::RegionMap::const_iterator i;
4032 boost::shared_ptr<Region> region;
4034 Glib::Threads::Mutex::Lock lm (region_lock);
4036 for (i = regions.begin(); i != regions.end(); ++i) {
4040 if (region->whole_file()) {
4042 if (child->source_equivalent (region)) {
4048 return boost::shared_ptr<Region> ();
4052 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
4054 set<boost::shared_ptr<Region> > relevant_regions;
4056 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
4057 RegionFactory::get_regions_using_source (*s, relevant_regions);
4060 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
4061 set<boost::shared_ptr<Region> >::iterator tmp;
4066 playlists->destroy_region (*r);
4067 RegionFactory::map_remove (*r);
4069 (*r)->drop_sources ();
4070 (*r)->drop_references ();
4072 relevant_regions.erase (r);
4077 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
4080 Glib::Threads::Mutex::Lock ls (source_lock);
4081 /* remove from the main source list */
4082 sources.erase ((*s)->id());
4085 (*s)->mark_for_remove ();
4086 (*s)->drop_references ();
4095 Session::remove_last_capture ()
4097 list<boost::shared_ptr<Source> > srcs;
4099 boost::shared_ptr<RouteList> rl = routes.reader ();
4100 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4101 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4106 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
4109 srcs.insert (srcs.end(), l.begin(), l.end());
4114 destroy_sources (srcs);
4116 save_state (_current_snapshot_name);
4121 /* Source Management */
4124 Session::add_source (boost::shared_ptr<Source> source)
4126 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
4127 pair<SourceMap::iterator,bool> result;
4129 entry.first = source->id();
4130 entry.second = source;
4133 Glib::Threads::Mutex::Lock lm (source_lock);
4134 result = sources.insert (entry);
4137 if (result.second) {
4139 /* yay, new source */
4141 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
4144 if (!fs->within_session()) {
4145 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
4151 boost::shared_ptr<AudioFileSource> afs;
4153 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
4154 if (Config->get_auto_analyse_audio()) {
4155 Analyser::queue_source_for_analysis (source, false);
4159 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
4164 Session::remove_source (boost::weak_ptr<Source> src)
4166 if (_state_of_the_state & Deletion) {
4170 SourceMap::iterator i;
4171 boost::shared_ptr<Source> source = src.lock();
4178 Glib::Threads::Mutex::Lock lm (source_lock);
4180 if ((i = sources.find (source->id())) != sources.end()) {
4185 if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
4187 /* save state so we don't end up with a session file
4188 referring to non-existent sources.
4191 save_state (_current_snapshot_name);
4195 boost::shared_ptr<Source>
4196 Session::source_by_id (const PBD::ID& id)
4198 Glib::Threads::Mutex::Lock lm (source_lock);
4199 SourceMap::iterator i;
4200 boost::shared_ptr<Source> source;
4202 if ((i = sources.find (id)) != sources.end()) {
4209 boost::shared_ptr<AudioFileSource>
4210 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
4212 /* Restricted to audio files because only audio sources have channel
4216 Glib::Threads::Mutex::Lock lm (source_lock);
4218 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
4219 boost::shared_ptr<AudioFileSource> afs
4220 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
4222 if (afs && afs->path() == path && chn == afs->channel()) {
4227 return boost::shared_ptr<AudioFileSource>();
4230 boost::shared_ptr<MidiSource>
4231 Session::midi_source_by_path (const std::string& path) const
4233 /* Restricted to MIDI files because audio sources require a channel
4234 for unique identification, in addition to a path.
4237 Glib::Threads::Mutex::Lock lm (source_lock);
4239 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
4240 boost::shared_ptr<MidiSource> ms
4241 = boost::dynamic_pointer_cast<MidiSource>(s->second);
4242 boost::shared_ptr<FileSource> fs
4243 = boost::dynamic_pointer_cast<FileSource>(s->second);
4245 if (ms && fs && fs->path() == path) {
4250 return boost::shared_ptr<MidiSource>();
4254 Session::count_sources_by_origin (const string& path)
4257 Glib::Threads::Mutex::Lock lm (source_lock);
4259 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
4260 boost::shared_ptr<FileSource> fs
4261 = boost::dynamic_pointer_cast<FileSource>(i->second);
4263 if (fs && fs->origin() == path) {
4272 peak_file_helper (const string& peak_path, const string& file_path, const string& file_base, bool hash) {
4274 std::string checksum = Glib::Checksum::compute_checksum(Glib::Checksum::CHECKSUM_SHA1, file_path + G_DIR_SEPARATOR + file_base);
4275 return Glib::build_filename (peak_path, checksum + peakfile_suffix);
4277 return Glib::build_filename (peak_path, file_base + peakfile_suffix);
4282 Session::construct_peak_filepath (const string& filepath, const bool in_session, const bool old_peak_name) const
4284 string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
4286 if (Glib::path_is_absolute (filepath)) {
4288 /* rip the session dir from the audiofile source */
4290 string session_path;
4291 bool in_another_session = true;
4293 if (filepath.find (interchange_dir_string) != string::npos) {
4295 session_path = Glib::path_get_dirname (filepath); /* now ends in audiofiles */
4296 session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
4297 session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
4298 session_path = Glib::path_get_dirname (session_path); /* now has session path */
4300 /* see if it is within our session */
4302 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4303 if (i->path == session_path) {
4304 in_another_session = false;
4309 in_another_session = false;
4313 if (in_another_session) {
4314 SessionDirectory sd (session_path);
4315 return peak_file_helper (sd.peak_path(), "", Glib::path_get_basename (filepath), !old_peak_name);
4319 /* 1) if file belongs to this session
4320 * it may be a relative path (interchange/...)
4321 * or just basename (session_state, remove source)
4322 * -> just use the basename
4324 std::string filename = Glib::path_get_basename (filepath);
4327 /* 2) if the file is outside our session dir:
4328 * (imported but not copied) add the path for check-summming */
4330 path = Glib::path_get_dirname (filepath);
4333 return peak_file_helper (_session_dir->peak_path(), path, Glib::path_get_basename (filepath), !old_peak_name);
4337 Session::new_audio_source_path_for_embedded (const std::string& path)
4341 * we know that the filename is already unique because it exists
4342 * out in the filesystem.
4344 * However, when we bring it into the session, we could get a
4347 * Eg. two embedded files:
4352 * When merged into session, these collide.
4354 * There will not be a conflict with in-memory sources
4355 * because when the source was created we already picked
4356 * a unique name for it.
4358 * This collision is not likely to be common, but we have to guard
4359 * against it. So, if there is a collision, take the md5 hash of the
4360 * the path, and use that as the filename instead.
4363 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4364 string base = Glib::path_get_basename (path);
4365 string newpath = Glib::build_filename (sdir.sound_path(), base);
4367 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4371 md5.digestString (path.c_str());
4372 md5.writeToString ();
4373 base = md5.digestChars;
4375 string ext = get_suffix (path);
4382 newpath = Glib::build_filename (sdir.sound_path(), base);
4384 /* if this collides, we're screwed */
4386 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4387 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
4396 /** Return true if there are no audio file sources that use @param name as
4397 * the filename component of their path.
4399 * Return false otherwise.
4401 * This method MUST ONLY be used to check in-session, mono files since it
4402 * hard-codes the channel of the audio file source we are looking for as zero.
4404 * If/when Ardour supports native files in non-mono formats, the logic here
4405 * will need to be revisited.
4408 Session::audio_source_name_is_unique (const string& name)
4410 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
4411 vector<space_and_path>::iterator i;
4412 uint32_t existing = 0;
4414 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4416 /* note that we search *without* the extension so that
4417 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
4418 in the event that this new name is required for
4419 a file format change.
4422 const string spath = *i;
4424 if (matching_unsuffixed_filename_exists_in (spath, name)) {
4429 /* it is possible that we have the path already
4430 * assigned to a source that has not yet been written
4431 * (ie. the write source for a diskstream). we have to
4432 * check this in order to make sure that our candidate
4433 * path isn't used again, because that can lead to
4434 * two Sources point to the same file with different
4435 * notions of their removability.
4439 string possible_path = Glib::build_filename (spath, name);
4441 if (audio_source_by_path_and_channel (possible_path, 0)) {
4447 return (existing == 0);
4451 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)
4454 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4456 if (Profile->get_trx() && destructive) {
4458 sstr << setfill ('0') << setw (4) << cnt;
4459 sstr << legalized_base;
4461 sstr << legalized_base;
4463 if (take_required || related_exists) {
4475 } else if (nchan > 2) {
4480 /* XXX what? more than 26 channels! */
4491 /** Return a unique name based on \a base for a new internal audio source */
4493 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
4496 string possible_name;
4497 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
4499 bool some_related_source_name_exists = false;
4501 legalized = legalize_for_path (base);
4503 // Find a "version" of the base name that doesn't exist in any of the possible directories.
4505 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
4507 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
4509 if (audio_source_name_is_unique (possible_name)) {
4513 some_related_source_name_exists = true;
4516 error << string_compose(
4517 _("There are already %1 recordings for %2, which I consider too many."),
4518 limit, base) << endmsg;
4520 throw failed_constructor();
4524 /* We've established that the new name does not exist in any session
4525 * directory, so now find out which one we should use for this new
4529 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4531 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
4536 /** Return a unique name based on `base` for a new internal MIDI source */
4538 Session::new_midi_source_path (const string& base)
4541 char buf[PATH_MAX+1];
4542 const uint32_t limit = 10000;
4544 string possible_path;
4545 string possible_name;
4548 legalized = legalize_for_path (base);
4550 // Find a "version" of the file name that doesn't exist in any of the possible directories.
4551 std::vector<string> sdirs = source_search_path(DataType::MIDI);
4553 /* - the main session folder is the first in the vector.
4554 * - after checking all locations for file-name uniqueness,
4555 * we keep the one from the last iteration as new file name
4556 * - midi files are small and should just be kept in the main session-folder
4558 * -> reverse the array, check main session folder last and use that as location
4561 std::reverse(sdirs.begin(), sdirs.end());
4563 for (cnt = 1; cnt <= limit; ++cnt) {
4565 vector<space_and_path>::iterator i;
4566 uint32_t existing = 0;
4568 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4570 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
4571 possible_name = buf;
4573 possible_path = Glib::build_filename (*i, possible_name);
4575 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
4579 if (midi_source_by_path (possible_path)) {
4584 if (existing == 0) {
4589 error << string_compose(
4590 _("There are already %1 recordings for %2, which I consider too many."),
4591 limit, base) << endmsg;
4597 /* No need to "find best location" for software/app-based RAID, because
4598 MIDI is so small that we always put it in the same place.
4601 return possible_path;
4605 /** Create a new within-session audio source */
4606 boost::shared_ptr<AudioFileSource>
4607 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
4609 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
4611 if (!path.empty()) {
4612 return boost::dynamic_pointer_cast<AudioFileSource> (
4613 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate(), true, true));
4615 throw failed_constructor ();
4619 /** Create a new within-session MIDI source */
4620 boost::shared_ptr<MidiSource>
4621 Session::create_midi_source_for_session (string const & basic_name)
4623 const string path = new_midi_source_path (basic_name);
4625 if (!path.empty()) {
4626 return boost::dynamic_pointer_cast<SMFSource> (
4627 SourceFactory::createWritable (
4628 DataType::MIDI, *this, path, false, frame_rate()));
4630 throw failed_constructor ();
4634 /** Create a new within-session MIDI source */
4635 boost::shared_ptr<MidiSource>
4636 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
4638 /* the caller passes in the track the source will be used in,
4639 so that we can keep the numbering sane.
4641 Rationale: a track with the name "Foo" that has had N
4642 captures carried out so far will ALREADY have a write source
4643 named "Foo-N+1.mid" waiting to be used for the next capture.
4645 If we call new_midi_source_name() we will get "Foo-N+2". But
4646 there is no region corresponding to "Foo-N+1", so when
4647 "Foo-N+2" appears in the track, the gap presents the user
4648 with odd behaviour - why did it skip past Foo-N+1?
4650 We could explain this to the user in some odd way, but
4651 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
4654 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
4657 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
4659 std::string name = track->steal_write_source_name ();
4662 return boost::shared_ptr<MidiSource>();
4665 /* MIDI files are small, just put them in the first location of the
4666 session source search path.
4669 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
4671 return boost::dynamic_pointer_cast<SMFSource> (
4672 SourceFactory::createWritable (
4673 DataType::MIDI, *this, path, false, frame_rate()));
4678 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
4680 if (playlist->hidden()) {
4684 playlists->add (playlist);
4687 playlist->release();
4694 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
4696 if (_state_of_the_state & Deletion) {
4700 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
4706 playlists->remove (playlist);
4712 Session::set_audition (boost::shared_ptr<Region> r)
4714 pending_audition_region = r;
4715 add_post_transport_work (PostTransportAudition);
4716 _butler->schedule_transport_work ();
4720 Session::audition_playlist ()
4722 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4723 ev->region.reset ();
4728 Session::non_realtime_set_audition ()
4730 assert (pending_audition_region);
4731 auditioner->audition_region (pending_audition_region);
4732 pending_audition_region.reset ();
4733 AuditionActive (true); /* EMIT SIGNAL */
4737 Session::audition_region (boost::shared_ptr<Region> r)
4739 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4745 Session::cancel_audition ()
4750 if (auditioner->auditioning()) {
4751 auditioner->cancel_audition ();
4752 AuditionActive (false); /* EMIT SIGNAL */
4757 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
4759 if (a->is_monitor()) {
4762 if (b->is_monitor()) {
4765 return a->order_key () < b->order_key ();
4769 Session::is_auditioning () const
4771 /* can be called before we have an auditioner object */
4773 return auditioner->auditioning();
4780 Session::graph_reordered ()
4782 /* don't do this stuff if we are setting up connections
4783 from a set_state() call or creating new tracks. Ditto for deletion.
4786 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _reconnecting_routes_in_progress || _route_deletion_in_progress) {
4790 /* every track/bus asked for this to be handled but it was deferred because
4791 we were connecting. do it now.
4794 request_input_change_handling ();
4798 /* force all diskstreams to update their capture offset values to
4799 reflect any changes in latencies within the graph.
4802 boost::shared_ptr<RouteList> rl = routes.reader ();
4803 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4804 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4806 tr->set_capture_offset ();
4811 /** @return Number of frames that there is disk space available to write,
4814 boost::optional<framecnt_t>
4815 Session::available_capture_duration ()
4817 Glib::Threads::Mutex::Lock lm (space_lock);
4819 if (_total_free_4k_blocks_uncertain) {
4820 return boost::optional<framecnt_t> ();
4823 float sample_bytes_on_disk = 4.0; // keep gcc happy
4825 switch (config.get_native_file_data_format()) {
4827 sample_bytes_on_disk = 4.0;
4831 sample_bytes_on_disk = 3.0;
4835 sample_bytes_on_disk = 2.0;
4839 /* impossible, but keep some gcc versions happy */
4840 fatal << string_compose (_("programming error: %1"),
4841 X_("illegal native file data format"))
4843 abort(); /*NOTREACHED*/
4846 double scale = 4096.0 / sample_bytes_on_disk;
4848 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
4849 return max_framecnt;
4852 return (framecnt_t) floor (_total_free_4k_blocks * scale);
4856 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
4859 RCUWriter<BundleList> writer (_bundles);
4860 boost::shared_ptr<BundleList> b = writer.get_copy ();
4861 b->push_back (bundle);
4865 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4872 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
4874 bool removed = false;
4877 RCUWriter<BundleList> writer (_bundles);
4878 boost::shared_ptr<BundleList> b = writer.get_copy ();
4879 BundleList::iterator i = find (b->begin(), b->end(), bundle);
4881 if (i != b->end()) {
4888 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4894 boost::shared_ptr<Bundle>
4895 Session::bundle_by_name (string name) const
4897 boost::shared_ptr<BundleList> b = _bundles.reader ();
4899 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
4900 if ((*i)->name() == name) {
4905 return boost::shared_ptr<Bundle> ();
4909 Session::tempo_map_changed (const PropertyChange&)
4913 playlists->update_after_tempo_map_change ();
4915 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
4921 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
4923 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
4924 (*i)->recompute_frames_from_bbt ();
4928 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
4929 * the given count with the current block size.
4932 Session::ensure_buffers (ChanCount howmany)
4934 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
4938 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
4940 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4941 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
4946 Session::next_insert_id ()
4948 /* this doesn't really loop forever. just think about it */
4951 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
4952 if (!insert_bitset[n]) {
4953 insert_bitset[n] = true;
4959 /* none available, so resize and try again */
4961 insert_bitset.resize (insert_bitset.size() + 16, false);
4966 Session::next_send_id ()
4968 /* this doesn't really loop forever. just think about it */
4971 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
4972 if (!send_bitset[n]) {
4973 send_bitset[n] = true;
4979 /* none available, so resize and try again */
4981 send_bitset.resize (send_bitset.size() + 16, false);
4986 Session::next_aux_send_id ()
4988 /* this doesn't really loop forever. just think about it */
4991 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
4992 if (!aux_send_bitset[n]) {
4993 aux_send_bitset[n] = true;
4999 /* none available, so resize and try again */
5001 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
5006 Session::next_return_id ()
5008 /* this doesn't really loop forever. just think about it */
5011 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
5012 if (!return_bitset[n]) {
5013 return_bitset[n] = true;
5019 /* none available, so resize and try again */
5021 return_bitset.resize (return_bitset.size() + 16, false);
5026 Session::mark_send_id (uint32_t id)
5028 if (id >= send_bitset.size()) {
5029 send_bitset.resize (id+16, false);
5031 if (send_bitset[id]) {
5032 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
5034 send_bitset[id] = true;
5038 Session::mark_aux_send_id (uint32_t id)
5040 if (id >= aux_send_bitset.size()) {
5041 aux_send_bitset.resize (id+16, false);
5043 if (aux_send_bitset[id]) {
5044 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
5046 aux_send_bitset[id] = true;
5050 Session::mark_return_id (uint32_t id)
5052 if (id >= return_bitset.size()) {
5053 return_bitset.resize (id+16, false);
5055 if (return_bitset[id]) {
5056 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
5058 return_bitset[id] = true;
5062 Session::mark_insert_id (uint32_t id)
5064 if (id >= insert_bitset.size()) {
5065 insert_bitset.resize (id+16, false);
5067 if (insert_bitset[id]) {
5068 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
5070 insert_bitset[id] = true;
5074 Session::unmark_send_id (uint32_t id)
5076 if (id < send_bitset.size()) {
5077 send_bitset[id] = false;
5082 Session::unmark_aux_send_id (uint32_t id)
5084 if (id < aux_send_bitset.size()) {
5085 aux_send_bitset[id] = false;
5090 Session::unmark_return_id (uint32_t id)
5092 if (id < return_bitset.size()) {
5093 return_bitset[id] = false;
5098 Session::unmark_insert_id (uint32_t id)
5100 if (id < insert_bitset.size()) {
5101 insert_bitset[id] = false;
5106 Session::reset_native_file_format ()
5108 boost::shared_ptr<RouteList> rl = routes.reader ();
5110 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5111 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5113 /* don't save state as we do this, there's no point
5115 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
5116 tr->reset_write_sources (false);
5117 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
5123 Session::route_name_unique (string n) const
5125 boost::shared_ptr<RouteList> r = routes.reader ();
5127 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5128 if ((*i)->name() == n) {
5137 Session::route_name_internal (string n) const
5139 if (auditioner && auditioner->name() == n) {
5143 if (_click_io && _click_io->name() == n) {
5151 Session::freeze_all (InterThreadInfo& itt)
5153 boost::shared_ptr<RouteList> r = routes.reader ();
5155 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5157 boost::shared_ptr<Track> t;
5159 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
5160 /* XXX this is wrong because itt.progress will keep returning to zero at the start
5170 boost::shared_ptr<Region>
5171 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
5172 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
5173 InterThreadInfo& itt,
5174 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
5175 bool for_export, bool for_freeze)
5177 boost::shared_ptr<Region> result;
5178 boost::shared_ptr<Playlist> playlist;
5179 boost::shared_ptr<Source> source;
5180 ChanCount diskstream_channels (track.n_channels());
5181 framepos_t position;
5182 framecnt_t this_chunk;
5184 framepos_t latency_skip;
5186 framepos_t len = end - start;
5187 bool need_block_size_reset = false;
5188 ChanCount const max_proc = track.max_processor_streams ();
5189 string legal_playlist_name;
5190 string possible_path;
5193 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
5194 end, start) << endmsg;
5198 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
5199 include_endpoint, for_export, for_freeze);
5201 if (diskstream_channels.n(track.data_type()) < 1) {
5202 error << _("Cannot write a range with no data.") << endmsg;
5206 // block all process callback handling
5208 block_processing ();
5211 // synchronize with AudioEngine::process_callback()
5212 // make sure processing is not currently running
5213 // and processing_blocked() is honored before
5214 // acquiring thread buffers
5215 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5218 _bounce_processing_active = true;
5220 /* call tree *MUST* hold route_lock */
5222 if ((playlist = track.playlist()) == 0) {
5226 legal_playlist_name = legalize_for_path (playlist->name());
5228 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
5230 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
5231 string path = ((track.data_type() == DataType::AUDIO)
5232 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
5233 : new_midi_source_path (legal_playlist_name));
5240 source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
5243 catch (failed_constructor& err) {
5244 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
5248 srcs.push_back (source);
5251 /* tell redirects that care that we are about to use a much larger
5252 * blocksize. this will flush all plugins too, so that they are ready
5253 * to be used for this process.
5256 need_block_size_reset = true;
5257 track.set_block_size (bounce_chunk_size);
5258 _engine.main_thread()->get_buffers ();
5262 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5264 /* create a set of reasonably-sized buffers */
5265 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5266 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
5268 buffers.set_count (max_proc);
5270 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5271 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5272 boost::shared_ptr<MidiSource> ms;
5274 afs->prepare_for_peakfile_writes ();
5275 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5276 Source::Lock lock(ms->mutex());
5277 ms->mark_streaming_write_started(lock);
5281 while (to_do && !itt.cancel) {
5283 this_chunk = min (to_do, bounce_chunk_size);
5285 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
5289 start += this_chunk;
5290 to_do -= this_chunk;
5291 itt.progress = (float) (1.0 - ((double) to_do / len));
5293 if (latency_skip >= bounce_chunk_size) {
5294 latency_skip -= bounce_chunk_size;
5298 const framecnt_t current_chunk = this_chunk - latency_skip;
5301 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5302 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5303 boost::shared_ptr<MidiSource> ms;
5306 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
5309 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5310 Source::Lock lock(ms->mutex());
5312 const MidiBuffer& buf = buffers.get_midi(0);
5313 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
5314 Evoral::Event<framepos_t> ev = *i;
5315 ev.set_time(ev.time() - position);
5316 ms->append_event_frames(lock, ev, ms->timeline_position());
5323 /* post-roll, pick up delayed processor output */
5324 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5326 while (latency_skip && !itt.cancel) {
5327 this_chunk = min (latency_skip, bounce_chunk_size);
5328 latency_skip -= this_chunk;
5330 buffers.silence (this_chunk, 0);
5331 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
5334 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5335 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5338 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
5350 xnow = localtime (&now);
5352 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
5353 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5354 boost::shared_ptr<MidiSource> ms;
5357 afs->update_header (position, *xnow, now);
5358 afs->flush_header ();
5359 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5360 Source::Lock lock(ms->mutex());
5361 ms->mark_streaming_write_completed(lock);
5365 /* construct a region to represent the bounced material */
5369 plist.add (Properties::start, 0);
5370 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
5371 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
5373 result = RegionFactory::create (srcs, plist);
5379 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5380 (*src)->mark_for_remove ();
5381 (*src)->drop_references ();
5385 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5386 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5389 afs->done_with_peakfile_writes ();
5393 _bounce_processing_active = false;
5395 if (need_block_size_reset) {
5396 _engine.main_thread()->drop_buffers ();
5397 track.set_block_size (get_block_size());
5400 unblock_processing ();
5406 Session::gain_automation_buffer() const
5408 return ProcessThread::gain_automation_buffer ();
5412 Session::trim_automation_buffer() const
5414 return ProcessThread::trim_automation_buffer ();
5418 Session::send_gain_automation_buffer() const
5420 return ProcessThread::send_gain_automation_buffer ();
5424 Session::pan_automation_buffer() const
5426 return ProcessThread::pan_automation_buffer ();
5430 Session::get_silent_buffers (ChanCount count)
5432 return ProcessThread::get_silent_buffers (count);
5436 Session::get_scratch_buffers (ChanCount count, bool silence)
5438 return ProcessThread::get_scratch_buffers (count, silence);
5442 Session::get_route_buffers (ChanCount count, bool silence)
5444 return ProcessThread::get_route_buffers (count, silence);
5449 Session::get_mix_buffers (ChanCount count)
5451 return ProcessThread::get_mix_buffers (count);
5455 Session::ntracks () const
5458 boost::shared_ptr<RouteList> r = routes.reader ();
5460 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5461 if (boost::dynamic_pointer_cast<Track> (*i)) {
5470 Session::nbusses () const
5473 boost::shared_ptr<RouteList> r = routes.reader ();
5475 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5476 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
5485 Session::add_automation_list(AutomationList *al)
5487 automation_lists[al->id()] = al;
5490 /** @return true if there is at least one record-enabled track, otherwise false */
5492 Session::have_rec_enabled_track () const
5494 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
5498 Session::have_rec_disabled_track () const
5500 return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
5503 /** Update the state of our rec-enabled tracks flag */
5505 Session::update_route_record_state ()
5507 boost::shared_ptr<RouteList> rl = routes.reader ();
5508 RouteList::iterator i = rl->begin();
5509 while (i != rl->end ()) {
5511 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5512 if (tr && tr->record_enabled ()) {
5519 int const old = g_atomic_int_get (&_have_rec_enabled_track);
5521 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
5523 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
5524 RecordStateChanged (); /* EMIT SIGNAL */
5527 for (i = rl->begin(); i != rl->end (); ++i) {
5528 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5529 if (tr && !tr->record_enabled ()) {
5534 g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
5536 bool record_arm_state_changed = (old != g_atomic_int_get (&_have_rec_enabled_track) );
5538 if (record_status() == Recording && record_arm_state_changed ) {
5539 RecordArmStateChanged ();
5545 Session::listen_position_changed ()
5547 boost::shared_ptr<RouteList> r = routes.reader ();
5549 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5550 (*i)->listen_position_changed ();
5555 Session::solo_control_mode_changed ()
5557 /* cancel all solo or all listen when solo control mode changes */
5560 set_solo (get_routes(), false);
5561 } else if (listening()) {
5562 set_listen (get_routes(), false);
5566 /** Called when a property of one of our route groups changes */
5568 Session::route_group_property_changed (RouteGroup* rg)
5570 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
5573 /** Called when a route is added to one of our route groups */
5575 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5577 RouteAddedToRouteGroup (rg, r);
5580 /** Called when a route is removed from one of our route groups */
5582 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5584 update_route_record_state ();
5585 RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
5588 boost::shared_ptr<RouteList>
5589 Session::get_tracks () const
5591 boost::shared_ptr<RouteList> rl = routes.reader ();
5592 boost::shared_ptr<RouteList> tl (new RouteList);
5594 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
5595 if (boost::dynamic_pointer_cast<Track> (*r)) {
5596 if (!(*r)->is_auditioner()) {
5604 boost::shared_ptr<RouteList>
5605 Session::get_routes_with_regions_at (framepos_t const p) const
5607 boost::shared_ptr<RouteList> r = routes.reader ();
5608 boost::shared_ptr<RouteList> rl (new RouteList);
5610 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5611 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5616 boost::shared_ptr<Playlist> pl = tr->playlist ();
5621 if (pl->has_region_at (p)) {
5630 Session::goto_end ()
5632 if (_session_range_location) {
5633 request_locate (_session_range_location->end(), false);
5635 request_locate (0, false);
5640 Session::goto_start ()
5642 if (_session_range_location) {
5643 request_locate (_session_range_location->start(), false);
5645 request_locate (0, false);
5650 Session::current_start_frame () const
5652 return _session_range_location ? _session_range_location->start() : 0;
5656 Session::current_end_frame () const
5658 return _session_range_location ? _session_range_location->end() : 0;
5662 Session::set_session_range_location (framepos_t start, framepos_t end)
5664 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
5665 _locations->add (_session_range_location);
5669 Session::step_edit_status_change (bool yn)
5675 send = (_step_editors == 0);
5680 send = (_step_editors == 1);
5683 if (_step_editors > 0) {
5689 StepEditStatusChange (val);
5695 Session::start_time_changed (framepos_t old)
5697 /* Update the auto loop range to match the session range
5698 (unless the auto loop range has been changed by the user)
5701 Location* s = _locations->session_range_location ();
5706 Location* l = _locations->auto_loop_location ();
5708 if (l && l->start() == old) {
5709 l->set_start (s->start(), true);
5714 Session::end_time_changed (framepos_t old)
5716 /* Update the auto loop range to match the session range
5717 (unless the auto loop range has been changed by the user)
5720 Location* s = _locations->session_range_location ();
5725 Location* l = _locations->auto_loop_location ();
5727 if (l && l->end() == old) {
5728 l->set_end (s->end(), true);
5732 std::vector<std::string>
5733 Session::source_search_path (DataType type) const
5737 if (session_dirs.size() == 1) {
5739 case DataType::AUDIO:
5740 sp.push_back (_session_dir->sound_path());
5742 case DataType::MIDI:
5743 sp.push_back (_session_dir->midi_path());
5747 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
5748 SessionDirectory sdir (i->path);
5750 case DataType::AUDIO:
5751 sp.push_back (sdir.sound_path());
5753 case DataType::MIDI:
5754 sp.push_back (sdir.midi_path());
5760 if (type == DataType::AUDIO) {
5761 const string sound_path_2X = _session_dir->sound_path_2X();
5762 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
5763 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
5764 sp.push_back (sound_path_2X);
5769 // now check the explicit (possibly user-specified) search path
5772 case DataType::AUDIO:
5773 sp += Searchpath(config.get_audio_search_path ());
5775 case DataType::MIDI:
5776 sp += Searchpath(config.get_midi_search_path ());
5784 Session::ensure_search_path_includes (const string& path, DataType type)
5793 case DataType::AUDIO:
5794 sp += Searchpath(config.get_audio_search_path ());
5796 case DataType::MIDI:
5797 sp += Searchpath (config.get_midi_search_path ());
5801 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
5802 /* No need to add this new directory if it has the same inode as
5803 an existing one; checking inode rather than name prevents duplicated
5804 directories when we are using symlinks.
5806 On Windows, I think we could just do if (*i == path) here.
5808 if (PBD::equivalent_paths (*i, path)) {
5816 case DataType::AUDIO:
5817 config.set_audio_search_path (sp.to_string());
5819 case DataType::MIDI:
5820 config.set_midi_search_path (sp.to_string());
5826 Session::remove_dir_from_search_path (const string& dir, DataType type)
5831 case DataType::AUDIO:
5832 sp = Searchpath(config.get_audio_search_path ());
5834 case DataType::MIDI:
5835 sp = Searchpath (config.get_midi_search_path ());
5842 case DataType::AUDIO:
5843 config.set_audio_search_path (sp.to_string());
5845 case DataType::MIDI:
5846 config.set_midi_search_path (sp.to_string());
5852 boost::shared_ptr<Speakers>
5853 Session::get_speakers()
5859 Session::unknown_processors () const
5863 boost::shared_ptr<RouteList> r = routes.reader ();
5864 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5865 list<string> t = (*i)->unknown_processors ();
5866 copy (t.begin(), t.end(), back_inserter (p));
5876 Session::update_latency (bool playback)
5878 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
5880 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
5884 boost::shared_ptr<RouteList> r = routes.reader ();
5885 framecnt_t max_latency = 0;
5888 /* reverse the list so that we work backwards from the last route to run to the first */
5889 RouteList* rl = routes.reader().get();
5890 r.reset (new RouteList (*rl));
5891 reverse (r->begin(), r->end());
5894 /* compute actual latency values for the given direction and store them all in per-port
5895 structures. this will also publish the same values (to JACK) so that computation of latency
5896 for routes can consistently use public latency values.
5899 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5900 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
5903 /* because we latency compensate playback, our published playback latencies should
5904 be the same for all output ports - all material played back by ardour has
5905 the same latency, whether its caused by plugins or by latency compensation. since
5906 these may differ from the values computed above, reset all playback port latencies
5910 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
5912 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5913 (*i)->set_public_port_latencies (max_latency, playback);
5918 post_playback_latency ();
5922 post_capture_latency ();
5925 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
5929 Session::post_playback_latency ()
5931 set_worst_playback_latency ();
5933 boost::shared_ptr<RouteList> r = routes.reader ();
5935 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5936 if (!(*i)->is_auditioner() && ((*i)->active())) {
5937 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
5941 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5942 (*i)->set_latency_compensation (_worst_track_latency);
5947 Session::post_capture_latency ()
5949 set_worst_capture_latency ();
5951 /* reflect any changes in capture latencies into capture offsets
5954 boost::shared_ptr<RouteList> rl = routes.reader();
5955 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5956 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5958 tr->set_capture_offset ();
5964 Session::initialize_latencies ()
5967 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5968 update_latency (false);
5969 update_latency (true);
5972 set_worst_io_latencies ();
5976 Session::set_worst_io_latencies ()
5978 set_worst_playback_latency ();
5979 set_worst_capture_latency ();
5983 Session::set_worst_playback_latency ()
5985 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5989 _worst_output_latency = 0;
5991 if (!_engine.connected()) {
5995 boost::shared_ptr<RouteList> r = routes.reader ();
5997 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5998 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
6001 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
6005 Session::set_worst_capture_latency ()
6007 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6011 _worst_input_latency = 0;
6013 if (!_engine.connected()) {
6017 boost::shared_ptr<RouteList> r = routes.reader ();
6019 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6020 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
6023 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
6027 Session::update_latency_compensation (bool force_whole_graph)
6029 bool some_track_latency_changed = false;
6031 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6035 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
6037 _worst_track_latency = 0;
6039 boost::shared_ptr<RouteList> r = routes.reader ();
6041 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6042 if (!(*i)->is_auditioner() && ((*i)->active())) {
6044 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
6045 some_track_latency_changed = true;
6047 _worst_track_latency = max (tl, _worst_track_latency);
6051 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
6052 (some_track_latency_changed ? "yes" : "no")));
6054 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
6056 if (some_track_latency_changed || force_whole_graph) {
6057 _engine.update_latencies ();
6061 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6062 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6066 tr->set_capture_offset ();
6071 Session::session_name_is_legal (const string& path)
6073 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
6075 for (int i = 0; illegal_chars[i]; ++i) {
6076 if (path.find (illegal_chars[i]) != string::npos) {
6077 return illegal_chars[i];
6085 Session::next_control_id () const
6089 /* the monitor bus remote ID is in a different
6090 * "namespace" than regular routes. its existence doesn't
6091 * affect normal (low) numbered routes.
6098 /* the same about masterbus in Waves Tracks */
6100 if (Profile->get_trx() && _master_out) {
6104 return nroutes() - subtract;
6108 Session::notify_remote_id_change ()
6110 if (deletion_in_progress()) {
6114 switch (Config->get_remote_model()) {
6116 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
6122 #ifdef USE_TRACKS_CODE_FEATURES
6123 /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
6124 * if track order has been changed by user
6126 reconnect_existing_routes(true, true);
6132 Session::sync_order_keys ()
6134 if (deletion_in_progress()) {
6138 /* tell everyone that something has happened to the sort keys
6139 and let them sync up with the change(s)
6140 this will give objects that manage the sort order keys the
6141 opportunity to keep them in sync if they wish to.
6144 DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
6146 reassign_track_numbers();
6148 Route::SyncOrderKeys (); /* EMIT SIGNAL */
6150 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
6154 Session::operation_in_progress (GQuark op) const
6156 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
6159 boost::shared_ptr<Port>
6160 Session::ltc_input_port () const
6162 return _ltc_input->nth (0);
6165 boost::shared_ptr<Port>
6166 Session::ltc_output_port () const
6168 return _ltc_output->nth (0);
6172 Session::reconnect_ltc_input ()
6176 string src = Config->get_ltc_source_port();
6178 _ltc_input->disconnect (this);
6180 if (src != _("None") && !src.empty()) {
6181 _ltc_input->nth (0)->connect (src);
6184 if ( ARDOUR::Profile->get_trx () ) {
6185 // Tracks need this signal to update timecode_source_dropdown
6186 MtcOrLtcInputPortChanged (); //emit signal
6192 Session::reconnect_ltc_output ()
6196 string src = Config->get_ltc_output_port();
6198 _ltc_output->disconnect (this);
6200 if (src != _("None") && !src.empty()) {
6201 _ltc_output->nth (0)->connect (src);
6207 Session::set_range_selection (framepos_t start, framepos_t end)
6209 _range_selection = Evoral::Range<framepos_t> (start, end);
6210 #ifdef USE_TRACKS_CODE_FEATURES
6211 follow_playhead_priority ();
6216 Session::set_object_selection (framepos_t start, framepos_t end)
6218 _object_selection = Evoral::Range<framepos_t> (start, end);
6219 #ifdef USE_TRACKS_CODE_FEATURES
6220 follow_playhead_priority ();
6225 Session::clear_range_selection ()
6227 _range_selection = Evoral::Range<framepos_t> (-1,-1);
6228 #ifdef USE_TRACKS_CODE_FEATURES
6229 follow_playhead_priority ();
6234 Session::clear_object_selection ()
6236 _object_selection = Evoral::Range<framepos_t> (-1,-1);
6237 #ifdef USE_TRACKS_CODE_FEATURES
6238 follow_playhead_priority ();