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/convert.h"
40 #include "pbd/error.h"
41 #include "pbd/file_utils.h"
43 #include "pbd/pthread_utils.h"
44 #include "pbd/search_path.h"
45 #include "pbd/stacktrace.h"
46 #include "pbd/stl_delete.h"
47 #include "pbd/replace_all.h"
48 #include "pbd/unwind.h"
50 #include "ardour/amp.h"
51 #include "ardour/analyser.h"
52 #include "ardour/async_midi_port.h"
53 #include "ardour/audio_buffer.h"
54 #include "ardour/audio_diskstream.h"
55 #include "ardour/audio_port.h"
56 #include "ardour/audio_track.h"
57 #include "ardour/audioengine.h"
58 #include "ardour/audiofilesource.h"
59 #include "ardour/auditioner.h"
60 #include "ardour/boost_debug.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/gain_control.h"
75 #include "ardour/graph.h"
76 #include "ardour/luabindings.h"
77 #include "ardour/midiport_manager.h"
78 #include "ardour/scene_changer.h"
79 #include "ardour/midi_patch_manager.h"
80 #include "ardour/midi_track.h"
81 #include "ardour/midi_ui.h"
82 #include "ardour/operations.h"
83 #include "ardour/playlist.h"
84 #include "ardour/playlist_factory.h"
85 #include "ardour/plugin.h"
86 #include "ardour/plugin_insert.h"
87 #include "ardour/process_thread.h"
88 #include "ardour/profile.h"
89 #include "ardour/rc_configuration.h"
90 #include "ardour/recent_sessions.h"
91 #include "ardour/region.h"
92 #include "ardour/region_factory.h"
93 #include "ardour/revision.h"
94 #include "ardour/route_graph.h"
95 #include "ardour/route_group.h"
96 #include "ardour/send.h"
97 #include "ardour/session.h"
98 #include "ardour/session_directory.h"
99 #include "ardour/session_playlists.h"
100 #include "ardour/smf_source.h"
101 #include "ardour/solo_isolate_control.h"
102 #include "ardour/source_factory.h"
103 #include "ardour/speakers.h"
104 #include "ardour/tempo.h"
105 #include "ardour/ticker.h"
106 #include "ardour/track.h"
107 #include "ardour/user_bundle.h"
108 #include "ardour/utils.h"
109 #include "ardour/vca_manager.h"
110 #include "ardour/vca.h"
112 #include "midi++/port.h"
113 #include "midi++/mmc.h"
115 #include "LuaBridge/LuaBridge.h"
117 #include "pbd/i18n.h"
119 #include <glibmm/checksum.h>
128 using namespace ARDOUR;
131 bool Session::_disable_all_loaded_plugins = false;
132 bool Session::_bypass_all_loaded_plugins = false;
133 guint Session::_name_id_counter = 0;
135 PBD::Signal1<int,uint32_t> Session::AudioEngineSetupRequired;
136 PBD::Signal1<void,std::string> Session::Dialog;
137 PBD::Signal0<int> Session::AskAboutPendingState;
138 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
139 PBD::Signal2<void, framecnt_t, framecnt_t> Session::NotifyAboutSampleRateMismatch;
140 PBD::Signal0<void> Session::SendFeedback;
141 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
143 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
144 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
145 PBD::Signal2<void,std::string, std::string> Session::Exported;
146 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
147 PBD::Signal0<void> Session::Quit;
148 PBD::Signal0<void> Session::FeedbackDetected;
149 PBD::Signal0<void> Session::SuccessfulGraphSort;
150 PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
152 const framecnt_t Session::bounce_chunk_size = 8192;
153 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
154 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
156 // seconds should be added after the region exceeds end marker
157 #ifdef USE_TRACKS_CODE_FEATURES
158 const uint32_t Session::session_end_shift = 5;
160 const uint32_t Session::session_end_shift = 0;
163 /** @param snapshot_name Snapshot name, without .ardour suffix */
164 Session::Session (AudioEngine &eng,
165 const string& fullpath,
166 const string& snapshot_name,
167 BusProfile* bus_profile,
169 : playlists (new SessionPlaylists)
171 , process_function (&Session::process_with_events)
172 , _bounce_processing_active (false)
173 , waiting_for_sync_offset (false)
174 , _base_frame_rate (0)
175 , _nominal_frame_rate (0)
176 , _current_frame_rate (0)
177 , transport_sub_state (0)
178 , _record_status (Disabled)
179 , _transport_frame (0)
180 , _session_range_location (0)
181 , _session_range_end_is_free (true)
184 , _transport_speed (0)
185 , _default_transport_speed (1.0)
186 , _last_transport_speed (0)
187 , _target_transport_speed (0.0)
188 , auto_play_legal (false)
189 , _last_slave_transport_frame (0)
190 , maximum_output_latency (0)
191 , _requested_return_frame (-1)
192 , current_block_size (0)
193 , _worst_output_latency (0)
194 , _worst_input_latency (0)
195 , _worst_track_latency (0)
196 , _have_captured (false)
197 , _non_soloed_outs_muted (false)
200 , _solo_isolated_cnt (0)
202 , _was_seamless (Config->get_seamless_loop ())
203 , _under_nsm_control (false)
205 , delta_accumulator_cnt (0)
206 , average_slave_delta (1800) // !!! why 1800 ???
208 , have_first_delta_accumulator (false)
209 , _slave_state (Stopped)
210 , _mtc_active (false)
211 , _ltc_active (false)
212 , post_export_sync (false)
213 , post_export_position (0)
215 , _export_rolling (false)
216 , _realtime_export (false)
217 , _region_export (false)
218 , _export_preroll (0)
219 , _export_latency (0)
220 , _pre_export_mmc_enabled (false)
221 , _name (snapshot_name)
223 , _send_qf_mtc (false)
224 , _pframes_since_last_mtc (0)
225 , session_midi_feedback (0)
227 , loop_changing (false)
229 , _session_dir (new SessionDirectory (fullpath))
230 , _current_snapshot_name (snapshot_name)
232 , state_was_pending (false)
233 , _state_of_the_state (StateOfTheState(CannotSave|InitialConnecting|Loading))
235 , _save_queued (false)
236 , _last_roll_location (0)
237 , _last_roll_or_reversal_location (0)
238 , _last_record_location (0)
239 , pending_locate_roll (false)
240 , pending_locate_frame (0)
241 , pending_locate_flush (false)
242 , pending_abort (false)
243 , pending_auto_loop (false)
244 , _mempool ("Session", 2097152)
245 , lua (lua_newstate (&PBD::ReallocPool::lalloc, &_mempool))
247 , _butler (new Butler (*this))
248 , _post_transport_work (0)
249 , cumulative_rf_motion (0)
251 , _locations (new Locations (*this))
252 , _ignore_skips_updates (false)
253 , _rt_thread_active (false)
254 , _rt_emit_pending (false)
255 , _ac_thread_active (false)
256 , _latency_recompute_pending (0)
258 , outbound_mtc_timecode_frame (0)
259 , next_quarter_frame_to_send (-1)
260 , _frames_per_timecode_frame (0)
261 , _frames_per_hour (0)
262 , _timecode_frames_per_hour (0)
263 , last_timecode_valid (false)
264 , last_timecode_when (0)
265 , _send_timecode_update (false)
277 , ltc_timecode_offset (0)
278 , ltc_timecode_negative_offset (false)
279 , midi_control_ui (0)
281 , _all_route_group (new RouteGroup (*this, "all"))
282 , routes (new RouteList)
283 , _adding_routes_in_progress (false)
284 , _reconnecting_routes_in_progress (false)
285 , _route_deletion_in_progress (false)
286 , destructive_index (0)
287 , _track_number_decimals(1)
288 , default_fade_steepness (0)
289 , default_fade_msecs (0)
290 , _total_free_4k_blocks (0)
291 , _total_free_4k_blocks_uncertain (false)
292 , no_questions_about_missing_files (false)
295 , _bundles (new BundleList)
296 , _bundle_xml_node (0)
300 , click_emphasis_data (0)
302 , click_emphasis_length (0)
303 , _clicks_cleared (0)
304 , _play_range (false)
305 , _range_selection (-1,-1)
306 , _object_selection (-1,-1)
308 , first_file_data_format_reset (true)
309 , first_file_header_format_reset (true)
310 , have_looped (false)
311 , _have_rec_enabled_track (false)
312 , _have_rec_disabled_track (true)
314 , _suspend_timecode_transmission (0)
315 , _speakers (new Speakers)
316 , _ignore_route_processor_changes (0)
321 , _vca_manager (new VCAManager (*this))
325 created_with = string_compose ("%1 %2", PROGRAM_NAME, revision);
327 pthread_mutex_init (&_rt_emit_mutex, 0);
328 pthread_cond_init (&_rt_emit_cond, 0);
330 pthread_mutex_init (&_auto_connect_mutex, 0);
331 pthread_cond_init (&_auto_connect_cond, 0);
333 init_name_id_counter (1); // reset for new sessions, start at 1
334 VCA::set_next_vca_number (1); // reset for new sessions, start at 1
336 pre_engine_init (fullpath);
342 Stateful::loading_state_version = CURRENT_SESSION_FILE_VERSION;
344 #ifdef USE_TRACKS_CODE_FEATURES
345 sr = EngineStateController::instance()->get_current_sample_rate();
347 if (ensure_engine (sr, true)) {
349 throw SessionException (_("Cannot connect to audio/midi engine"));
352 // set samplerate for plugins added early
353 // e.g from templates or MB channelstrip
354 set_block_size (_engine.samples_per_cycle());
355 set_frame_rate (_engine.sample_rate());
357 if (create (mix_template, bus_profile)) {
359 throw SessionException (_("Session initialization failed"));
362 /* if a mix template was provided, then ::create() will
363 * have copied it into the session and we need to load it
364 * so that we have the state ready for ::set_state()
365 * after the engine is started.
367 * Note that we do NOT try to get the sample rate from
368 * the template at this time, though doing so would
369 * be easy if we decided this was an appropriate part
373 if (!mix_template.empty()) {
374 if (load_state (_current_snapshot_name)) {
375 throw SessionException (_("Failed to load template/snapshot state"));
377 store_recent_templates (mix_template);
380 /* load default session properties - if any */
385 if (load_state (_current_snapshot_name)) {
386 throw SessionException (_("Failed to load state"));
389 /* try to get sample rate from XML state so that we
390 * can influence the SR if we set up the audio
395 XMLProperty const * prop;
396 XMLNode const * root (state_tree->root());
397 if ((prop = root->property (X_("sample-rate"))) != 0) {
398 sr = atoi (prop->value());
402 if (ensure_engine (sr, false)) {
404 throw SessionException (_("Cannot connect to audio/midi engine"));
408 if (post_engine_init ()) {
410 throw SessionException (_("Cannot configure audio/midi engine with session parameters"));
413 store_recent_sessions (_name, _path);
415 bool was_dirty = dirty();
417 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
419 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
420 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
423 DirtyChanged (); /* EMIT SIGNAL */
426 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
427 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
429 emit_thread_start ();
430 auto_connect_thread_start ();
432 /* hook us up to the engine since we are now completely constructed */
434 BootMessage (_("Connect to engine"));
436 _engine.set_session (this);
437 _engine.reset_timebase ();
439 #ifdef USE_TRACKS_CODE_FEATURES
441 EngineStateController::instance()->set_session(this);
444 if ( ARDOUR::Profile->get_trx () ) {
446 /* Waves Tracks: fill session with tracks basing on the amount of inputs.
447 * each available input must have corresponding track when session starts.
450 uint32_t how_many (0);
452 std::vector<std::string> inputs;
453 EngineStateController::instance()->get_physical_audio_inputs(inputs);
455 how_many = inputs.size();
457 list<boost::shared_ptr<AudioTrack> > tracks;
459 // Track names after driver
460 if (Config->get_tracks_auto_naming() == NameAfterDriver) {
461 string track_name = "";
462 for (std::vector<string>::size_type i = 0; i < inputs.size(); ++i) {
464 track_name = inputs[i];
465 replace_all (track_name, "system:capture", "");
467 list<boost::shared_ptr<AudioTrack> > single_track = new_audio_track (1, 1, Normal, 0, 1, track_name);
468 tracks.insert(tracks.begin(), single_track.front());
470 } else { // Default track names
471 tracks = new_audio_track (1, 1, Normal, 0, how_many, string());
474 if (tracks.size() != how_many) {
476 throw failed_constructor ();
485 BootMessage (_("Session loading complete"));
497 Session::next_name_id ()
499 return g_atomic_int_add (&_name_id_counter, 1);
503 Session::name_id_counter ()
505 return g_atomic_int_get (&_name_id_counter);
509 Session::init_name_id_counter (guint n)
511 g_atomic_int_set (&_name_id_counter, n);
515 Session::ensure_engine (uint32_t desired_sample_rate, bool isnew)
517 if (_engine.current_backend() == 0) {
518 /* backend is unknown ... */
519 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
520 if (r.get_value_or (-1) != 0) {
523 } else if (!isnew && _engine.running() && _engine.sample_rate () == desired_sample_rate) {
525 } else if (_engine.setup_required()) {
526 /* backend is known, but setup is needed */
527 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
528 if (r.get_value_or (-1) != 0) {
531 } else if (!_engine.running()) {
532 if (_engine.start()) {
537 /* at this point the engine should be running */
539 if (!_engine.running()) {
543 return immediately_post_engine ();
548 Session::immediately_post_engine ()
550 /* Do various initializations that should take place directly after we
551 * know that the engine is running, but before we either create a
552 * session or set state for an existing one.
555 if (how_many_dsp_threads () > 1) {
556 /* For now, only create the graph if we are using >1 DSP threads, as
557 it is a bit slower than the old code with 1 thread.
559 _process_graph.reset (new Graph (*this));
562 /* every time we reconnect, recompute worst case output latencies */
564 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
566 if (synced_to_engine()) {
567 _engine.transport_stop ();
570 if (config.get_jack_time_master()) {
571 _engine.transport_locate (_transport_frame);
576 BootMessage (_("Set up LTC"));
578 BootMessage (_("Set up Click"));
580 BootMessage (_("Set up standard connections"));
584 catch (failed_constructor& err) {
588 /* TODO, connect in different thread. (PortRegisteredOrUnregistered may be in RT context)
590 _engine.PortRegisteredOrUnregistered.connect_same_thread (*this, boost::bind (&Session::setup_bundles, this));
598 vector<void*> debug_pointers;
600 /* if we got to here, leaving pending capture state around
604 remove_pending_capture_state ();
608 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
610 /* stop autoconnecting */
611 auto_connect_thread_terminate ();
613 /* disconnect from any and all signals that we are connected to */
615 Port::PortSignalDrop (); /* EMIT SIGNAL */
618 /* shutdown control surface protocols while we still have ports
619 and the engine to move data to any devices.
622 ControlProtocolManager::instance().drop_protocols ();
624 MIDI::Name::MidiPatchManager::instance().remove_search_path(session_directory().midi_patch_path());
626 _engine.remove_session ();
628 #ifdef USE_TRACKS_CODE_FEATURES
629 EngineStateController::instance()->remove_session();
632 /* deregister all ports - there will be no process or any other
633 * callbacks from the engine any more.
636 Port::PortDrop (); /* EMIT SIGNAL */
640 /* clear history so that no references to objects are held any more */
644 /* clear state tree so that no references to objects are held any more */
649 // unregister all lua functions, drop held references (if any)
651 lua.do_command ("Session = nil");
659 lua.collect_garbage ();
661 /* reset dynamic state version back to default */
662 Stateful::loading_state_version = 0;
664 _butler->drop_references ();
668 delete _all_route_group;
670 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
671 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
675 if (click_data != default_click) {
676 delete [] click_data;
679 if (click_emphasis_data != default_click_emphasis) {
680 delete [] click_emphasis_data;
685 /* need to remove auditioner before monitoring section
686 * otherwise it is re-connected */
689 /* drop references to routes held by the monitoring section
690 * specifically _monitor_out aux/listen references */
691 remove_monitor_section();
693 /* clear out any pending dead wood from RCU managed objects */
698 AudioDiskstream::free_working_buffers();
700 /* tell everyone who is still standing that we're about to die */
703 /* tell everyone to drop references and delete objects as we go */
705 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
706 RegionFactory::delete_all_regions ();
708 /* Do this early so that VCAs no longer hold references to routes */
710 DEBUG_TRACE (DEBUG::Destruction, "delete vcas\n");
713 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
715 /* reset these three references to special routes before we do the usual route delete thing */
717 _master_out.reset ();
718 _monitor_out.reset ();
721 RCUWriter<RouteList> writer (routes);
722 boost::shared_ptr<RouteList> r = writer.get_copy ();
724 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
725 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
726 (*i)->drop_references ();
730 /* writer goes out of scope and updates master */
735 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
736 Glib::Threads::Mutex::Lock lm (source_lock);
737 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
738 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
739 i->second->drop_references ();
745 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
748 emit_thread_terminate ();
750 pthread_cond_destroy (&_rt_emit_cond);
751 pthread_mutex_destroy (&_rt_emit_mutex);
753 pthread_cond_destroy (&_auto_connect_cond);
754 pthread_mutex_destroy (&_auto_connect_mutex);
756 delete _scene_changer; _scene_changer = 0;
757 delete midi_control_ui; midi_control_ui = 0;
759 delete _mmc; _mmc = 0;
760 delete _midi_ports; _midi_ports = 0;
761 delete _locations; _locations = 0;
766 /* clear event queue, the session is gone, nobody is interested in
767 * those anymore, but they do leak memory if not removed
769 while (!immediate_events.empty ()) {
770 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
771 SessionEvent *ev = immediate_events.front ();
772 DEBUG_TRACE (DEBUG::SessionEvents, string_compose ("Drop event: %1\n", enum_2_string (ev->type)));
773 immediate_events.pop_front ();
777 case SessionEvent::AutoLoop:
778 case SessionEvent::AutoLoopDeclick:
779 case SessionEvent::Skip:
780 case SessionEvent::PunchIn:
781 case SessionEvent::PunchOut:
782 case SessionEvent::StopOnce:
783 case SessionEvent::RangeStop:
784 case SessionEvent::RangeLocate:
788 case SessionEvent::RealTimeOperation:
795 del = del && !_remove_event (ev);
802 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
804 BOOST_SHOW_POINTERS ();
808 Session::setup_ltc ()
812 _ltc_input.reset (new IO (*this, X_("LTC In"), IO::Input));
813 _ltc_output.reset (new IO (*this, X_("LTC Out"), IO::Output));
815 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC In"))) != 0) {
816 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
819 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
820 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
822 reconnect_ltc_input ();
825 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC Out"))) != 0) {
826 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
829 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
830 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
832 reconnect_ltc_output ();
835 /* fix up names of LTC ports because we don't want the normal
836 * IO style of NAME/TYPE-{in,out}N
839 _ltc_input->nth (0)->set_name (X_("LTC-in"));
840 _ltc_output->nth (0)->set_name (X_("LTC-out"));
844 Session::setup_click ()
848 boost::shared_ptr<AutomationList> gl (new AutomationList (Evoral::Parameter (GainAutomation)));
849 boost::shared_ptr<GainControl> gain_control = boost::shared_ptr<GainControl> (new GainControl (*this, Evoral::Parameter(GainAutomation), gl));
851 _click_io.reset (new ClickIO (*this, X_("Click")));
852 _click_gain.reset (new Amp (*this, _("Fader"), gain_control, true));
853 _click_gain->activate ();
855 setup_click_state (state_tree->root());
857 setup_click_state (0);
862 Session::setup_click_state (const XMLNode* node)
864 const XMLNode* child = 0;
866 if (node && (child = find_named_node (*node, "Click")) != 0) {
868 /* existing state for Click */
871 if (Stateful::loading_state_version < 3000) {
872 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
874 const XMLNodeList& children (child->children());
875 XMLNodeList::const_iterator i = children.begin();
876 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
878 if (i != children.end()) {
879 c = _click_gain->set_state (**i, Stateful::loading_state_version);
885 _clicking = Config->get_clicking ();
889 error << _("could not setup Click I/O") << endmsg;
896 /* default state for Click: dual-mono to first 2 physical outputs */
899 _engine.get_physical_outputs (DataType::AUDIO, outs);
901 for (uint32_t physport = 0; physport < 2; ++physport) {
902 if (outs.size() > physport) {
903 if (_click_io->add_port (outs[physport], this)) {
904 // relax, even though its an error
909 if (_click_io->n_ports () > ChanCount::ZERO) {
910 _clicking = Config->get_clicking ();
916 Session::get_physical_ports (vector<string>& inputs, vector<string>& outputs, DataType type,
917 MidiPortFlags include, MidiPortFlags exclude)
919 _engine.get_physical_inputs (type, inputs, include, exclude);
920 _engine.get_physical_outputs (type, outputs, include, exclude);
924 Session::setup_bundles ()
928 RCUWriter<BundleList> writer (_bundles);
929 boost::shared_ptr<BundleList> b = writer.get_copy ();
930 for (BundleList::iterator i = b->begin(); i != b->end();) {
931 if (boost::dynamic_pointer_cast<UserBundle>(*i)) {
939 vector<string> inputs[DataType::num_types];
940 vector<string> outputs[DataType::num_types];
942 for (uint32_t i = 0; i < DataType::num_types; ++i) {
943 get_physical_ports (inputs[i], outputs[i], DataType (DataType::Symbol (i)),
944 MidiPortFlags (0), /* no specific inclusions */
945 MidiPortFlags (MidiPortControl|MidiPortVirtual) /* exclude control & virtual ports */
949 /* Create a set of Bundle objects that map
950 to the physical I/O currently available. We create both
951 mono and stereo bundles, so that the common cases of mono
952 and stereo tracks get bundles to put in their mixer strip
953 in / out menus. There may be a nicer way of achieving that;
954 it doesn't really scale that well to higher channel counts
957 /* mono output bundles */
959 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
961 std::string pn = _engine.get_pretty_name_by_name (outputs[DataType::AUDIO][np]);
963 snprintf (buf, sizeof (buf), _("out %s"), pn.c_str());
965 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
968 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
969 c->add_channel (_("mono"), DataType::AUDIO);
970 c->set_port (0, outputs[DataType::AUDIO][np]);
972 add_bundle (c, false);
975 /* stereo output bundles */
977 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
978 if (np + 1 < outputs[DataType::AUDIO].size()) {
980 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
981 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
982 c->add_channel (_("L"), DataType::AUDIO);
983 c->set_port (0, outputs[DataType::AUDIO][np]);
984 c->add_channel (_("R"), DataType::AUDIO);
985 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
987 add_bundle (c, false);
991 /* mono input bundles */
993 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
995 std::string pn = _engine.get_pretty_name_by_name (inputs[DataType::AUDIO][np]);
997 snprintf (buf, sizeof (buf), _("in %s"), pn.c_str());
999 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
1002 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
1003 c->add_channel (_("mono"), DataType::AUDIO);
1004 c->set_port (0, inputs[DataType::AUDIO][np]);
1006 add_bundle (c, false);
1009 /* stereo input bundles */
1011 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
1012 if (np + 1 < inputs[DataType::AUDIO].size()) {
1014 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
1016 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
1017 c->add_channel (_("L"), DataType::AUDIO);
1018 c->set_port (0, inputs[DataType::AUDIO][np]);
1019 c->add_channel (_("R"), DataType::AUDIO);
1020 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
1022 add_bundle (c, false);
1026 /* MIDI input bundles */
1028 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
1029 string n = inputs[DataType::MIDI][np];
1031 std::string pn = _engine.get_pretty_name_by_name (n);
1035 boost::erase_first (n, X_("alsa_pcm:"));
1037 boost::shared_ptr<Bundle> c (new Bundle (n, false));
1038 c->add_channel ("", DataType::MIDI);
1039 c->set_port (0, inputs[DataType::MIDI][np]);
1040 add_bundle (c, false);
1043 /* MIDI output bundles */
1045 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
1046 string n = outputs[DataType::MIDI][np];
1047 std::string pn = _engine.get_pretty_name_by_name (n);
1051 boost::erase_first (n, X_("alsa_pcm:"));
1053 boost::shared_ptr<Bundle> c (new Bundle (n, true));
1054 c->add_channel ("", DataType::MIDI);
1055 c->set_port (0, outputs[DataType::MIDI][np]);
1056 add_bundle (c, false);
1059 // we trust the backend to only calls us if there's a change
1060 BundleAddedOrRemoved (); /* EMIT SIGNAL */
1064 Session::auto_connect_master_bus ()
1066 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
1070 // Waves Tracks: Do not connect master bas for Tracks if AutoConnectMaster option is not set
1071 // In this case it means "Multi Out" output mode
1072 if (ARDOUR::Profile->get_trx() && !(Config->get_output_auto_connect() & AutoConnectMaster) ) {
1076 /* if requested auto-connect the outputs to the first N physical ports.
1079 uint32_t limit = _master_out->n_outputs().n_total();
1080 vector<string> outputs[DataType::num_types];
1082 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1083 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1086 for (uint32_t n = 0; n < limit; ++n) {
1087 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
1089 if (outputs[p->type()].size() > n) {
1090 connect_to = outputs[p->type()][n];
1093 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
1094 if (_master_out->output()->connect (p, connect_to, this)) {
1095 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
1104 Session::remove_monitor_section ()
1106 if (!_monitor_out || Profile->get_trx()) {
1110 /* force reversion to Solo-In-Place */
1111 Config->set_solo_control_is_listen_control (false);
1113 /* if we are auditioning, cancel it ... this is a workaround
1114 to a problem (auditioning does not execute the process graph,
1115 which is needed to remove routes when using >1 core for processing)
1120 /* Hold process lock while doing this so that we don't hear bits and
1121 * pieces of audio as we work on each route.
1124 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1126 /* Connect tracks to monitor section. Note that in an
1127 existing session, the internal sends will already exist, but we want the
1128 routes to notice that they connect to the control out specifically.
1132 boost::shared_ptr<RouteList> r = routes.reader ();
1133 ProcessorChangeBlocker pcb (this, false);
1135 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
1137 if ((*x)->is_monitor()) {
1139 } else if ((*x)->is_master()) {
1142 (*x)->remove_aux_or_listen (_monitor_out);
1147 remove_route (_monitor_out);
1148 if (_state_of_the_state & Deletion) {
1152 auto_connect_master_bus ();
1155 auditioner->connect ();
1158 Config->ParameterChanged ("use-monitor-bus");
1162 Session::add_monitor_section ()
1166 if (_monitor_out || !_master_out || Profile->get_trx()) {
1170 boost::shared_ptr<Route> r (new Route (*this, _("Monitor"), PresentationInfo::MonitorOut, DataType::AUDIO));
1176 BOOST_MARK_ROUTE(r);
1179 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1180 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1181 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1183 error << _("Cannot create monitor section. 'Monitor' Port name is not unique.") << endmsg;
1188 add_routes (rl, false, false, false, 0);
1190 assert (_monitor_out);
1192 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
1193 are undefined, at best.
1196 uint32_t limit = _monitor_out->n_inputs().n_audio();
1200 /* connect the inputs to the master bus outputs. this
1201 * represents a separate data feed from the internal sends from
1202 * each route. as of jan 2011, it allows the monitor section to
1203 * conditionally ignore either the internal sends or the normal
1204 * input feed, but we should really find a better way to do
1208 _master_out->output()->disconnect (this);
1210 for (uint32_t n = 0; n < limit; ++n) {
1211 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1212 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1215 string connect_to = o->name();
1216 if (_monitor_out->input()->connect (p, connect_to, this)) {
1217 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1225 /* if monitor section is not connected, connect it to physical outs
1228 if ((Config->get_auto_connect_standard_busses () || Profile->get_mixbus ()) && !_monitor_out->output()->connected ()) {
1230 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1232 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1235 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1237 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1238 Config->get_monitor_bus_preferred_bundle())
1244 /* Monitor bus is audio only */
1246 vector<string> outputs[DataType::num_types];
1248 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1249 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1252 uint32_t mod = outputs[DataType::AUDIO].size();
1253 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1257 for (uint32_t n = 0; n < limit; ++n) {
1259 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1261 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1262 connect_to = outputs[DataType::AUDIO][n % mod];
1265 if (!connect_to.empty()) {
1266 if (_monitor_out->output()->connect (p, connect_to, this)) {
1267 error << string_compose (
1268 _("cannot connect control output %1 to %2"),
1279 /* Hold process lock while doing this so that we don't hear bits and
1280 * pieces of audio as we work on each route.
1283 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1285 /* Connect tracks to monitor section. Note that in an
1286 existing session, the internal sends will already exist, but we want the
1287 routes to notice that they connect to the control out specifically.
1291 boost::shared_ptr<RouteList> rls = routes.reader ();
1293 ProcessorChangeBlocker pcb (this, false /* XXX */);
1295 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1297 if ((*x)->is_monitor()) {
1299 } else if ((*x)->is_master()) {
1302 (*x)->enable_monitor_send ();
1307 auditioner->connect ();
1309 Config->ParameterChanged ("use-monitor-bus");
1313 Session::reset_monitor_section ()
1315 /* Process lock should be held by the caller.*/
1317 if (!_monitor_out || Profile->get_trx()) {
1321 uint32_t limit = _master_out->n_outputs().n_audio();
1323 /* connect the inputs to the master bus outputs. this
1324 * represents a separate data feed from the internal sends from
1325 * each route. as of jan 2011, it allows the monitor section to
1326 * conditionally ignore either the internal sends or the normal
1327 * input feed, but we should really find a better way to do
1331 _master_out->output()->disconnect (this);
1332 _monitor_out->output()->disconnect (this);
1334 // monitor section follow master bus - except midi
1335 ChanCount mon_chn (_master_out->output()->n_ports());
1336 mon_chn.set_midi (0);
1338 _monitor_out->input()->ensure_io (mon_chn, false, this);
1339 _monitor_out->output()->ensure_io (mon_chn, false, this);
1341 for (uint32_t n = 0; n < limit; ++n) {
1342 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1343 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1346 string connect_to = o->name();
1347 if (_monitor_out->input()->connect (p, connect_to, this)) {
1348 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1355 /* connect monitor section to physical outs
1358 if (Config->get_auto_connect_standard_busses()) {
1360 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1362 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1365 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1367 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1368 Config->get_monitor_bus_preferred_bundle())
1374 /* Monitor bus is audio only */
1376 vector<string> outputs[DataType::num_types];
1378 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1379 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1382 uint32_t mod = outputs[DataType::AUDIO].size();
1383 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1387 for (uint32_t n = 0; n < limit; ++n) {
1389 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1391 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1392 connect_to = outputs[DataType::AUDIO][n % mod];
1395 if (!connect_to.empty()) {
1396 if (_monitor_out->output()->connect (p, connect_to, this)) {
1397 error << string_compose (
1398 _("cannot connect control output %1 to %2"),
1409 /* Connect tracks to monitor section. Note that in an
1410 existing session, the internal sends will already exist, but we want the
1411 routes to notice that they connect to the control out specifically.
1415 boost::shared_ptr<RouteList> rls = routes.reader ();
1417 ProcessorChangeBlocker pcb (this, false);
1419 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1421 if ((*x)->is_monitor()) {
1423 } else if ((*x)->is_master()) {
1426 (*x)->enable_monitor_send ();
1432 Session::hookup_io ()
1434 /* stop graph reordering notifications from
1435 causing resorts, etc.
1438 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
1442 /* we delay creating the auditioner till now because
1443 it makes its own connections to ports.
1447 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
1449 throw failed_constructor ();
1451 a->use_new_diskstream ();
1455 catch (failed_constructor& err) {
1456 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
1460 /* load bundles, which we may have postponed earlier on */
1461 if (_bundle_xml_node) {
1462 load_bundles (*_bundle_xml_node);
1463 delete _bundle_xml_node;
1466 /* Tell all IO objects to connect themselves together */
1468 IO::enable_connecting ();
1470 /* Now tell all "floating" ports to connect to whatever
1471 they should be connected to.
1474 AudioEngine::instance()->reconnect_ports ();
1476 /* Anyone who cares about input state, wake up and do something */
1478 IOConnectionsComplete (); /* EMIT SIGNAL */
1480 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
1482 /* now handle the whole enchilada as if it was one
1483 graph reorder event.
1488 /* update the full solo state, which can't be
1489 correctly determined on a per-route basis, but
1490 needs the global overview that only the session
1494 update_route_solo_state ();
1498 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
1500 boost::shared_ptr<Track> track = wp.lock ();
1505 boost::shared_ptr<Playlist> playlist;
1507 if ((playlist = track->playlist()) != 0) {
1508 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
1509 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
1510 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
1515 Session::record_enabling_legal () const
1517 /* this used to be in here, but survey says.... we don't need to restrict it */
1518 // if (record_status() == Recording) {
1522 if (Config->get_all_safe()) {
1529 Session::set_track_monitor_input_status (bool yn)
1531 boost::shared_ptr<RouteList> rl = routes.reader ();
1532 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1533 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1534 if (tr && tr->rec_enable_control()->get_value()) {
1535 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1536 tr->request_input_monitoring (yn);
1542 Session::auto_punch_start_changed (Location* location)
1544 replace_event (SessionEvent::PunchIn, location->start());
1546 if (get_record_enabled() && config.get_punch_in()) {
1547 /* capture start has been changed, so save new pending state */
1548 save_state ("", true);
1553 Session::auto_punch_end_changed (Location* location)
1555 framepos_t when_to_stop = location->end();
1556 // when_to_stop += _worst_output_latency + _worst_input_latency;
1557 replace_event (SessionEvent::PunchOut, when_to_stop);
1561 Session::auto_punch_changed (Location* location)
1563 framepos_t when_to_stop = location->end();
1565 replace_event (SessionEvent::PunchIn, location->start());
1566 //when_to_stop += _worst_output_latency + _worst_input_latency;
1567 replace_event (SessionEvent::PunchOut, when_to_stop);
1570 /** @param loc A loop location.
1571 * @param pos Filled in with the start time of the required fade-out (in session frames).
1572 * @param length Filled in with the length of the required fade-out.
1575 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
1577 pos = max (loc->start(), loc->end() - 64);
1578 length = loc->end() - pos;
1582 Session::auto_loop_changed (Location* location)
1584 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1587 auto_loop_declick_range (location, dcp, dcl);
1589 if (transport_rolling() && play_loop) {
1591 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1593 // if (_transport_frame > location->end()) {
1595 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1596 // relocate to beginning of loop
1597 clear_events (SessionEvent::LocateRoll);
1599 request_locate (location->start(), true);
1602 else if (Config->get_seamless_loop() && !loop_changing) {
1604 // schedule a locate-roll to refill the diskstreams at the
1605 // previous loop end
1606 loop_changing = true;
1608 if (location->end() > last_loopend) {
1609 clear_events (SessionEvent::LocateRoll);
1610 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1616 clear_events (SessionEvent::AutoLoopDeclick);
1617 clear_events (SessionEvent::AutoLoop);
1620 /* possibly move playhead if not rolling; if we are rolling we'll move
1621 to the loop start on stop if that is appropriate.
1626 if (!transport_rolling() && select_playhead_priority_target (pos)) {
1627 if (pos == location->start()) {
1628 request_locate (pos);
1633 last_loopend = location->end();
1638 Session::set_auto_punch_location (Location* location)
1642 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1643 punch_connections.drop_connections();
1644 existing->set_auto_punch (false, this);
1645 remove_event (existing->start(), SessionEvent::PunchIn);
1646 clear_events (SessionEvent::PunchOut);
1647 auto_punch_location_changed (0);
1652 if (location == 0) {
1656 if (location->end() <= location->start()) {
1657 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1661 punch_connections.drop_connections ();
1663 location->StartChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, location));
1664 location->EndChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, location));
1665 location->Changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, location));
1667 location->set_auto_punch (true, this);
1669 auto_punch_changed (location);
1671 auto_punch_location_changed (location);
1675 Session::set_session_extents (framepos_t start, framepos_t end)
1678 if ((existing = _locations->session_range_location()) == 0) {
1679 //if there is no existing session, we need to make a new session location (should never happen)
1680 existing = new Location (*this, 0, 0, _("session"), Location::IsSessionRange);
1684 error << _("Session: you can't use that location for session start/end)") << endmsg;
1688 existing->set( start, end );
1694 Session::set_auto_loop_location (Location* location)
1698 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1699 loop_connections.drop_connections ();
1700 existing->set_auto_loop (false, this);
1701 remove_event (existing->end(), SessionEvent::AutoLoop);
1704 auto_loop_declick_range (existing, dcp, dcl);
1705 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1706 auto_loop_location_changed (0);
1711 if (location == 0) {
1715 if (location->end() <= location->start()) {
1716 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1720 last_loopend = location->end();
1722 loop_connections.drop_connections ();
1724 location->StartChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1725 location->EndChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1726 location->Changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1727 location->FlagsChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1729 location->set_auto_loop (true, this);
1731 if (Config->get_loop_is_mode() && play_loop && Config->get_seamless_loop()) {
1732 // set all tracks to use internal looping
1733 boost::shared_ptr<RouteList> rl = routes.reader ();
1734 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1735 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1736 if (tr && !tr->hidden()) {
1737 tr->set_loop (location);
1742 /* take care of our stuff first */
1744 auto_loop_changed (location);
1746 /* now tell everyone else */
1748 auto_loop_location_changed (location);
1752 Session::update_marks (Location*)
1758 Session::update_skips (Location* loc, bool consolidate)
1760 if (_ignore_skips_updates) {
1764 Locations::LocationList skips;
1767 PBD::Unwinder<bool> uw (_ignore_skips_updates, true);
1768 consolidate_skips (loc);
1771 sync_locations_to_skips ();
1777 Session::consolidate_skips (Location* loc)
1779 Locations::LocationList all_locations = _locations->list ();
1781 for (Locations::LocationList::iterator l = all_locations.begin(); l != all_locations.end(); ) {
1783 if (!(*l)->is_skip ()) {
1788 /* don't test against self */
1795 switch (Evoral::coverage ((*l)->start(), (*l)->end(), loc->start(), loc->end())) {
1796 case Evoral::OverlapInternal:
1797 case Evoral::OverlapExternal:
1798 case Evoral::OverlapStart:
1799 case Evoral::OverlapEnd:
1800 /* adjust new location to cover existing one */
1801 loc->set_start (min (loc->start(), (*l)->start()));
1802 loc->set_end (max (loc->end(), (*l)->end()));
1803 /* we don't need this one any more */
1804 _locations->remove (*l);
1805 /* the location has been deleted, so remove reference to it in our local list */
1806 l = all_locations.erase (l);
1809 case Evoral::OverlapNone:
1817 Session::sync_locations_to_skips ()
1819 /* This happens asynchronously (in the audioengine thread). After the clear is done, we will call
1820 * Session::_sync_locations_to_skips() from the audioengine thread.
1822 clear_events (SessionEvent::Skip, boost::bind (&Session::_sync_locations_to_skips, this));
1826 Session::_sync_locations_to_skips ()
1828 /* called as a callback after existing Skip events have been cleared from a realtime audioengine thread */
1830 Locations::LocationList const & locs (_locations->list());
1832 for (Locations::LocationList::const_iterator i = locs.begin(); i != locs.end(); ++i) {
1834 Location* location = *i;
1836 if (location->is_skip() && location->is_skipping()) {
1837 SessionEvent* ev = new SessionEvent (SessionEvent::Skip, SessionEvent::Add, location->start(), location->end(), 1.0);
1845 Session::location_added (Location *location)
1847 if (location->is_auto_punch()) {
1848 set_auto_punch_location (location);
1851 if (location->is_auto_loop()) {
1852 set_auto_loop_location (location);
1855 if (location->is_session_range()) {
1856 /* no need for any signal handling or event setting with the session range,
1857 because we keep a direct reference to it and use its start/end directly.
1859 _session_range_location = location;
1862 if (location->is_mark()) {
1863 /* listen for per-location signals that require us to do any * global updates for marks */
1865 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1866 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1867 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1868 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1871 if (location->is_skip()) {
1872 /* listen for per-location signals that require us to update skip-locate events */
1874 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1875 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1876 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1877 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, false));
1879 update_skips (location, true);
1886 Session::location_removed (Location *location)
1888 if (location->is_auto_loop()) {
1889 set_auto_loop_location (0);
1890 set_track_loop (false);
1893 if (location->is_auto_punch()) {
1894 set_auto_punch_location (0);
1897 if (location->is_session_range()) {
1898 /* this is never supposed to happen */
1899 error << _("programming error: session range removed!") << endl;
1902 if (location->is_skip()) {
1904 update_skips (location, false);
1911 Session::locations_changed ()
1913 _locations->apply (*this, &Session::_locations_changed);
1917 Session::_locations_changed (const Locations::LocationList& locations)
1919 /* There was some mass-change in the Locations object.
1921 We might be re-adding a location here but it doesn't actually matter
1922 for all the locations that the Session takes an interest in.
1926 PBD::Unwinder<bool> protect_ignore_skip_updates (_ignore_skips_updates, true);
1927 for (Locations::LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
1928 location_added (*i);
1932 update_skips (NULL, false);
1936 Session::enable_record ()
1938 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1939 /* no recording at anything except normal speed */
1944 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1946 if (rs == Recording) {
1950 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1952 _last_record_location = _transport_frame;
1953 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1955 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1956 set_track_monitor_input_status (true);
1959 RecordStateChanged ();
1966 Session::set_all_tracks_record_enabled (bool enable )
1968 boost::shared_ptr<RouteList> rl = routes.reader();
1969 set_controls (route_list_to_control_list (rl, &Stripable::rec_enable_control), enable, Controllable::NoGroup);
1973 Session::disable_record (bool rt_context, bool force)
1977 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1979 if (!Config->get_latched_record_enable () || force) {
1980 g_atomic_int_set (&_record_status, Disabled);
1981 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1983 if (rs == Recording) {
1984 g_atomic_int_set (&_record_status, Enabled);
1988 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1989 set_track_monitor_input_status (false);
1992 RecordStateChanged (); /* emit signal */
1995 remove_pending_capture_state ();
2001 Session::step_back_from_record ()
2003 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
2005 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
2006 set_track_monitor_input_status (false);
2009 RecordStateChanged (); /* emit signal */
2014 Session::maybe_enable_record ()
2016 if (_step_editors > 0) {
2020 g_atomic_int_set (&_record_status, Enabled);
2022 /* This function is currently called from somewhere other than an RT thread.
2023 This save_state() call therefore doesn't impact anything. Doing it here
2024 means that we save pending state of which sources the next record will use,
2025 which gives us some chance of recovering from a crash during the record.
2028 save_state ("", true);
2030 if (_transport_speed) {
2031 if (!config.get_punch_in()) {
2035 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
2036 RecordStateChanged (); /* EMIT SIGNAL */
2043 Session::audible_frame () const
2047 frameoffset_t offset = worst_playback_latency (); // - _engine.samples_since_cycle_start ();
2048 offset *= transport_speed ();
2050 if (synced_to_engine()) {
2051 /* Note: this is basically just sync-to-JACK */
2052 ret = _engine.transport_frame();
2054 ret = _transport_frame;
2057 if (transport_rolling()) {
2060 /* Check to see if we have passed the first guaranteed
2061 * audible frame past our last start position. if not,
2062 * return that last start point because in terms
2063 * of audible frames, we have not moved yet.
2065 * `Start position' in this context means the time we last
2066 * either started, located, or changed transport direction.
2069 if (_transport_speed > 0.0f) {
2071 if (!play_loop || !have_looped) {
2072 if (ret < _last_roll_or_reversal_location) {
2073 return _last_roll_or_reversal_location;
2077 Location *location = _locations->auto_loop_location();
2078 frameoffset_t lo = location->start() - ret;
2080 ret = location->end () - lo;
2084 } else if (_transport_speed < 0.0f) {
2086 /* XXX wot? no backward looping? */
2088 if (ret > _last_roll_or_reversal_location) {
2089 return _last_roll_or_reversal_location;
2094 return std::max ((framepos_t)0, ret);
2098 Session::set_frame_rate (framecnt_t frames_per_second)
2100 /** \fn void Session::set_frame_size(framecnt_t)
2101 the AudioEngine object that calls this guarantees
2102 that it will not be called while we are also in
2103 ::process(). Its fine to do things that block
2107 if (_base_frame_rate == 0) {
2108 _base_frame_rate = frames_per_second;
2110 else if (_base_frame_rate != frames_per_second && frames_per_second != _nominal_frame_rate) {
2111 NotifyAboutSampleRateMismatch (_base_frame_rate, frames_per_second);
2113 _nominal_frame_rate = frames_per_second;
2118 reset_write_sources (false);
2120 // XXX we need some equivalent to this, somehow
2121 // SndFileSource::setup_standard_crossfades (frames_per_second);
2125 /* XXX need to reset/reinstantiate all LADSPA plugins */
2129 Session::set_block_size (pframes_t nframes)
2131 /* the AudioEngine guarantees
2132 that it will not be called while we are also in
2133 ::process(). It is therefore fine to do things that block
2138 current_block_size = nframes;
2142 boost::shared_ptr<RouteList> r = routes.reader ();
2144 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2145 (*i)->set_block_size (nframes);
2148 boost::shared_ptr<RouteList> rl = routes.reader ();
2149 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2150 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2152 tr->set_block_size (nframes);
2156 set_worst_io_latencies ();
2162 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
2164 boost::shared_ptr<Route> r2;
2166 if (r1->feeds (rbase) && rbase->feeds (r1)) {
2167 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
2171 /* make a copy of the existing list of routes that feed r1 */
2173 Route::FedBy existing (r1->fed_by());
2175 /* for each route that feeds r1, recurse, marking it as feeding
2179 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
2180 if (!(r2 = i->r.lock ())) {
2181 /* (*i) went away, ignore it */
2185 /* r2 is a route that feeds r1 which somehow feeds base. mark
2186 base as being fed by r2
2189 rbase->add_fed_by (r2, i->sends_only);
2193 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
2197 if (r1->feeds (r2) && r2->feeds (r1)) {
2201 /* now recurse, so that we can mark base as being fed by
2202 all routes that feed r2
2205 trace_terminal (r2, rbase);
2212 Session::resort_routes ()
2214 /* don't do anything here with signals emitted
2215 by Routes during initial setup or while we
2216 are being destroyed.
2219 if (_state_of_the_state & (InitialConnecting | Deletion)) {
2223 if (_route_deletion_in_progress) {
2228 RCUWriter<RouteList> writer (routes);
2229 boost::shared_ptr<RouteList> r = writer.get_copy ();
2230 resort_routes_using (r);
2231 /* writer goes out of scope and forces update */
2235 if (DEBUG_ENABLED(DEBUG::Graph)) {
2236 boost::shared_ptr<RouteList> rl = routes.reader ();
2237 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2238 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
2240 const Route::FedBy& fb ((*i)->fed_by());
2242 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
2243 boost::shared_ptr<Route> sf = f->r.lock();
2245 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
2254 /** This is called whenever we need to rebuild the graph of how we will process
2256 * @param r List of routes, in any order.
2260 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
2262 /* We are going to build a directed graph of our routes;
2263 this is where the edges of that graph are put.
2268 /* Go through all routes doing two things:
2270 * 1. Collect the edges of the route graph. Each of these edges
2271 * is a pair of routes, one of which directly feeds the other
2272 * either by a JACK connection or by an internal send.
2274 * 2. Begin the process of making routes aware of which other
2275 * routes directly or indirectly feed them. This information
2276 * is used by the solo code.
2279 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2281 /* Clear out the route's list of direct or indirect feeds */
2282 (*i)->clear_fed_by ();
2284 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
2286 bool via_sends_only;
2288 /* See if this *j feeds *i according to the current state of the JACK
2289 connections and internal sends.
2291 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
2292 /* add the edge to the graph (part #1) */
2293 edges.add (*j, *i, via_sends_only);
2294 /* tell the route (for part #2) */
2295 (*i)->add_fed_by (*j, via_sends_only);
2300 /* Attempt a topological sort of the route graph */
2301 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
2303 if (sorted_routes) {
2304 /* We got a satisfactory topological sort, so there is no feedback;
2307 Note: the process graph rechain does not require a
2308 topologically-sorted list, but hey ho.
2310 if (_process_graph) {
2311 _process_graph->rechain (sorted_routes, edges);
2314 _current_route_graph = edges;
2316 /* Complete the building of the routes' lists of what directly
2317 or indirectly feeds them.
2319 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2320 trace_terminal (*i, *i);
2323 *r = *sorted_routes;
2326 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
2327 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2328 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 presentation order %2\n", (*i)->name(), (*i)->presentation_info().order()));
2332 SuccessfulGraphSort (); /* EMIT SIGNAL */
2335 /* The topological sort failed, so we have a problem. Tell everyone
2336 and stick to the old graph; this will continue to be processed, so
2337 until the feedback is fixed, what is played back will not quite
2338 reflect what is actually connected. Note also that we do not
2339 do trace_terminal here, as it would fail due to an endless recursion,
2340 so the solo code will think that everything is still connected
2344 FeedbackDetected (); /* EMIT SIGNAL */
2349 /** Find a route name starting with \a base, maybe followed by the
2350 * lowest \a id. \a id will always be added if \a definitely_add_number
2351 * is true on entry; otherwise it will only be added if required
2352 * to make the name unique.
2354 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
2355 * The available route name with the lowest ID will be used, and \a id
2356 * will be set to the ID.
2358 * \return false if a route name could not be found, and \a track_name
2359 * and \a id do not reflect a free route name.
2362 Session::find_route_name (string const & base, uint32_t& id, string& name, bool definitely_add_number)
2364 /* the base may conflict with ports that do not belong to existing
2365 routes, but hidden objects like the click track. So check port names
2366 before anything else.
2369 for (vector<string>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
2370 if (base == *reserved) {
2371 /* Check if this reserved name already exists, and if
2372 so, disallow it without a numeric suffix.
2374 if (route_by_name (*reserved)) {
2375 definitely_add_number = true;
2384 /* if we have "base 1" already, it doesn't make sense to add "base"
2385 * if "base 1" has been deleted, adding "base" is no worse than "base 1"
2387 if (!definitely_add_number && route_by_name (base) == 0 && (route_by_name (string_compose("%1 1", base)) == 0)) {
2388 /* just use the base */
2394 name = string_compose ("%1 %2", base, id);
2396 if (route_by_name (name) == 0) {
2402 } while (id < (UINT_MAX-1));
2407 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
2409 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
2411 in = ChanCount::ZERO;
2412 out = ChanCount::ZERO;
2414 boost::shared_ptr<RouteList> r = routes.reader ();
2416 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2417 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2418 if (tr && !tr->is_auditioner()) {
2419 in += tr->n_inputs();
2420 out += tr->n_outputs();
2426 Session::default_track_name_pattern (DataType t)
2429 case DataType::AUDIO:
2430 if (Profile->get_trx()) {
2437 case DataType::MIDI:
2444 /** Caller must not hold process lock
2445 * @param name_template string to use for the start of the name, or "" to use "MIDI".
2446 * @param instrument plugin info for the instrument to insert pre-fader, if any
2448 list<boost::shared_ptr<MidiTrack> >
2449 Session::new_midi_track (const ChanCount& input, const ChanCount& output,
2450 boost::shared_ptr<PluginInfo> instrument, Plugin::PresetRecord* pset,
2451 RouteGroup* route_group, uint32_t how_many, string name_template, PresentationInfo::order_t order,
2455 uint32_t track_id = 0;
2457 RouteList new_routes;
2458 list<boost::shared_ptr<MidiTrack> > ret;
2460 const string name_pattern = default_track_name_pattern (DataType::MIDI);
2461 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
2464 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, use_number)) {
2465 error << "cannot find name for new midi track" << endmsg;
2469 boost::shared_ptr<MidiTrack> track;
2472 track.reset (new MidiTrack (*this, track_name, mode));
2474 if (track->init ()) {
2478 if (Profile->get_mixbus ()) {
2479 track->set_strict_io (true);
2482 track->use_new_diskstream();
2484 BOOST_MARK_TRACK (track);
2487 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2488 if (track->input()->ensure_io (input, false, this)) {
2489 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
2493 if (track->output()->ensure_io (output, false, this)) {
2494 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
2499 track->non_realtime_input_change();
2502 route_group->add (track);
2505 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2507 new_routes.push_back (track);
2508 ret.push_back (track);
2511 catch (failed_constructor &err) {
2512 error << _("Session: could not create new midi track.") << endmsg;
2516 catch (AudioEngine::PortRegistrationFailure& pfe) {
2518 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;
2526 if (!new_routes.empty()) {
2527 StateProtector sp (this);
2528 if (Profile->get_trx()) {
2529 add_routes (new_routes, false, false, false, order);
2531 add_routes (new_routes, true, true, false, order);
2535 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
2536 PluginPtr plugin = instrument->load (*this);
2538 warning << "Failed to add Synth Plugin to newly created track." << endmsg;
2542 plugin->load_preset (*pset);
2544 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2545 (*r)->add_processor (p, PreFader);
2554 Session::new_midi_route (RouteGroup* route_group, uint32_t how_many, string name_template, boost::shared_ptr<PluginInfo> instrument, Plugin::PresetRecord* pset,
2555 PresentationInfo::Flag flag, PresentationInfo::order_t order)
2558 uint32_t bus_id = 0;
2562 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Midi Bus");
2565 if (!find_route_name (name_template.empty () ? _("Midi Bus") : name_template, ++bus_id, bus_name, use_number)) {
2566 error << "cannot find name for new midi bus" << endmsg;
2571 boost::shared_ptr<Route> bus (new Route (*this, bus_name, flag, DataType::AUDIO)); // XXX Editor::add_routes is not ready for ARDOUR::DataType::MIDI
2577 if (Profile->get_mixbus ()) {
2578 bus->set_strict_io (true);
2581 BOOST_MARK_ROUTE(bus);
2584 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2586 if (bus->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
2587 error << _("cannot configure new midi bus input") << endmsg;
2592 if (bus->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
2593 error << _("cannot configure new midi bus output") << endmsg;
2599 route_group->add (bus);
2602 bus->add_internal_return ();
2603 ret.push_back (bus);
2606 catch (failed_constructor &err) {
2607 error << _("Session: could not create new audio route.") << endmsg;
2611 catch (AudioEngine::PortRegistrationFailure& pfe) {
2612 error << pfe.what() << endmsg;
2622 StateProtector sp (this);
2623 add_routes (ret, false, false, false, order);
2626 for (RouteList::iterator r = ret.begin(); r != ret.end(); ++r) {
2627 PluginPtr plugin = instrument->load (*this);
2629 warning << "Failed to add Synth Plugin to newly created track." << endmsg;
2633 plugin->load_preset (*pset);
2635 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2636 (*r)->add_processor (p, PreFader);
2647 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2649 boost::shared_ptr<Route> midi_track (wmt.lock());
2655 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2657 if (change.after.n_audio() <= change.before.n_audio()) {
2661 /* new audio ports: make sure the audio goes somewhere useful,
2662 * unless the user has no-auto-connect selected.
2664 * The existing ChanCounts don't matter for this call as they are only
2665 * to do with matching input and output indices, and we are only changing
2668 auto_connect_route (midi_track, false, ChanCount(), change.before);
2672 #ifdef USE_TRACKS_CODE_FEATURES
2675 compare_routes_by_remote_id (const boost::shared_ptr<Route>& route1, const boost::shared_ptr<Route>& route2)
2677 return route1->remote_control_id() < route2->remote_control_id();
2681 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2683 // it is not allowed to perform connection
2684 if (!IO::connecting_legal) {
2688 // if we are deleting routes we will call this once at the end
2689 if (_route_deletion_in_progress) {
2693 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2699 // We need to disconnect the route's inputs and outputs first
2700 // basing on autoconnect configuration
2701 bool reconnectIputs = !(Config->get_input_auto_connect() & ManualConnect) && reconnect_inputs;
2702 bool reconnectOutputs = !(Config->get_output_auto_connect() & ManualConnect) && reconnect_outputs;
2704 ChanCount existing_inputs;
2705 ChanCount existing_outputs;
2706 count_existing_track_channels (existing_inputs, existing_outputs);
2708 //ChanCount inputs = ChanCount::ZERO;
2709 //ChanCount outputs = ChanCount::ZERO;
2711 RouteList existing_routes = *routes.reader ();
2712 existing_routes.sort (compare_routes_by_remote_id);
2715 PBD::Unwinder<bool> protect_ignore_changes (_reconnecting_routes_in_progress, true);
2717 vector<string> physinputs;
2718 vector<string> physoutputs;
2720 EngineStateController::instance()->get_physical_audio_outputs(physoutputs);
2721 EngineStateController::instance()->get_physical_audio_inputs(physinputs);
2723 uint32_t input_n = 0;
2724 uint32_t output_n = 0;
2725 RouteList::iterator rIter = existing_routes.begin();
2726 const AutoConnectOption current_input_auto_connection (Config->get_input_auto_connect());
2727 const AutoConnectOption current_output_auto_connection (Config->get_output_auto_connect());
2728 for (; rIter != existing_routes.end(); ++rIter) {
2729 if (*rIter == _master_out || *rIter == _monitor_out ) {
2733 if (current_output_auto_connection == AutoConnectPhysical) {
2734 (*rIter)->amp()->deactivate();
2735 } else if (current_output_auto_connection == AutoConnectMaster) {
2736 (*rIter)->amp()->activate();
2739 if (reconnectIputs) {
2740 (*rIter)->input()->disconnect (this); //GZ: check this; could be heavy
2742 for (uint32_t route_input_n = 0; route_input_n < (*rIter)->n_inputs().get(DataType::AUDIO); ++route_input_n) {
2744 if (current_input_auto_connection & AutoConnectPhysical) {
2746 if ( input_n == physinputs.size() ) {
2750 string port = physinputs[input_n];
2752 if (port.empty() ) {
2753 error << "Physical Input number "<< input_n << " is unavailable and cannot be connected" << endmsg;
2756 //GZ: check this; could be heavy
2757 (*rIter)->input()->connect ((*rIter)->input()->ports().port(DataType::AUDIO, route_input_n), port, this);
2763 if (reconnectOutputs) {
2765 //normalize route ouptuts: reduce the amount outputs to be equal to the amount of inputs
2766 if (current_output_auto_connection & AutoConnectPhysical) {
2768 //GZ: check this; could be heavy
2769 (*rIter)->output()->disconnect (this);
2770 size_t route_inputs_count = (*rIter)->n_inputs().get(DataType::AUDIO);
2772 //GZ: check this; could be heavy
2773 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, route_inputs_count), false, this );
2775 } else if (current_output_auto_connection & AutoConnectMaster){
2777 if (!reconnect_master) {
2781 //GZ: check this; could be heavy
2782 (*rIter)->output()->disconnect (this);
2785 uint32_t master_inputs_count = _master_out->n_inputs().get(DataType::AUDIO);
2786 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, master_inputs_count), false, this );
2788 error << error << "Master bus is not available" << endmsg;
2793 for (uint32_t route_output_n = 0; route_output_n < (*rIter)->n_outputs().get(DataType::AUDIO); ++route_output_n) {
2794 if (current_output_auto_connection & AutoConnectPhysical) {
2796 if ( output_n == physoutputs.size() ) {
2800 string port = physoutputs[output_n];
2802 if (port.empty() ) {
2803 error << "Physical Output number "<< output_n << " is unavailable and cannot be connected" << endmsg;
2806 //GZ: check this; could be heavy
2807 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2810 } else if (current_output_auto_connection & AutoConnectMaster) {
2812 if ( route_output_n == _master_out->n_inputs().get(DataType::AUDIO) ) {
2816 // connect to master bus
2817 string port = _master_out->input()->ports().port(DataType::AUDIO, route_output_n)->name();
2819 if (port.empty() ) {
2820 error << "MasterBus Input number "<< route_output_n << " is unavailable and cannot be connected" << endmsg;
2824 //GZ: check this; could be heavy
2825 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2832 _master_out->output()->disconnect (this);
2833 auto_connect_master_bus ();
2838 session_routes_reconnected (); /* EMIT SIGNAL */
2842 Session::reconnect_midi_scene_ports(bool inputs)
2846 boost::shared_ptr<MidiPort> scene_in_ptr = scene_in();
2848 scene_in_ptr->disconnect_all ();
2850 std::vector<EngineStateController::MidiPortState> midi_port_states;
2851 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2853 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2855 for (; state_iter != midi_port_states.end(); ++state_iter) {
2856 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2857 scene_in_ptr->connect (state_iter->name);
2864 boost::shared_ptr<MidiPort> scene_out_ptr = scene_out();
2866 if (scene_out_ptr ) {
2867 scene_out_ptr->disconnect_all ();
2869 std::vector<EngineStateController::MidiPortState> midi_port_states;
2870 EngineStateController::instance()->get_physical_midi_output_states (midi_port_states);
2872 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2874 for (; state_iter != midi_port_states.end(); ++state_iter) {
2875 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2876 scene_out_ptr->connect (state_iter->name);
2884 Session::reconnect_mtc_ports ()
2886 boost::shared_ptr<MidiPort> mtc_in_ptr = _midi_ports->mtc_input_port();
2892 mtc_in_ptr->disconnect_all ();
2894 std::vector<EngineStateController::MidiPortState> midi_port_states;
2895 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2897 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2899 for (; state_iter != midi_port_states.end(); ++state_iter) {
2900 if (state_iter->available && state_iter->mtc_in) {
2901 mtc_in_ptr->connect (state_iter->name);
2905 if (!_midi_ports->mtc_input_port ()->connected () &&
2906 config.get_external_sync () &&
2907 (Config->get_sync_source () == MTC) ) {
2908 config.set_external_sync (false);
2911 if ( ARDOUR::Profile->get_trx () ) {
2912 // Tracks need this signal to update timecode_source_dropdown
2913 MtcOrLtcInputPortChanged (); //emit signal
2918 Session::reconnect_mmc_ports(bool inputs)
2920 if (inputs ) { // get all enabled midi input ports
2922 boost::shared_ptr<MidiPort> mmc_in_ptr = _midi_ports->mmc_in();
2924 mmc_in_ptr->disconnect_all ();
2925 std::vector<std::string> enabled_midi_inputs;
2926 EngineStateController::instance()->get_physical_midi_inputs (enabled_midi_inputs);
2928 std::vector<std::string>::iterator port_iter = enabled_midi_inputs.begin();
2930 for (; port_iter != enabled_midi_inputs.end(); ++port_iter) {
2931 mmc_in_ptr->connect (*port_iter);
2935 } else { // get all enabled midi output ports
2937 boost::shared_ptr<MidiPort> mmc_out_ptr = _midi_ports->mmc_out();
2939 mmc_out_ptr->disconnect_all ();
2940 std::vector<std::string> enabled_midi_outputs;
2941 EngineStateController::instance()->get_physical_midi_outputs (enabled_midi_outputs);
2943 std::vector<std::string>::iterator port_iter = enabled_midi_outputs.begin();
2945 for (; port_iter != enabled_midi_outputs.end(); ++port_iter) {
2946 mmc_out_ptr->connect (*port_iter);
2955 Session::ensure_route_presentation_info_gap (PresentationInfo::order_t first_new_order, uint32_t how_many)
2957 if (first_new_order == PresentationInfo::max_order) {
2958 /* adding at end, no worries */
2962 /* create a gap in the presentation info to accomodate @param how_many
2966 get_stripables (sl);
2968 for (StripableList::iterator si = sl.begin(); si != sl.end(); ++si) {
2969 boost::shared_ptr<Stripable> s (*si);
2971 if (s->is_monitor() || s->is_auditioner()) {
2975 if (s->presentation_info().order () >= first_new_order) {
2976 s->set_presentation_order (s->presentation_info().order () + how_many);
2981 /** Caller must not hold process lock
2982 * @param name_template string to use for the start of the name, or "" to use "Audio".
2984 list< boost::shared_ptr<AudioTrack> >
2985 Session::new_audio_track (int input_channels, int output_channels, RouteGroup* route_group,
2986 uint32_t how_many, string name_template, PresentationInfo::order_t order,
2990 uint32_t track_id = 0;
2992 RouteList new_routes;
2993 list<boost::shared_ptr<AudioTrack> > ret;
2995 const string name_pattern = default_track_name_pattern (DataType::AUDIO);
2996 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
3000 if (!find_route_name (name_template.empty() ? _(name_pattern.c_str()) : name_template, ++track_id, track_name, use_number)) {
3001 error << "cannot find name for new audio track" << endmsg;
3005 boost::shared_ptr<AudioTrack> track;
3008 track.reset (new AudioTrack (*this, track_name, mode));
3010 if (track->init ()) {
3014 if (Profile->get_mixbus ()) {
3015 track->set_strict_io (true);
3018 if (ARDOUR::Profile->get_trx ()) {
3019 // TRACKS considers it's not a USE CASE, it's
3020 // a piece of behavior of the session model:
3022 // Gain for a newly created route depends on
3023 // the current output_auto_connect mode:
3025 // 0 for Stereo Out mode
3027 if (Config->get_output_auto_connect() & AutoConnectMaster) {
3028 track->gain_control()->set_value (dB_to_coefficient (0), Controllable::NoGroup);
3032 track->use_new_diskstream();
3034 BOOST_MARK_TRACK (track);
3037 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3039 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
3040 error << string_compose (
3041 _("cannot configure %1 in/%2 out configuration for new audio track"),
3042 input_channels, output_channels)
3047 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
3048 error << string_compose (
3049 _("cannot configure %1 in/%2 out configuration for new audio track"),
3050 input_channels, output_channels)
3057 route_group->add (track);
3060 track->non_realtime_input_change();
3062 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
3064 new_routes.push_back (track);
3065 ret.push_back (track);
3068 catch (failed_constructor &err) {
3069 error << _("Session: could not create new audio track.") << endmsg;
3073 catch (AudioEngine::PortRegistrationFailure& pfe) {
3075 error << pfe.what() << endmsg;
3083 if (!new_routes.empty()) {
3084 StateProtector sp (this);
3085 if (Profile->get_trx()) {
3086 add_routes (new_routes, false, false, false, order);
3088 add_routes (new_routes, true, true, false, order);
3095 /** Caller must not hold process lock.
3096 * @param name_template string to use for the start of the name, or "" to use "Bus".
3099 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template,
3100 PresentationInfo::Flag flags, PresentationInfo::order_t order)
3103 uint32_t bus_id = 0;
3107 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
3110 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, use_number)) {
3111 error << "cannot find name for new audio bus" << endmsg;
3116 boost::shared_ptr<Route> bus (new Route (*this, bus_name, flags, DataType::AUDIO));
3122 if (Profile->get_mixbus ()) {
3123 bus->set_strict_io (true);
3126 BOOST_MARK_ROUTE(bus);
3129 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3131 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
3132 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
3133 input_channels, output_channels)
3139 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
3140 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
3141 input_channels, output_channels)
3148 route_group->add (bus);
3151 bus->add_internal_return ();
3152 ret.push_back (bus);
3155 catch (failed_constructor &err) {
3156 error << _("Session: could not create new audio route.") << endmsg;
3160 catch (AudioEngine::PortRegistrationFailure& pfe) {
3161 error << pfe.what() << endmsg;
3171 StateProtector sp (this);
3172 if (Profile->get_trx()) {
3173 add_routes (ret, false, false, false, order);
3175 add_routes (ret, false, true, true, order); // autoconnect // outputs only
3184 Session::new_route_from_template (uint32_t how_many, PresentationInfo::order_t insert_at, const std::string& template_path, const std::string& name_base,
3185 PlaylistDisposition pd)
3189 if (!tree.read (template_path.c_str())) {
3193 return new_route_from_template (how_many, insert_at, *tree.root(), name_base, pd);
3197 Session::new_route_from_template (uint32_t how_many, PresentationInfo::order_t insert_at, XMLNode& node, const std::string& name_base, PlaylistDisposition pd)
3200 uint32_t number = 0;
3201 const uint32_t being_added = how_many;
3202 /* This will prevent the use of any existing XML-provided PBD::ID
3205 Stateful::ForceIDRegeneration force_ids;
3206 IO::disable_connecting ();
3210 /* We're going to modify the node contents a bit so take a
3211 * copy. The node may be re-used when duplicating more than once.
3214 XMLNode node_copy (node);
3219 if (!name_base.empty()) {
3221 /* if we're adding more than one routes, force
3222 * all the names of the new routes to be
3223 * numbered, via the final parameter.
3226 if (!find_route_name (name_base.c_str(), ++number, name, (being_added > 1))) {
3227 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3233 string const route_name = node_copy.property(X_("name"))->value ();
3235 /* generate a new name by adding a number to the end of the template name */
3236 if (!find_route_name (route_name.c_str(), ++number, name, true)) {
3237 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3238 abort(); /*NOTREACHED*/
3242 /* set this name in the XML description that we are about to use */
3244 if (pd == CopyPlaylist) {
3245 XMLNode* ds_node = find_named_node (node_copy, "Diskstream");
3247 const std::string playlist_name = ds_node->property (X_("playlist"))->value ();
3248 boost::shared_ptr<Playlist> playlist = playlists->by_name (playlist_name);
3249 // Use same name as Route::set_name_in_state so playlist copy
3250 // is picked up when creating the Route in XMLRouteFactory below
3251 PlaylistFactory::create (playlist, string_compose ("%1.1", name));
3255 bool rename_playlist = (pd == CopyPlaylist || pd == NewPlaylist);
3257 Route::set_name_in_state (node_copy, name, rename_playlist);
3259 /* trim bitslots from listen sends so that new ones are used */
3260 XMLNodeList children = node_copy.children ();
3261 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
3262 if ((*i)->name() == X_("Processor")) {
3263 /* ForceIDRegeneration does not catch the following */
3264 XMLProperty const * role = (*i)->property (X_("role"));
3265 XMLProperty const * type = (*i)->property (X_("type"));
3266 if (role && role->value() == X_("Aux")) {
3267 /* check if the target bus exists.
3268 * we should not save aux-sends in templates.
3270 XMLProperty const * target = (*i)->property (X_("target"));
3272 (*i)->add_property ("type", "dangling-aux-send");
3275 boost::shared_ptr<Route> r = route_by_id (target->value());
3276 if (!r || boost::dynamic_pointer_cast<Track>(r)) {
3277 (*i)->add_property ("type", "dangling-aux-send");
3281 if (role && role->value() == X_("Listen")) {
3282 (*i)->remove_property (X_("bitslot"));
3284 else if (role && (role->value() == X_("Send") || role->value() == X_("Aux"))) {
3286 Delivery::Role xrole;
3287 uint32_t bitslot = 0;
3288 xrole = Delivery::Role (string_2_enum (role->value(), xrole));
3289 std::string name = Send::name_and_id_new_send(*this, xrole, bitslot, false);
3290 snprintf (buf, sizeof (buf), "%" PRIu32, bitslot);
3291 (*i)->remove_property (X_("bitslot"));
3292 (*i)->remove_property (X_("name"));
3293 (*i)->add_property ("bitslot", buf);
3294 (*i)->add_property ("name", name);
3296 else if (type && type->value() == X_("intreturn")) {
3297 (*i)->remove_property (X_("bitslot"));
3298 (*i)->add_property ("ignore-bitslot", "1");
3300 else if (type && type->value() == X_("return")) {
3301 // Return::set_state() generates a new one
3302 (*i)->remove_property (X_("bitslot"));
3304 else if (type && type->value() == X_("port")) {
3305 // PortInsert::set_state() handles the bitslot
3306 (*i)->remove_property (X_("bitslot"));
3307 (*i)->add_property ("ignore-name", "1");
3312 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
3315 error << _("Session: cannot create track/bus from template description") << endmsg;
3319 if (boost::dynamic_pointer_cast<Track>(route)) {
3320 /* force input/output change signals so that the new diskstream
3321 picks up the configuration of the route. During session
3322 loading this normally happens in a different way.
3325 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3327 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
3328 change.after = route->input()->n_ports();
3329 route->input()->changed (change, this);
3330 change.after = route->output()->n_ports();
3331 route->output()->changed (change, this);
3334 ret.push_back (route);
3337 catch (failed_constructor &err) {
3338 error << _("Session: could not create new route from template") << endmsg;
3342 catch (AudioEngine::PortRegistrationFailure& pfe) {
3343 error << pfe.what() << endmsg;
3352 StateProtector sp (this);
3353 if (Profile->get_trx()) {
3354 add_routes (ret, false, false, false, insert_at);
3356 add_routes (ret, true, true, false, insert_at);
3358 IO::enable_connecting ();
3365 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save, PresentationInfo::order_t order)
3368 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
3369 add_routes_inner (new_routes, input_auto_connect, output_auto_connect, order);
3372 error << _("Adding new tracks/busses failed") << endmsg;
3377 update_latency (true);
3378 update_latency (false);
3383 save_state (_current_snapshot_name);
3386 update_route_record_state ();
3388 RouteAdded (new_routes); /* EMIT SIGNAL */
3392 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, PresentationInfo::order_t order)
3394 ChanCount existing_inputs;
3395 ChanCount existing_outputs;
3399 count_existing_track_channels (existing_inputs, existing_outputs);
3402 RCUWriter<RouteList> writer (routes);
3403 boost::shared_ptr<RouteList> r = writer.get_copy ();
3404 r->insert (r->end(), new_routes.begin(), new_routes.end());
3405 n_routes = r->size();
3407 /* if there is no control out and we're not in the middle of loading,
3408 * resort the graph here. if there is a control out, we will resort
3409 * toward the end of this method. if we are in the middle of loading,
3410 * we will resort when done.
3413 if (!_monitor_out && IO::connecting_legal) {
3414 resort_routes_using (r);
3418 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("ensure order gap starting at %1 for %2\n", order, new_routes.size()));
3419 ensure_route_presentation_info_gap (order, new_routes.size());
3421 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x, ++added) {
3423 boost::weak_ptr<Route> wpr (*x);
3424 boost::shared_ptr<Route> r (*x);
3426 r->solo_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2,wpr));
3427 r->solo_isolate_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, wpr));
3428 r->mute_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this));
3430 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
3431 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
3432 r->processor_latency_changed.connect_same_thread (*this, boost::bind (&Session::queue_latency_recompute, this));
3434 if (r->is_master()) {
3438 if (r->is_monitor()) {
3442 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
3444 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
3445 track_playlist_changed (boost::weak_ptr<Track> (tr));
3446 tr->rec_enable_control()->Changed.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
3448 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
3450 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
3451 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
3452 mt->presentation_info().PropertyChanged.connect_same_thread (*this, boost::bind (&Session::midi_track_presentation_info_changed, this, _1, boost::weak_ptr<MidiTrack>(mt)));
3456 if (!r->presentation_info().special()) {
3458 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("checking PI state for %1\n", r->name()));
3460 /* presentation info order may already have been set from XML */
3462 if (!r->presentation_info().order_set()) {
3464 if (order == PresentationInfo::max_order) {
3465 /* just add to the end */
3466 r->set_presentation_order (n_routes + added, false);
3467 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order not set, set to NR %1 + %2 = %3\n", n_routes, added, n_routes + added));
3469 r->set_presentation_order (order + added);
3470 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order not set, set to %1 + %2 = %3\n", order, added, order + added));
3473 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order already set to %1\n", r->presentation_info().order()));
3477 #if !defined(__APPLE__) && !defined(__FreeBSD__)
3478 /* clang complains: 'operator<<' should be declared prior to the call site or in an associated namespace of one of its
3479 * arguments std::ostream& operator<<(std::ostream& o, ARDOUR::PresentationInfo const& rid)"
3481 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("added route %1, group order %2 type %3 (summary: %4)\n",
3483 r->presentation_info().order(),
3484 enum_2_string (r->presentation_info().flags()),
3485 r->presentation_info()));
3489 if (input_auto_connect || output_auto_connect) {
3490 auto_connect_route (r, input_auto_connect, ChanCount (), ChanCount (), existing_inputs, existing_outputs);
3491 existing_inputs += r->n_inputs();
3492 existing_outputs += r->n_outputs();
3498 if (_monitor_out && IO::connecting_legal) {
3499 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
3501 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3502 if ((*x)->is_monitor()) {
3504 } else if ((*x)->is_master()) {
3507 (*x)->enable_monitor_send ();
3512 reassign_track_numbers ();
3516 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
3518 boost::shared_ptr<RouteList> r = routes.reader ();
3519 boost::shared_ptr<Send> s;
3521 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3522 if ((s = (*i)->internal_send_for (dest)) != 0) {
3523 s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO, Controllable::NoGroup);
3529 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
3531 boost::shared_ptr<RouteList> r = routes.reader ();
3532 boost::shared_ptr<Send> s;
3534 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3535 if ((s = (*i)->internal_send_for (dest)) != 0) {
3536 s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY, Controllable::NoGroup);
3542 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
3544 boost::shared_ptr<RouteList> r = routes.reader ();
3545 boost::shared_ptr<Send> s;
3547 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3548 if ((s = (*i)->internal_send_for (dest)) != 0) {
3549 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value(), Controllable::NoGroup);
3554 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
3556 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
3558 boost::shared_ptr<RouteList> r = routes.reader ();
3559 boost::shared_ptr<RouteList> t (new RouteList);
3561 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3562 /* no MIDI sends because there are no MIDI busses yet */
3563 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
3568 add_internal_sends (dest, p, t);
3572 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
3574 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
3575 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
3580 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
3582 add_internal_send (dest, sender->before_processor_for_index (index), sender);
3586 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
3588 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
3592 if (!dest->internal_return()) {
3593 dest->add_internal_return ();
3596 sender->add_aux_send (dest, before);
3602 Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
3604 { // RCU Writer scope
3605 PBD::Unwinder<bool> uw_flag (_route_deletion_in_progress, true);
3606 RCUWriter<RouteList> writer (routes);
3607 boost::shared_ptr<RouteList> rs = writer.get_copy ();
3610 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3612 if (*iter == _master_out) {
3616 /* speed up session deletion, don't do the solo dance */
3617 if (0 == _state_of_the_state & Deletion) {
3618 (*iter)->solo_control()->set_value (0.0, Controllable::NoGroup);
3623 /* deleting the master out seems like a dumb
3624 idea, but its more of a UI policy issue
3628 if (*iter == _master_out) {
3629 _master_out = boost::shared_ptr<Route> ();
3632 if (*iter == _monitor_out) {
3633 _monitor_out.reset ();
3636 // We need to disconnect the route's inputs and outputs
3638 (*iter)->input()->disconnect (0);
3639 (*iter)->output()->disconnect (0);
3641 /* if the route had internal sends sending to it, remove them */
3642 if ((*iter)->internal_return()) {
3644 boost::shared_ptr<RouteList> r = routes.reader ();
3645 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3646 boost::shared_ptr<Send> s = (*i)->internal_send_for (*iter);
3648 (*i)->remove_processor (s);
3653 /* if the monitoring section had a pointer to this route, remove it */
3654 if (_monitor_out && !(*iter)->is_master() && !(*iter)->is_monitor()) {
3655 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3656 ProcessorChangeBlocker pcb (this, false);
3657 (*iter)->remove_aux_or_listen (_monitor_out);
3660 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*iter);
3661 if (mt && mt->step_editing()) {
3662 if (_step_editors > 0) {
3668 /* writer goes out of scope, forces route list update */
3670 } // end of RCU Writer scope
3672 update_route_solo_state ();
3673 update_latency_compensation ();
3676 /* Re-sort routes to remove the graph's current references to the one that is
3677 * going away, then flush old references out of the graph.
3678 * Wave Tracks: reconnect routes
3681 #ifdef USE_TRACKS_CODE_FEATURES
3682 reconnect_existing_routes(true, false);
3684 routes.flush (); // maybe unsafe, see below.
3688 if (_process_graph && !(_state_of_the_state & Deletion)) {
3689 _process_graph->clear_other_chain ();
3692 /* get rid of it from the dead wood collection in the route list manager */
3693 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
3697 /* try to cause everyone to drop their references
3698 * and unregister ports from the backend
3701 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3702 cerr << "Drop references to " << (*iter)->name() << endl;
3703 (*iter)->drop_references ();
3706 if (_state_of_the_state & Deletion) {
3710 PresentationInfo::Change(); /* EMIT SIGNAL */
3712 /* save the new state of the world */
3714 if (save_state (_current_snapshot_name)) {
3715 save_history (_current_snapshot_name);
3718 update_route_record_state ();
3722 Session::remove_route (boost::shared_ptr<Route> route)
3724 boost::shared_ptr<RouteList> rl (new RouteList);
3725 rl->push_back (route);
3730 Session::route_mute_changed ()
3736 Session::route_listen_changed (Controllable::GroupControlDisposition group_override, boost::weak_ptr<Route> wpr)
3738 boost::shared_ptr<Route> route (wpr.lock());
3744 assert (Config->get_solo_control_is_listen_control());
3746 if (route->solo_control()->soloed_by_self_or_masters()) {
3748 if (Config->get_exclusive_solo()) {
3750 RouteGroup* rg = route->route_group ();
3751 const bool group_already_accounted_for = (group_override == Controllable::ForGroup);
3753 boost::shared_ptr<RouteList> r = routes.reader ();
3755 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3756 if ((*i) == route) {
3757 /* already changed */
3761 if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
3762 /* route does not get solo propagated to it */
3766 if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
3767 /* this route is a part of the same solo group as the route
3768 * that was changed. Changing that route did change or will
3769 * change all group members appropriately, so we can ignore it
3774 (*i)->solo_control()->set_value (0.0, Controllable::NoGroup);
3780 } else if (_listen_cnt > 0) {
3787 Session::route_solo_isolated_changed (boost::weak_ptr<Route> wpr)
3789 boost::shared_ptr<Route> route (wpr.lock());
3795 bool send_changed = false;
3797 if (route->solo_isolate_control()->solo_isolated()) {
3798 if (_solo_isolated_cnt == 0) {
3799 send_changed = true;
3801 _solo_isolated_cnt++;
3802 } else if (_solo_isolated_cnt > 0) {
3803 _solo_isolated_cnt--;
3804 if (_solo_isolated_cnt == 0) {
3805 send_changed = true;
3810 IsolatedChanged (); /* EMIT SIGNAL */
3815 Session::route_solo_changed (bool self_solo_changed, Controllable::GroupControlDisposition group_override, boost::weak_ptr<Route> wpr)
3817 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1, update\n", self_solo_changed));
3819 boost::shared_ptr<Route> route (wpr.lock());
3825 if (Config->get_solo_control_is_listen_control()) {
3826 route_listen_changed (group_override, wpr);
3830 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: self %2 masters %3 transition %4\n", route->name(), route->self_soloed(), route->solo_control()->get_masters_value(), route->solo_control()->transitioned_into_solo()));
3832 if (route->solo_control()->transitioned_into_solo() == 0) {
3833 /* route solo changed by upstream/downstream or clear all solo state; not interesting
3836 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 not self-soloed nor soloed by master (%2), ignoring\n", route->name(), route->solo_control()->get_masters_value()));
3840 boost::shared_ptr<RouteList> r = routes.reader ();
3841 int32_t delta = route->solo_control()->transitioned_into_solo ();
3843 /* the route may be a member of a group that has shared-solo
3844 * semantics. If so, then all members of that group should follow the
3845 * solo of the changed route. But ... this is optional, controlled by a
3846 * Controllable::GroupControlDisposition.
3848 * The first argument to the signal that this method is connected to is the
3849 * GroupControlDisposition value that was used to change solo.
3851 * If the solo change was done with group semantics (either InverseGroup
3852 * (force the entire group to change even if the group shared solo is
3853 * disabled) or UseGroup (use the group, which may or may not have the
3854 * shared solo property enabled)) then as we propagate the change to
3855 * the entire session we should IGNORE THE GROUP that the changed route
3859 RouteGroup* rg = route->route_group ();
3860 const bool group_already_accounted_for = (group_override == Controllable::ForGroup);
3862 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate to session, group accounted for ? %1\n", group_already_accounted_for));
3864 if (delta == 1 && Config->get_exclusive_solo()) {
3866 /* new solo: disable all other solos, but not the group if its solo-enabled */
3868 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3870 if ((*i) == route) {
3871 /* already changed */
3875 if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
3876 /* route does not get solo propagated to it */
3880 if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
3881 /* this route is a part of the same solo group as the route
3882 * that was changed. Changing that route did change or will
3883 * change all group members appropriately, so we can ignore it
3889 (*i)->solo_control()->set_value (0.0, group_override);
3893 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3895 RouteList uninvolved;
3897 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
3899 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3900 bool via_sends_only;
3901 bool in_signal_flow;
3903 if ((*i) == route) {
3904 /* already changed */
3908 if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
3909 /* route does not get solo propagated to it */
3910 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 excluded from solo because iso = %2 can_solo = %3\n", (*i)->name(), (*i)->solo_isolate_control()->solo_isolated(),
3915 if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
3916 /* this route is a part of the same solo group as the route
3917 * that was changed. Changing that route did change or will
3918 * change all group members appropriately, so we can ignore it
3924 in_signal_flow = false;
3926 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3928 if ((*i)->feeds (route, &via_sends_only)) {
3929 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3930 if (!via_sends_only) {
3931 if (!route->soloed_by_others_upstream()) {
3932 (*i)->solo_control()->mod_solo_by_others_downstream (delta);
3934 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others upstream\n");
3937 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3939 in_signal_flow = true;
3941 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3944 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3946 if (route->feeds (*i, &via_sends_only)) {
3947 /* propagate solo upstream only if routing other than
3948 sends is involved, but do consider the other route
3949 (*i) to be part of the signal flow even if only
3952 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3956 route->soloed_by_others_downstream(),
3957 route->soloed_by_others_upstream()));
3958 if (!via_sends_only) {
3959 //NB. Triggers Invert Push, which handles soloed by downstream
3960 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3961 (*i)->solo_control()->mod_solo_by_others_upstream (delta);
3963 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3965 in_signal_flow = true;
3967 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3970 if (!in_signal_flow) {
3971 uninvolved.push_back (*i);
3975 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3977 /* now notify that the mute state of the routes not involved in the signal
3978 pathway of the just-solo-changed route may have altered.
3981 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3982 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
3983 (*i)->act_on_mute ();
3984 /* Session will emit SoloChanged() after all solo changes are
3985 * complete, which should be used by UIs to update mute status
3991 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
3993 /* now figure out if anything that matters is soloed (or is "listening")*/
3995 bool something_soloed = false;
3996 bool something_listening = false;
3997 uint32_t listeners = 0;
3998 uint32_t isolated = 0;
4001 r = routes.reader();
4004 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4005 if ((*i)->can_solo()) {
4006 if (Config->get_solo_control_is_listen_control()) {
4007 if ((*i)->solo_control()->soloed_by_self_or_masters()) {
4009 something_listening = true;
4012 (*i)->set_listen (false);
4013 if ((*i)->can_solo() && (*i)->solo_control()->soloed_by_self_or_masters()) {
4014 something_soloed = true;
4019 if ((*i)->solo_isolate_control()->solo_isolated()) {
4024 if (something_soloed != _non_soloed_outs_muted) {
4025 _non_soloed_outs_muted = something_soloed;
4026 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
4029 if (something_listening != _listening) {
4030 _listening = something_listening;
4031 SoloActive (_listening);
4034 _listen_cnt = listeners;
4036 if (isolated != _solo_isolated_cnt) {
4037 _solo_isolated_cnt = isolated;
4038 IsolatedChanged (); /* EMIT SIGNAL */
4041 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
4042 something_soloed, listeners, isolated));
4045 SoloChanged (); /* EMIT SIGNAL */
4050 Session::get_stripables (StripableList& sl) const
4052 boost::shared_ptr<RouteList> r = routes.reader ();
4053 sl.insert (sl.end(), r->begin(), r->end());
4055 VCAList v = _vca_manager->vcas ();
4056 sl.insert (sl.end(), v.begin(), v.end());
4059 boost::shared_ptr<RouteList>
4060 Session::get_routes_with_internal_returns() const
4062 boost::shared_ptr<RouteList> r = routes.reader ();
4063 boost::shared_ptr<RouteList> rl (new RouteList);
4065 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4066 if ((*i)->internal_return ()) {
4074 Session::io_name_is_legal (const std::string& name) const
4076 boost::shared_ptr<RouteList> r = routes.reader ();
4078 for (vector<string>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
4079 if (name == *reserved) {
4080 if (!route_by_name (*reserved)) {
4081 /* first instance of a reserved name is allowed */
4084 /* all other instances of a reserved name are not allowed */
4089 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4090 if ((*i)->name() == name) {
4094 if ((*i)->has_io_processor_named (name)) {
4103 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
4106 vector<string> connections;
4108 /* if we are passed only a single route and we're not told to turn
4109 * others off, then just do the simple thing.
4112 if (flip_others == false && rl->size() == 1) {
4113 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
4115 mt->set_input_active (onoff);
4120 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
4122 PortSet& ps ((*rt)->input()->ports());
4124 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
4125 p->get_connections (connections);
4128 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
4129 routes_using_input_from (*s, rl2);
4132 /* scan all relevant routes to see if others are on or off */
4134 bool others_are_already_on = false;
4136 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
4138 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
4144 if ((*r) != (*rt)) {
4145 if (mt->input_active()) {
4146 others_are_already_on = true;
4149 /* this one needs changing */
4150 mt->set_input_active (onoff);
4156 /* globally reverse other routes */
4158 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
4159 if ((*r) != (*rt)) {
4160 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
4162 mt->set_input_active (!others_are_already_on);
4171 Session::routes_using_input_from (const string& str, RouteList& rl)
4173 boost::shared_ptr<RouteList> r = routes.reader();
4175 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4176 if ((*i)->input()->connected_to (str)) {
4182 boost::shared_ptr<Route>
4183 Session::route_by_name (string name) const
4185 boost::shared_ptr<RouteList> r = routes.reader ();
4187 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4188 if ((*i)->name() == name) {
4193 return boost::shared_ptr<Route> ((Route*) 0);
4196 boost::shared_ptr<Route>
4197 Session::route_by_id (PBD::ID id) const
4199 boost::shared_ptr<RouteList> r = routes.reader ();
4201 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4202 if ((*i)->id() == id) {
4207 return boost::shared_ptr<Route> ((Route*) 0);
4210 boost::shared_ptr<Processor>
4211 Session::processor_by_id (PBD::ID id) const
4213 boost::shared_ptr<RouteList> r = routes.reader ();
4215 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4216 boost::shared_ptr<Processor> p = (*i)->Route::processor_by_id (id);
4222 return boost::shared_ptr<Processor> ();
4225 boost::shared_ptr<Track>
4226 Session::track_by_diskstream_id (PBD::ID id) const
4228 boost::shared_ptr<RouteList> r = routes.reader ();
4230 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4231 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
4232 if (t && t->using_diskstream_id (id)) {
4237 return boost::shared_ptr<Track> ();
4240 boost::shared_ptr<Route>
4241 Session::get_remote_nth_route (PresentationInfo::order_t n) const
4243 return boost::dynamic_pointer_cast<Route> (get_remote_nth_stripable (n, PresentationInfo::Route));
4246 boost::shared_ptr<Stripable>
4247 Session::get_remote_nth_stripable (PresentationInfo::order_t n, PresentationInfo::Flag flags) const
4250 PresentationInfo::order_t match_cnt = 0;
4252 get_stripables (sl);
4253 sl.sort (Stripable::PresentationOrderSorter());
4255 for (StripableList::const_iterator s = sl.begin(); s != sl.end(); ++s) {
4257 if ((*s)->presentation_info().hidden()) {
4258 /* if the caller didn't explicitly ask for hidden
4259 stripables, ignore hidden ones. This matches
4260 the semantics of the pre-PresentationOrder
4261 "get by RID" logic of Ardour 4.x and earlier.
4263 XXX at some point we should likely reverse
4264 the logic of the flags, because asking for "the
4265 hidden stripables" is not going to be common,
4266 whereas asking for visible ones is normal.
4269 if (! (flags & PresentationInfo::Hidden)) {
4274 if ((*s)->presentation_info().flag_match (flags)) {
4275 if (match_cnt++ == n) {
4281 /* there is no nth stripable that matches the given flags */
4282 return boost::shared_ptr<Stripable>();
4285 boost::shared_ptr<Route>
4286 Session::route_by_selected_count (uint32_t id) const
4288 boost::shared_ptr<RouteList> r = routes.reader ();
4290 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4291 /* NOT IMPLEMENTED */
4294 return boost::shared_ptr<Route> ((Route*) 0);
4297 struct PresentationOrderSorter {
4298 bool operator() (boost::shared_ptr<Stripable> a, boost::shared_ptr<Stripable> b) {
4299 if (a->presentation_info().special() && !b->presentation_info().special()) {
4300 /* a is not ordered, b is; b comes before a */
4302 } else if (!b->presentation_info().order_set() && a->presentation_info().order_set()) {
4303 /* b is not ordered, a is; a comes before b */
4306 return a->presentation_info().order() < b->presentation_info().order();
4312 Session::reassign_track_numbers ()
4316 RouteList r (*(routes.reader ()));
4317 PresentationOrderSorter sorter;
4320 StateProtector sp (this);
4322 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4323 if (boost::dynamic_pointer_cast<Track> (*i)) {
4324 (*i)->set_track_number(++tn);
4326 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
4327 (*i)->set_track_number(--bn);
4330 const uint32_t decimals = ceilf (log10f (tn + 1));
4331 const bool decimals_changed = _track_number_decimals != decimals;
4332 _track_number_decimals = decimals;
4334 if (decimals_changed && config.get_track_name_number ()) {
4335 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4336 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
4338 t->resync_track_name();
4341 // trigger GUI re-layout
4342 config.ParameterChanged("track-name-number");
4346 if (DEBUG_ENABLED(DEBUG::OrderKeys)) {
4347 boost::shared_ptr<RouteList> rl = routes.reader ();
4348 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4349 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 numbered %2\n", (*i)->name(), (*i)->track_number()));
4357 Session::playlist_region_added (boost::weak_ptr<Region> w)
4359 boost::shared_ptr<Region> r = w.lock ();
4364 /* These are the operations that are currently in progress... */
4365 list<GQuark> curr = _current_trans_quarks;
4368 /* ...and these are the operations during which we want to update
4369 the session range location markers.
4372 ops.push_back (Operations::capture);
4373 ops.push_back (Operations::paste);
4374 ops.push_back (Operations::duplicate_region);
4375 ops.push_back (Operations::insert_file);
4376 ops.push_back (Operations::insert_region);
4377 ops.push_back (Operations::drag_region_brush);
4378 ops.push_back (Operations::region_drag);
4379 ops.push_back (Operations::selection_grab);
4380 ops.push_back (Operations::region_fill);
4381 ops.push_back (Operations::fill_selection);
4382 ops.push_back (Operations::create_region);
4383 ops.push_back (Operations::region_copy);
4384 ops.push_back (Operations::fixed_time_region_copy);
4387 /* See if any of the current operations match the ones that we want */
4389 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
4391 /* If so, update the session range markers */
4393 maybe_update_session_range (r->position (), r->last_frame ());
4397 /** Update the session range markers if a is before the current start or
4398 * b is after the current end.
4401 Session::maybe_update_session_range (framepos_t a, framepos_t b)
4403 if (_state_of_the_state & Loading) {
4407 framepos_t session_end_marker_shift_samples = session_end_shift * _nominal_frame_rate;
4409 if (_session_range_location == 0) {
4411 set_session_range_location (a, b + session_end_marker_shift_samples);
4415 if (a < _session_range_location->start()) {
4416 _session_range_location->set_start (a);
4419 if (_session_range_end_is_free && (b > _session_range_location->end())) {
4420 _session_range_location->set_end (b);
4426 Session::set_end_is_free (bool yn)
4428 _session_range_end_is_free = yn;
4432 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
4434 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4435 maybe_update_session_range (i->to, i->to + i->length);
4440 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
4442 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4443 maybe_update_session_range (i->from, i->to);
4447 /* Region management */
4449 boost::shared_ptr<Region>
4450 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
4452 const RegionFactory::RegionMap& regions (RegionFactory::regions());
4453 RegionFactory::RegionMap::const_iterator i;
4454 boost::shared_ptr<Region> region;
4456 Glib::Threads::Mutex::Lock lm (region_lock);
4458 for (i = regions.begin(); i != regions.end(); ++i) {
4462 if (region->whole_file()) {
4464 if (child->source_equivalent (region)) {
4470 return boost::shared_ptr<Region> ();
4474 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
4476 set<boost::shared_ptr<Region> > relevant_regions;
4478 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
4479 RegionFactory::get_regions_using_source (*s, relevant_regions);
4482 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
4483 set<boost::shared_ptr<Region> >::iterator tmp;
4488 playlists->destroy_region (*r);
4489 RegionFactory::map_remove (*r);
4491 (*r)->drop_sources ();
4492 (*r)->drop_references ();
4494 relevant_regions.erase (r);
4499 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
4502 Glib::Threads::Mutex::Lock ls (source_lock);
4503 /* remove from the main source list */
4504 sources.erase ((*s)->id());
4507 (*s)->mark_for_remove ();
4508 (*s)->drop_references ();
4517 Session::remove_last_capture ()
4519 list<boost::shared_ptr<Source> > srcs;
4521 boost::shared_ptr<RouteList> rl = routes.reader ();
4522 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4523 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4528 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
4531 srcs.insert (srcs.end(), l.begin(), l.end());
4536 destroy_sources (srcs);
4538 save_state (_current_snapshot_name);
4543 /* Source Management */
4546 Session::add_source (boost::shared_ptr<Source> source)
4548 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
4549 pair<SourceMap::iterator,bool> result;
4551 entry.first = source->id();
4552 entry.second = source;
4555 Glib::Threads::Mutex::Lock lm (source_lock);
4556 result = sources.insert (entry);
4559 if (result.second) {
4561 /* yay, new source */
4563 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
4566 if (!fs->within_session()) {
4567 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
4573 boost::shared_ptr<AudioFileSource> afs;
4575 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
4576 if (Config->get_auto_analyse_audio()) {
4577 Analyser::queue_source_for_analysis (source, false);
4581 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
4586 Session::remove_source (boost::weak_ptr<Source> src)
4588 if (_state_of_the_state & Deletion) {
4592 SourceMap::iterator i;
4593 boost::shared_ptr<Source> source = src.lock();
4600 Glib::Threads::Mutex::Lock lm (source_lock);
4602 if ((i = sources.find (source->id())) != sources.end()) {
4607 if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
4609 /* save state so we don't end up with a session file
4610 referring to non-existent sources.
4613 save_state (_current_snapshot_name);
4617 boost::shared_ptr<Source>
4618 Session::source_by_id (const PBD::ID& id)
4620 Glib::Threads::Mutex::Lock lm (source_lock);
4621 SourceMap::iterator i;
4622 boost::shared_ptr<Source> source;
4624 if ((i = sources.find (id)) != sources.end()) {
4631 boost::shared_ptr<AudioFileSource>
4632 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
4634 /* Restricted to audio files because only audio sources have channel
4638 Glib::Threads::Mutex::Lock lm (source_lock);
4640 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
4641 boost::shared_ptr<AudioFileSource> afs
4642 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
4644 if (afs && afs->path() == path && chn == afs->channel()) {
4649 return boost::shared_ptr<AudioFileSource>();
4652 boost::shared_ptr<MidiSource>
4653 Session::midi_source_by_path (const std::string& path) const
4655 /* Restricted to MIDI files because audio sources require a channel
4656 for unique identification, in addition to a path.
4659 Glib::Threads::Mutex::Lock lm (source_lock);
4661 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
4662 boost::shared_ptr<MidiSource> ms
4663 = boost::dynamic_pointer_cast<MidiSource>(s->second);
4664 boost::shared_ptr<FileSource> fs
4665 = boost::dynamic_pointer_cast<FileSource>(s->second);
4667 if (ms && fs && fs->path() == path) {
4672 return boost::shared_ptr<MidiSource>();
4676 Session::count_sources_by_origin (const string& path)
4679 Glib::Threads::Mutex::Lock lm (source_lock);
4681 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
4682 boost::shared_ptr<FileSource> fs
4683 = boost::dynamic_pointer_cast<FileSource>(i->second);
4685 if (fs && fs->origin() == path) {
4694 peak_file_helper (const string& peak_path, const string& file_path, const string& file_base, bool hash) {
4696 std::string checksum = Glib::Checksum::compute_checksum(Glib::Checksum::CHECKSUM_SHA1, file_path + G_DIR_SEPARATOR + file_base);
4697 return Glib::build_filename (peak_path, checksum + peakfile_suffix);
4699 return Glib::build_filename (peak_path, file_base + peakfile_suffix);
4704 Session::construct_peak_filepath (const string& filepath, const bool in_session, const bool old_peak_name) const
4706 string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
4708 if (Glib::path_is_absolute (filepath)) {
4710 /* rip the session dir from the audiofile source */
4712 string session_path;
4713 bool in_another_session = true;
4715 if (filepath.find (interchange_dir_string) != string::npos) {
4717 session_path = Glib::path_get_dirname (filepath); /* now ends in audiofiles */
4718 session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
4719 session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
4720 session_path = Glib::path_get_dirname (session_path); /* now has session path */
4722 /* see if it is within our session */
4724 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4725 if (i->path == session_path) {
4726 in_another_session = false;
4731 in_another_session = false;
4735 if (in_another_session) {
4736 SessionDirectory sd (session_path);
4737 return peak_file_helper (sd.peak_path(), "", Glib::path_get_basename (filepath), !old_peak_name);
4741 /* 1) if file belongs to this session
4742 * it may be a relative path (interchange/...)
4743 * or just basename (session_state, remove source)
4744 * -> just use the basename
4746 std::string filename = Glib::path_get_basename (filepath);
4749 /* 2) if the file is outside our session dir:
4750 * (imported but not copied) add the path for check-summming */
4752 path = Glib::path_get_dirname (filepath);
4755 return peak_file_helper (_session_dir->peak_path(), path, Glib::path_get_basename (filepath), !old_peak_name);
4759 Session::new_audio_source_path_for_embedded (const std::string& path)
4763 * we know that the filename is already unique because it exists
4764 * out in the filesystem.
4766 * However, when we bring it into the session, we could get a
4769 * Eg. two embedded files:
4774 * When merged into session, these collide.
4776 * There will not be a conflict with in-memory sources
4777 * because when the source was created we already picked
4778 * a unique name for it.
4780 * This collision is not likely to be common, but we have to guard
4781 * against it. So, if there is a collision, take the md5 hash of the
4782 * the path, and use that as the filename instead.
4785 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4786 string base = Glib::path_get_basename (path);
4787 string newpath = Glib::build_filename (sdir.sound_path(), base);
4789 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4793 md5.digestString (path.c_str());
4794 md5.writeToString ();
4795 base = md5.digestChars;
4797 string ext = get_suffix (path);
4804 newpath = Glib::build_filename (sdir.sound_path(), base);
4806 /* if this collides, we're screwed */
4808 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4809 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
4818 /** Return true if there are no audio file sources that use @param name as
4819 * the filename component of their path.
4821 * Return false otherwise.
4823 * This method MUST ONLY be used to check in-session, mono files since it
4824 * hard-codes the channel of the audio file source we are looking for as zero.
4826 * If/when Ardour supports native files in non-mono formats, the logic here
4827 * will need to be revisited.
4830 Session::audio_source_name_is_unique (const string& name)
4832 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
4833 vector<space_and_path>::iterator i;
4834 uint32_t existing = 0;
4836 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4838 /* note that we search *without* the extension so that
4839 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
4840 in the event that this new name is required for
4841 a file format change.
4844 const string spath = *i;
4846 if (matching_unsuffixed_filename_exists_in (spath, name)) {
4851 /* it is possible that we have the path already
4852 * assigned to a source that has not yet been written
4853 * (ie. the write source for a diskstream). we have to
4854 * check this in order to make sure that our candidate
4855 * path isn't used again, because that can lead to
4856 * two Sources point to the same file with different
4857 * notions of their removability.
4861 string possible_path = Glib::build_filename (spath, name);
4863 if (audio_source_by_path_and_channel (possible_path, 0)) {
4869 return (existing == 0);
4873 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)
4876 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4878 if (Profile->get_trx() && destructive) {
4880 sstr << setfill ('0') << setw (4) << cnt;
4881 sstr << legalized_base;
4883 sstr << legalized_base;
4885 if (take_required || related_exists) {
4897 } else if (nchan > 2) {
4902 /* XXX what? more than 26 channels! */
4913 /** Return a unique name based on \a base for a new internal audio source */
4915 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
4918 string possible_name;
4919 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
4921 bool some_related_source_name_exists = false;
4923 legalized = legalize_for_path (base);
4925 // Find a "version" of the base name that doesn't exist in any of the possible directories.
4927 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
4929 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
4931 if (audio_source_name_is_unique (possible_name)) {
4935 some_related_source_name_exists = true;
4938 error << string_compose(
4939 _("There are already %1 recordings for %2, which I consider too many."),
4940 limit, base) << endmsg;
4942 throw failed_constructor();
4946 /* We've established that the new name does not exist in any session
4947 * directory, so now find out which one we should use for this new
4951 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4953 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
4958 /** Return a unique name based on `base` for a new internal MIDI source */
4960 Session::new_midi_source_path (const string& base)
4963 char buf[PATH_MAX+1];
4964 const uint32_t limit = 10000;
4966 string possible_path;
4967 string possible_name;
4970 legalized = legalize_for_path (base);
4972 // Find a "version" of the file name that doesn't exist in any of the possible directories.
4973 std::vector<string> sdirs = source_search_path(DataType::MIDI);
4975 /* - the main session folder is the first in the vector.
4976 * - after checking all locations for file-name uniqueness,
4977 * we keep the one from the last iteration as new file name
4978 * - midi files are small and should just be kept in the main session-folder
4980 * -> reverse the array, check main session folder last and use that as location
4983 std::reverse(sdirs.begin(), sdirs.end());
4985 for (cnt = 1; cnt <= limit; ++cnt) {
4987 vector<space_and_path>::iterator i;
4988 uint32_t existing = 0;
4990 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4992 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
4993 possible_name = buf;
4995 possible_path = Glib::build_filename (*i, possible_name);
4997 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
5001 if (midi_source_by_path (possible_path)) {
5006 if (existing == 0) {
5011 error << string_compose(
5012 _("There are already %1 recordings for %2, which I consider too many."),
5013 limit, base) << endmsg;
5019 /* No need to "find best location" for software/app-based RAID, because
5020 MIDI is so small that we always put it in the same place.
5023 return possible_path;
5027 /** Create a new within-session audio source */
5028 boost::shared_ptr<AudioFileSource>
5029 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
5031 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
5033 if (!path.empty()) {
5034 return boost::dynamic_pointer_cast<AudioFileSource> (
5035 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate(), true, true));
5037 throw failed_constructor ();
5041 /** Create a new within-session MIDI source */
5042 boost::shared_ptr<MidiSource>
5043 Session::create_midi_source_for_session (string const & basic_name)
5045 const string path = new_midi_source_path (basic_name);
5047 if (!path.empty()) {
5048 return boost::dynamic_pointer_cast<SMFSource> (
5049 SourceFactory::createWritable (
5050 DataType::MIDI, *this, path, false, frame_rate()));
5052 throw failed_constructor ();
5056 /** Create a new within-session MIDI source */
5057 boost::shared_ptr<MidiSource>
5058 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
5060 /* the caller passes in the track the source will be used in,
5061 so that we can keep the numbering sane.
5063 Rationale: a track with the name "Foo" that has had N
5064 captures carried out so far will ALREADY have a write source
5065 named "Foo-N+1.mid" waiting to be used for the next capture.
5067 If we call new_midi_source_name() we will get "Foo-N+2". But
5068 there is no region corresponding to "Foo-N+1", so when
5069 "Foo-N+2" appears in the track, the gap presents the user
5070 with odd behaviour - why did it skip past Foo-N+1?
5072 We could explain this to the user in some odd way, but
5073 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
5076 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
5079 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
5081 std::string name = track->steal_write_source_name ();
5084 return boost::shared_ptr<MidiSource>();
5087 /* MIDI files are small, just put them in the first location of the
5088 session source search path.
5091 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
5093 return boost::dynamic_pointer_cast<SMFSource> (
5094 SourceFactory::createWritable (
5095 DataType::MIDI, *this, path, false, frame_rate()));
5100 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
5102 if (playlist->hidden()) {
5106 playlists->add (playlist);
5109 playlist->release();
5116 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
5118 if (_state_of_the_state & Deletion) {
5122 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
5128 playlists->remove (playlist);
5134 Session::set_audition (boost::shared_ptr<Region> r)
5136 pending_audition_region = r;
5137 add_post_transport_work (PostTransportAudition);
5138 _butler->schedule_transport_work ();
5142 Session::audition_playlist ()
5144 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
5145 ev->region.reset ();
5151 Session::register_lua_function (
5152 const std::string& name,
5153 const std::string& script,
5154 const LuaScriptParamList& args
5157 Glib::Threads::Mutex::Lock lm (lua_lock);
5159 lua_State* L = lua.getState();
5161 const std::string& bytecode = LuaScripting::get_factory_bytecode (script);
5162 luabridge::LuaRef tbl_arg (luabridge::newTable(L));
5163 for (LuaScriptParamList::const_iterator i = args.begin(); i != args.end(); ++i) {
5164 if ((*i)->optional && !(*i)->is_set) { continue; }
5165 tbl_arg[(*i)->name] = (*i)->value;
5167 (*_lua_add)(name, bytecode, tbl_arg); // throws luabridge::LuaException
5172 Session::unregister_lua_function (const std::string& name)
5174 Glib::Threads::Mutex::Lock lm (lua_lock);
5175 (*_lua_del)(name); // throws luabridge::LuaException
5176 lua.collect_garbage ();
5180 std::vector<std::string>
5181 Session::registered_lua_functions ()
5183 Glib::Threads::Mutex::Lock lm (lua_lock);
5184 std::vector<std::string> rv;
5187 luabridge::LuaRef list ((*_lua_list)());
5188 for (luabridge::Iterator i (list); !i.isNil (); ++i) {
5189 if (!i.key ().isString ()) { assert(0); continue; }
5190 rv.push_back (i.key ().cast<std::string> ());
5192 } catch (luabridge::LuaException const& e) { }
5197 static void _lua_print (std::string s) {
5198 std::cout << "SessionLua: " << s << "\n";
5203 Session::try_run_lua (pframes_t nframes)
5205 if (_n_lua_scripts == 0) return;
5206 Glib::Threads::Mutex::Lock tm (lua_lock, Glib::Threads::TRY_LOCK);
5208 try { (*_lua_run)(nframes); } catch (luabridge::LuaException const& e) { }
5209 lua.collect_garbage_step ();
5214 Session::setup_lua ()
5217 lua.Print.connect (&_lua_print);
5221 "function ArdourSession ()"
5222 " local self = { scripts = {}, instances = {} }"
5224 " local remove = function (n)"
5225 " self.scripts[n] = nil"
5226 " self.instances[n] = nil"
5227 " Session:scripts_changed()" // call back
5230 " local addinternal = function (n, f, a)"
5231 " assert(type(n) == 'string', 'function-name must be string')"
5232 " assert(type(f) == 'function', 'Given script is a not a function')"
5233 " assert(type(a) == 'table' or type(a) == 'nil', 'Given argument is invalid')"
5234 " assert(self.scripts[n] == nil, 'Callback \"'.. n ..'\" already exists.')"
5235 " self.scripts[n] = { ['f'] = f, ['a'] = a }"
5236 " local env = _ENV; env.f = nil env.io = nil env.os = nil env.loadfile = nil env.require = nil env.dofile = nil env.package = nil env.debug = nil"
5237 " local env = { print = print, tostring = tostring, assert = assert, ipairs = ipairs, error = error, select = select, string = string, type = type, tonumber = tonumber, collectgarbage = collectgarbage, pairs = pairs, math = math, table = table, pcall = pcall, Session = Session, PBD = PBD, Timecode = Timecode, Evoral = Evoral, C = C, ARDOUR = ARDOUR }"
5238 " self.instances[n] = load (string.dump(f, true), nil, nil, env)(a)"
5239 " Session:scripts_changed()" // call back
5242 " local add = function (n, b, a)"
5243 " assert(type(b) == 'string', 'ByteCode must be string')"
5244 " load (b)()" // assigns f
5245 " assert(type(f) == 'string', 'Assigned ByteCode must be string')"
5246 " addinternal (n, load(f), a)"
5249 " local run = function (...)"
5250 " for n, s in pairs (self.instances) do"
5251 " local status, err = pcall (s, ...)"
5252 " if not status then"
5253 " print ('fn \"'.. n .. '\": ', err)"
5260 " local cleanup = function ()"
5261 " self.scripts = nil"
5262 " self.instances = nil"
5265 " local list = function ()"
5267 " for n, _ in pairs (self.scripts) do"
5273 " local function basic_serialize (o)"
5274 " if type(o) == \"number\" then"
5275 " return tostring(o)"
5277 " return string.format(\"%q\", o)"
5281 " local function serialize (name, value)"
5282 " local rv = name .. ' = '"
5284 " if type(value) == \"number\" or type(value) == \"string\" or type(value) == \"nil\" then"
5285 " return rv .. basic_serialize(value) .. ' '"
5286 " elseif type(value) == \"table\" then"
5288 " for k,v in pairs(value) do"
5289 " local fieldname = string.format(\"%s[%s]\", name, basic_serialize(k))"
5290 " rv = rv .. serialize(fieldname, v) .. ' '"
5291 " collectgarbage()" // string concatenation allocates a new string :(
5294 " elseif type(value) == \"function\" then"
5295 " return rv .. string.format(\"%q\", string.dump(value, true))"
5297 " error('cannot save a ' .. type(value))"
5302 " local save = function ()"
5303 " return (serialize('scripts', self.scripts))"
5306 " local restore = function (state)"
5307 " self.scripts = {}"
5309 " for n, s in pairs (scripts) do"
5310 " addinternal (n, load(s['f']), s['a'])"
5314 " return { run = run, add = add, remove = remove,"
5315 " list = list, restore = restore, save = save, cleanup = cleanup}"
5318 " sess = ArdourSession ()"
5319 " ArdourSession = nil"
5321 "function ardour () end"
5324 lua_State* L = lua.getState();
5327 luabridge::LuaRef lua_sess = luabridge::getGlobal (L, "sess");
5328 lua.do_command ("sess = nil"); // hide it.
5329 lua.do_command ("collectgarbage()");
5331 _lua_run = new luabridge::LuaRef(lua_sess["run"]);
5332 _lua_add = new luabridge::LuaRef(lua_sess["add"]);
5333 _lua_del = new luabridge::LuaRef(lua_sess["remove"]);
5334 _lua_list = new luabridge::LuaRef(lua_sess["list"]);
5335 _lua_save = new luabridge::LuaRef(lua_sess["save"]);
5336 _lua_load = new luabridge::LuaRef(lua_sess["restore"]);
5337 _lua_cleanup = new luabridge::LuaRef(lua_sess["cleanup"]);
5338 } catch (luabridge::LuaException const& e) {
5339 fatal << string_compose (_("programming error: %1"),
5340 X_("Failed to setup Lua interpreter"))
5342 abort(); /*NOTREACHED*/
5345 LuaBindings::stddef (L);
5346 LuaBindings::common (L);
5347 LuaBindings::dsp (L);
5348 luabridge::push <Session *> (L, this);
5349 lua_setglobal (L, "Session");
5353 Session::scripts_changed ()
5355 assert (!lua_lock.trylock()); // must hold lua_lock
5358 luabridge::LuaRef list ((*_lua_list)());
5360 for (luabridge::Iterator i (list); !i.isNil (); ++i) {
5361 if (!i.key ().isString ()) { assert(0); continue; }
5364 _n_lua_scripts = cnt;
5365 } catch (luabridge::LuaException const& e) {
5366 fatal << string_compose (_("programming error: %1"),
5367 X_("Indexing Lua Session Scripts failed."))
5369 abort(); /*NOTREACHED*/
5374 Session::non_realtime_set_audition ()
5376 assert (pending_audition_region);
5377 auditioner->audition_region (pending_audition_region);
5378 pending_audition_region.reset ();
5379 AuditionActive (true); /* EMIT SIGNAL */
5383 Session::audition_region (boost::shared_ptr<Region> r)
5385 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
5391 Session::cancel_audition ()
5396 if (auditioner->auditioning()) {
5397 auditioner->cancel_audition ();
5398 AuditionActive (false); /* EMIT SIGNAL */
5403 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
5405 if (a->is_monitor()) {
5408 if (b->is_monitor()) {
5411 return a->presentation_info().order() < b->presentation_info().order();
5415 Session::is_auditioning () const
5417 /* can be called before we have an auditioner object */
5419 return auditioner->auditioning();
5426 Session::graph_reordered ()
5428 /* don't do this stuff if we are setting up connections
5429 from a set_state() call or creating new tracks. Ditto for deletion.
5432 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _reconnecting_routes_in_progress || _route_deletion_in_progress) {
5436 /* every track/bus asked for this to be handled but it was deferred because
5437 we were connecting. do it now.
5440 request_input_change_handling ();
5444 /* force all diskstreams to update their capture offset values to
5445 reflect any changes in latencies within the graph.
5448 boost::shared_ptr<RouteList> rl = routes.reader ();
5449 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5450 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5452 tr->set_capture_offset ();
5457 /** @return Number of frames that there is disk space available to write,
5460 boost::optional<framecnt_t>
5461 Session::available_capture_duration ()
5463 Glib::Threads::Mutex::Lock lm (space_lock);
5465 if (_total_free_4k_blocks_uncertain) {
5466 return boost::optional<framecnt_t> ();
5469 float sample_bytes_on_disk = 4.0; // keep gcc happy
5471 switch (config.get_native_file_data_format()) {
5473 sample_bytes_on_disk = 4.0;
5477 sample_bytes_on_disk = 3.0;
5481 sample_bytes_on_disk = 2.0;
5485 /* impossible, but keep some gcc versions happy */
5486 fatal << string_compose (_("programming error: %1"),
5487 X_("illegal native file data format"))
5489 abort(); /*NOTREACHED*/
5492 double scale = 4096.0 / sample_bytes_on_disk;
5494 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
5495 return max_framecnt;
5498 return (framecnt_t) floor (_total_free_4k_blocks * scale);
5502 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
5505 RCUWriter<BundleList> writer (_bundles);
5506 boost::shared_ptr<BundleList> b = writer.get_copy ();
5507 b->push_back (bundle);
5511 BundleAddedOrRemoved (); /* EMIT SIGNAL */
5518 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
5520 bool removed = false;
5523 RCUWriter<BundleList> writer (_bundles);
5524 boost::shared_ptr<BundleList> b = writer.get_copy ();
5525 BundleList::iterator i = find (b->begin(), b->end(), bundle);
5527 if (i != b->end()) {
5534 BundleAddedOrRemoved (); /* EMIT SIGNAL */
5540 boost::shared_ptr<Bundle>
5541 Session::bundle_by_name (string name) const
5543 boost::shared_ptr<BundleList> b = _bundles.reader ();
5545 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
5546 if ((*i)->name() == name) {
5551 return boost::shared_ptr<Bundle> ();
5555 Session::tempo_map_changed (const PropertyChange&)
5559 playlists->update_after_tempo_map_change ();
5561 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
5567 Session::gui_tempo_map_changed ()
5571 playlists->update_after_tempo_map_change ();
5573 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
5577 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
5579 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
5580 (*i)->recompute_frames_from_bbt ();
5584 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
5585 * the given count with the current block size.
5588 Session::ensure_buffers (ChanCount howmany)
5590 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
5594 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
5596 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5597 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
5602 Session::next_insert_id ()
5604 /* this doesn't really loop forever. just think about it */
5607 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < insert_bitset.size(); ++n) {
5608 if (!insert_bitset[n]) {
5609 insert_bitset[n] = true;
5615 /* none available, so resize and try again */
5617 insert_bitset.resize (insert_bitset.size() + 16, false);
5622 Session::next_send_id ()
5624 /* this doesn't really loop forever. just think about it */
5627 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < send_bitset.size(); ++n) {
5628 if (!send_bitset[n]) {
5629 send_bitset[n] = true;
5635 /* none available, so resize and try again */
5637 send_bitset.resize (send_bitset.size() + 16, false);
5642 Session::next_aux_send_id ()
5644 /* this doesn't really loop forever. just think about it */
5647 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < aux_send_bitset.size(); ++n) {
5648 if (!aux_send_bitset[n]) {
5649 aux_send_bitset[n] = true;
5655 /* none available, so resize and try again */
5657 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
5662 Session::next_return_id ()
5664 /* this doesn't really loop forever. just think about it */
5667 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < return_bitset.size(); ++n) {
5668 if (!return_bitset[n]) {
5669 return_bitset[n] = true;
5675 /* none available, so resize and try again */
5677 return_bitset.resize (return_bitset.size() + 16, false);
5682 Session::mark_send_id (uint32_t id)
5684 if (id >= send_bitset.size()) {
5685 send_bitset.resize (id+16, false);
5687 if (send_bitset[id]) {
5688 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
5690 send_bitset[id] = true;
5694 Session::mark_aux_send_id (uint32_t id)
5696 if (id >= aux_send_bitset.size()) {
5697 aux_send_bitset.resize (id+16, false);
5699 if (aux_send_bitset[id]) {
5700 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
5702 aux_send_bitset[id] = true;
5706 Session::mark_return_id (uint32_t id)
5708 if (id >= return_bitset.size()) {
5709 return_bitset.resize (id+16, false);
5711 if (return_bitset[id]) {
5712 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
5714 return_bitset[id] = true;
5718 Session::mark_insert_id (uint32_t id)
5720 if (id >= insert_bitset.size()) {
5721 insert_bitset.resize (id+16, false);
5723 if (insert_bitset[id]) {
5724 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
5726 insert_bitset[id] = true;
5730 Session::unmark_send_id (uint32_t id)
5732 if (id < send_bitset.size()) {
5733 send_bitset[id] = false;
5738 Session::unmark_aux_send_id (uint32_t id)
5740 if (id < aux_send_bitset.size()) {
5741 aux_send_bitset[id] = false;
5746 Session::unmark_return_id (uint32_t id)
5748 if (_state_of_the_state & Deletion) { return; }
5749 if (id < return_bitset.size()) {
5750 return_bitset[id] = false;
5755 Session::unmark_insert_id (uint32_t id)
5757 if (id < insert_bitset.size()) {
5758 insert_bitset[id] = false;
5763 Session::reset_native_file_format ()
5765 boost::shared_ptr<RouteList> rl = routes.reader ();
5767 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5768 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5770 /* don't save state as we do this, there's no point
5772 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
5773 tr->reset_write_sources (false);
5774 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
5780 Session::route_name_unique (string n) const
5782 boost::shared_ptr<RouteList> r = routes.reader ();
5784 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5785 if ((*i)->name() == n) {
5794 Session::route_name_internal (string n) const
5796 if (auditioner && auditioner->name() == n) {
5800 if (_click_io && _click_io->name() == n) {
5808 Session::freeze_all (InterThreadInfo& itt)
5810 boost::shared_ptr<RouteList> r = routes.reader ();
5812 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5814 boost::shared_ptr<Track> t;
5816 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
5817 /* XXX this is wrong because itt.progress will keep returning to zero at the start
5827 boost::shared_ptr<Region>
5828 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
5829 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
5830 InterThreadInfo& itt,
5831 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
5832 bool for_export, bool for_freeze)
5834 boost::shared_ptr<Region> result;
5835 boost::shared_ptr<Playlist> playlist;
5836 boost::shared_ptr<Source> source;
5837 ChanCount diskstream_channels (track.n_channels());
5838 framepos_t position;
5839 framecnt_t this_chunk;
5841 framepos_t latency_skip;
5843 framepos_t len = end - start;
5844 bool need_block_size_reset = false;
5845 ChanCount const max_proc = track.max_processor_streams ();
5846 string legal_playlist_name;
5847 string possible_path;
5850 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
5851 end, start) << endmsg;
5855 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
5856 include_endpoint, for_export, for_freeze);
5858 if (diskstream_channels.n(track.data_type()) < 1) {
5859 error << _("Cannot write a range with no data.") << endmsg;
5863 // block all process callback handling
5865 block_processing ();
5868 // synchronize with AudioEngine::process_callback()
5869 // make sure processing is not currently running
5870 // and processing_blocked() is honored before
5871 // acquiring thread buffers
5872 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5875 _bounce_processing_active = true;
5877 /* call tree *MUST* hold route_lock */
5879 if ((playlist = track.playlist()) == 0) {
5883 legal_playlist_name = legalize_for_path (playlist->name());
5885 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
5887 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
5888 string path = ((track.data_type() == DataType::AUDIO)
5889 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
5890 : new_midi_source_path (legal_playlist_name));
5897 source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
5900 catch (failed_constructor& err) {
5901 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
5905 srcs.push_back (source);
5908 /* tell redirects that care that we are about to use a much larger
5909 * blocksize. this will flush all plugins too, so that they are ready
5910 * to be used for this process.
5913 need_block_size_reset = true;
5914 track.set_block_size (bounce_chunk_size);
5915 _engine.main_thread()->get_buffers ();
5919 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5921 /* create a set of reasonably-sized buffers */
5922 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5923 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
5925 buffers.set_count (max_proc);
5927 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5928 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5929 boost::shared_ptr<MidiSource> ms;
5931 afs->prepare_for_peakfile_writes ();
5932 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5933 Source::Lock lock(ms->mutex());
5934 ms->mark_streaming_write_started(lock);
5938 while (to_do && !itt.cancel) {
5940 this_chunk = min (to_do, bounce_chunk_size);
5942 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
5946 start += this_chunk;
5947 to_do -= this_chunk;
5948 itt.progress = (float) (1.0 - ((double) to_do / len));
5950 if (latency_skip >= bounce_chunk_size) {
5951 latency_skip -= bounce_chunk_size;
5955 const framecnt_t current_chunk = this_chunk - latency_skip;
5958 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5959 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5960 boost::shared_ptr<MidiSource> ms;
5963 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
5966 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5967 Source::Lock lock(ms->mutex());
5969 const MidiBuffer& buf = buffers.get_midi(0);
5970 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
5971 Evoral::Event<framepos_t> ev = *i;
5972 ev.set_time(ev.time() - position);
5973 ms->append_event_frames(lock, ev, ms->timeline_position());
5980 /* post-roll, pick up delayed processor output */
5981 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5983 while (latency_skip && !itt.cancel) {
5984 this_chunk = min (latency_skip, bounce_chunk_size);
5985 latency_skip -= this_chunk;
5987 buffers.silence (this_chunk, 0);
5988 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
5991 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5992 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5995 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
6007 xnow = localtime (&now);
6009 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
6010 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6011 boost::shared_ptr<MidiSource> ms;
6014 afs->update_header (position, *xnow, now);
6015 afs->flush_header ();
6016 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
6017 Source::Lock lock(ms->mutex());
6018 ms->mark_streaming_write_completed(lock);
6022 /* construct a region to represent the bounced material */
6026 plist.add (Properties::start, 0);
6027 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
6028 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
6030 result = RegionFactory::create (srcs, plist);
6036 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
6037 (*src)->mark_for_remove ();
6038 (*src)->drop_references ();
6042 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
6043 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6046 afs->done_with_peakfile_writes ();
6050 _bounce_processing_active = false;
6052 if (need_block_size_reset) {
6053 _engine.main_thread()->drop_buffers ();
6054 track.set_block_size (get_block_size());
6057 unblock_processing ();
6063 Session::gain_automation_buffer() const
6065 return ProcessThread::gain_automation_buffer ();
6069 Session::trim_automation_buffer() const
6071 return ProcessThread::trim_automation_buffer ();
6075 Session::send_gain_automation_buffer() const
6077 return ProcessThread::send_gain_automation_buffer ();
6081 Session::pan_automation_buffer() const
6083 return ProcessThread::pan_automation_buffer ();
6087 Session::get_silent_buffers (ChanCount count)
6089 return ProcessThread::get_silent_buffers (count);
6093 Session::get_scratch_buffers (ChanCount count, bool silence)
6095 return ProcessThread::get_scratch_buffers (count, silence);
6099 Session::get_noinplace_buffers (ChanCount count)
6101 return ProcessThread::get_noinplace_buffers (count);
6105 Session::get_route_buffers (ChanCount count, bool silence)
6107 return ProcessThread::get_route_buffers (count, silence);
6112 Session::get_mix_buffers (ChanCount count)
6114 return ProcessThread::get_mix_buffers (count);
6118 Session::ntracks () const
6121 boost::shared_ptr<RouteList> r = routes.reader ();
6123 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
6124 if (boost::dynamic_pointer_cast<Track> (*i)) {
6133 Session::nbusses () const
6136 boost::shared_ptr<RouteList> r = routes.reader ();
6138 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
6139 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
6148 Session::add_automation_list(AutomationList *al)
6150 automation_lists[al->id()] = al;
6153 /** @return true if there is at least one record-enabled track, otherwise false */
6155 Session::have_rec_enabled_track () const
6157 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
6161 Session::have_rec_disabled_track () const
6163 return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
6166 /** Update the state of our rec-enabled tracks flag */
6168 Session::update_route_record_state ()
6170 boost::shared_ptr<RouteList> rl = routes.reader ();
6171 RouteList::iterator i = rl->begin();
6172 while (i != rl->end ()) {
6174 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6175 if (tr && tr->rec_enable_control()->get_value()) {
6182 int const old = g_atomic_int_get (&_have_rec_enabled_track);
6184 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
6186 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
6187 RecordStateChanged (); /* EMIT SIGNAL */
6190 for (i = rl->begin(); i != rl->end (); ++i) {
6191 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6192 if (tr && !tr->rec_enable_control()->get_value()) {
6197 g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
6199 bool record_arm_state_changed = (old != g_atomic_int_get (&_have_rec_enabled_track) );
6201 if (record_status() == Recording && record_arm_state_changed ) {
6202 RecordArmStateChanged ();
6208 Session::listen_position_changed ()
6210 ProcessorChangeBlocker pcb (this);
6211 boost::shared_ptr<RouteList> r = routes.reader ();
6212 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6213 (*i)->listen_position_changed ();
6218 Session::solo_control_mode_changed ()
6220 if (soloing() || listening()) {
6222 /* We can't use ::clear_all_solo_state() here because during
6223 session loading at program startup, that will queue a call
6224 to rt_clear_all_solo_state() that will not execute until
6225 AFTER solo states have been established (thus throwing away
6226 the session's saved solo state). So just explicitly turn
6229 set_controls (route_list_to_control_list (get_routes(), &Stripable::solo_control), 0.0, Controllable::NoGroup);
6231 clear_all_solo_state (get_routes());
6236 /** Called when a property of one of our route groups changes */
6238 Session::route_group_property_changed (RouteGroup* rg)
6240 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
6243 /** Called when a route is added to one of our route groups */
6245 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
6247 RouteAddedToRouteGroup (rg, r);
6250 /** Called when a route is removed from one of our route groups */
6252 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
6254 update_route_record_state ();
6255 RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
6257 if (!rg->has_control_master () && !rg->has_subgroup () && rg->empty()) {
6258 remove_route_group (*rg);
6262 boost::shared_ptr<RouteList>
6263 Session::get_tracks () const
6265 boost::shared_ptr<RouteList> rl = routes.reader ();
6266 boost::shared_ptr<RouteList> tl (new RouteList);
6268 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
6269 if (boost::dynamic_pointer_cast<Track> (*r)) {
6270 if (!(*r)->is_auditioner()) {
6278 boost::shared_ptr<RouteList>
6279 Session::get_routes_with_regions_at (framepos_t const p) const
6281 boost::shared_ptr<RouteList> r = routes.reader ();
6282 boost::shared_ptr<RouteList> rl (new RouteList);
6284 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6285 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6290 boost::shared_ptr<Playlist> pl = tr->playlist ();
6295 if (pl->has_region_at (p)) {
6304 Session::goto_end ()
6306 if (_session_range_location) {
6307 request_locate (_session_range_location->end(), false);
6309 request_locate (0, false);
6314 Session::goto_start (bool and_roll)
6316 if (_session_range_location) {
6317 request_locate (_session_range_location->start(), and_roll);
6319 request_locate (0, and_roll);
6324 Session::current_start_frame () const
6326 return _session_range_location ? _session_range_location->start() : 0;
6330 Session::current_end_frame () const
6332 return _session_range_location ? _session_range_location->end() : 0;
6336 Session::set_session_range_location (framepos_t start, framepos_t end)
6338 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
6339 _locations->add (_session_range_location);
6343 Session::step_edit_status_change (bool yn)
6349 send = (_step_editors == 0);
6354 send = (_step_editors == 1);
6357 if (_step_editors > 0) {
6363 StepEditStatusChange (val);
6369 Session::start_time_changed (framepos_t old)
6371 /* Update the auto loop range to match the session range
6372 (unless the auto loop range has been changed by the user)
6375 Location* s = _locations->session_range_location ();
6380 Location* l = _locations->auto_loop_location ();
6382 if (l && l->start() == old) {
6383 l->set_start (s->start(), true);
6389 Session::end_time_changed (framepos_t old)
6391 /* Update the auto loop range to match the session range
6392 (unless the auto loop range has been changed by the user)
6395 Location* s = _locations->session_range_location ();
6400 Location* l = _locations->auto_loop_location ();
6402 if (l && l->end() == old) {
6403 l->set_end (s->end(), true);
6408 std::vector<std::string>
6409 Session::source_search_path (DataType type) const
6413 if (session_dirs.size() == 1) {
6415 case DataType::AUDIO:
6416 sp.push_back (_session_dir->sound_path());
6418 case DataType::MIDI:
6419 sp.push_back (_session_dir->midi_path());
6423 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
6424 SessionDirectory sdir (i->path);
6426 case DataType::AUDIO:
6427 sp.push_back (sdir.sound_path());
6429 case DataType::MIDI:
6430 sp.push_back (sdir.midi_path());
6436 if (type == DataType::AUDIO) {
6437 const string sound_path_2X = _session_dir->sound_path_2X();
6438 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
6439 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
6440 sp.push_back (sound_path_2X);
6445 // now check the explicit (possibly user-specified) search path
6448 case DataType::AUDIO:
6449 sp += Searchpath(config.get_audio_search_path ());
6451 case DataType::MIDI:
6452 sp += Searchpath(config.get_midi_search_path ());
6460 Session::ensure_search_path_includes (const string& path, DataType type)
6469 case DataType::AUDIO:
6470 sp += Searchpath(config.get_audio_search_path ());
6472 case DataType::MIDI:
6473 sp += Searchpath (config.get_midi_search_path ());
6477 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
6478 /* No need to add this new directory if it has the same inode as
6479 an existing one; checking inode rather than name prevents duplicated
6480 directories when we are using symlinks.
6482 On Windows, I think we could just do if (*i == path) here.
6484 if (PBD::equivalent_paths (*i, path)) {
6492 case DataType::AUDIO:
6493 config.set_audio_search_path (sp.to_string());
6495 case DataType::MIDI:
6496 config.set_midi_search_path (sp.to_string());
6502 Session::remove_dir_from_search_path (const string& dir, DataType type)
6507 case DataType::AUDIO:
6508 sp = Searchpath(config.get_audio_search_path ());
6510 case DataType::MIDI:
6511 sp = Searchpath (config.get_midi_search_path ());
6518 case DataType::AUDIO:
6519 config.set_audio_search_path (sp.to_string());
6521 case DataType::MIDI:
6522 config.set_midi_search_path (sp.to_string());
6528 boost::shared_ptr<Speakers>
6529 Session::get_speakers()
6535 Session::unknown_processors () const
6539 boost::shared_ptr<RouteList> r = routes.reader ();
6540 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6541 list<string> t = (*i)->unknown_processors ();
6542 copy (t.begin(), t.end(), back_inserter (p));
6552 Session::update_latency (bool playback)
6555 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
6557 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _route_deletion_in_progress) {
6561 boost::shared_ptr<RouteList> r = routes.reader ();
6562 framecnt_t max_latency = 0;
6565 /* reverse the list so that we work backwards from the last route to run to the first */
6566 RouteList* rl = routes.reader().get();
6567 r.reset (new RouteList (*rl));
6568 reverse (r->begin(), r->end());
6571 /* compute actual latency values for the given direction and store them all in per-port
6572 structures. this will also publish the same values (to JACK) so that computation of latency
6573 for routes can consistently use public latency values.
6576 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6577 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
6580 /* because we latency compensate playback, our published playback latencies should
6581 be the same for all output ports - all material played back by ardour has
6582 the same latency, whether its caused by plugins or by latency compensation. since
6583 these may differ from the values computed above, reset all playback port latencies
6587 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
6589 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6590 (*i)->set_public_port_latencies (max_latency, playback);
6595 post_playback_latency ();
6599 post_capture_latency ();
6602 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
6606 Session::post_playback_latency ()
6608 set_worst_playback_latency ();
6610 boost::shared_ptr<RouteList> r = routes.reader ();
6612 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6613 if (!(*i)->is_auditioner() && ((*i)->active())) {
6614 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
6618 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6619 (*i)->set_latency_compensation (_worst_track_latency);
6624 Session::post_capture_latency ()
6626 set_worst_capture_latency ();
6628 /* reflect any changes in capture latencies into capture offsets
6631 boost::shared_ptr<RouteList> rl = routes.reader();
6632 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
6633 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6635 tr->set_capture_offset ();
6641 Session::initialize_latencies ()
6644 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
6645 update_latency (false);
6646 update_latency (true);
6649 set_worst_io_latencies ();
6653 Session::set_worst_io_latencies ()
6655 set_worst_playback_latency ();
6656 set_worst_capture_latency ();
6660 Session::set_worst_playback_latency ()
6662 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6666 _worst_output_latency = 0;
6668 if (!_engine.connected()) {
6672 boost::shared_ptr<RouteList> r = routes.reader ();
6674 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6675 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
6678 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
6682 Session::set_worst_capture_latency ()
6684 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6688 _worst_input_latency = 0;
6690 if (!_engine.connected()) {
6694 boost::shared_ptr<RouteList> r = routes.reader ();
6696 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6697 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
6700 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
6704 Session::update_latency_compensation (bool force_whole_graph)
6706 bool some_track_latency_changed = false;
6708 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6712 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
6714 _worst_track_latency = 0;
6716 boost::shared_ptr<RouteList> r = routes.reader ();
6718 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6719 if (!(*i)->is_auditioner() && ((*i)->active())) {
6721 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
6722 some_track_latency_changed = true;
6724 _worst_track_latency = max (tl, _worst_track_latency);
6728 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
6729 (some_track_latency_changed ? "yes" : "no")));
6731 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
6733 if (some_track_latency_changed || force_whole_graph) {
6734 _engine.update_latencies ();
6738 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6739 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6743 tr->set_capture_offset ();
6748 Session::session_name_is_legal (const string& path)
6750 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
6752 for (int i = 0; illegal_chars[i]; ++i) {
6753 if (path.find (illegal_chars[i]) != string::npos) {
6754 return illegal_chars[i];
6762 Session::notify_presentation_info_change ()
6764 if (deletion_in_progress()) {
6768 PresentationInfo::Change (); /* EMIT SIGNAL */
6769 reassign_track_numbers();
6771 #ifdef USE_TRACKS_CODE_FEATURES
6772 /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
6773 * if track order has been changed by user
6775 reconnect_existing_routes(true, true);
6781 Session::operation_in_progress (GQuark op) const
6783 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
6786 boost::shared_ptr<Port>
6787 Session::ltc_input_port () const
6789 return _ltc_input->nth (0);
6792 boost::shared_ptr<Port>
6793 Session::ltc_output_port () const
6795 return _ltc_output->nth (0);
6799 Session::reconnect_ltc_input ()
6803 string src = Config->get_ltc_source_port();
6805 _ltc_input->disconnect (this);
6807 if (src != _("None") && !src.empty()) {
6808 _ltc_input->nth (0)->connect (src);
6811 if ( ARDOUR::Profile->get_trx () ) {
6812 // Tracks need this signal to update timecode_source_dropdown
6813 MtcOrLtcInputPortChanged (); //emit signal
6819 Session::reconnect_ltc_output ()
6823 string src = Config->get_ltc_output_port();
6825 _ltc_output->disconnect (this);
6827 if (src != _("None") && !src.empty()) {
6828 _ltc_output->nth (0)->connect (src);
6834 Session::set_range_selection (framepos_t start, framepos_t end)
6836 _range_selection = Evoral::Range<framepos_t> (start, end);
6837 #ifdef USE_TRACKS_CODE_FEATURES
6838 follow_playhead_priority ();
6843 Session::set_object_selection (framepos_t start, framepos_t end)
6845 _object_selection = Evoral::Range<framepos_t> (start, end);
6846 #ifdef USE_TRACKS_CODE_FEATURES
6847 follow_playhead_priority ();
6852 Session::clear_range_selection ()
6854 _range_selection = Evoral::Range<framepos_t> (-1,-1);
6855 #ifdef USE_TRACKS_CODE_FEATURES
6856 follow_playhead_priority ();
6861 Session::clear_object_selection ()
6863 _object_selection = Evoral::Range<framepos_t> (-1,-1);
6864 #ifdef USE_TRACKS_CODE_FEATURES
6865 follow_playhead_priority ();
6870 Session::auto_connect_route (boost::shared_ptr<Route> route, bool connect_inputs,
6871 const ChanCount& input_start,
6872 const ChanCount& output_start,
6873 const ChanCount& input_offset,
6874 const ChanCount& output_offset)
6876 Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
6877 _auto_connect_queue.push (AutoConnectRequest (route, connect_inputs,
6878 input_start, output_start,
6879 input_offset, output_offset));
6881 auto_connect_thread_wakeup ();
6885 Session::auto_connect_thread_wakeup ()
6887 if (pthread_mutex_trylock (&_auto_connect_mutex) == 0) {
6888 pthread_cond_signal (&_auto_connect_cond);
6889 pthread_mutex_unlock (&_auto_connect_mutex);
6894 Session::queue_latency_recompute ()
6896 g_atomic_int_inc (&_latency_recompute_pending);
6897 auto_connect_thread_wakeup ();
6901 Session::auto_connect (const AutoConnectRequest& ar)
6903 boost::shared_ptr<Route> route = ar.route.lock();
6905 if (!route) { return; }
6907 if (!IO::connecting_legal) {
6911 /* If both inputs and outputs are auto-connected to physical ports,
6912 * use the max of input and output offsets to ensure auto-connected
6913 * port numbers always match up (e.g. the first audio input and the
6914 * first audio output of the route will have the same physical
6915 * port number). Otherwise just use the lowest input or output
6919 const bool in_out_physical =
6920 (Config->get_input_auto_connect() & AutoConnectPhysical)
6921 && (Config->get_output_auto_connect() & AutoConnectPhysical)
6922 && ar.connect_inputs;
6924 const ChanCount in_offset = in_out_physical
6925 ? ChanCount::max(ar.input_offset, ar.output_offset)
6928 const ChanCount out_offset = in_out_physical
6929 ? ChanCount::max(ar.input_offset, ar.output_offset)
6932 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
6933 vector<string> physinputs;
6934 vector<string> physoutputs;
6937 /* for connecting track inputs we only want MIDI ports marked
6941 get_physical_ports (physinputs, physoutputs, *t, MidiPortMusic);
6943 if (!physinputs.empty() && ar.connect_inputs) {
6944 uint32_t nphysical_in = physinputs.size();
6946 for (uint32_t i = ar.input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
6949 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
6950 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
6953 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
6959 if (!physoutputs.empty()) {
6960 uint32_t nphysical_out = physoutputs.size();
6961 for (uint32_t i = ar.output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
6965 * do not create new connections if we reached the limit of physical outputs
6968 if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
6969 ARDOUR::Profile->get_trx () &&
6970 ar.output_offset.get(*t) == nphysical_out ) {
6974 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
6975 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
6976 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
6977 /* master bus is audio only */
6978 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
6979 port = _master_out->input()->ports().port(*t,
6980 i % _master_out->input()->n_ports().get(*t))->name();
6984 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
6993 Session::auto_connect_thread_start ()
6995 if (_ac_thread_active) {
6999 while (!_auto_connect_queue.empty ()) {
7000 _auto_connect_queue.pop ();
7003 _ac_thread_active = true;
7004 if (pthread_create (&_auto_connect_thread, NULL, auto_connect_thread, this)) {
7005 _ac_thread_active = false;
7010 Session::auto_connect_thread_terminate ()
7012 if (!_ac_thread_active) {
7015 _ac_thread_active = false;
7018 Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
7019 while (!_auto_connect_queue.empty ()) {
7020 _auto_connect_queue.pop ();
7024 auto_connect_thread_wakeup ();
7027 pthread_join (_auto_connect_thread, &status);
7031 Session::auto_connect_thread (void *arg)
7033 Session *s = static_cast<Session *>(arg);
7034 s->auto_connect_thread_run ();
7040 Session::auto_connect_thread_run ()
7042 pthread_set_name (X_("autoconnect"));
7043 SessionEvent::create_per_thread_pool (X_("autoconnect"), 1024);
7044 PBD::notify_event_loops_about_thread_creation (pthread_self(), X_("autoconnect"), 1024);
7045 pthread_mutex_lock (&_auto_connect_mutex);
7046 while (_ac_thread_active) {
7048 if (!_auto_connect_queue.empty ()) {
7049 // Why would we need the process lock ??
7050 // A: if ports are added while we're connecting, the backend's iterator may be invalidated:
7051 // graph_order_callback() -> resort_routes() -> direct_feeds_according_to_reality () -> backend::connected_to()
7052 // All ardour-internal backends use a std::vector xxxAudioBackend::find_port()
7053 // We have control over those, but what does jack do?
7054 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
7056 Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
7057 while (!_auto_connect_queue.empty ()) {
7058 const AutoConnectRequest ar (_auto_connect_queue.front());
7059 _auto_connect_queue.pop ();
7066 if (!actively_recording ()) { // might not be needed,
7067 /* this is only used for updating plugin latencies, the
7068 * graph does not change. so it's safe in general.
7070 * .. update_latency_compensation () entails set_capture_offset()
7071 * which calls Diskstream::set_capture_offset () which
7072 * modifies the capture offset... which can be a proplem
7073 * in "prepare_to_stop"
7075 while (g_atomic_int_and (&_latency_recompute_pending, 0)) {
7076 update_latency_compensation ();
7080 AudioEngine::instance()->clear_pending_port_deletions ();
7082 pthread_cond_wait (&_auto_connect_cond, &_auto_connect_mutex);
7084 pthread_mutex_unlock (&_auto_connect_mutex);
7088 Session::cancel_all_solo ()
7092 get_stripables (sl);
7094 set_controls (stripable_list_to_control_list (sl, &Stripable::solo_control), 0.0, Controllable::NoGroup);
7095 clear_all_solo_state (routes.reader());