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, _1, wpr));
3210 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, 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 (void* /*src*/, 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_solo_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 boost::shared_ptr<RouteList> r = routes.reader ();
3508 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3509 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() || (leave_group_alone && ((*i)->route_group() == rg))) {
3512 (*i)->set_listen (false, this);
3518 } else if (_listen_cnt > 0) {
3523 update_route_solo_state ();
3526 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3528 boost::shared_ptr<Route> route = wpr.lock ();
3531 /* should not happen */
3532 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_isolated_changed")) << endmsg;
3536 bool send_changed = false;
3538 if (route->solo_isolated()) {
3539 if (_solo_isolated_cnt == 0) {
3540 send_changed = true;
3542 _solo_isolated_cnt++;
3543 } else if (_solo_isolated_cnt > 0) {
3544 _solo_isolated_cnt--;
3545 if (_solo_isolated_cnt == 0) {
3546 send_changed = true;
3551 IsolatedChanged (); /* EMIT SIGNAL */
3556 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
3558 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
3560 if (!self_solo_change) {
3561 // session doesn't care about changes to soloed-by-others
3565 boost::shared_ptr<Route> route = wpr.lock ();
3568 boost::shared_ptr<RouteList> r = routes.reader ();
3571 if (route->self_soloed()) {
3577 RouteGroup* rg = route->route_group ();
3578 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
3580 if (delta == 1 && Config->get_exclusive_solo()) {
3582 /* new solo: disable all other solos, but not the group if its solo-enabled */
3584 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3585 if ((*i) == route || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3586 (leave_group_alone && ((*i)->route_group() == rg))) {
3589 (*i)->set_solo (false, this);
3593 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3595 RouteList uninvolved;
3597 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
3599 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3600 bool via_sends_only;
3601 bool in_signal_flow;
3603 if ((*i) == route || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3604 (leave_group_alone && ((*i)->route_group() == rg))) {
3608 in_signal_flow = false;
3610 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3612 if ((*i)->feeds (route, &via_sends_only)) {
3613 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3614 if (!via_sends_only) {
3615 if (!route->soloed_by_others_upstream()) {
3616 (*i)->mod_solo_by_others_downstream (delta);
3619 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3621 in_signal_flow = true;
3623 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3626 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3628 if (route->feeds (*i, &via_sends_only)) {
3629 /* propagate solo upstream only if routing other than
3630 sends is involved, but do consider the other route
3631 (*i) to be part of the signal flow even if only
3634 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3638 route->soloed_by_others_downstream(),
3639 route->soloed_by_others_upstream()));
3640 if (!via_sends_only) {
3641 if (!route->soloed_by_others_downstream()) {
3642 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3643 (*i)->mod_solo_by_others_upstream (delta);
3645 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
3648 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3650 in_signal_flow = true;
3652 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3655 if (!in_signal_flow) {
3656 uninvolved.push_back (*i);
3660 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3662 update_route_solo_state (r);
3664 /* now notify that the mute state of the routes not involved in the signal
3665 pathway of the just-solo-changed route may have altered.
3668 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3669 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
3670 (*i)->act_on_mute ();
3671 (*i)->mute_changed (this);
3674 SoloChanged (); /* EMIT SIGNAL */
3679 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
3681 /* now figure out if anything that matters is soloed (or is "listening")*/
3683 bool something_soloed = false;
3684 uint32_t listeners = 0;
3685 uint32_t isolated = 0;
3688 r = routes.reader();
3691 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3692 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
3693 something_soloed = true;
3696 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
3697 if (Config->get_solo_control_is_listen_control()) {
3700 (*i)->set_listen (false, this);
3704 if ((*i)->solo_isolated()) {
3709 if (something_soloed != _non_soloed_outs_muted) {
3710 _non_soloed_outs_muted = something_soloed;
3711 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
3714 _listen_cnt = listeners;
3716 if (isolated != _solo_isolated_cnt) {
3717 _solo_isolated_cnt = isolated;
3718 IsolatedChanged (); /* EMIT SIGNAL */
3721 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
3722 something_soloed, listeners, isolated));
3725 boost::shared_ptr<RouteList>
3726 Session::get_routes_with_internal_returns() const
3728 boost::shared_ptr<RouteList> r = routes.reader ();
3729 boost::shared_ptr<RouteList> rl (new RouteList);
3731 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3732 if ((*i)->internal_return ()) {
3740 Session::io_name_is_legal (const std::string& name)
3742 boost::shared_ptr<RouteList> r = routes.reader ();
3744 for (vector<string>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
3745 if (name == *reserved) {
3750 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3751 if ((*i)->name() == name) {
3755 if ((*i)->has_io_processor_named (name)) {
3764 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
3767 vector<string> connections;
3769 /* if we are passed only a single route and we're not told to turn
3770 * others off, then just do the simple thing.
3773 if (flip_others == false && rl->size() == 1) {
3774 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
3776 mt->set_input_active (onoff);
3781 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
3783 PortSet& ps ((*rt)->input()->ports());
3785 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
3786 p->get_connections (connections);
3789 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
3790 routes_using_input_from (*s, rl2);
3793 /* scan all relevant routes to see if others are on or off */
3795 bool others_are_already_on = false;
3797 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3799 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3805 if ((*r) != (*rt)) {
3806 if (mt->input_active()) {
3807 others_are_already_on = true;
3810 /* this one needs changing */
3811 mt->set_input_active (onoff);
3817 /* globally reverse other routes */
3819 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3820 if ((*r) != (*rt)) {
3821 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3823 mt->set_input_active (!others_are_already_on);
3832 Session::routes_using_input_from (const string& str, RouteList& rl)
3834 boost::shared_ptr<RouteList> r = routes.reader();
3836 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3837 if ((*i)->input()->connected_to (str)) {
3843 boost::shared_ptr<Route>
3844 Session::route_by_name (string name)
3846 boost::shared_ptr<RouteList> r = routes.reader ();
3848 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3849 if ((*i)->name() == name) {
3854 return boost::shared_ptr<Route> ((Route*) 0);
3857 boost::shared_ptr<Route>
3858 Session::route_by_id (PBD::ID id)
3860 boost::shared_ptr<RouteList> r = routes.reader ();
3862 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3863 if ((*i)->id() == id) {
3868 return boost::shared_ptr<Route> ((Route*) 0);
3871 boost::shared_ptr<Track>
3872 Session::track_by_diskstream_id (PBD::ID id)
3874 boost::shared_ptr<RouteList> r = routes.reader ();
3876 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3877 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3878 if (t && t->using_diskstream_id (id)) {
3883 return boost::shared_ptr<Track> ();
3886 boost::shared_ptr<Route>
3887 Session::route_by_remote_id (uint32_t id)
3889 boost::shared_ptr<RouteList> r = routes.reader ();
3891 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3892 if ((*i)->remote_control_id() == id) {
3897 return boost::shared_ptr<Route> ((Route*) 0);
3902 Session::reassign_track_numbers ()
3906 RouteList r (*(routes.reader ()));
3907 SignalOrderRouteSorter sorter;
3910 StateProtector sp (this);
3912 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3913 if (boost::dynamic_pointer_cast<Track> (*i)) {
3914 (*i)->set_track_number(++tn);
3916 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
3917 (*i)->set_track_number(--bn);
3920 const uint32_t decimals = ceilf (log10f (tn + 1));
3921 const bool decimals_changed = _track_number_decimals != decimals;
3922 _track_number_decimals = decimals;
3924 if (decimals_changed && config.get_track_name_number ()) {
3925 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3926 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3928 t->resync_track_name();
3931 // trigger GUI re-layout
3932 config.ParameterChanged("track-name-number");
3937 Session::playlist_region_added (boost::weak_ptr<Region> w)
3939 boost::shared_ptr<Region> r = w.lock ();
3944 /* These are the operations that are currently in progress... */
3945 list<GQuark> curr = _current_trans_quarks;
3948 /* ...and these are the operations during which we want to update
3949 the session range location markers.
3952 ops.push_back (Operations::capture);
3953 ops.push_back (Operations::paste);
3954 ops.push_back (Operations::duplicate_region);
3955 ops.push_back (Operations::insert_file);
3956 ops.push_back (Operations::insert_region);
3957 ops.push_back (Operations::drag_region_brush);
3958 ops.push_back (Operations::region_drag);
3959 ops.push_back (Operations::selection_grab);
3960 ops.push_back (Operations::region_fill);
3961 ops.push_back (Operations::fill_selection);
3962 ops.push_back (Operations::create_region);
3963 ops.push_back (Operations::region_copy);
3964 ops.push_back (Operations::fixed_time_region_copy);
3967 /* See if any of the current operations match the ones that we want */
3969 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
3971 /* If so, update the session range markers */
3973 maybe_update_session_range (r->position (), r->last_frame ());
3977 /** Update the session range markers if a is before the current start or
3978 * b is after the current end.
3981 Session::maybe_update_session_range (framepos_t a, framepos_t b)
3983 if (_state_of_the_state & Loading) {
3987 framepos_t session_end_marker_shift_samples = session_end_shift * _nominal_frame_rate;
3989 if (_session_range_location == 0) {
3991 set_session_range_location (a, b + session_end_marker_shift_samples);
3995 if (a < _session_range_location->start()) {
3996 _session_range_location->set_start (a);
3999 if (b > _session_range_location->end()) {
4000 _session_range_location->set_end (b);
4006 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
4008 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4009 maybe_update_session_range (i->to, i->to + i->length);
4014 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
4016 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4017 maybe_update_session_range (i->from, i->to);
4021 /* Region management */
4023 boost::shared_ptr<Region>
4024 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
4026 const RegionFactory::RegionMap& regions (RegionFactory::regions());
4027 RegionFactory::RegionMap::const_iterator i;
4028 boost::shared_ptr<Region> region;
4030 Glib::Threads::Mutex::Lock lm (region_lock);
4032 for (i = regions.begin(); i != regions.end(); ++i) {
4036 if (region->whole_file()) {
4038 if (child->source_equivalent (region)) {
4044 return boost::shared_ptr<Region> ();
4048 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
4050 set<boost::shared_ptr<Region> > relevant_regions;
4052 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
4053 RegionFactory::get_regions_using_source (*s, relevant_regions);
4056 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
4057 set<boost::shared_ptr<Region> >::iterator tmp;
4062 playlists->destroy_region (*r);
4063 RegionFactory::map_remove (*r);
4065 (*r)->drop_sources ();
4066 (*r)->drop_references ();
4068 relevant_regions.erase (r);
4073 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
4076 Glib::Threads::Mutex::Lock ls (source_lock);
4077 /* remove from the main source list */
4078 sources.erase ((*s)->id());
4081 (*s)->mark_for_remove ();
4082 (*s)->drop_references ();
4091 Session::remove_last_capture ()
4093 list<boost::shared_ptr<Source> > srcs;
4095 boost::shared_ptr<RouteList> rl = routes.reader ();
4096 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4097 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4102 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
4105 srcs.insert (srcs.end(), l.begin(), l.end());
4110 destroy_sources (srcs);
4112 save_state (_current_snapshot_name);
4117 /* Source Management */
4120 Session::add_source (boost::shared_ptr<Source> source)
4122 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
4123 pair<SourceMap::iterator,bool> result;
4125 entry.first = source->id();
4126 entry.second = source;
4129 Glib::Threads::Mutex::Lock lm (source_lock);
4130 result = sources.insert (entry);
4133 if (result.second) {
4135 /* yay, new source */
4137 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
4140 if (!fs->within_session()) {
4141 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
4147 boost::shared_ptr<AudioFileSource> afs;
4149 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
4150 if (Config->get_auto_analyse_audio()) {
4151 Analyser::queue_source_for_analysis (source, false);
4155 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
4160 Session::remove_source (boost::weak_ptr<Source> src)
4162 if (_state_of_the_state & Deletion) {
4166 SourceMap::iterator i;
4167 boost::shared_ptr<Source> source = src.lock();
4174 Glib::Threads::Mutex::Lock lm (source_lock);
4176 if ((i = sources.find (source->id())) != sources.end()) {
4181 if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
4183 /* save state so we don't end up with a session file
4184 referring to non-existent sources.
4187 save_state (_current_snapshot_name);
4191 boost::shared_ptr<Source>
4192 Session::source_by_id (const PBD::ID& id)
4194 Glib::Threads::Mutex::Lock lm (source_lock);
4195 SourceMap::iterator i;
4196 boost::shared_ptr<Source> source;
4198 if ((i = sources.find (id)) != sources.end()) {
4205 boost::shared_ptr<AudioFileSource>
4206 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
4208 /* Restricted to audio files because only audio sources have channel
4212 Glib::Threads::Mutex::Lock lm (source_lock);
4214 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
4215 boost::shared_ptr<AudioFileSource> afs
4216 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
4218 if (afs && afs->path() == path && chn == afs->channel()) {
4223 return boost::shared_ptr<AudioFileSource>();
4226 boost::shared_ptr<MidiSource>
4227 Session::midi_source_by_path (const std::string& path) const
4229 /* Restricted to MIDI files because audio sources require a channel
4230 for unique identification, in addition to a path.
4233 Glib::Threads::Mutex::Lock lm (source_lock);
4235 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
4236 boost::shared_ptr<MidiSource> ms
4237 = boost::dynamic_pointer_cast<MidiSource>(s->second);
4238 boost::shared_ptr<FileSource> fs
4239 = boost::dynamic_pointer_cast<FileSource>(s->second);
4241 if (ms && fs && fs->path() == path) {
4246 return boost::shared_ptr<MidiSource>();
4250 Session::count_sources_by_origin (const string& path)
4253 Glib::Threads::Mutex::Lock lm (source_lock);
4255 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
4256 boost::shared_ptr<FileSource> fs
4257 = boost::dynamic_pointer_cast<FileSource>(i->second);
4259 if (fs && fs->origin() == path) {
4268 peak_file_helper (const string& peak_path, const string& file_path, const string& file_base, bool hash) {
4270 std::string checksum = Glib::Checksum::compute_checksum(Glib::Checksum::CHECKSUM_SHA1, file_path + G_DIR_SEPARATOR + file_base);
4271 return Glib::build_filename (peak_path, checksum + peakfile_suffix);
4273 return Glib::build_filename (peak_path, file_base + peakfile_suffix);
4278 Session::construct_peak_filepath (const string& filepath, const bool in_session, const bool old_peak_name) const
4280 string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
4282 if (Glib::path_is_absolute (filepath)) {
4284 /* rip the session dir from the audiofile source */
4286 string session_path;
4287 bool in_another_session = true;
4289 if (filepath.find (interchange_dir_string) != string::npos) {
4291 session_path = Glib::path_get_dirname (filepath); /* now ends in audiofiles */
4292 session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
4293 session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
4294 session_path = Glib::path_get_dirname (session_path); /* now has session path */
4296 /* see if it is within our session */
4298 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4299 if (i->path == session_path) {
4300 in_another_session = false;
4305 in_another_session = false;
4309 if (in_another_session) {
4310 SessionDirectory sd (session_path);
4311 return peak_file_helper (sd.peak_path(), "", Glib::path_get_basename (filepath), !old_peak_name);
4315 /* 1) if file belongs to this session
4316 * it may be a relative path (interchange/...)
4317 * or just basename (session_state, remove source)
4318 * -> just use the basename
4320 std::string filename = Glib::path_get_basename (filepath);
4323 /* 2) if the file is outside our session dir:
4324 * (imported but not copied) add the path for check-summming */
4326 path = Glib::path_get_dirname (filepath);
4329 return peak_file_helper (_session_dir->peak_path(), path, Glib::path_get_basename (filepath), !old_peak_name);
4333 Session::new_audio_source_path_for_embedded (const std::string& path)
4337 * we know that the filename is already unique because it exists
4338 * out in the filesystem.
4340 * However, when we bring it into the session, we could get a
4343 * Eg. two embedded files:
4348 * When merged into session, these collide.
4350 * There will not be a conflict with in-memory sources
4351 * because when the source was created we already picked
4352 * a unique name for it.
4354 * This collision is not likely to be common, but we have to guard
4355 * against it. So, if there is a collision, take the md5 hash of the
4356 * the path, and use that as the filename instead.
4359 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4360 string base = Glib::path_get_basename (path);
4361 string newpath = Glib::build_filename (sdir.sound_path(), base);
4363 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4367 md5.digestString (path.c_str());
4368 md5.writeToString ();
4369 base = md5.digestChars;
4371 string ext = get_suffix (path);
4378 newpath = Glib::build_filename (sdir.sound_path(), base);
4380 /* if this collides, we're screwed */
4382 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4383 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
4392 /** Return true if there are no audio file sources that use @param name as
4393 * the filename component of their path.
4395 * Return false otherwise.
4397 * This method MUST ONLY be used to check in-session, mono files since it
4398 * hard-codes the channel of the audio file source we are looking for as zero.
4400 * If/when Ardour supports native files in non-mono formats, the logic here
4401 * will need to be revisited.
4404 Session::audio_source_name_is_unique (const string& name)
4406 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
4407 vector<space_and_path>::iterator i;
4408 uint32_t existing = 0;
4410 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4412 /* note that we search *without* the extension so that
4413 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
4414 in the event that this new name is required for
4415 a file format change.
4418 const string spath = *i;
4420 if (matching_unsuffixed_filename_exists_in (spath, name)) {
4425 /* it is possible that we have the path already
4426 * assigned to a source that has not yet been written
4427 * (ie. the write source for a diskstream). we have to
4428 * check this in order to make sure that our candidate
4429 * path isn't used again, because that can lead to
4430 * two Sources point to the same file with different
4431 * notions of their removability.
4435 string possible_path = Glib::build_filename (spath, name);
4437 if (audio_source_by_path_and_channel (possible_path, 0)) {
4443 return (existing == 0);
4447 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)
4450 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4452 if (Profile->get_trx() && destructive) {
4454 sstr << setfill ('0') << setw (4) << cnt;
4455 sstr << legalized_base;
4457 sstr << legalized_base;
4459 if (take_required || related_exists) {
4471 } else if (nchan > 2) {
4476 /* XXX what? more than 26 channels! */
4487 /** Return a unique name based on \a base for a new internal audio source */
4489 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
4492 string possible_name;
4493 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
4495 bool some_related_source_name_exists = false;
4497 legalized = legalize_for_path (base);
4499 // Find a "version" of the base name that doesn't exist in any of the possible directories.
4501 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
4503 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
4505 if (audio_source_name_is_unique (possible_name)) {
4509 some_related_source_name_exists = true;
4512 error << string_compose(
4513 _("There are already %1 recordings for %2, which I consider too many."),
4514 limit, base) << endmsg;
4516 throw failed_constructor();
4520 /* We've established that the new name does not exist in any session
4521 * directory, so now find out which one we should use for this new
4525 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4527 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
4532 /** Return a unique name based on `base` for a new internal MIDI source */
4534 Session::new_midi_source_path (const string& base)
4537 char buf[PATH_MAX+1];
4538 const uint32_t limit = 10000;
4540 string possible_path;
4541 string possible_name;
4544 legalized = legalize_for_path (base);
4546 // Find a "version" of the file name that doesn't exist in any of the possible directories.
4547 std::vector<string> sdirs = source_search_path(DataType::MIDI);
4549 /* - the main session folder is the first in the vector.
4550 * - after checking all locations for file-name uniqueness,
4551 * we keep the one from the last iteration as new file name
4552 * - midi files are small and should just be kept in the main session-folder
4554 * -> reverse the array, check main session folder last and use that as location
4557 std::reverse(sdirs.begin(), sdirs.end());
4559 for (cnt = 1; cnt <= limit; ++cnt) {
4561 vector<space_and_path>::iterator i;
4562 uint32_t existing = 0;
4564 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4566 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
4567 possible_name = buf;
4569 possible_path = Glib::build_filename (*i, possible_name);
4571 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
4575 if (midi_source_by_path (possible_path)) {
4580 if (existing == 0) {
4585 error << string_compose(
4586 _("There are already %1 recordings for %2, which I consider too many."),
4587 limit, base) << endmsg;
4593 /* No need to "find best location" for software/app-based RAID, because
4594 MIDI is so small that we always put it in the same place.
4597 return possible_path;
4601 /** Create a new within-session audio source */
4602 boost::shared_ptr<AudioFileSource>
4603 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
4605 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
4607 if (!path.empty()) {
4608 return boost::dynamic_pointer_cast<AudioFileSource> (
4609 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate(), true, true));
4611 throw failed_constructor ();
4615 /** Create a new within-session MIDI source */
4616 boost::shared_ptr<MidiSource>
4617 Session::create_midi_source_for_session (string const & basic_name)
4619 const string path = new_midi_source_path (basic_name);
4621 if (!path.empty()) {
4622 return boost::dynamic_pointer_cast<SMFSource> (
4623 SourceFactory::createWritable (
4624 DataType::MIDI, *this, path, false, frame_rate()));
4626 throw failed_constructor ();
4630 /** Create a new within-session MIDI source */
4631 boost::shared_ptr<MidiSource>
4632 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
4634 /* the caller passes in the track the source will be used in,
4635 so that we can keep the numbering sane.
4637 Rationale: a track with the name "Foo" that has had N
4638 captures carried out so far will ALREADY have a write source
4639 named "Foo-N+1.mid" waiting to be used for the next capture.
4641 If we call new_midi_source_name() we will get "Foo-N+2". But
4642 there is no region corresponding to "Foo-N+1", so when
4643 "Foo-N+2" appears in the track, the gap presents the user
4644 with odd behaviour - why did it skip past Foo-N+1?
4646 We could explain this to the user in some odd way, but
4647 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
4650 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
4653 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
4655 std::string name = track->steal_write_source_name ();
4658 return boost::shared_ptr<MidiSource>();
4661 /* MIDI files are small, just put them in the first location of the
4662 session source search path.
4665 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
4667 return boost::dynamic_pointer_cast<SMFSource> (
4668 SourceFactory::createWritable (
4669 DataType::MIDI, *this, path, false, frame_rate()));
4674 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
4676 if (playlist->hidden()) {
4680 playlists->add (playlist);
4683 playlist->release();
4690 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
4692 if (_state_of_the_state & Deletion) {
4696 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
4702 playlists->remove (playlist);
4708 Session::set_audition (boost::shared_ptr<Region> r)
4710 pending_audition_region = r;
4711 add_post_transport_work (PostTransportAudition);
4712 _butler->schedule_transport_work ();
4716 Session::audition_playlist ()
4718 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4719 ev->region.reset ();
4724 Session::non_realtime_set_audition ()
4726 assert (pending_audition_region);
4727 auditioner->audition_region (pending_audition_region);
4728 pending_audition_region.reset ();
4729 AuditionActive (true); /* EMIT SIGNAL */
4733 Session::audition_region (boost::shared_ptr<Region> r)
4735 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4741 Session::cancel_audition ()
4746 if (auditioner->auditioning()) {
4747 auditioner->cancel_audition ();
4748 AuditionActive (false); /* EMIT SIGNAL */
4753 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
4755 if (a->is_monitor()) {
4758 if (b->is_monitor()) {
4761 return a->order_key () < b->order_key ();
4765 Session::is_auditioning () const
4767 /* can be called before we have an auditioner object */
4769 return auditioner->auditioning();
4776 Session::graph_reordered ()
4778 /* don't do this stuff if we are setting up connections
4779 from a set_state() call or creating new tracks. Ditto for deletion.
4782 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _reconnecting_routes_in_progress || _route_deletion_in_progress) {
4786 /* every track/bus asked for this to be handled but it was deferred because
4787 we were connecting. do it now.
4790 request_input_change_handling ();
4794 /* force all diskstreams to update their capture offset values to
4795 reflect any changes in latencies within the graph.
4798 boost::shared_ptr<RouteList> rl = routes.reader ();
4799 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4800 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4802 tr->set_capture_offset ();
4807 /** @return Number of frames that there is disk space available to write,
4810 boost::optional<framecnt_t>
4811 Session::available_capture_duration ()
4813 Glib::Threads::Mutex::Lock lm (space_lock);
4815 if (_total_free_4k_blocks_uncertain) {
4816 return boost::optional<framecnt_t> ();
4819 float sample_bytes_on_disk = 4.0; // keep gcc happy
4821 switch (config.get_native_file_data_format()) {
4823 sample_bytes_on_disk = 4.0;
4827 sample_bytes_on_disk = 3.0;
4831 sample_bytes_on_disk = 2.0;
4835 /* impossible, but keep some gcc versions happy */
4836 fatal << string_compose (_("programming error: %1"),
4837 X_("illegal native file data format"))
4839 abort(); /*NOTREACHED*/
4842 double scale = 4096.0 / sample_bytes_on_disk;
4844 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
4845 return max_framecnt;
4848 return (framecnt_t) floor (_total_free_4k_blocks * scale);
4852 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
4855 RCUWriter<BundleList> writer (_bundles);
4856 boost::shared_ptr<BundleList> b = writer.get_copy ();
4857 b->push_back (bundle);
4861 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4868 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
4870 bool removed = false;
4873 RCUWriter<BundleList> writer (_bundles);
4874 boost::shared_ptr<BundleList> b = writer.get_copy ();
4875 BundleList::iterator i = find (b->begin(), b->end(), bundle);
4877 if (i != b->end()) {
4884 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4890 boost::shared_ptr<Bundle>
4891 Session::bundle_by_name (string name) const
4893 boost::shared_ptr<BundleList> b = _bundles.reader ();
4895 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
4896 if ((*i)->name() == name) {
4901 return boost::shared_ptr<Bundle> ();
4905 Session::tempo_map_changed (const PropertyChange&)
4909 playlists->update_after_tempo_map_change ();
4911 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
4917 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
4919 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
4920 (*i)->recompute_frames_from_bbt ();
4924 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
4925 * the given count with the current block size.
4928 Session::ensure_buffers (ChanCount howmany)
4930 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
4934 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
4936 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4937 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
4942 Session::next_insert_id ()
4944 /* this doesn't really loop forever. just think about it */
4947 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
4948 if (!insert_bitset[n]) {
4949 insert_bitset[n] = true;
4955 /* none available, so resize and try again */
4957 insert_bitset.resize (insert_bitset.size() + 16, false);
4962 Session::next_send_id ()
4964 /* this doesn't really loop forever. just think about it */
4967 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
4968 if (!send_bitset[n]) {
4969 send_bitset[n] = true;
4975 /* none available, so resize and try again */
4977 send_bitset.resize (send_bitset.size() + 16, false);
4982 Session::next_aux_send_id ()
4984 /* this doesn't really loop forever. just think about it */
4987 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
4988 if (!aux_send_bitset[n]) {
4989 aux_send_bitset[n] = true;
4995 /* none available, so resize and try again */
4997 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
5002 Session::next_return_id ()
5004 /* this doesn't really loop forever. just think about it */
5007 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
5008 if (!return_bitset[n]) {
5009 return_bitset[n] = true;
5015 /* none available, so resize and try again */
5017 return_bitset.resize (return_bitset.size() + 16, false);
5022 Session::mark_send_id (uint32_t id)
5024 if (id >= send_bitset.size()) {
5025 send_bitset.resize (id+16, false);
5027 if (send_bitset[id]) {
5028 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
5030 send_bitset[id] = true;
5034 Session::mark_aux_send_id (uint32_t id)
5036 if (id >= aux_send_bitset.size()) {
5037 aux_send_bitset.resize (id+16, false);
5039 if (aux_send_bitset[id]) {
5040 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
5042 aux_send_bitset[id] = true;
5046 Session::mark_return_id (uint32_t id)
5048 if (id >= return_bitset.size()) {
5049 return_bitset.resize (id+16, false);
5051 if (return_bitset[id]) {
5052 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
5054 return_bitset[id] = true;
5058 Session::mark_insert_id (uint32_t id)
5060 if (id >= insert_bitset.size()) {
5061 insert_bitset.resize (id+16, false);
5063 if (insert_bitset[id]) {
5064 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
5066 insert_bitset[id] = true;
5070 Session::unmark_send_id (uint32_t id)
5072 if (id < send_bitset.size()) {
5073 send_bitset[id] = false;
5078 Session::unmark_aux_send_id (uint32_t id)
5080 if (id < aux_send_bitset.size()) {
5081 aux_send_bitset[id] = false;
5086 Session::unmark_return_id (uint32_t id)
5088 if (id < return_bitset.size()) {
5089 return_bitset[id] = false;
5094 Session::unmark_insert_id (uint32_t id)
5096 if (id < insert_bitset.size()) {
5097 insert_bitset[id] = false;
5102 Session::reset_native_file_format ()
5104 boost::shared_ptr<RouteList> rl = routes.reader ();
5106 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5107 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5109 /* don't save state as we do this, there's no point
5111 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
5112 tr->reset_write_sources (false);
5113 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
5119 Session::route_name_unique (string n) const
5121 boost::shared_ptr<RouteList> r = routes.reader ();
5123 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5124 if ((*i)->name() == n) {
5133 Session::route_name_internal (string n) const
5135 if (auditioner && auditioner->name() == n) {
5139 if (_click_io && _click_io->name() == n) {
5147 Session::freeze_all (InterThreadInfo& itt)
5149 boost::shared_ptr<RouteList> r = routes.reader ();
5151 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5153 boost::shared_ptr<Track> t;
5155 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
5156 /* XXX this is wrong because itt.progress will keep returning to zero at the start
5166 boost::shared_ptr<Region>
5167 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
5168 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
5169 InterThreadInfo& itt,
5170 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
5171 bool for_export, bool for_freeze)
5173 boost::shared_ptr<Region> result;
5174 boost::shared_ptr<Playlist> playlist;
5175 boost::shared_ptr<Source> source;
5176 ChanCount diskstream_channels (track.n_channels());
5177 framepos_t position;
5178 framecnt_t this_chunk;
5180 framepos_t latency_skip;
5182 framepos_t len = end - start;
5183 bool need_block_size_reset = false;
5184 ChanCount const max_proc = track.max_processor_streams ();
5185 string legal_playlist_name;
5186 string possible_path;
5189 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
5190 end, start) << endmsg;
5194 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
5195 include_endpoint, for_export, for_freeze);
5197 if (diskstream_channels.n(track.data_type()) < 1) {
5198 error << _("Cannot write a range with no data.") << endmsg;
5202 // block all process callback handling
5204 block_processing ();
5207 // synchronize with AudioEngine::process_callback()
5208 // make sure processing is not currently running
5209 // and processing_blocked() is honored before
5210 // acquiring thread buffers
5211 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5214 _bounce_processing_active = true;
5216 /* call tree *MUST* hold route_lock */
5218 if ((playlist = track.playlist()) == 0) {
5222 legal_playlist_name = legalize_for_path (playlist->name());
5224 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
5226 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
5227 string path = ((track.data_type() == DataType::AUDIO)
5228 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
5229 : new_midi_source_path (legal_playlist_name));
5236 source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
5239 catch (failed_constructor& err) {
5240 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
5244 srcs.push_back (source);
5247 /* tell redirects that care that we are about to use a much larger
5248 * blocksize. this will flush all plugins too, so that they are ready
5249 * to be used for this process.
5252 need_block_size_reset = true;
5253 track.set_block_size (bounce_chunk_size);
5254 _engine.main_thread()->get_buffers ();
5258 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5260 /* create a set of reasonably-sized buffers */
5261 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5262 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
5264 buffers.set_count (max_proc);
5266 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5267 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5268 boost::shared_ptr<MidiSource> ms;
5270 afs->prepare_for_peakfile_writes ();
5271 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5272 Source::Lock lock(ms->mutex());
5273 ms->mark_streaming_write_started(lock);
5277 while (to_do && !itt.cancel) {
5279 this_chunk = min (to_do, bounce_chunk_size);
5281 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
5285 start += this_chunk;
5286 to_do -= this_chunk;
5287 itt.progress = (float) (1.0 - ((double) to_do / len));
5289 if (latency_skip >= bounce_chunk_size) {
5290 latency_skip -= bounce_chunk_size;
5294 const framecnt_t current_chunk = this_chunk - latency_skip;
5297 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5298 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5299 boost::shared_ptr<MidiSource> ms;
5302 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
5305 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5306 Source::Lock lock(ms->mutex());
5308 const MidiBuffer& buf = buffers.get_midi(0);
5309 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
5310 Evoral::Event<framepos_t> ev = *i;
5311 ev.set_time(ev.time() - position);
5312 ms->append_event_frames(lock, ev, ms->timeline_position());
5319 /* post-roll, pick up delayed processor output */
5320 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5322 while (latency_skip && !itt.cancel) {
5323 this_chunk = min (latency_skip, bounce_chunk_size);
5324 latency_skip -= this_chunk;
5326 buffers.silence (this_chunk, 0);
5327 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
5330 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5331 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5334 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
5346 xnow = localtime (&now);
5348 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
5349 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5350 boost::shared_ptr<MidiSource> ms;
5353 afs->update_header (position, *xnow, now);
5354 afs->flush_header ();
5355 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5356 Source::Lock lock(ms->mutex());
5357 ms->mark_streaming_write_completed(lock);
5361 /* construct a region to represent the bounced material */
5365 plist.add (Properties::start, 0);
5366 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
5367 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
5369 result = RegionFactory::create (srcs, plist);
5375 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5376 (*src)->mark_for_remove ();
5377 (*src)->drop_references ();
5381 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5382 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5385 afs->done_with_peakfile_writes ();
5389 _bounce_processing_active = false;
5391 if (need_block_size_reset) {
5392 _engine.main_thread()->drop_buffers ();
5393 track.set_block_size (get_block_size());
5396 unblock_processing ();
5402 Session::gain_automation_buffer() const
5404 return ProcessThread::gain_automation_buffer ();
5408 Session::trim_automation_buffer() const
5410 return ProcessThread::trim_automation_buffer ();
5414 Session::send_gain_automation_buffer() const
5416 return ProcessThread::send_gain_automation_buffer ();
5420 Session::pan_automation_buffer() const
5422 return ProcessThread::pan_automation_buffer ();
5426 Session::get_silent_buffers (ChanCount count)
5428 return ProcessThread::get_silent_buffers (count);
5432 Session::get_scratch_buffers (ChanCount count, bool silence)
5434 return ProcessThread::get_scratch_buffers (count, silence);
5438 Session::get_route_buffers (ChanCount count, bool silence)
5440 return ProcessThread::get_route_buffers (count, silence);
5445 Session::get_mix_buffers (ChanCount count)
5447 return ProcessThread::get_mix_buffers (count);
5451 Session::ntracks () const
5454 boost::shared_ptr<RouteList> r = routes.reader ();
5456 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5457 if (boost::dynamic_pointer_cast<Track> (*i)) {
5466 Session::nbusses () const
5469 boost::shared_ptr<RouteList> r = routes.reader ();
5471 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5472 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
5481 Session::add_automation_list(AutomationList *al)
5483 automation_lists[al->id()] = al;
5486 /** @return true if there is at least one record-enabled track, otherwise false */
5488 Session::have_rec_enabled_track () const
5490 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
5494 Session::have_rec_disabled_track () const
5496 return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
5499 /** Update the state of our rec-enabled tracks flag */
5501 Session::update_route_record_state ()
5503 boost::shared_ptr<RouteList> rl = routes.reader ();
5504 RouteList::iterator i = rl->begin();
5505 while (i != rl->end ()) {
5507 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5508 if (tr && tr->record_enabled ()) {
5515 int const old = g_atomic_int_get (&_have_rec_enabled_track);
5517 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
5519 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
5520 RecordStateChanged (); /* EMIT SIGNAL */
5523 for (i = rl->begin(); i != rl->end (); ++i) {
5524 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5525 if (tr && !tr->record_enabled ()) {
5530 g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
5532 bool record_arm_state_changed = (old != g_atomic_int_get (&_have_rec_enabled_track) );
5534 if (record_status() == Recording && record_arm_state_changed ) {
5535 RecordArmStateChanged ();
5541 Session::listen_position_changed ()
5543 boost::shared_ptr<RouteList> r = routes.reader ();
5545 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5546 (*i)->listen_position_changed ();
5551 Session::solo_control_mode_changed ()
5553 /* cancel all solo or all listen when solo control mode changes */
5556 set_solo (get_routes(), false);
5557 } else if (listening()) {
5558 set_listen (get_routes(), false);
5562 /** Called when a property of one of our route groups changes */
5564 Session::route_group_property_changed (RouteGroup* rg)
5566 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
5569 /** Called when a route is added to one of our route groups */
5571 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5573 RouteAddedToRouteGroup (rg, r);
5576 /** Called when a route is removed from one of our route groups */
5578 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5580 update_route_record_state ();
5581 RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
5584 boost::shared_ptr<RouteList>
5585 Session::get_tracks () const
5587 boost::shared_ptr<RouteList> rl = routes.reader ();
5588 boost::shared_ptr<RouteList> tl (new RouteList);
5590 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
5591 if (boost::dynamic_pointer_cast<Track> (*r)) {
5592 if (!(*r)->is_auditioner()) {
5600 boost::shared_ptr<RouteList>
5601 Session::get_routes_with_regions_at (framepos_t const p) const
5603 boost::shared_ptr<RouteList> r = routes.reader ();
5604 boost::shared_ptr<RouteList> rl (new RouteList);
5606 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5607 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5612 boost::shared_ptr<Playlist> pl = tr->playlist ();
5617 if (pl->has_region_at (p)) {
5626 Session::goto_end ()
5628 if (_session_range_location) {
5629 request_locate (_session_range_location->end(), false);
5631 request_locate (0, false);
5636 Session::goto_start ()
5638 if (_session_range_location) {
5639 request_locate (_session_range_location->start(), false);
5641 request_locate (0, false);
5646 Session::current_start_frame () const
5648 return _session_range_location ? _session_range_location->start() : 0;
5652 Session::current_end_frame () const
5654 return _session_range_location ? _session_range_location->end() : 0;
5658 Session::set_session_range_location (framepos_t start, framepos_t end)
5660 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
5661 _locations->add (_session_range_location);
5665 Session::step_edit_status_change (bool yn)
5671 send = (_step_editors == 0);
5676 send = (_step_editors == 1);
5679 if (_step_editors > 0) {
5685 StepEditStatusChange (val);
5691 Session::start_time_changed (framepos_t old)
5693 /* Update the auto loop range to match the session range
5694 (unless the auto loop range has been changed by the user)
5697 Location* s = _locations->session_range_location ();
5702 Location* l = _locations->auto_loop_location ();
5704 if (l && l->start() == old) {
5705 l->set_start (s->start(), true);
5710 Session::end_time_changed (framepos_t old)
5712 /* Update the auto loop range to match the session range
5713 (unless the auto loop range has been changed by the user)
5716 Location* s = _locations->session_range_location ();
5721 Location* l = _locations->auto_loop_location ();
5723 if (l && l->end() == old) {
5724 l->set_end (s->end(), true);
5728 std::vector<std::string>
5729 Session::source_search_path (DataType type) const
5733 if (session_dirs.size() == 1) {
5735 case DataType::AUDIO:
5736 sp.push_back (_session_dir->sound_path());
5738 case DataType::MIDI:
5739 sp.push_back (_session_dir->midi_path());
5743 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
5744 SessionDirectory sdir (i->path);
5746 case DataType::AUDIO:
5747 sp.push_back (sdir.sound_path());
5749 case DataType::MIDI:
5750 sp.push_back (sdir.midi_path());
5756 if (type == DataType::AUDIO) {
5757 const string sound_path_2X = _session_dir->sound_path_2X();
5758 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
5759 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
5760 sp.push_back (sound_path_2X);
5765 // now check the explicit (possibly user-specified) search path
5768 case DataType::AUDIO:
5769 sp += Searchpath(config.get_audio_search_path ());
5771 case DataType::MIDI:
5772 sp += Searchpath(config.get_midi_search_path ());
5780 Session::ensure_search_path_includes (const string& path, DataType type)
5789 case DataType::AUDIO:
5790 sp += Searchpath(config.get_audio_search_path ());
5792 case DataType::MIDI:
5793 sp += Searchpath (config.get_midi_search_path ());
5797 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
5798 /* No need to add this new directory if it has the same inode as
5799 an existing one; checking inode rather than name prevents duplicated
5800 directories when we are using symlinks.
5802 On Windows, I think we could just do if (*i == path) here.
5804 if (PBD::equivalent_paths (*i, path)) {
5812 case DataType::AUDIO:
5813 config.set_audio_search_path (sp.to_string());
5815 case DataType::MIDI:
5816 config.set_midi_search_path (sp.to_string());
5822 Session::remove_dir_from_search_path (const string& dir, DataType type)
5827 case DataType::AUDIO:
5828 sp = Searchpath(config.get_audio_search_path ());
5830 case DataType::MIDI:
5831 sp = Searchpath (config.get_midi_search_path ());
5838 case DataType::AUDIO:
5839 config.set_audio_search_path (sp.to_string());
5841 case DataType::MIDI:
5842 config.set_midi_search_path (sp.to_string());
5848 boost::shared_ptr<Speakers>
5849 Session::get_speakers()
5855 Session::unknown_processors () const
5859 boost::shared_ptr<RouteList> r = routes.reader ();
5860 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5861 list<string> t = (*i)->unknown_processors ();
5862 copy (t.begin(), t.end(), back_inserter (p));
5872 Session::update_latency (bool playback)
5874 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
5876 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
5880 boost::shared_ptr<RouteList> r = routes.reader ();
5881 framecnt_t max_latency = 0;
5884 /* reverse the list so that we work backwards from the last route to run to the first */
5885 RouteList* rl = routes.reader().get();
5886 r.reset (new RouteList (*rl));
5887 reverse (r->begin(), r->end());
5890 /* compute actual latency values for the given direction and store them all in per-port
5891 structures. this will also publish the same values (to JACK) so that computation of latency
5892 for routes can consistently use public latency values.
5895 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5896 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
5899 /* because we latency compensate playback, our published playback latencies should
5900 be the same for all output ports - all material played back by ardour has
5901 the same latency, whether its caused by plugins or by latency compensation. since
5902 these may differ from the values computed above, reset all playback port latencies
5906 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
5908 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5909 (*i)->set_public_port_latencies (max_latency, playback);
5914 post_playback_latency ();
5918 post_capture_latency ();
5921 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
5925 Session::post_playback_latency ()
5927 set_worst_playback_latency ();
5929 boost::shared_ptr<RouteList> r = routes.reader ();
5931 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5932 if (!(*i)->is_auditioner() && ((*i)->active())) {
5933 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
5937 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5938 (*i)->set_latency_compensation (_worst_track_latency);
5943 Session::post_capture_latency ()
5945 set_worst_capture_latency ();
5947 /* reflect any changes in capture latencies into capture offsets
5950 boost::shared_ptr<RouteList> rl = routes.reader();
5951 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5952 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5954 tr->set_capture_offset ();
5960 Session::initialize_latencies ()
5963 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5964 update_latency (false);
5965 update_latency (true);
5968 set_worst_io_latencies ();
5972 Session::set_worst_io_latencies ()
5974 set_worst_playback_latency ();
5975 set_worst_capture_latency ();
5979 Session::set_worst_playback_latency ()
5981 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5985 _worst_output_latency = 0;
5987 if (!_engine.connected()) {
5991 boost::shared_ptr<RouteList> r = routes.reader ();
5993 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5994 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
5997 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
6001 Session::set_worst_capture_latency ()
6003 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6007 _worst_input_latency = 0;
6009 if (!_engine.connected()) {
6013 boost::shared_ptr<RouteList> r = routes.reader ();
6015 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6016 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
6019 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
6023 Session::update_latency_compensation (bool force_whole_graph)
6025 bool some_track_latency_changed = false;
6027 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6031 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
6033 _worst_track_latency = 0;
6035 boost::shared_ptr<RouteList> r = routes.reader ();
6037 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6038 if (!(*i)->is_auditioner() && ((*i)->active())) {
6040 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
6041 some_track_latency_changed = true;
6043 _worst_track_latency = max (tl, _worst_track_latency);
6047 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
6048 (some_track_latency_changed ? "yes" : "no")));
6050 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
6052 if (some_track_latency_changed || force_whole_graph) {
6053 _engine.update_latencies ();
6057 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6058 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6062 tr->set_capture_offset ();
6067 Session::session_name_is_legal (const string& path)
6069 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
6071 for (int i = 0; illegal_chars[i]; ++i) {
6072 if (path.find (illegal_chars[i]) != string::npos) {
6073 return illegal_chars[i];
6081 Session::next_control_id () const
6085 /* the monitor bus remote ID is in a different
6086 * "namespace" than regular routes. its existence doesn't
6087 * affect normal (low) numbered routes.
6094 /* the same about masterbus in Waves Tracks */
6096 if (Profile->get_trx() && _master_out) {
6100 return nroutes() - subtract;
6104 Session::notify_remote_id_change ()
6106 if (deletion_in_progress()) {
6110 switch (Config->get_remote_model()) {
6112 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
6118 #ifdef USE_TRACKS_CODE_FEATURES
6119 /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
6120 * if track order has been changed by user
6122 reconnect_existing_routes(true, true);
6128 Session::sync_order_keys ()
6130 if (deletion_in_progress()) {
6134 /* tell everyone that something has happened to the sort keys
6135 and let them sync up with the change(s)
6136 this will give objects that manage the sort order keys the
6137 opportunity to keep them in sync if they wish to.
6140 DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
6142 reassign_track_numbers();
6144 Route::SyncOrderKeys (); /* EMIT SIGNAL */
6146 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
6150 Session::operation_in_progress (GQuark op) const
6152 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
6155 boost::shared_ptr<Port>
6156 Session::ltc_input_port () const
6158 return _ltc_input->nth (0);
6161 boost::shared_ptr<Port>
6162 Session::ltc_output_port () const
6164 return _ltc_output->nth (0);
6168 Session::reconnect_ltc_input ()
6172 string src = Config->get_ltc_source_port();
6174 _ltc_input->disconnect (this);
6176 if (src != _("None") && !src.empty()) {
6177 _ltc_input->nth (0)->connect (src);
6180 if ( ARDOUR::Profile->get_trx () ) {
6181 // Tracks need this signal to update timecode_source_dropdown
6182 MtcOrLtcInputPortChanged (); //emit signal
6188 Session::reconnect_ltc_output ()
6192 string src = Config->get_ltc_output_port();
6194 _ltc_output->disconnect (this);
6196 if (src != _("None") && !src.empty()) {
6197 _ltc_output->nth (0)->connect (src);
6203 Session::set_range_selection (framepos_t start, framepos_t end)
6205 _range_selection = Evoral::Range<framepos_t> (start, end);
6206 #ifdef USE_TRACKS_CODE_FEATURES
6207 follow_playhead_priority ();
6212 Session::set_object_selection (framepos_t start, framepos_t end)
6214 _object_selection = Evoral::Range<framepos_t> (start, end);
6215 #ifdef USE_TRACKS_CODE_FEATURES
6216 follow_playhead_priority ();
6221 Session::clear_range_selection ()
6223 _range_selection = Evoral::Range<framepos_t> (-1,-1);
6224 #ifdef USE_TRACKS_CODE_FEATURES
6225 follow_playhead_priority ();
6230 Session::clear_object_selection ()
6232 _object_selection = Evoral::Range<framepos_t> (-1,-1);
6233 #ifdef USE_TRACKS_CODE_FEATURES
6234 follow_playhead_priority ();