2 * Copyright (C) 1999-2019 Paul Davis <paul@linuxaudiosystems.com>
3 * Copyright (C) 2006-2007 Jesse Chappell <jesse@essej.net>
4 * Copyright (C) 2006-2009 Sampo Savolainen <v2@iki.fi>
5 * Copyright (C) 2006-2015 David Robillard <d@drobilla.net>
6 * Copyright (C) 2006-2016 Tim Mayberry <mojofunk@gmail.com>
7 * Copyright (C) 2007-2012 Carl Hetherington <carl@carlh.net>
8 * Copyright (C) 2008-2009 Hans Baier <hansfbaier@googlemail.com>
9 * Copyright (C) 2012-2019 Robin Gareus <robin@gareus.org>
10 * Copyright (C) 2013-2017 Nick Mainsbridge <mainsbridge@gmail.com>
11 * Copyright (C) 2014-2019 Ben Loftis <ben@harrisonconsoles.com>
12 * Copyright (C) 2015 GZharun <grygoriiz@wavesglobal.com>
13 * Copyright (C) 2016-2018 Len Ovens <len@ovenwerks.net>
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation; either version 2 of the License, or
18 * (at your option) any later version.
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
25 * You should have received a copy of the GNU General Public License along
26 * with this program; if not, write to the Free Software Foundation, Inc.,
27 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
36 #include <cstdio> /* sprintf(3) ... grrr */
42 #include <glibmm/threads.h>
43 #include <glibmm/miscutils.h>
44 #include <glibmm/fileutils.h>
46 #include <boost/algorithm/string/erase.hpp>
48 #include "pbd/basename.h"
49 #include "pbd/convert.h"
50 #include "pbd/error.h"
51 #include "pbd/file_utils.h"
53 #include "pbd/pthread_utils.h"
54 #include "pbd/search_path.h"
55 #include "pbd/stacktrace.h"
56 #include "pbd/stl_delete.h"
57 #include "pbd/replace_all.h"
58 #include "pbd/types_convert.h"
59 #include "pbd/unwind.h"
61 #include "ardour/amp.h"
62 #include "ardour/analyser.h"
63 #include "ardour/async_midi_port.h"
64 #include "ardour/audio_buffer.h"
65 #include "ardour/audio_port.h"
66 #include "ardour/audio_track.h"
67 #include "ardour/audioengine.h"
68 #include "ardour/audiofilesource.h"
69 #include "ardour/auditioner.h"
70 #include "ardour/boost_debug.h"
71 #include "ardour/buffer_manager.h"
72 #include "ardour/buffer_set.h"
73 #include "ardour/bundle.h"
74 #include "ardour/butler.h"
75 #include "ardour/click.h"
76 #include "ardour/control_protocol_manager.h"
77 #include "ardour/data_type.h"
78 #include "ardour/debug.h"
79 #include "ardour/disk_reader.h"
80 #include "ardour/directory_names.h"
81 #ifdef USE_TRACKS_CODE_FEATURES
82 #include "ardour/engine_state_controller.h"
84 #include "ardour/filename_extensions.h"
85 #include "ardour/gain_control.h"
86 #include "ardour/graph.h"
87 #include "ardour/luabindings.h"
88 #include "ardour/midiport_manager.h"
89 #include "ardour/scene_changer.h"
90 #include "ardour/midi_patch_manager.h"
91 #include "ardour/midi_track.h"
92 #include "ardour/midi_ui.h"
93 #include "ardour/operations.h"
94 #include "ardour/playlist.h"
95 #include "ardour/playlist_factory.h"
96 #include "ardour/plugin.h"
97 #include "ardour/plugin_insert.h"
98 #include "ardour/process_thread.h"
99 #include "ardour/profile.h"
100 #include "ardour/rc_configuration.h"
101 #include "ardour/recent_sessions.h"
102 #include "ardour/region.h"
103 #include "ardour/region_factory.h"
104 #include "ardour/revision.h"
105 #include "ardour/route_graph.h"
106 #include "ardour/route_group.h"
107 #include "ardour/rt_tasklist.h"
108 #include "ardour/send.h"
109 #include "ardour/selection.h"
110 #include "ardour/session.h"
111 #include "ardour/session_directory.h"
112 #include "ardour/session_playlists.h"
113 #include "ardour/smf_source.h"
114 #include "ardour/solo_isolate_control.h"
115 #include "ardour/source_factory.h"
116 #include "ardour/speakers.h"
117 #include "ardour/tempo.h"
118 #include "ardour/ticker.h"
119 #include "ardour/transport_master.h"
120 #include "ardour/track.h"
121 #include "ardour/types_convert.h"
122 #include "ardour/user_bundle.h"
123 #include "ardour/utils.h"
124 #include "ardour/vca_manager.h"
125 #include "ardour/vca.h"
127 #include "midi++/port.h"
128 #include "midi++/mmc.h"
130 #include "LuaBridge/LuaBridge.h"
132 #include "pbd/i18n.h"
134 #include <glibmm/checksum.h>
143 using namespace ARDOUR;
146 bool Session::_disable_all_loaded_plugins = false;
147 bool Session::_bypass_all_loaded_plugins = false;
148 guint Session::_name_id_counter = 0;
150 PBD::Signal1<int,uint32_t> Session::AudioEngineSetupRequired;
151 PBD::Signal1<void,std::string> Session::Dialog;
152 PBD::Signal0<int> Session::AskAboutPendingState;
153 PBD::Signal2<int, samplecnt_t, samplecnt_t> Session::AskAboutSampleRateMismatch;
154 PBD::Signal2<void, samplecnt_t, samplecnt_t> Session::NotifyAboutSampleRateMismatch;
155 PBD::Signal0<void> Session::SendFeedback;
156 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
158 PBD::Signal1<void, samplepos_t> Session::StartTimeChanged;
159 PBD::Signal1<void, samplepos_t> Session::EndTimeChanged;
160 PBD::Signal2<void,std::string, std::string> Session::Exported;
161 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
162 PBD::Signal0<void> Session::Quit;
163 PBD::Signal0<void> Session::FeedbackDetected;
164 PBD::Signal0<void> Session::SuccessfulGraphSort;
165 PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
167 const samplecnt_t Session::bounce_chunk_size = 8192;
168 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
169 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
171 // seconds should be added after the region exceeds end marker
172 #ifdef USE_TRACKS_CODE_FEATURES
173 const uint32_t Session::session_end_shift = 5;
175 const uint32_t Session::session_end_shift = 0;
178 /** @param snapshot_name Snapshot name, without .ardour suffix */
179 Session::Session (AudioEngine &eng,
180 const string& fullpath,
181 const string& snapshot_name,
182 BusProfile* bus_profile,
184 : _playlists (new SessionPlaylists)
186 , process_function (&Session::process_with_events)
187 , _bounce_processing_active (false)
188 , waiting_for_sync_offset (false)
189 , _base_sample_rate (0)
190 , _nominal_sample_rate (0)
191 , _current_sample_rate (0)
192 , transport_sub_state (0)
193 , _record_status (Disabled)
194 , _transport_sample (0)
196 , _session_range_location (0)
197 , _session_range_is_free (true)
199 , _remaining_latency_preroll (0)
200 , _engine_speed (1.0)
201 , _transport_speed (0)
202 , _default_transport_speed (1.0)
203 , _last_transport_speed (0)
204 , _signalled_varispeed (0)
205 , _target_transport_speed (0.0)
206 , auto_play_legal (false)
207 , _requested_return_sample (-1)
208 , current_block_size (0)
209 , _worst_output_latency (0)
210 , _worst_input_latency (0)
211 , _worst_route_latency (0)
212 , _send_latency_changes (0)
213 , _have_captured (false)
214 , _non_soloed_outs_muted (false)
217 , _solo_isolated_cnt (0)
219 , _was_seamless (Config->get_seamless_loop ())
220 , _under_nsm_control (false)
222 , transport_master_tracking_state (Stopped)
223 , master_wait_end (0)
224 , post_export_sync (false)
225 , post_export_position (0)
227 , _export_rolling (false)
228 , _realtime_export (false)
229 , _region_export (false)
230 , _export_preroll (0)
231 , _pre_export_mmc_enabled (false)
232 , _name (snapshot_name)
234 , _send_qf_mtc (false)
235 , _pframes_since_last_mtc (0)
237 , loop_changing (false)
239 , _session_dir (new SessionDirectory (fullpath))
240 , _current_snapshot_name (snapshot_name)
242 , state_was_pending (false)
243 , _state_of_the_state (StateOfTheState (CannotSave | InitialConnecting | Loading))
245 , _save_queued (false)
246 , _last_roll_location (0)
247 , _last_roll_or_reversal_location (0)
248 , _last_record_location (0)
249 , pending_auto_loop (false)
250 , _mempool ("Session", 3145728)
251 , lua (lua_newstate (&PBD::ReallocPool::lalloc, &_mempool))
253 , _butler (new Butler (*this))
254 , _post_transport_work (0)
255 , _locations (new Locations (*this))
256 , _ignore_skips_updates (false)
257 , _rt_thread_active (false)
258 , _rt_emit_pending (false)
259 , _ac_thread_active (0)
260 , _latency_recompute_pending (0)
262 , outbound_mtc_timecode_frame (0)
263 , next_quarter_frame_to_send (-1)
264 , _samples_per_timecode_frame (0)
265 , _frames_per_hour (0)
266 , _timecode_frames_per_hour (0)
267 , last_timecode_valid (false)
268 , last_timecode_when (0)
269 , _send_timecode_update (false)
281 , ltc_timecode_offset (0)
282 , ltc_timecode_negative_offset (false)
283 , midi_control_ui (0)
285 , _all_route_group (new RouteGroup (*this, "all"))
286 , routes (new RouteList)
287 , _adding_routes_in_progress (false)
288 , _reconnecting_routes_in_progress (false)
289 , _route_deletion_in_progress (false)
290 , destructive_index (0)
291 , _track_number_decimals(1)
292 , default_fade_steepness (0)
293 , default_fade_msecs (0)
294 , _total_free_4k_blocks (0)
295 , _total_free_4k_blocks_uncertain (false)
296 , no_questions_about_missing_files (false)
299 , _bundles (new BundleList)
300 , _bundle_xml_node (0)
303 , _click_rec_only (false)
305 , click_emphasis_data (0)
307 , click_emphasis_length (0)
308 , _clicks_cleared (0)
309 , _count_in_samples (0)
310 , _play_range (false)
311 , _range_selection (-1,-1)
312 , _object_selection (-1,-1)
313 , _preroll_record_trim_len (0)
314 , _count_in_once (false)
316 , first_file_data_format_reset (true)
317 , first_file_header_format_reset (true)
318 , have_looped (false)
319 , _have_rec_enabled_track (false)
320 , _have_rec_disabled_track (true)
322 , _suspend_timecode_transmission (0)
323 , _speakers (new Speakers)
324 , _ignore_route_processor_changes (0)
329 , _vca_manager (new VCAManager (*this))
330 , _selection (new CoreSelection (*this))
331 , _global_locate_pending (false)
335 created_with = string_compose ("%1 %2", PROGRAM_NAME, revision);
337 pthread_mutex_init (&_rt_emit_mutex, 0);
338 pthread_cond_init (&_rt_emit_cond, 0);
340 pthread_mutex_init (&_auto_connect_mutex, 0);
341 pthread_cond_init (&_auto_connect_cond, 0);
343 init_name_id_counter (1); // reset for new sessions, start at 1
344 VCA::set_next_vca_number (1); // reset for new sessions, start at 1
346 pre_engine_init (fullpath); // sets _is_new
352 Stateful::loading_state_version = CURRENT_SESSION_FILE_VERSION;
354 #ifdef USE_TRACKS_CODE_FEATURES
355 sr = EngineStateController::instance()->get_current_sample_rate();
357 if (ensure_engine (sr, true)) {
359 throw SessionException (_("Cannot connect to audio/midi engine"));
362 // set samplerate for plugins added early
363 // e.g from templates or MB channelstrip
364 set_block_size (_engine.samples_per_cycle());
365 set_sample_rate (_engine.sample_rate());
367 if (create (mix_template, bus_profile)) {
369 throw SessionException (_("Session initialization failed"));
372 /* if a mix template was provided, then ::create() will
373 * have copied it into the session and we need to load it
374 * so that we have the state ready for ::set_state()
375 * after the engine is started.
377 * Note that we do NOT try to get the sample rate from
378 * the template at this time, though doing so would
379 * be easy if we decided this was an appropriate part
383 if (!mix_template.empty()) {
385 if (load_state (_current_snapshot_name)) {
386 throw SessionException (_("Failed to load template/snapshot state"));
388 } catch (PBD::unknown_enumeration& e) {
389 throw SessionException (_("Failed to parse template/snapshot state"));
391 store_recent_templates (mix_template);
394 /* load default session properties - if any */
399 if (load_state (_current_snapshot_name)) {
400 throw SessionException (_("Failed to load state"));
403 /* try to get sample rate from XML state so that we
404 * can influence the SR if we set up the audio
409 XMLProperty const * prop;
410 XMLNode const * root (state_tree->root());
411 if ((prop = root->property (X_("sample-rate"))) != 0) {
412 sr = atoi (prop->value());
416 if (ensure_engine (sr, false)) {
418 throw SessionException (_("Cannot connect to audio/midi engine"));
422 int err = post_engine_init ();
427 throw SessionException (string_compose (_("Cannot initialize session/engine: %1"), _("Failed to create background threads.")));
431 throw SessionException (string_compose (_("Cannot initialize session/engine: %1"), _("Invalid TempoMap in session-file.")));
434 throw SessionException (string_compose (_("Cannot initialize session/engine: %1"), _("Invalid or corrupt session state.")));
437 throw SessionException (string_compose (_("Cannot initialize session/engine: %1"), _("Port registration failed.")));
440 throw SessionException (string_compose (_("Cannot initialize session/engine: %1"), _("Unexpected exception during session setup, possibly invalid audio/midi engine parameters. Please see stdout/stderr for details")));
445 store_recent_sessions (_name, _path);
447 bool was_dirty = dirty();
450 PresentationInfo::Change.connect_same_thread (*this, boost::bind (&Session::notify_presentation_info_change, this));
452 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
453 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
456 DirtyChanged (); /* EMIT SIGNAL */
459 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
460 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
462 Send::ChangedLatency.connect_same_thread (*this, boost::bind (&Session::send_latency_compensation_change, this));
464 emit_thread_start ();
465 auto_connect_thread_start ();
467 /* hook us up to the engine since we are now completely constructed */
469 BootMessage (_("Connect to engine"));
471 _engine.set_session (this);
472 _engine.reset_timebase ();
474 #ifdef USE_TRACKS_CODE_FEATURES
476 EngineStateController::instance()->set_session(this);
479 if ( ARDOUR::Profile->get_trx () ) {
481 /* Waves Tracks: fill session with tracks basing on the amount of inputs.
482 * each available input must have corresponding track when session starts.
485 uint32_t how_many (0);
487 std::vector<std::string> inputs;
488 EngineStateController::instance()->get_physical_audio_inputs(inputs);
490 how_many = inputs.size();
492 list<boost::shared_ptr<AudioTrack> > tracks;
494 // Track names after driver
495 if (Config->get_tracks_auto_naming() == NameAfterDriver) {
496 string track_name = "";
497 for (std::vector<string>::size_type i = 0; i < inputs.size(); ++i) {
499 track_name = inputs[i];
500 replace_all (track_name, "system:capture", "");
502 list<boost::shared_ptr<AudioTrack> > single_track = new_audio_track (1, 1, Normal, 0, 1, track_name);
503 tracks.insert(tracks.begin(), single_track.front());
505 } else { // Default track names
506 tracks = new_audio_track (1, 1, Normal, 0, how_many, string());
509 if (tracks.size() != how_many) {
511 throw failed_constructor ();
517 ensure_subdirs (); // archived or zipped sessions may lack peaks/ analysis/ etc
519 if (!mix_template.empty ()) {
520 /* ::create() unsets _is_new after creating the session.
521 * But for templated sessions, the sample-rate is initially unset
522 * (not read from template), so we need to save it (again).
530 BootMessage (_("Session loading complete"));
542 Session::next_name_id ()
544 return g_atomic_int_add (&_name_id_counter, 1);
548 Session::name_id_counter ()
550 return g_atomic_int_get (&_name_id_counter);
554 Session::init_name_id_counter (guint n)
556 g_atomic_int_set (&_name_id_counter, n);
560 Session::ensure_engine (uint32_t desired_sample_rate, bool isnew)
562 if (_engine.current_backend() == 0) {
563 /* backend is unknown ... */
564 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
565 if (r.get_value_or (-1) != 0) {
568 } else if (!isnew && _engine.running() && _engine.sample_rate () == desired_sample_rate) {
570 } else if (_engine.setup_required()) {
571 /* backend is known, but setup is needed */
572 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
573 if (r.get_value_or (-1) != 0) {
576 } else if (!_engine.running()) {
577 if (_engine.start()) {
582 /* at this point the engine should be running */
584 if (!_engine.running()) {
588 return immediately_post_engine ();
593 Session::immediately_post_engine ()
595 /* Do various initializations that should take place directly after we
596 * know that the engine is running, but before we either create a
597 * session or set state for an existing one.
600 _rt_tasklist.reset (new RTTaskList ());
602 if (how_many_dsp_threads () > 1) {
603 /* For now, only create the graph if we are using >1 DSP threads, as
604 it is a bit slower than the old code with 1 thread.
606 _process_graph.reset (new Graph (*this));
609 /* every time we reconnect, recompute worst case output latencies */
611 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
613 if (synced_to_engine()) {
614 _engine.transport_stop ();
617 if (config.get_jack_time_master()) {
618 _engine.transport_locate (_transport_sample);
622 BootMessage (_("Set up LTC"));
624 BootMessage (_("Set up Click"));
626 BootMessage (_("Set up standard connections"));
630 catch (failed_constructor& err) {
634 /* TODO, connect in different thread. (PortRegisteredOrUnregistered may be in RT context)
636 _engine.PortRegisteredOrUnregistered.connect_same_thread (*this, boost::bind (&Session::setup_bundles, this));
644 vector<void*> debug_pointers;
646 /* if we got to here, leaving pending capture state around
650 remove_pending_capture_state ();
654 _state_of_the_state = StateOfTheState (CannotSave | Deletion);
657 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
661 /* disconnect from any and all signals that we are connected to */
663 Port::PortSignalDrop (); /* EMIT SIGNAL */
666 /* shutdown control surface protocols while we still have ports
667 * and the engine to move data to any devices.
670 /* remove I/O objects before unsetting the engine session */
672 _ltc_output.reset ();
674 ControlProtocolManager::instance().drop_protocols ();
676 /* stop auto dis/connecting */
677 auto_connect_thread_terminate ();
679 MIDI::Name::MidiPatchManager::instance().remove_search_path(session_directory().midi_patch_path());
681 _engine.remove_session ();
683 #ifdef USE_TRACKS_CODE_FEATURES
684 EngineStateController::instance()->remove_session();
687 /* deregister all ports - there will be no process or any other
688 * callbacks from the engine any more.
691 Port::PortDrop (); /* EMIT SIGNAL */
694 Glib::Threads::Mutex::Lock lm (controllables_lock);
695 for (Controllables::iterator i = controllables.begin(); i != controllables.end(); ++i) {
696 (*i)->DropReferences (); /* EMIT SIGNAL */
698 controllables.clear ();
701 /* clear history so that no references to objects are held any more */
705 /* clear state tree so that no references to objects are held any more */
711 /* unregister all lua functions, drop held references (if any) */
712 Glib::Threads::Mutex::Lock tm (lua_lock, Glib::Threads::TRY_LOCK);
714 lua.do_command ("Session = nil");
722 lua.collect_garbage ();
725 /* reset dynamic state version back to default */
726 Stateful::loading_state_version = 0;
728 _butler->drop_references ();
732 delete _all_route_group;
734 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
735 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
739 if (click_data != default_click) {
740 delete [] click_data;
743 if (click_emphasis_data != default_click_emphasis) {
744 delete [] click_emphasis_data;
749 /* need to remove auditioner before monitoring section
750 * otherwise it is re-connected.
751 * Note: If a session was never successfully loaded, there
752 * may not yet be an auditioner.
755 auditioner->drop_references ();
759 /* drop references to routes held by the monitoring section
760 * specifically _monitor_out aux/listen references */
761 remove_monitor_section();
763 /* clear out any pending dead wood from RCU managed objects */
768 DiskReader::free_working_buffers();
770 /* tell everyone who is still standing that we're about to die */
773 /* tell everyone to drop references and delete objects as we go */
775 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
776 RegionFactory::delete_all_regions ();
778 /* Do this early so that VCAs no longer hold references to routes */
780 DEBUG_TRACE (DEBUG::Destruction, "delete vcas\n");
783 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
785 /* reset these three references to special routes before we do the usual route delete thing */
787 _master_out.reset ();
788 _monitor_out.reset ();
791 RCUWriter<RouteList> writer (routes);
792 boost::shared_ptr<RouteList> r = writer.get_copy ();
794 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
795 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
796 (*i)->drop_references ();
800 /* writer goes out of scope and updates master */
805 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
806 Glib::Threads::Mutex::Lock lm (source_lock);
807 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
808 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
809 i->second->drop_references ();
815 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
818 emit_thread_terminate ();
820 pthread_cond_destroy (&_rt_emit_cond);
821 pthread_mutex_destroy (&_rt_emit_mutex);
823 pthread_cond_destroy (&_auto_connect_cond);
824 pthread_mutex_destroy (&_auto_connect_mutex);
826 delete _scene_changer; _scene_changer = 0;
827 delete midi_control_ui; midi_control_ui = 0;
829 delete _mmc; _mmc = 0;
830 delete _midi_ports; _midi_ports = 0;
831 delete _locations; _locations = 0;
836 /* clear event queue, the session is gone, nobody is interested in
837 * those anymore, but they do leak memory if not removed
839 while (!immediate_events.empty ()) {
840 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
841 SessionEvent *ev = immediate_events.front ();
842 DEBUG_TRACE (DEBUG::SessionEvents, string_compose ("Drop event: %1\n", enum_2_string (ev->type)));
843 immediate_events.pop_front ();
847 case SessionEvent::AutoLoop:
848 case SessionEvent::Skip:
849 case SessionEvent::PunchIn:
850 case SessionEvent::PunchOut:
851 case SessionEvent::StopOnce:
852 case SessionEvent::RangeStop:
853 case SessionEvent::RangeLocate:
857 case SessionEvent::RealTimeOperation:
864 del = del && !_remove_event (ev);
872 /* unregister all dropped ports, process pending port deletion. */
873 // this may call ARDOUR::Port::drop ... jack_port_unregister ()
874 // jack1 cannot cope with removing ports while processing
875 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
876 AudioEngine::instance()->clear_pending_port_deletions ();
879 DEBUG_TRACE (DEBUG::Destruction, "delete selection\n");
883 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
886 Controllable::dump_registry ();
889 BOOST_SHOW_POINTERS ();
893 Session::setup_ltc ()
897 _ltc_output.reset (new IO (*this, X_("LTC Out"), IO::Output));
899 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC Out"))) != 0) {
900 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
903 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
904 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
905 // TODO use auto-connect thread
906 reconnect_ltc_output ();
910 /* fix up names of LTC ports because we don't want the normal
911 * IO style of NAME/TYPE-{in,out}N
914 _ltc_output->nth (0)->set_name (X_("LTC-out"));
918 Session::setup_click ()
922 boost::shared_ptr<AutomationList> gl (new AutomationList (Evoral::Parameter (GainAutomation)));
923 boost::shared_ptr<GainControl> gain_control = boost::shared_ptr<GainControl> (new GainControl (*this, Evoral::Parameter(GainAutomation), gl));
925 _click_io.reset (new ClickIO (*this, X_("Click")));
926 _click_gain.reset (new Amp (*this, _("Fader"), gain_control, true));
927 _click_gain->activate ();
929 setup_click_state (state_tree->root());
931 setup_click_state (0);
936 Session::setup_click_state (const XMLNode* node)
938 const XMLNode* child = 0;
940 if (node && (child = find_named_node (*node, "Click")) != 0) {
942 /* existing state for Click */
945 if (Stateful::loading_state_version < 3000) {
946 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
948 const XMLNodeList& children (child->children());
949 XMLNodeList::const_iterator i = children.begin();
950 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
952 if (i != children.end()) {
953 c = _click_gain->set_state (**i, Stateful::loading_state_version);
959 _clicking = Config->get_clicking ();
963 error << _("could not setup Click I/O") << endmsg;
970 /* default state for Click: dual-mono to first 2 physical outputs */
973 _engine.get_physical_outputs (DataType::AUDIO, outs);
975 for (uint32_t physport = 0; physport < 2; ++physport) {
976 if (outs.size() > physport) {
977 if (_click_io->add_port (outs[physport], this)) {
978 // relax, even though its an error
983 if (_click_io->n_ports () > ChanCount::ZERO) {
984 _clicking = Config->get_clicking ();
990 Session::get_physical_ports (vector<string>& inputs, vector<string>& outputs, DataType type,
991 MidiPortFlags include, MidiPortFlags exclude)
993 _engine.get_physical_inputs (type, inputs, include, exclude);
994 _engine.get_physical_outputs (type, outputs, include, exclude);
998 Session::setup_bundles ()
1002 RCUWriter<BundleList> writer (_bundles);
1003 boost::shared_ptr<BundleList> b = writer.get_copy ();
1004 for (BundleList::iterator i = b->begin(); i != b->end();) {
1005 if (boost::dynamic_pointer_cast<UserBundle>(*i)) {
1013 vector<string> inputs[DataType::num_types];
1014 vector<string> outputs[DataType::num_types];
1016 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1017 get_physical_ports (inputs[i], outputs[i], DataType (DataType::Symbol (i)),
1018 MidiPortFlags (0), /* no specific inclusions */
1019 MidiPortFlags (MidiPortControl|MidiPortVirtual) /* exclude control & virtual ports */
1023 /* Create a set of Bundle objects that map
1024 to the physical I/O currently available. We create both
1025 mono and stereo bundles, so that the common cases of mono
1026 and stereo tracks get bundles to put in their mixer strip
1027 in / out menus. There may be a nicer way of achieving that;
1028 it doesn't really scale that well to higher channel counts
1031 /* mono output bundles */
1033 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
1035 std::string pn = _engine.get_pretty_name_by_name (outputs[DataType::AUDIO][np]);
1037 snprintf (buf, sizeof (buf), _("out %s"), pn.c_str());
1039 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
1042 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
1043 c->add_channel (_("mono"), DataType::AUDIO);
1044 c->set_port (0, outputs[DataType::AUDIO][np]);
1046 add_bundle (c, false);
1049 /* stereo output bundles */
1051 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
1052 if (np + 1 < outputs[DataType::AUDIO].size()) {
1054 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
1055 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
1056 c->add_channel (_("L"), DataType::AUDIO);
1057 c->set_port (0, outputs[DataType::AUDIO][np]);
1058 c->add_channel (_("R"), DataType::AUDIO);
1059 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
1061 add_bundle (c, false);
1065 /* mono input bundles */
1067 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
1069 std::string pn = _engine.get_pretty_name_by_name (inputs[DataType::AUDIO][np]);
1071 snprintf (buf, sizeof (buf), _("in %s"), pn.c_str());
1073 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
1076 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
1077 c->add_channel (_("mono"), DataType::AUDIO);
1078 c->set_port (0, inputs[DataType::AUDIO][np]);
1080 add_bundle (c, false);
1083 /* stereo input bundles */
1085 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
1086 if (np + 1 < inputs[DataType::AUDIO].size()) {
1088 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
1090 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
1091 c->add_channel (_("L"), DataType::AUDIO);
1092 c->set_port (0, inputs[DataType::AUDIO][np]);
1093 c->add_channel (_("R"), DataType::AUDIO);
1094 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
1096 add_bundle (c, false);
1100 /* MIDI input bundles */
1102 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
1103 string n = inputs[DataType::MIDI][np];
1105 std::string pn = _engine.get_pretty_name_by_name (n);
1109 boost::erase_first (n, X_("alsa_pcm:"));
1111 boost::shared_ptr<Bundle> c (new Bundle (n, false));
1112 c->add_channel ("", DataType::MIDI);
1113 c->set_port (0, inputs[DataType::MIDI][np]);
1114 add_bundle (c, false);
1117 /* MIDI output bundles */
1119 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
1120 string n = outputs[DataType::MIDI][np];
1121 std::string pn = _engine.get_pretty_name_by_name (n);
1125 boost::erase_first (n, X_("alsa_pcm:"));
1127 boost::shared_ptr<Bundle> c (new Bundle (n, true));
1128 c->add_channel ("", DataType::MIDI);
1129 c->set_port (0, outputs[DataType::MIDI][np]);
1130 add_bundle (c, false);
1133 // we trust the backend to only calls us if there's a change
1134 BundleAddedOrRemoved (); /* EMIT SIGNAL */
1138 Session::auto_connect_master_bus ()
1140 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
1144 // Waves Tracks: Do not connect master bas for Tracks if AutoConnectMaster option is not set
1145 // In this case it means "Multi Out" output mode
1146 if (ARDOUR::Profile->get_trx() && !(Config->get_output_auto_connect() & AutoConnectMaster) ) {
1150 /* if requested auto-connect the outputs to the first N physical ports.
1153 uint32_t limit = _master_out->n_outputs().n_total();
1154 vector<string> outputs[DataType::num_types];
1156 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1157 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1160 for (uint32_t n = 0; n < limit; ++n) {
1161 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
1163 if (outputs[p->type()].size() > n) {
1164 connect_to = outputs[p->type()][n];
1167 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
1168 if (_master_out->output()->connect (p, connect_to, this)) {
1169 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
1178 Session::remove_monitor_section ()
1180 if (!_monitor_out || Profile->get_trx()) {
1184 /* allow deletion when session is unloaded */
1185 if (!_engine.running() && !deletion_in_progress ()) {
1186 error << _("Cannot remove monitor section while the engine is offline.") << endmsg;
1190 /* force reversion to Solo-In-Place */
1191 Config->set_solo_control_is_listen_control (false);
1193 /* if we are auditioning, cancel it ... this is a workaround
1194 to a problem (auditioning does not execute the process graph,
1195 which is needed to remove routes when using >1 core for processing)
1199 if (!deletion_in_progress ()) {
1200 /* Hold process lock while doing this so that we don't hear bits and
1201 * pieces of audio as we work on each route.
1204 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1206 /* Connect tracks to monitor section. Note that in an
1207 existing session, the internal sends will already exist, but we want the
1208 routes to notice that they connect to the control out specifically.
1212 boost::shared_ptr<RouteList> r = routes.reader ();
1213 ProcessorChangeBlocker pcb (this, false);
1215 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
1217 if ((*x)->is_monitor()) {
1219 } else if ((*x)->is_master()) {
1222 (*x)->remove_aux_or_listen (_monitor_out);
1227 remove_route (_monitor_out);
1228 if (deletion_in_progress ()) {
1232 auto_connect_master_bus ();
1235 auditioner->connect ();
1238 MonitorBusAddedOrRemoved (); /* EMIT SIGNAL */
1242 Session::add_monitor_section ()
1246 if (!_engine.running()) {
1247 error << _("Cannot create monitor section while the engine is offline.") << endmsg;
1251 if (_monitor_out || !_master_out || Profile->get_trx()) {
1255 boost::shared_ptr<Route> r (new Route (*this, _("Monitor"), PresentationInfo::MonitorOut, DataType::AUDIO));
1261 BOOST_MARK_ROUTE(r);
1264 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1265 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1266 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1268 error << _("Cannot create monitor section. 'Monitor' Port name is not unique.") << endmsg;
1273 add_routes (rl, false, false, false, 0);
1275 assert (_monitor_out);
1277 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
1278 are undefined, at best.
1281 uint32_t limit = _monitor_out->n_inputs().n_audio();
1285 /* connect the inputs to the master bus outputs. this
1286 * represents a separate data feed from the internal sends from
1287 * each route. as of jan 2011, it allows the monitor section to
1288 * conditionally ignore either the internal sends or the normal
1289 * input feed, but we should really find a better way to do
1293 _master_out->output()->disconnect (this);
1295 for (uint32_t n = 0; n < limit; ++n) {
1296 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1297 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1300 string connect_to = o->name();
1301 if (_monitor_out->input()->connect (p, connect_to, this)) {
1302 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1310 /* if monitor section is not connected, connect it to physical outs
1313 if ((Config->get_auto_connect_standard_busses () || Profile->get_mixbus ()) && !_monitor_out->output()->connected ()) {
1315 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1317 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1320 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1322 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1323 Config->get_monitor_bus_preferred_bundle())
1329 /* Monitor bus is audio only */
1331 vector<string> outputs[DataType::num_types];
1333 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1334 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1337 uint32_t mod = outputs[DataType::AUDIO].size();
1338 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1342 for (uint32_t n = 0; n < limit; ++n) {
1344 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1346 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1347 connect_to = outputs[DataType::AUDIO][n % mod];
1350 if (!connect_to.empty()) {
1351 if (_monitor_out->output()->connect (p, connect_to, this)) {
1352 error << string_compose (
1353 _("cannot connect control output %1 to %2"),
1364 /* Hold process lock while doing this so that we don't hear bits and
1365 * pieces of audio as we work on each route.
1368 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1370 /* Connect tracks to monitor section. Note that in an
1371 existing session, the internal sends will already exist, but we want the
1372 routes to notice that they connect to the control out specifically.
1376 boost::shared_ptr<RouteList> rls = routes.reader ();
1378 ProcessorChangeBlocker pcb (this, false /* XXX */);
1380 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1382 if ((*x)->is_monitor()) {
1384 } else if ((*x)->is_master()) {
1387 (*x)->enable_monitor_send ();
1392 auditioner->connect ();
1395 MonitorBusAddedOrRemoved (); /* EMIT SIGNAL */
1399 Session::reset_monitor_section ()
1401 /* Process lock should be held by the caller.*/
1403 if (!_monitor_out || Profile->get_trx()) {
1407 uint32_t limit = _master_out->n_outputs().n_audio();
1409 /* connect the inputs to the master bus outputs. this
1410 * represents a separate data feed from the internal sends from
1411 * each route. as of jan 2011, it allows the monitor section to
1412 * conditionally ignore either the internal sends or the normal
1413 * input feed, but we should really find a better way to do
1417 _master_out->output()->disconnect (this);
1418 _monitor_out->output()->disconnect (this);
1420 // monitor section follow master bus - except midi
1421 ChanCount mon_chn (_master_out->output()->n_ports());
1422 mon_chn.set_midi (0);
1424 _monitor_out->input()->ensure_io (mon_chn, false, this);
1425 _monitor_out->output()->ensure_io (mon_chn, false, this);
1427 for (uint32_t n = 0; n < limit; ++n) {
1428 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1429 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1432 string connect_to = o->name();
1433 if (_monitor_out->input()->connect (p, connect_to, this)) {
1434 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1441 /* connect monitor section to physical outs
1444 if (Config->get_auto_connect_standard_busses()) {
1446 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1448 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1451 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1453 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1454 Config->get_monitor_bus_preferred_bundle())
1460 /* Monitor bus is audio only */
1462 vector<string> outputs[DataType::num_types];
1464 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1465 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1468 uint32_t mod = outputs[DataType::AUDIO].size();
1469 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1473 for (uint32_t n = 0; n < limit; ++n) {
1475 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1477 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1478 connect_to = outputs[DataType::AUDIO][n % mod];
1481 if (!connect_to.empty()) {
1482 if (_monitor_out->output()->connect (p, connect_to, this)) {
1483 error << string_compose (
1484 _("cannot connect control output %1 to %2"),
1495 /* Connect tracks to monitor section. Note that in an
1496 existing session, the internal sends will already exist, but we want the
1497 routes to notice that they connect to the control out specifically.
1501 boost::shared_ptr<RouteList> rls = routes.reader ();
1503 ProcessorChangeBlocker pcb (this, false);
1505 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1507 if ((*x)->is_monitor()) {
1509 } else if ((*x)->is_master()) {
1512 (*x)->enable_monitor_send ();
1518 Session::add_master_bus (ChanCount const& count)
1520 if (master_out ()) {
1526 boost::shared_ptr<Route> r (new Route (*this, _("Master"), PresentationInfo::MasterOut, DataType::AUDIO));
1531 BOOST_MARK_ROUTE(r);
1534 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1535 r->input()->ensure_io (count, false, this);
1536 r->output()->ensure_io (count, false, this);
1540 add_routes (rl, false, false, false, PresentationInfo::max_order);
1545 Session::hookup_io ()
1547 /* stop graph reordering notifications from
1548 causing resorts, etc.
1551 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
1555 /* we delay creating the auditioner till now because
1556 it makes its own connections to ports.
1560 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
1562 throw failed_constructor ();
1567 catch (failed_constructor& err) {
1568 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
1572 /* load bundles, which we may have postponed earlier on */
1573 if (_bundle_xml_node) {
1574 load_bundles (*_bundle_xml_node);
1575 delete _bundle_xml_node;
1578 /* Tell all IO objects to connect themselves together */
1580 IO::enable_connecting ();
1582 /* Now tell all "floating" ports to connect to whatever
1583 they should be connected to.
1586 AudioEngine::instance()->reconnect_ports ();
1588 /* Anyone who cares about input state, wake up and do something */
1590 IOConnectionsComplete (); /* EMIT SIGNAL */
1592 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
1594 /* now handle the whole enchilada as if it was one
1595 graph reorder event.
1600 /* update the full solo state, which can't be
1601 correctly determined on a per-route basis, but
1602 needs the global overview that only the session
1606 update_route_solo_state ();
1610 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
1612 boost::shared_ptr<Track> track = wp.lock ();
1617 boost::shared_ptr<Playlist> playlist;
1619 if ((playlist = track->playlist()) != 0) {
1620 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
1621 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
1622 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
1627 Session::record_enabling_legal () const
1629 if (Config->get_all_safe()) {
1636 Session::set_track_monitor_input_status (bool yn)
1638 boost::shared_ptr<RouteList> rl = routes.reader ();
1639 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1640 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1641 if (tr && tr->rec_enable_control()->get_value()) {
1642 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1643 tr->request_input_monitoring (yn);
1649 Session::auto_punch_start_changed (Location* location)
1651 replace_event (SessionEvent::PunchIn, location->start());
1653 if (get_record_enabled() && config.get_punch_in() && !actively_recording ()) {
1654 /* capture start has been changed, so save new pending state */
1655 save_state ("", true);
1660 Session::auto_punch_end_changed (Location* location)
1662 replace_event (SessionEvent::PunchOut, location->end());
1666 Session::auto_punch_changed (Location* location)
1668 auto_punch_start_changed (location);
1669 auto_punch_end_changed (location);
1672 /** @param loc A loop location.
1673 * @param pos Filled in with the start time of the required fade-out (in session samples).
1674 * @param length Filled in with the length of the required fade-out.
1677 Session::auto_loop_declick_range (Location* loc, samplepos_t & pos, samplepos_t & length)
1679 pos = max (loc->start(), loc->end() - 64);
1680 length = loc->end() - pos;
1684 Session::auto_loop_changed (Location* location)
1686 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1689 auto_loop_declick_range (location, dcp, dcl);
1691 bool rolling = transport_rolling ();
1693 if (rolling && play_loop) {
1695 if (_transport_sample < location->start() || _transport_sample > location->end()) {
1696 // relocate to beginning of loop
1697 clear_events (SessionEvent::LocateRoll);
1698 request_locate (location->start(), true);
1702 clear_events (SessionEvent::AutoLoop);
1705 /* possibly move playhead if not rolling; if we are rolling we'll move
1706 to the loop start on stop if that is appropriate.
1711 if (!rolling && select_playhead_priority_target (pos)) {
1712 if (pos == location->start()) {
1713 request_locate (pos);
1717 last_loopend = location->end();
1722 Session::set_auto_punch_location (Location* location)
1726 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1727 punch_connections.drop_connections();
1728 existing->set_auto_punch (false, this);
1729 clear_events (SessionEvent::PunchIn);
1730 clear_events (SessionEvent::PunchOut);
1731 auto_punch_location_changed (0);
1736 if (location == 0) {
1740 if (location->end() <= location->start()) {
1741 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1745 punch_connections.drop_connections ();
1747 location->StartChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, location));
1748 location->EndChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, location));
1749 location->Changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, location));
1751 location->set_auto_punch (true, this);
1753 auto_punch_changed (location);
1755 auto_punch_location_changed (location);
1759 Session::set_session_extents (samplepos_t start, samplepos_t end)
1762 if ((existing = _locations->session_range_location()) == 0) {
1763 //if there is no existing session, we need to make a new session location (should never happen)
1764 existing = new Location (*this, 0, 0, _("session"), Location::IsSessionRange, 0);
1768 error << _("Session: you can't use that location for session start/end)") << endmsg;
1772 existing->set( start, end );
1778 Session::set_auto_loop_location (Location* location)
1782 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1783 loop_connections.drop_connections ();
1784 existing->set_auto_loop (false, this);
1785 remove_event (existing->end(), SessionEvent::AutoLoop);
1788 auto_loop_declick_range (existing, dcp, dcl);
1789 auto_loop_location_changed (0);
1794 if (location == 0) {
1798 if (location->end() <= location->start()) {
1799 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1803 last_loopend = location->end();
1805 loop_connections.drop_connections ();
1807 location->StartChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1808 location->EndChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1809 location->Changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1810 location->FlagsChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1812 location->set_auto_loop (true, this);
1814 if (Config->get_loop_is_mode() && play_loop && Config->get_seamless_loop()) {
1815 // set all tracks to use internal looping
1816 boost::shared_ptr<RouteList> rl = routes.reader ();
1817 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1818 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1819 if (tr && !tr->is_private_route()) {
1820 tr->set_loop (location);
1825 /* take care of our stuff first */
1827 auto_loop_changed (location);
1829 /* now tell everyone else */
1831 auto_loop_location_changed (location);
1835 Session::update_marks (Location*)
1841 Session::update_skips (Location* loc, bool consolidate)
1843 if (_ignore_skips_updates) {
1847 Locations::LocationList skips;
1850 PBD::Unwinder<bool> uw (_ignore_skips_updates, true);
1851 consolidate_skips (loc);
1854 sync_locations_to_skips ();
1860 Session::consolidate_skips (Location* loc)
1862 Locations::LocationList all_locations = _locations->list ();
1864 for (Locations::LocationList::iterator l = all_locations.begin(); l != all_locations.end(); ) {
1866 if (!(*l)->is_skip ()) {
1871 /* don't test against self */
1878 switch (Evoral::coverage ((*l)->start(), (*l)->end(), loc->start(), loc->end())) {
1879 case Evoral::OverlapInternal:
1880 case Evoral::OverlapExternal:
1881 case Evoral::OverlapStart:
1882 case Evoral::OverlapEnd:
1883 /* adjust new location to cover existing one */
1884 loc->set_start (min (loc->start(), (*l)->start()));
1885 loc->set_end (max (loc->end(), (*l)->end()));
1886 /* we don't need this one any more */
1887 _locations->remove (*l);
1888 /* the location has been deleted, so remove reference to it in our local list */
1889 l = all_locations.erase (l);
1892 case Evoral::OverlapNone:
1900 Session::sync_locations_to_skips ()
1902 /* This happens asynchronously (in the audioengine thread). After the clear is done, we will call
1903 * Session::_sync_locations_to_skips() from the audioengine thread.
1905 clear_events (SessionEvent::Skip, boost::bind (&Session::_sync_locations_to_skips, this));
1909 Session::_sync_locations_to_skips ()
1911 /* called as a callback after existing Skip events have been cleared from a realtime audioengine thread */
1913 Locations::LocationList const & locs (_locations->list());
1915 for (Locations::LocationList::const_iterator i = locs.begin(); i != locs.end(); ++i) {
1917 Location* location = *i;
1919 if (location->is_skip() && location->is_skipping()) {
1920 SessionEvent* ev = new SessionEvent (SessionEvent::Skip, SessionEvent::Add, location->start(), location->end(), 1.0);
1928 Session::location_added (Location *location)
1930 if (location->is_auto_punch()) {
1931 set_auto_punch_location (location);
1934 if (location->is_auto_loop()) {
1935 set_auto_loop_location (location);
1938 if (location->is_session_range()) {
1939 /* no need for any signal handling or event setting with the session range,
1940 because we keep a direct reference to it and use its start/end directly.
1942 _session_range_location = location;
1945 if (location->is_mark()) {
1946 /* listen for per-location signals that require us to do any * global updates for marks */
1948 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1949 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1950 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1951 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1952 location->PositionLockStyleChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1955 if (location->is_range_marker()) {
1956 /* listen for per-location signals that require us to do any * global updates for marks */
1958 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1959 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1960 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1961 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1962 location->PositionLockStyleChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1965 if (location->is_skip()) {
1966 /* listen for per-location signals that require us to update skip-locate events */
1968 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1969 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1970 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1971 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, false));
1972 location->PositionLockStyleChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1974 update_skips (location, true);
1981 Session::location_removed (Location *location)
1983 if (location->is_auto_loop()) {
1984 set_auto_loop_location (0);
1986 set_track_loop (false);
1991 if (location->is_auto_punch()) {
1992 set_auto_punch_location (0);
1995 if (location->is_session_range()) {
1996 /* this is never supposed to happen */
1997 error << _("programming error: session range removed!") << endl;
2000 if (location->is_skip()) {
2002 update_skips (location, false);
2009 Session::locations_changed ()
2011 _locations->apply (*this, &Session::_locations_changed);
2015 Session::_locations_changed (const Locations::LocationList& locations)
2017 /* There was some mass-change in the Locations object.
2019 * We might be re-adding a location here but it doesn't actually matter
2020 * for all the locations that the Session takes an interest in.
2024 PBD::Unwinder<bool> protect_ignore_skip_updates (_ignore_skips_updates, true);
2025 for (Locations::LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
2026 location_added (*i);
2030 update_skips (NULL, false);
2034 Session::enable_record ()
2036 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
2037 /* no recording at anything except normal speed */
2042 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
2044 if (rs == Recording) {
2048 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
2050 _last_record_location = _transport_sample;
2051 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
2053 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
2054 set_track_monitor_input_status (true);
2057 RecordStateChanged ();
2064 Session::set_all_tracks_record_enabled (bool enable )
2066 boost::shared_ptr<RouteList> rl = routes.reader();
2067 set_controls (route_list_to_control_list (rl, &Stripable::rec_enable_control), enable, Controllable::NoGroup);
2071 Session::disable_record (bool rt_context, bool force)
2075 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
2077 if (!Config->get_latched_record_enable () || force) {
2078 g_atomic_int_set (&_record_status, Disabled);
2079 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
2081 if (rs == Recording) {
2082 g_atomic_int_set (&_record_status, Enabled);
2086 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
2087 set_track_monitor_input_status (false);
2090 RecordStateChanged (); /* emit signal */
2095 Session::step_back_from_record ()
2097 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
2099 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
2100 set_track_monitor_input_status (false);
2103 RecordStateChanged (); /* emit signal */
2108 Session::maybe_enable_record (bool rt_context)
2110 if (_step_editors > 0) {
2114 g_atomic_int_set (&_record_status, Enabled);
2116 /* This function is currently called from somewhere other than an RT thread.
2117 * (except maybe lua scripts, which can use rt_context = true)
2118 * This save_state() call therefore doesn't impact anything. Doing it here
2119 * means that we save pending state of which sources the next record will use,
2120 * which gives us some chance of recovering from a crash during the record.
2124 save_state ("", true);
2127 if (_transport_speed) {
2128 if (!config.get_punch_in()) {
2132 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
2133 RecordStateChanged (); /* EMIT SIGNAL */
2140 Session::audible_sample (bool* latent_locate) const
2142 if (latent_locate) {
2143 *latent_locate = false;
2148 if (synced_to_engine()) {
2149 /* Note: this is basically just sync-to-JACK */
2150 ret = _engine.transport_sample();
2152 ret = _transport_sample;
2157 if (!transport_rolling()) {
2161 #if 0 // TODO looping
2162 if (_transport_speed > 0.0f) {
2163 if (play_loop && have_looped) {
2164 /* the play-position wrapped at the loop-point
2165 * ardour is already playing the beginning of the loop,
2166 * but due to playback latency, the "audible frame"
2167 * is still at the end of the loop.
2169 Location *location = _locations->auto_loop_location();
2170 sampleoffset_t lo = location->start() - ret;
2172 ret = location->end () - lo;
2173 if (latent_locate) {
2174 *latent_locate = true;
2178 } else if (_transport_speed < 0.0f) {
2179 /* XXX wot? no backward looping? */
2183 return std::max ((samplepos_t)0, ret);
2187 Session::preroll_samples (samplepos_t pos) const
2189 const float pr = Config->get_preroll_seconds();
2190 if (pos >= 0 && pr < 0) {
2191 const Tempo& tempo = _tempo_map->tempo_at_sample (pos);
2192 const Meter& meter = _tempo_map->meter_at_sample (pos);
2193 return meter.samples_per_bar (tempo, sample_rate()) * -pr;
2198 return pr * sample_rate();
2202 Session::set_sample_rate (samplecnt_t frames_per_second)
2204 /** \fn void Session::set_sample_size(samplecnt_t)
2205 the AudioEngine object that calls this guarantees
2206 that it will not be called while we are also in
2207 ::process(). Its fine to do things that block
2211 if (_base_sample_rate == 0) {
2212 _base_sample_rate = frames_per_second;
2214 else if (_base_sample_rate != frames_per_second && frames_per_second != _nominal_sample_rate) {
2215 NotifyAboutSampleRateMismatch (_base_sample_rate, frames_per_second);
2217 _nominal_sample_rate = frames_per_second;
2222 reset_write_sources (false);
2224 // XXX we need some equivalent to this, somehow
2225 // SndFileSource::setup_standard_crossfades (frames_per_second);
2229 /* XXX need to reset/reinstantiate all LADSPA plugins */
2233 Session::set_block_size (pframes_t nframes)
2235 /* the AudioEngine guarantees
2236 that it will not be called while we are also in
2237 ::process(). It is therefore fine to do things that block
2242 current_block_size = nframes;
2246 boost::shared_ptr<RouteList> r = routes.reader ();
2248 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2249 (*i)->set_block_size (nframes);
2252 boost::shared_ptr<RouteList> rl = routes.reader ();
2253 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2254 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2256 tr->set_block_size (nframes);
2260 set_worst_io_latencies ();
2266 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase, bool sends_only)
2268 boost::shared_ptr<Route> r2;
2270 if (r1->feeds (rbase) && rbase->feeds (r1)) {
2271 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
2275 /* make a copy of the existing list of routes that feed r1 */
2277 Route::FedBy existing (r1->fed_by());
2279 /* for each route that feeds r1, recurse, marking it as feeding
2283 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
2284 if (!(r2 = i->r.lock ())) {
2285 /* (*i) went away, ignore it */
2289 /* r2 is a route that feeds r1 which somehow feeds base. mark
2290 base as being fed by r2
2293 rbase->add_fed_by (r2, i->sends_only || sends_only);
2297 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
2301 if (r1->feeds (r2) && r2->feeds (r1)) {
2305 /* now recurse, so that we can mark base as being fed by
2306 all routes that feed r2
2309 trace_terminal (r2, rbase, i->sends_only || sends_only);
2316 Session::resort_routes ()
2318 /* don't do anything here with signals emitted
2319 by Routes during initial setup or while we
2320 are being destroyed.
2323 if (inital_connect_or_deletion_in_progress ()) {
2327 if (_route_deletion_in_progress) {
2332 RCUWriter<RouteList> writer (routes);
2333 boost::shared_ptr<RouteList> r = writer.get_copy ();
2334 resort_routes_using (r);
2335 /* writer goes out of scope and forces update */
2339 if (DEBUG_ENABLED(DEBUG::Graph)) {
2340 boost::shared_ptr<RouteList> rl = routes.reader ();
2341 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2342 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
2344 const Route::FedBy& fb ((*i)->fed_by());
2346 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
2347 boost::shared_ptr<Route> sf = f->r.lock();
2349 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
2358 /** This is called whenever we need to rebuild the graph of how we will process
2360 * @param r List of routes, in any order.
2364 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
2366 /* We are going to build a directed graph of our routes;
2367 this is where the edges of that graph are put.
2372 /* Go through all routes doing two things:
2374 * 1. Collect the edges of the route graph. Each of these edges
2375 * is a pair of routes, one of which directly feeds the other
2376 * either by a JACK connection or by an internal send.
2378 * 2. Begin the process of making routes aware of which other
2379 * routes directly or indirectly feed them. This information
2380 * is used by the solo code.
2383 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2385 /* Clear out the route's list of direct or indirect feeds */
2386 (*i)->clear_fed_by ();
2388 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
2390 bool via_sends_only;
2392 /* See if this *j feeds *i according to the current state of the JACK
2393 connections and internal sends.
2395 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
2396 /* add the edge to the graph (part #1) */
2397 edges.add (*j, *i, via_sends_only);
2398 /* tell the route (for part #2) */
2399 (*i)->add_fed_by (*j, via_sends_only);
2404 /* Attempt a topological sort of the route graph */
2405 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
2407 if (sorted_routes) {
2408 /* We got a satisfactory topological sort, so there is no feedback;
2411 Note: the process graph rechain does not require a
2412 topologically-sorted list, but hey ho.
2414 if (_process_graph) {
2415 _process_graph->rechain (sorted_routes, edges);
2418 _current_route_graph = edges;
2420 /* Complete the building of the routes' lists of what directly
2421 or indirectly feeds them.
2423 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2424 trace_terminal (*i, *i, false);
2427 *r = *sorted_routes;
2430 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
2431 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2432 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 presentation order %2\n", (*i)->name(), (*i)->presentation_info().order()));
2436 SuccessfulGraphSort (); /* EMIT SIGNAL */
2439 /* The topological sort failed, so we have a problem. Tell everyone
2440 and stick to the old graph; this will continue to be processed, so
2441 until the feedback is fixed, what is played back will not quite
2442 reflect what is actually connected. Note also that we do not
2443 do trace_terminal here, as it would fail due to an endless recursion,
2444 so the solo code will think that everything is still connected
2448 FeedbackDetected (); /* EMIT SIGNAL */
2453 /** Find a route name starting with \a base, maybe followed by the
2454 * lowest \a id. \a id will always be added if \a definitely_add_number
2455 * is true on entry; otherwise it will only be added if required
2456 * to make the name unique.
2458 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
2459 * The available route name with the lowest ID will be used, and \a id
2460 * will be set to the ID.
2462 * \return false if a route name could not be found, and \a track_name
2463 * and \a id do not reflect a free route name.
2466 Session::find_route_name (string const & base, uint32_t& id, string& name, bool definitely_add_number)
2468 /* the base may conflict with ports that do not belong to existing
2469 routes, but hidden objects like the click track. So check port names
2470 before anything else.
2473 for (map<string,bool>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
2474 if (base == reserved->first) {
2475 /* Check if this reserved name already exists, and if
2476 so, disallow it without a numeric suffix.
2478 if (!reserved->second || route_by_name (reserved->first)) {
2479 definitely_add_number = true;
2488 /* if we have "base 1" already, it doesn't make sense to add "base"
2489 * if "base 1" has been deleted, adding "base" is no worse than "base 1"
2491 if (!definitely_add_number && route_by_name (base) == 0 && (route_by_name (string_compose("%1 1", base)) == 0)) {
2492 /* just use the base */
2498 name = string_compose ("%1 %2", base, id);
2500 if (route_by_name (name) == 0) {
2506 } while (id < (UINT_MAX-1));
2511 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
2513 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
2515 in = ChanCount::ZERO;
2516 out = ChanCount::ZERO;
2518 boost::shared_ptr<RouteList> r = routes.reader ();
2520 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2521 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2525 assert (!tr->is_auditioner()); // XXX remove me
2526 in += tr->n_inputs();
2527 out += tr->n_outputs();
2532 Session::default_track_name_pattern (DataType t)
2535 case DataType::AUDIO:
2536 if (Profile->get_trx()) {
2543 case DataType::MIDI:
2550 /** Caller must not hold process lock
2551 * @param name_template string to use for the start of the name, or "" to use "MIDI".
2552 * @param instrument plugin info for the instrument to insert pre-fader, if any
2554 list<boost::shared_ptr<MidiTrack> >
2555 Session::new_midi_track (const ChanCount& input, const ChanCount& output, bool strict_io,
2556 boost::shared_ptr<PluginInfo> instrument, Plugin::PresetRecord* pset,
2557 RouteGroup* route_group, uint32_t how_many,
2558 string name_template, PresentationInfo::order_t order,
2562 uint32_t track_id = 0;
2564 RouteList new_routes;
2565 list<boost::shared_ptr<MidiTrack> > ret;
2567 const string name_pattern = default_track_name_pattern (DataType::MIDI);
2568 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
2571 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, use_number)) {
2572 error << "cannot find name for new midi track" << endmsg;
2576 boost::shared_ptr<MidiTrack> track;
2579 track.reset (new MidiTrack (*this, track_name, mode));
2581 if (track->init ()) {
2586 track->set_strict_io (true);
2589 BOOST_MARK_TRACK (track);
2592 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2593 if (track->input()->ensure_io (input, false, this)) {
2594 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
2598 if (track->output()->ensure_io (output, false, this)) {
2599 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
2605 route_group->add (track);
2608 new_routes.push_back (track);
2609 ret.push_back (track);
2612 catch (failed_constructor &err) {
2613 error << _("Session: could not create new midi track.") << endmsg;
2617 catch (AudioEngine::PortRegistrationFailure& pfe) {
2619 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;
2627 if (!new_routes.empty()) {
2628 StateProtector sp (this);
2629 if (Profile->get_trx()) {
2630 add_routes (new_routes, false, false, false, order);
2632 add_routes (new_routes, true, true, false, order);
2636 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
2637 PluginPtr plugin = instrument->load (*this);
2639 warning << "Failed to add Synth Plugin to newly created track." << endmsg;
2643 plugin->load_preset (*pset);
2645 boost::shared_ptr<PluginInsert> pi (new PluginInsert (*this, plugin));
2647 pi->set_strict_io (true);
2650 (*r)->add_processor (pi, PreFader);
2652 if (Profile->get_mixbus () && pi->configured () && pi->output_streams().n_audio() > 2) {
2653 (*r)->move_instrument_down (false);
2663 Session::new_midi_route (RouteGroup* route_group, uint32_t how_many, string name_template, bool strict_io,
2664 boost::shared_ptr<PluginInfo> instrument, Plugin::PresetRecord* pset,
2665 PresentationInfo::Flag flag, PresentationInfo::order_t order)
2668 uint32_t bus_id = 0;
2672 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Midi Bus");
2675 if (!find_route_name (name_template.empty () ? _("Midi Bus") : name_template, ++bus_id, bus_name, use_number)) {
2676 error << "cannot find name for new midi bus" << endmsg;
2681 boost::shared_ptr<Route> bus (new Route (*this, bus_name, flag, DataType::AUDIO)); // XXX Editor::add_routes is not ready for ARDOUR::DataType::MIDI
2688 bus->set_strict_io (true);
2691 BOOST_MARK_ROUTE(bus);
2694 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2696 if (bus->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
2697 error << _("cannot configure new midi bus input") << endmsg;
2702 if (bus->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
2703 error << _("cannot configure new midi bus output") << endmsg;
2709 route_group->add (bus);
2712 bus->add_internal_return ();
2713 ret.push_back (bus);
2716 catch (failed_constructor &err) {
2717 error << _("Session: could not create new audio route.") << endmsg;
2721 catch (AudioEngine::PortRegistrationFailure& pfe) {
2722 error << pfe.what() << endmsg;
2732 StateProtector sp (this);
2733 add_routes (ret, false, false, false, order);
2736 for (RouteList::iterator r = ret.begin(); r != ret.end(); ++r) {
2737 PluginPtr plugin = instrument->load (*this);
2739 warning << "Failed to add Synth Plugin to newly created track." << endmsg;
2743 plugin->load_preset (*pset);
2745 boost::shared_ptr<PluginInsert> pi (new PluginInsert (*this, plugin));
2747 pi->set_strict_io (true);
2750 (*r)->add_processor (pi, PreFader);
2752 if (Profile->get_mixbus () && pi->configured () && pi->output_streams().n_audio() > 2) {
2753 (*r)->move_instrument_down (false);
2765 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2767 boost::shared_ptr<Route> midi_track (wmt.lock());
2773 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2775 if (change.after.n_audio() <= change.before.n_audio()) {
2779 /* new audio ports: make sure the audio goes somewhere useful,
2780 * unless the user has no-auto-connect selected.
2782 * The existing ChanCounts don't matter for this call as they are only
2783 * to do with matching input and output indices, and we are only changing
2786 auto_connect_route (midi_track, false, ChanCount(), change.before);
2790 #ifdef USE_TRACKS_CODE_FEATURES
2793 compare_routes_by_remote_id (const boost::shared_ptr<Route>& route1, const boost::shared_ptr<Route>& route2)
2795 return route1->remote_control_id() < route2->remote_control_id();
2799 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2801 // it is not allowed to perform connection
2802 if (!IO::connecting_legal) {
2806 // if we are deleting routes we will call this once at the end
2807 if (_route_deletion_in_progress) {
2811 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2817 // We need to disconnect the route's inputs and outputs first
2818 // basing on autoconnect configuration
2819 bool reconnectIputs = !(Config->get_input_auto_connect() & ManualConnect) && reconnect_inputs;
2820 bool reconnectOutputs = !(Config->get_output_auto_connect() & ManualConnect) && reconnect_outputs;
2822 ChanCount existing_inputs;
2823 ChanCount existing_outputs;
2824 count_existing_track_channels (existing_inputs, existing_outputs);
2826 //ChanCount inputs = ChanCount::ZERO;
2827 //ChanCount outputs = ChanCount::ZERO;
2829 RouteList existing_routes = *routes.reader ();
2830 existing_routes.sort (compare_routes_by_remote_id);
2833 PBD::Unwinder<bool> protect_ignore_changes (_reconnecting_routes_in_progress, true);
2835 vector<string> physinputs;
2836 vector<string> physoutputs;
2838 EngineStateController::instance()->get_physical_audio_outputs(physoutputs);
2839 EngineStateController::instance()->get_physical_audio_inputs(physinputs);
2841 uint32_t input_n = 0;
2842 uint32_t output_n = 0;
2843 RouteList::iterator rIter = existing_routes.begin();
2844 const AutoConnectOption current_input_auto_connection (Config->get_input_auto_connect());
2845 const AutoConnectOption current_output_auto_connection (Config->get_output_auto_connect());
2846 for (; rIter != existing_routes.end(); ++rIter) {
2847 if (*rIter == _master_out || *rIter == _monitor_out ) {
2851 if (current_output_auto_connection == AutoConnectPhysical) {
2852 (*rIter)->amp()->deactivate();
2853 } else if (current_output_auto_connection == AutoConnectMaster) {
2854 (*rIter)->amp()->activate();
2857 if (reconnectIputs) {
2858 (*rIter)->input()->disconnect (this); //GZ: check this; could be heavy
2860 for (uint32_t route_input_n = 0; route_input_n < (*rIter)->n_inputs().get(DataType::AUDIO); ++route_input_n) {
2862 if (current_input_auto_connection & AutoConnectPhysical) {
2864 if ( input_n == physinputs.size() ) {
2868 string port = physinputs[input_n];
2870 if (port.empty() ) {
2871 error << "Physical Input number "<< input_n << " is unavailable and cannot be connected" << endmsg;
2874 //GZ: check this; could be heavy
2875 (*rIter)->input()->connect ((*rIter)->input()->ports().port(DataType::AUDIO, route_input_n), port, this);
2881 if (reconnectOutputs) {
2883 //normalize route ouptuts: reduce the amount outputs to be equal to the amount of inputs
2884 if (current_output_auto_connection & AutoConnectPhysical) {
2886 //GZ: check this; could be heavy
2887 (*rIter)->output()->disconnect (this);
2888 size_t route_inputs_count = (*rIter)->n_inputs().get(DataType::AUDIO);
2890 //GZ: check this; could be heavy
2891 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, route_inputs_count), false, this );
2893 } else if (current_output_auto_connection & AutoConnectMaster){
2895 if (!reconnect_master) {
2899 //GZ: check this; could be heavy
2900 (*rIter)->output()->disconnect (this);
2903 uint32_t master_inputs_count = _master_out->n_inputs().get(DataType::AUDIO);
2904 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, master_inputs_count), false, this );
2906 error << error << "Master bus is not available" << endmsg;
2911 for (uint32_t route_output_n = 0; route_output_n < (*rIter)->n_outputs().get(DataType::AUDIO); ++route_output_n) {
2912 if (current_output_auto_connection & AutoConnectPhysical) {
2914 if ( output_n == physoutputs.size() ) {
2918 string port = physoutputs[output_n];
2920 if (port.empty() ) {
2921 error << "Physical Output number "<< output_n << " is unavailable and cannot be connected" << endmsg;
2924 //GZ: check this; could be heavy
2925 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2928 } else if (current_output_auto_connection & AutoConnectMaster) {
2930 if ( route_output_n == _master_out->n_inputs().get(DataType::AUDIO) ) {
2934 // connect to master bus
2935 string port = _master_out->input()->ports().port(DataType::AUDIO, route_output_n)->name();
2937 if (port.empty() ) {
2938 error << "MasterBus Input number "<< route_output_n << " is unavailable and cannot be connected" << endmsg;
2942 //GZ: check this; could be heavy
2943 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2950 _master_out->output()->disconnect (this);
2951 auto_connect_master_bus ();
2956 session_routes_reconnected (); /* EMIT SIGNAL */
2960 Session::reconnect_midi_scene_ports(bool inputs)
2964 boost::shared_ptr<MidiPort> scene_in_ptr = scene_in();
2966 scene_in_ptr->disconnect_all ();
2968 std::vector<EngineStateController::MidiPortState> midi_port_states;
2969 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2971 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2973 for (; state_iter != midi_port_states.end(); ++state_iter) {
2974 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2975 scene_in_ptr->connect (state_iter->name);
2982 boost::shared_ptr<MidiPort> scene_out_ptr = scene_out();
2984 if (scene_out_ptr ) {
2985 scene_out_ptr->disconnect_all ();
2987 std::vector<EngineStateController::MidiPortState> midi_port_states;
2988 EngineStateController::instance()->get_physical_midi_output_states (midi_port_states);
2990 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2992 for (; state_iter != midi_port_states.end(); ++state_iter) {
2993 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2994 scene_out_ptr->connect (state_iter->name);
3002 Session::reconnect_mmc_ports(bool inputs)
3004 if (inputs ) { // get all enabled midi input ports
3006 boost::shared_ptr<MidiPort> mmc_in_ptr = _midi_ports->mmc_in();
3008 mmc_in_ptr->disconnect_all ();
3009 std::vector<std::string> enabled_midi_inputs;
3010 EngineStateController::instance()->get_physical_midi_inputs (enabled_midi_inputs);
3012 std::vector<std::string>::iterator port_iter = enabled_midi_inputs.begin();
3014 for (; port_iter != enabled_midi_inputs.end(); ++port_iter) {
3015 mmc_in_ptr->connect (*port_iter);
3019 } else { // get all enabled midi output ports
3021 boost::shared_ptr<MidiPort> mmc_out_ptr = _midi_ports->mmc_out();
3023 mmc_out_ptr->disconnect_all ();
3024 std::vector<std::string> enabled_midi_outputs;
3025 EngineStateController::instance()->get_physical_midi_outputs (enabled_midi_outputs);
3027 std::vector<std::string>::iterator port_iter = enabled_midi_outputs.begin();
3029 for (; port_iter != enabled_midi_outputs.end(); ++port_iter) {
3030 mmc_out_ptr->connect (*port_iter);
3039 Session::ensure_stripable_sort_order ()
3042 get_stripables (sl);
3043 sl.sort (Stripable::Sorter ());
3045 bool change = false;
3046 PresentationInfo::order_t order = 0;
3048 for (StripableList::iterator si = sl.begin(); si != sl.end(); ++si) {
3049 boost::shared_ptr<Stripable> s (*si);
3050 assert (!s->is_auditioner ()); // XXX remove me
3051 if (s->is_monitor ()) {
3054 if (order != s->presentation_info().order()) {
3055 s->set_presentation_order (order);
3064 Session::ensure_route_presentation_info_gap (PresentationInfo::order_t first_new_order, uint32_t how_many)
3066 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("ensure order gap starting at %1 for %2\n", first_new_order, how_many));
3068 if (first_new_order == PresentationInfo::max_order) {
3069 /* adding at end, no worries */
3073 /* create a gap in the presentation info to accomodate @param how_many
3077 get_stripables (sl);
3079 for (StripableList::iterator si = sl.begin(); si != sl.end(); ++si) {
3080 boost::shared_ptr<Stripable> s (*si);
3082 if (s->presentation_info().special (false)) {
3086 if (!s->presentation_info().order_set()) {
3090 if (s->presentation_info().order () >= first_new_order) {
3091 s->set_presentation_order (s->presentation_info().order () + how_many);
3096 /** Caller must not hold process lock
3097 * @param name_template string to use for the start of the name, or "" to use "Audio".
3099 list< boost::shared_ptr<AudioTrack> >
3100 Session::new_audio_track (int input_channels, int output_channels, RouteGroup* route_group,
3101 uint32_t how_many, string name_template, PresentationInfo::order_t order,
3105 uint32_t track_id = 0;
3107 RouteList new_routes;
3108 list<boost::shared_ptr<AudioTrack> > ret;
3110 const string name_pattern = default_track_name_pattern (DataType::AUDIO);
3111 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
3115 if (!find_route_name (name_template.empty() ? _(name_pattern.c_str()) : name_template, ++track_id, track_name, use_number)) {
3116 error << "cannot find name for new audio track" << endmsg;
3120 boost::shared_ptr<AudioTrack> track;
3123 track.reset (new AudioTrack (*this, track_name, mode));
3125 if (track->init ()) {
3129 if (Profile->get_mixbus ()) {
3130 track->set_strict_io (true);
3133 if (ARDOUR::Profile->get_trx ()) {
3134 // TRACKS considers it's not a USE CASE, it's
3135 // a piece of behavior of the session model:
3137 // Gain for a newly created route depends on
3138 // the current output_auto_connect mode:
3140 // 0 for Stereo Out mode
3142 if (Config->get_output_auto_connect() & AutoConnectMaster) {
3143 track->gain_control()->set_value (dB_to_coefficient (0), Controllable::NoGroup);
3147 BOOST_MARK_TRACK (track);
3150 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3152 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
3153 error << string_compose (
3154 _("cannot configure %1 in/%2 out configuration for new audio track"),
3155 input_channels, output_channels)
3160 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
3161 error << string_compose (
3162 _("cannot configure %1 in/%2 out configuration for new audio track"),
3163 input_channels, output_channels)
3170 route_group->add (track);
3173 new_routes.push_back (track);
3174 ret.push_back (track);
3177 catch (failed_constructor &err) {
3178 error << _("Session: could not create new audio track.") << endmsg;
3182 catch (AudioEngine::PortRegistrationFailure& pfe) {
3184 error << pfe.what() << endmsg;
3192 if (!new_routes.empty()) {
3193 StateProtector sp (this);
3194 if (Profile->get_trx()) {
3195 add_routes (new_routes, false, false, false, order);
3197 add_routes (new_routes, true, true, false, order);
3204 /** Caller must not hold process lock.
3205 * @param name_template string to use for the start of the name, or "" to use "Bus".
3208 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template,
3209 PresentationInfo::Flag flags, PresentationInfo::order_t order)
3212 uint32_t bus_id = 0;
3216 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
3219 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, use_number)) {
3220 error << "cannot find name for new audio bus" << endmsg;
3225 boost::shared_ptr<Route> bus (new Route (*this, bus_name, flags, DataType::AUDIO));
3231 if (Profile->get_mixbus ()) {
3232 bus->set_strict_io (true);
3235 BOOST_MARK_ROUTE(bus);
3238 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3240 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
3241 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
3242 input_channels, output_channels)
3248 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
3249 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
3250 input_channels, output_channels)
3257 route_group->add (bus);
3260 bus->add_internal_return ();
3261 ret.push_back (bus);
3264 catch (failed_constructor &err) {
3265 error << _("Session: could not create new audio route.") << endmsg;
3269 catch (AudioEngine::PortRegistrationFailure& pfe) {
3270 error << pfe.what() << endmsg;
3280 StateProtector sp (this);
3281 if (Profile->get_trx()) {
3282 add_routes (ret, false, false, false, order);
3283 } else if (flags == PresentationInfo::FoldbackBus) {
3284 add_routes (ret, false, false, true, order); // no autoconnect
3286 add_routes (ret, false, true, true, order); // autoconnect // outputs only
3295 Session::new_route_from_template (uint32_t how_many, PresentationInfo::order_t insert_at, const std::string& template_path, const std::string& name_base,
3296 PlaylistDisposition pd)
3300 if (!tree.read (template_path.c_str())) {
3304 return new_route_from_template (how_many, insert_at, *tree.root(), name_base, pd);
3308 Session::new_route_from_template (uint32_t how_many, PresentationInfo::order_t insert_at, XMLNode& node, const std::string& name_base, PlaylistDisposition pd)
3311 uint32_t number = 0;
3312 const uint32_t being_added = how_many;
3313 /* This will prevent the use of any existing XML-provided PBD::ID
3316 Stateful::ForceIDRegeneration force_ids;
3317 IO::disable_connecting ();
3321 /* We're going to modify the node contents a bit so take a
3322 * copy. The node may be re-used when duplicating more than once.
3325 XMLNode node_copy (node);
3326 std::vector<boost::shared_ptr<Playlist> > shared_playlists;
3331 if (!name_base.empty()) {
3333 /* if we're adding more than one routes, force
3334 * all the names of the new routes to be
3335 * numbered, via the final parameter.
3338 if (!find_route_name (name_base.c_str(), ++number, name, (being_added > 1))) {
3339 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3345 string const route_name = node_copy.property(X_("name"))->value ();
3347 /* generate a new name by adding a number to the end of the template name */
3348 if (!find_route_name (route_name.c_str(), ++number, name, true)) {
3349 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3350 abort(); /*NOTREACHED*/
3354 /* figure out the appropriate playlist setup. The track
3355 * (if the Route we're creating is a track) will find
3359 if (pd == CopyPlaylist) {
3361 PBD::ID playlist_id;
3363 if (node_copy.get_property (X_("audio-playlist"), playlist_id)) {
3364 boost::shared_ptr<Playlist> playlist = _playlists->by_id (playlist_id);
3365 playlist = PlaylistFactory::create (playlist, string_compose ("%1.1", name));
3366 playlist->reset_shares ();
3367 node_copy.set_property (X_("audio-playlist"), playlist->id());
3370 if (node_copy.get_property (X_("midi-playlist"), playlist_id)) {
3371 boost::shared_ptr<Playlist> playlist = _playlists->by_id (playlist_id);
3372 playlist = PlaylistFactory::create (playlist, string_compose ("%1.1", name));
3373 playlist->reset_shares ();
3374 node_copy.set_property (X_("midi-playlist"), playlist->id());
3377 } else if (pd == SharePlaylist) {
3378 PBD::ID playlist_id;
3380 if (node_copy.get_property (X_("audio-playlist"), playlist_id)) {
3381 boost::shared_ptr<Playlist> playlist = _playlists->by_id (playlist_id);
3382 shared_playlists.push_back (playlist);
3385 if (node_copy.get_property (X_("midi-playlist"), playlist_id)) {
3386 boost::shared_ptr<Playlist> playlist = _playlists->by_id (playlist_id);
3387 shared_playlists.push_back (playlist);
3390 } else { /* NewPlaylist */
3394 if (node_copy.get_property (X_("audio-playlist"), pid)) {
3395 boost::shared_ptr<Playlist> playlist = PlaylistFactory::create (DataType::AUDIO, *this, name, false);
3396 node_copy.set_property (X_("audio-playlist"), playlist->id());
3399 if (node_copy.get_property (X_("midi-playlist"), pid)) {
3400 boost::shared_ptr<Playlist> playlist = PlaylistFactory::create (DataType::MIDI, *this, name, false);
3401 node_copy.set_property (X_("midi-playlist"), playlist->id());
3405 /* Fix up new name in the XML node */
3407 Route::set_name_in_state (node_copy, name);
3409 /* trim bitslots from listen sends so that new ones are used */
3410 XMLNodeList children = node_copy.children ();
3411 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
3412 if ((*i)->name() == X_("Processor")) {
3413 /* ForceIDRegeneration does not catch the following */
3414 XMLProperty const * role = (*i)->property (X_("role"));
3415 XMLProperty const * type = (*i)->property (X_("type"));
3416 if (role && role->value() == X_("Aux")) {
3417 /* check if the target bus exists.
3418 * we should not save aux-sends in templates.
3420 XMLProperty const * target = (*i)->property (X_("target"));
3422 (*i)->set_property ("type", "dangling-aux-send");
3425 boost::shared_ptr<Route> r = route_by_id (target->value());
3426 if (!r || boost::dynamic_pointer_cast<Track>(r)) {
3427 (*i)->set_property ("type", "dangling-aux-send");
3431 if (role && role->value() == X_("Listen")) {
3432 (*i)->remove_property (X_("bitslot"));
3434 else if (role && (role->value() == X_("Send") || role->value() == X_("Aux"))) {
3435 Delivery::Role xrole;
3436 uint32_t bitslot = 0;
3437 xrole = Delivery::Role (string_2_enum (role->value(), xrole));
3438 std::string name = Send::name_and_id_new_send(*this, xrole, bitslot, false);
3439 (*i)->remove_property (X_("bitslot"));
3440 (*i)->remove_property (X_("name"));
3441 (*i)->set_property ("bitslot", bitslot);
3442 (*i)->set_property ("name", name);
3443 XMLNodeList io_kids = (*i)->children ();
3444 for (XMLNodeList::iterator j = io_kids.begin(); j != io_kids.end(); ++j) {
3445 if ((*j)->name() != X_("IO")) {
3448 (*j)->remove_property (X_("name"));
3449 (*j)->set_property ("name", name);
3452 else if (type && type->value() == X_("intreturn")) {
3453 (*i)->remove_property (X_("bitslot"));
3454 (*i)->set_property ("ignore-bitslot", "1");
3456 else if (type && type->value() == X_("return")) {
3457 // Return::set_state() generates a new one
3458 (*i)->remove_property (X_("bitslot"));
3460 else if (type && type->value() == X_("port")) {
3461 IOProcessor::prepare_for_reset (**i, name);
3466 /* new routes start off unsoloed to avoid issues related to
3467 upstream / downstream buses.
3469 node_copy.remove_node_and_delete (X_("Controllable"), X_("name"), X_("solo"));
3471 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
3474 error << _("Session: cannot create track/bus from template description") << endmsg;
3478 /* Fix up sharing of playlists with the new Route/Track */
3480 for (vector<boost::shared_ptr<Playlist> >::iterator sp = shared_playlists.begin(); sp != shared_playlists.end(); ++sp) {
3481 (*sp)->share_with (route->id());
3484 if (boost::dynamic_pointer_cast<Track>(route)) {
3485 /* force input/output change signals so that the new diskstream
3486 picks up the configuration of the route. During session
3487 loading this normally happens in a different way.
3490 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3492 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
3493 change.after = route->input()->n_ports();
3494 route->input()->changed (change, this);
3495 change.after = route->output()->n_ports();
3496 route->output()->changed (change, this);
3499 ret.push_back (route);
3502 catch (failed_constructor &err) {
3503 error << _("Session: could not create new route from template") << endmsg;
3507 catch (AudioEngine::PortRegistrationFailure& pfe) {
3508 error << pfe.what() << endmsg;
3513 IO::enable_connecting ();
3522 StateProtector sp (this);
3523 if (Profile->get_trx()) {
3524 add_routes (ret, false, false, false, insert_at);
3526 add_routes (ret, true, true, false, insert_at);
3530 IO::enable_connecting ();
3536 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save, PresentationInfo::order_t order)
3539 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
3540 add_routes_inner (new_routes, input_auto_connect, output_auto_connect, order);
3543 error << _("Adding new tracks/busses failed") << endmsg;
3548 update_latency (false);
3549 update_latency (true);
3554 save_state (_current_snapshot_name);
3557 update_route_record_state ();
3559 RouteAdded (new_routes); /* EMIT SIGNAL */
3563 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, PresentationInfo::order_t order)
3565 ChanCount existing_inputs;
3566 ChanCount existing_outputs;
3570 count_existing_track_channels (existing_inputs, existing_outputs);
3573 RCUWriter<RouteList> writer (routes);
3574 boost::shared_ptr<RouteList> r = writer.get_copy ();
3575 n_routes = r->size();
3576 r->insert (r->end(), new_routes.begin(), new_routes.end());
3578 /* if there is no control out and we're not in the middle of loading,
3579 * resort the graph here. if there is a control out, we will resort
3580 * toward the end of this method. if we are in the middle of loading,
3581 * we will resort when done.
3584 if (!_monitor_out && IO::connecting_legal) {
3585 resort_routes_using (r);
3589 /* monitor is not part of the order */
3591 assert (n_routes > 0);
3596 PresentationInfo::ChangeSuspender cs;
3597 ensure_route_presentation_info_gap (order, new_routes.size());
3599 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x, ++added) {
3601 boost::weak_ptr<Route> wpr (*x);
3602 boost::shared_ptr<Route> r (*x);
3604 r->solo_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2,wpr));
3605 r->solo_isolate_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, wpr));
3606 r->mute_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this));
3608 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
3609 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
3610 r->processor_latency_changed.connect_same_thread (*this, boost::bind (&Session::queue_latency_recompute, this));
3612 if (r->is_master()) {
3616 if (r->is_monitor()) {
3620 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
3622 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
3623 track_playlist_changed (boost::weak_ptr<Track> (tr));
3624 tr->rec_enable_control()->Changed.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
3626 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
3628 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
3629 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
3630 mt->presentation_info().PropertyChanged.connect_same_thread (*this, boost::bind (&Session::midi_track_presentation_info_changed, this, _1, boost::weak_ptr<MidiTrack>(mt)));
3634 if (!r->presentation_info().special (false)) {
3636 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("checking PI state for %1\n", r->name()));
3638 /* presentation info order may already have been set from XML */
3640 if (!r->presentation_info().order_set()) {
3641 if (order == PresentationInfo::max_order) {
3642 /* just add to the end */
3643 r->set_presentation_order (n_routes + added);
3644 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order not set, set to NR %1 + %2 = %3\n", n_routes, added, n_routes + added));
3646 r->set_presentation_order (order + added);
3647 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order not set, set to %1 + %2 = %3\n", order, added, order + added));
3650 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order already set to %1\n", r->presentation_info().order()));
3654 #if !defined(__APPLE__) && !defined(__FreeBSD__)
3655 /* clang complains: 'operator<<' should be declared prior to the call site or in an associated namespace of one of its
3656 * arguments std::ostream& operator<<(std::ostream& o, ARDOUR::PresentationInfo const& rid)"
3658 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("added route %1, group order %2 type %3 (summary: %4)\n",
3660 r->presentation_info().order(),
3661 enum_2_string (r->presentation_info().flags()),
3662 r->presentation_info()));
3666 if (input_auto_connect || output_auto_connect) {
3667 auto_connect_route (r, input_auto_connect, ChanCount (), ChanCount (), existing_inputs, existing_outputs);
3668 existing_inputs += r->n_inputs();
3669 existing_outputs += r->n_outputs();
3674 ensure_stripable_sort_order ();
3677 if (_monitor_out && IO::connecting_legal) {
3678 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
3680 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3681 if ((*x)->is_monitor()) {
3683 } else if ((*x)->is_master()) {
3686 (*x)->enable_monitor_send ();
3691 reassign_track_numbers ();
3695 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
3697 boost::shared_ptr<RouteList> r = routes.reader ();
3698 boost::shared_ptr<Send> s;
3700 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3701 if ((s = (*i)->internal_send_for (dest)) != 0) {
3702 s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO, Controllable::NoGroup);
3708 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
3710 boost::shared_ptr<RouteList> r = routes.reader ();
3711 boost::shared_ptr<Send> s;
3713 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3714 if ((s = (*i)->internal_send_for (dest)) != 0) {
3715 s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY, Controllable::NoGroup);
3721 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
3723 boost::shared_ptr<RouteList> r = routes.reader ();
3724 boost::shared_ptr<Send> s;
3726 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3727 if ((s = (*i)->internal_send_for (dest)) != 0) {
3728 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value(), Controllable::NoGroup);
3733 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
3735 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
3737 boost::shared_ptr<RouteList> r = routes.reader ();
3738 boost::shared_ptr<RouteList> t (new RouteList);
3740 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3741 /* no MIDI sends because there are no MIDI busses yet */
3742 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
3747 add_internal_sends (dest, p, t);
3751 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
3753 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
3754 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
3759 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
3761 add_internal_send (dest, sender->before_processor_for_index (index), sender);
3765 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
3767 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
3771 if (!dest->internal_return()) {
3772 dest->add_internal_return ();
3775 sender->add_aux_send (dest, before);
3781 Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
3783 bool mute_changed = false;
3784 bool send_selected = false;
3786 { // RCU Writer scope
3787 PBD::Unwinder<bool> uw_flag (_route_deletion_in_progress, true);
3788 RCUWriter<RouteList> writer (routes);
3789 boost::shared_ptr<RouteList> rs = writer.get_copy ();
3791 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3793 if (_selection->selected (*iter)) {
3794 send_selected = true;
3797 if (*iter == _master_out) {
3801 /* speed up session deletion, don't do the solo dance */
3802 if (!deletion_in_progress ()) {
3803 (*iter)->solo_control()->set_value (0.0, Controllable::NoGroup);
3806 if ((*iter)->mute_control()->muted ()) {
3807 mute_changed = true;
3812 /* deleting the master out seems like a dumb
3813 idea, but its more of a UI policy issue
3817 if (*iter == _master_out) {
3818 _master_out = boost::shared_ptr<Route> ();
3821 if (*iter == _monitor_out) {
3822 _monitor_out.reset ();
3825 // We need to disconnect the route's inputs and outputs
3827 (*iter)->input()->disconnect (0);
3828 (*iter)->output()->disconnect (0);
3830 /* if the route had internal sends sending to it, remove them */
3832 if (!deletion_in_progress () && (*iter)->internal_return()) {
3834 boost::shared_ptr<RouteList> r = routes.reader ();
3835 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3836 boost::shared_ptr<Send> s = (*i)->internal_send_for (*iter);
3838 (*i)->remove_processor (s);
3843 /* if the monitoring section had a pointer to this route, remove it */
3844 if (_monitor_out && !(*iter)->is_master() && !(*iter)->is_monitor()) {
3845 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3846 ProcessorChangeBlocker pcb (this, false);
3847 (*iter)->remove_aux_or_listen (_monitor_out);
3850 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*iter);
3851 if (mt && mt->step_editing()) {
3852 if (_step_editors > 0) {
3858 /* writer goes out of scope, forces route list update */
3860 } // end of RCU Writer scope
3863 MuteChanged (); /* EMIT SIGNAL */
3866 update_route_solo_state ();
3867 update_latency_compensation ();
3870 /* Re-sort routes to remove the graph's current references to the one that is
3871 * going away, then flush old references out of the graph.
3872 * Wave Tracks: reconnect routes
3875 #ifdef USE_TRACKS_CODE_FEATURES
3876 reconnect_existing_routes(true, false);
3878 routes.flush (); // maybe unsafe, see below.
3882 if (_process_graph && !deletion_in_progress() && _engine.running()) {
3883 _process_graph->clear_other_chain ();
3886 /* get rid of it from the dead wood collection in the route list manager */
3887 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
3891 /* remove these routes from the selection if appropriate, and signal
3892 * the change *before* we call DropReferences for them.
3895 if (send_selected && !deletion_in_progress()) {
3896 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3897 _selection->remove_stripable_by_id ((*iter)->id());
3900 pc.add (Properties::selected);
3901 PresentationInfo::Change (pc);
3904 /* try to cause everyone to drop their references
3905 * and unregister ports from the backend
3908 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3909 (*iter)->drop_references ();
3912 if (deletion_in_progress()) {
3917 pc.add (Properties::order);
3918 PresentationInfo::Change (pc);
3920 /* save the new state of the world */
3922 if (save_state (_current_snapshot_name)) {
3923 save_history (_current_snapshot_name);
3926 update_route_record_state ();
3930 Session::remove_route (boost::shared_ptr<Route> route)
3932 boost::shared_ptr<RouteList> rl (new RouteList);
3933 rl->push_back (route);
3938 Session::route_mute_changed ()
3940 MuteChanged (); /* EMIT SIGNAL */
3945 Session::route_listen_changed (Controllable::GroupControlDisposition group_override, boost::weak_ptr<Route> wpr)
3947 boost::shared_ptr<Route> route (wpr.lock());
3953 assert (Config->get_solo_control_is_listen_control());
3955 if (route->solo_control()->soloed_by_self_or_masters()) {
3957 if (Config->get_exclusive_solo()) {
3959 RouteGroup* rg = route->route_group ();
3960 const bool group_already_accounted_for = (group_override == Controllable::ForGroup);
3962 boost::shared_ptr<RouteList> r = routes.reader ();
3964 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3965 if ((*i) == route) {
3966 /* already changed */
3970 if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
3971 /* route does not get solo propagated to it */
3975 if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
3976 /* this route is a part of the same solo group as the route
3977 * that was changed. Changing that route did change or will
3978 * change all group members appropriately, so we can ignore it
3983 (*i)->solo_control()->set_value (0.0, Controllable::NoGroup);
3989 } else if (_listen_cnt > 0) {
3996 Session::route_solo_isolated_changed (boost::weak_ptr<Route> wpr)
3998 boost::shared_ptr<Route> route (wpr.lock());
4004 bool send_changed = false;
4006 if (route->solo_isolate_control()->solo_isolated()) {
4007 if (_solo_isolated_cnt == 0) {
4008 send_changed = true;
4010 _solo_isolated_cnt++;
4011 } else if (_solo_isolated_cnt > 0) {
4012 _solo_isolated_cnt--;
4013 if (_solo_isolated_cnt == 0) {
4014 send_changed = true;
4019 IsolatedChanged (); /* EMIT SIGNAL */
4024 Session::route_solo_changed (bool self_solo_changed, Controllable::GroupControlDisposition group_override, boost::weak_ptr<Route> wpr)
4026 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1, update\n", self_solo_changed));
4028 boost::shared_ptr<Route> route (wpr.lock());
4034 if (Config->get_solo_control_is_listen_control()) {
4035 route_listen_changed (group_override, wpr);
4039 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()));
4041 if (route->solo_control()->transitioned_into_solo() == 0) {
4042 /* route solo changed by upstream/downstream or clear all solo state; not interesting
4045 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()));
4049 boost::shared_ptr<RouteList> r = routes.reader ();
4050 int32_t delta = route->solo_control()->transitioned_into_solo ();
4052 /* the route may be a member of a group that has shared-solo
4053 * semantics. If so, then all members of that group should follow the
4054 * solo of the changed route. But ... this is optional, controlled by a
4055 * Controllable::GroupControlDisposition.
4057 * The first argument to the signal that this method is connected to is the
4058 * GroupControlDisposition value that was used to change solo.
4060 * If the solo change was done with group semantics (either InverseGroup
4061 * (force the entire group to change even if the group shared solo is
4062 * disabled) or UseGroup (use the group, which may or may not have the
4063 * shared solo property enabled)) then as we propagate the change to
4064 * the entire session we should IGNORE THE GROUP that the changed route
4068 RouteGroup* rg = route->route_group ();
4069 const bool group_already_accounted_for = (group_override == Controllable::ForGroup);
4071 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate to session, group accounted for ? %1\n", group_already_accounted_for));
4073 if (delta == 1 && Config->get_exclusive_solo()) {
4075 /* new solo: disable all other solos, but not the group if its solo-enabled */
4077 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4079 if ((*i) == route) {
4080 /* already changed */
4084 if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
4085 /* route does not get solo propagated to it */
4089 if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
4090 /* this route is a part of the same solo group as the route
4091 * that was changed. Changing that route did change or will
4092 * change all group members appropriately, so we can ignore it
4098 (*i)->solo_control()->set_value (0.0, group_override);
4102 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
4104 RouteList uninvolved;
4106 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
4108 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4109 bool via_sends_only;
4110 bool in_signal_flow;
4112 if ((*i) == route) {
4113 /* already changed */
4117 if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
4118 /* route does not get solo propagated to it */
4119 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(),
4124 if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
4125 /* this route is a part of the same solo group as the route
4126 * that was changed. Changing that route did change or will
4127 * change all group members appropriately, so we can ignore it
4133 in_signal_flow = false;
4135 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
4137 if ((*i)->feeds (route, &via_sends_only)) {
4138 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
4139 if (!via_sends_only) {
4140 if (!route->soloed_by_others_upstream()) {
4141 (*i)->solo_control()->mod_solo_by_others_downstream (delta);
4143 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others upstream\n");
4146 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
4148 in_signal_flow = true;
4150 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
4153 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
4155 if (route->feeds (*i, &via_sends_only)) {
4156 /* propagate solo upstream only if routing other than
4157 sends is involved, but do consider the other route
4158 (*i) to be part of the signal flow even if only
4161 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
4165 route->soloed_by_others_downstream(),
4166 route->soloed_by_others_upstream()));
4167 if (!via_sends_only) {
4168 //NB. Triggers Invert Push, which handles soloed by downstream
4169 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
4170 (*i)->solo_control()->mod_solo_by_others_upstream (delta);
4172 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
4174 in_signal_flow = true;
4176 DEBUG_TRACE (DEBUG::Solo, string_compose("\tno feed to %1\n", (*i)->name()) );
4179 if (!in_signal_flow) {
4180 uninvolved.push_back (*i);
4184 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
4186 /* now notify that the mute state of the routes not involved in the signal
4187 pathway of the just-solo-changed route may have altered.
4190 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
4191 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
4192 (*i)->act_on_mute ();
4193 /* Session will emit SoloChanged() after all solo changes are
4194 * complete, which should be used by UIs to update mute status
4200 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
4202 /* now figure out if anything that matters is soloed (or is "listening")*/
4204 bool something_soloed = false;
4205 bool something_listening = false;
4206 uint32_t listeners = 0;
4207 uint32_t isolated = 0;
4210 r = routes.reader();
4213 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4214 if ((*i)->can_solo()) {
4215 if (Config->get_solo_control_is_listen_control()) {
4216 if ((*i)->solo_control()->soloed_by_self_or_masters()) {
4218 something_listening = true;
4221 (*i)->set_listen (false);
4222 if ((*i)->can_solo() && (*i)->solo_control()->soloed_by_self_or_masters()) {
4223 something_soloed = true;
4228 if ((*i)->solo_isolate_control()->solo_isolated()) {
4233 if (something_soloed != _non_soloed_outs_muted) {
4234 _non_soloed_outs_muted = something_soloed;
4235 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
4238 if (something_listening != _listening) {
4239 _listening = something_listening;
4240 SoloActive (_listening);
4243 _listen_cnt = listeners;
4245 if (isolated != _solo_isolated_cnt) {
4246 _solo_isolated_cnt = isolated;
4247 IsolatedChanged (); /* EMIT SIGNAL */
4250 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
4251 something_soloed, listeners, isolated));
4254 SoloChanged (); /* EMIT SIGNAL */
4259 Session::muted () const
4261 // TODO consider caching the value on every MuteChanged signal,
4262 // Note that API users may also subscribe to MuteChanged and hence
4263 // this method needs to be called first.
4266 get_stripables (all);
4267 for (StripableList::const_iterator i = all.begin(); i != all.end(); ++i) {
4268 assert (!(*i)->is_auditioner()); // XXX remove me
4269 if ((*i)->is_monitor()) {
4272 boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route>(*i);
4273 if (r && !r->active()) {
4276 boost::shared_ptr<MuteControl> mc = (*i)->mute_control();
4277 if (mc && mc->muted ()) {
4285 std::vector<boost::weak_ptr<AutomationControl> >
4286 Session::cancel_all_mute ()
4289 get_stripables (all);
4290 std::vector<boost::weak_ptr<AutomationControl> > muted;
4291 boost::shared_ptr<ControlList> cl (new ControlList);
4292 for (StripableList::const_iterator i = all.begin(); i != all.end(); ++i) {
4293 assert (!(*i)->is_auditioner());
4294 if ((*i)->is_monitor()) {
4297 boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route> (*i);
4298 if (r && !r->active()) {
4301 boost::shared_ptr<AutomationControl> ac = (*i)->mute_control();
4302 if (ac && ac->get_value () > 0) {
4304 muted.push_back (boost::weak_ptr<AutomationControl>(ac));
4307 if (!cl->empty ()) {
4308 set_controls (cl, 0.0, PBD::Controllable::UseGroup);
4314 Session::get_stripables (StripableList& sl, PresentationInfo::Flag fl) const
4316 boost::shared_ptr<RouteList> r = routes.reader ();
4317 for (RouteList::iterator it = r->begin(); it != r->end(); ++it) {
4318 if ((*it)->presentation_info ().flags () & fl) {
4323 if (fl & PresentationInfo::VCA) {
4324 VCAList v = _vca_manager->vcas ();
4325 sl.insert (sl.end(), v.begin(), v.end());
4330 Session::get_stripables () const
4332 PresentationInfo::Flag fl = PresentationInfo::AllStripables;
4334 Session::get_stripables (rv, fl);
4335 rv.sort (Stripable::Sorter ());
4340 Session::get_routelist (bool mixer_order, PresentationInfo::Flag fl) const
4342 boost::shared_ptr<RouteList> r = routes.reader ();
4344 for (RouteList::iterator it = r->begin(); it != r->end(); ++it) {
4345 if ((*it)->presentation_info ().flags () & fl) {
4349 rv.sort (Stripable::Sorter (mixer_order));
4353 boost::shared_ptr<RouteList>
4354 Session::get_routes_with_internal_returns() const
4356 boost::shared_ptr<RouteList> r = routes.reader ();
4357 boost::shared_ptr<RouteList> rl (new RouteList);
4359 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4360 if ((*i)->internal_return ()) {
4368 Session::io_name_is_legal (const std::string& name) const
4370 boost::shared_ptr<RouteList> r = routes.reader ();
4372 for (map<string,bool>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
4373 if (name == reserved->first) {
4374 if (!route_by_name (reserved->first)) {
4375 /* first instance of a reserved name is allowed for some */
4376 return reserved->second;
4378 /* all other instances of a reserved name are not allowed */
4383 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4384 if ((*i)->name() == name) {
4388 if ((*i)->has_io_processor_named (name)) {
4397 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
4400 vector<string> connections;
4402 /* if we are passed only a single route and we're not told to turn
4403 * others off, then just do the simple thing.
4406 if (flip_others == false && rl->size() == 1) {
4407 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
4409 mt->set_input_active (onoff);
4414 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
4416 PortSet& ps ((*rt)->input()->ports());
4418 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
4419 p->get_connections (connections);
4422 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
4423 routes_using_input_from (*s, rl2);
4426 /* scan all relevant routes to see if others are on or off */
4428 bool others_are_already_on = false;
4430 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
4432 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
4438 if ((*r) != (*rt)) {
4439 if (mt->input_active()) {
4440 others_are_already_on = true;
4443 /* this one needs changing */
4444 mt->set_input_active (onoff);
4450 /* globally reverse other routes */
4452 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
4453 if ((*r) != (*rt)) {
4454 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
4456 mt->set_input_active (!others_are_already_on);
4465 Session::routes_using_input_from (const string& str, RouteList& rl)
4467 boost::shared_ptr<RouteList> r = routes.reader();
4469 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4470 if ((*i)->input()->connected_to (str)) {
4476 boost::shared_ptr<Route>
4477 Session::route_by_name (string name) const
4479 boost::shared_ptr<RouteList> r = routes.reader ();
4481 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4482 if ((*i)->name() == name) {
4487 return boost::shared_ptr<Route> ((Route*) 0);
4490 boost::shared_ptr<Route>
4491 Session::route_by_id (PBD::ID id) const
4493 boost::shared_ptr<RouteList> r = routes.reader ();
4495 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4496 if ((*i)->id() == id) {
4501 return boost::shared_ptr<Route> ((Route*) 0);
4505 boost::shared_ptr<Stripable>
4506 Session::stripable_by_id (PBD::ID id) const
4509 get_stripables (sl);
4511 for (StripableList::const_iterator s = sl.begin(); s != sl.end(); ++s) {
4512 if ((*s)->id() == id) {
4517 return boost::shared_ptr<Stripable>();
4520 boost::shared_ptr<Processor>
4521 Session::processor_by_id (PBD::ID id) const
4523 boost::shared_ptr<RouteList> r = routes.reader ();
4525 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4526 boost::shared_ptr<Processor> p = (*i)->Route::processor_by_id (id);
4532 return boost::shared_ptr<Processor> ();
4535 boost::shared_ptr<Route>
4536 Session::get_remote_nth_route (PresentationInfo::order_t n) const
4538 return boost::dynamic_pointer_cast<Route> (get_remote_nth_stripable (n, PresentationInfo::Route));
4541 boost::shared_ptr<Stripable>
4542 Session::get_remote_nth_stripable (PresentationInfo::order_t n, PresentationInfo::Flag flags) const
4545 PresentationInfo::order_t match_cnt = 0;
4547 get_stripables (sl);
4548 sl.sort (Stripable::Sorter());
4550 for (StripableList::const_iterator s = sl.begin(); s != sl.end(); ++s) {
4552 if ((*s)->presentation_info().hidden()) {
4553 /* if the caller didn't explicitly ask for hidden
4554 stripables, ignore hidden ones. This matches
4555 the semantics of the pre-PresentationOrder
4556 "get by RID" logic of Ardour 4.x and earlier.
4558 XXX at some point we should likely reverse
4559 the logic of the flags, because asking for "the
4560 hidden stripables" is not going to be common,
4561 whereas asking for visible ones is normal.
4564 if (! (flags & PresentationInfo::Hidden)) {
4569 if ((*s)->presentation_info().flag_match (flags)) {
4570 if (match_cnt++ == n) {
4576 /* there is no nth stripable that matches the given flags */
4577 return boost::shared_ptr<Stripable>();
4580 boost::shared_ptr<Route>
4581 Session::route_by_selected_count (uint32_t id) const
4583 RouteList r (*(routes.reader ()));
4584 r.sort (Stripable::Sorter());
4586 RouteList::iterator i;
4588 for (i = r.begin(); i != r.end(); ++i) {
4589 if ((*i)->is_selected()) {
4597 return boost::shared_ptr<Route> ();
4601 Session::reassign_track_numbers ()
4605 RouteList r (*(routes.reader ()));
4606 r.sort (Stripable::Sorter());
4608 StateProtector sp (this);
4610 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4611 assert (!(*i)->is_auditioner());
4612 if (boost::dynamic_pointer_cast<Track> (*i)) {
4613 (*i)->set_track_number(++tn);
4615 else if (!(*i)->is_master() && !(*i)->is_monitor()) {
4616 (*i)->set_track_number(--bn);
4619 const uint32_t decimals = ceilf (log10f (tn + 1));
4620 const bool decimals_changed = _track_number_decimals != decimals;
4621 _track_number_decimals = decimals;
4623 if (decimals_changed && config.get_track_name_number ()) {
4624 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4625 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
4627 t->resync_track_name();
4630 // trigger GUI re-layout
4631 config.ParameterChanged("track-name-number");
4635 if (DEBUG_ENABLED(DEBUG::OrderKeys)) {
4636 boost::shared_ptr<RouteList> rl = routes.reader ();
4637 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4638 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 numbered %2\n", (*i)->name(), (*i)->track_number()));
4646 Session::playlist_region_added (boost::weak_ptr<Region> w)
4648 boost::shared_ptr<Region> r = w.lock ();
4653 /* These are the operations that are currently in progress... */
4654 list<GQuark> curr = _current_trans_quarks;
4657 /* ...and these are the operations during which we want to update
4658 the session range location markers.
4661 ops.push_back (Operations::capture);
4662 ops.push_back (Operations::paste);
4663 ops.push_back (Operations::duplicate_region);
4664 ops.push_back (Operations::insert_file);
4665 ops.push_back (Operations::insert_region);
4666 ops.push_back (Operations::drag_region_brush);
4667 ops.push_back (Operations::region_drag);
4668 ops.push_back (Operations::selection_grab);
4669 ops.push_back (Operations::region_fill);
4670 ops.push_back (Operations::fill_selection);
4671 ops.push_back (Operations::create_region);
4672 ops.push_back (Operations::region_copy);
4673 ops.push_back (Operations::fixed_time_region_copy);
4676 /* See if any of the current operations match the ones that we want */
4678 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
4680 /* If so, update the session range markers */
4682 maybe_update_session_range (r->position (), r->last_sample ());
4686 /** Update the session range markers if a is before the current start or
4687 * b is after the current end.
4690 Session::maybe_update_session_range (samplepos_t a, samplepos_t b)
4696 samplepos_t session_end_marker_shift_samples = session_end_shift * _nominal_sample_rate;
4698 if (_session_range_location == 0) {
4700 set_session_range_location (a, b + session_end_marker_shift_samples);
4704 if (_session_range_is_free && (a < _session_range_location->start())) {
4705 _session_range_location->set_start (a);
4708 if (_session_range_is_free && (b > _session_range_location->end())) {
4709 _session_range_location->set_end (b);
4715 Session::set_session_range_is_free (bool yn)
4717 _session_range_is_free = yn;
4721 Session::playlist_ranges_moved (list<Evoral::RangeMove<samplepos_t> > const & ranges)
4723 for (list<Evoral::RangeMove<samplepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4724 maybe_update_session_range (i->to, i->to + i->length);
4729 Session::playlist_regions_extended (list<Evoral::Range<samplepos_t> > const & ranges)
4731 for (list<Evoral::Range<samplepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4732 maybe_update_session_range (i->from, i->to);
4736 /* Region management */
4738 boost::shared_ptr<Region>
4739 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
4741 const RegionFactory::RegionMap& regions (RegionFactory::regions());
4742 RegionFactory::RegionMap::const_iterator i;
4743 boost::shared_ptr<Region> region;
4745 Glib::Threads::Mutex::Lock lm (region_lock);
4747 for (i = regions.begin(); i != regions.end(); ++i) {
4751 if (region->whole_file()) {
4753 if (child->source_equivalent (region)) {
4759 return boost::shared_ptr<Region> ();
4763 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
4765 set<boost::shared_ptr<Region> > relevant_regions;
4767 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
4768 RegionFactory::get_regions_using_source (*s, relevant_regions);
4771 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
4772 set<boost::shared_ptr<Region> >::iterator tmp;
4777 _playlists->destroy_region (*r);
4778 RegionFactory::map_remove (*r);
4780 (*r)->drop_sources ();
4781 (*r)->drop_references ();
4783 relevant_regions.erase (r);
4788 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
4791 Glib::Threads::Mutex::Lock ls (source_lock);
4792 /* remove from the main source list */
4793 sources.erase ((*s)->id());
4796 (*s)->mark_for_remove ();
4797 (*s)->drop_references ();
4807 Session::remove_last_capture ()
4809 list<boost::shared_ptr<Source> > srcs;
4811 boost::shared_ptr<RouteList> rl = routes.reader ();
4812 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4813 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4818 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
4821 srcs.insert (srcs.end(), l.begin(), l.end());
4826 destroy_sources (srcs);
4828 save_state (_current_snapshot_name);
4834 Session::get_last_capture_sources (std::list<boost::shared_ptr<Source> >& srcs)
4836 boost::shared_ptr<RouteList> rl = routes.reader ();
4837 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4838 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4843 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
4846 srcs.insert (srcs.end(), l.begin(), l.end());
4852 /* Source Management */
4855 Session::add_source (boost::shared_ptr<Source> source)
4857 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
4858 pair<SourceMap::iterator,bool> result;
4860 entry.first = source->id();
4861 entry.second = source;
4864 Glib::Threads::Mutex::Lock lm (source_lock);
4865 result = sources.insert (entry);
4868 if (result.second) {
4870 /* yay, new source */
4872 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
4875 if (!fs->within_session()) {
4876 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
4882 boost::shared_ptr<AudioFileSource> afs;
4884 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
4885 if (Config->get_auto_analyse_audio()) {
4886 Analyser::queue_source_for_analysis (source, false);
4890 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
4892 SourceAdded(source);
4897 Session::remove_source (boost::weak_ptr<Source> src)
4899 if (deletion_in_progress ()) {
4903 SourceMap::iterator i;
4904 boost::shared_ptr<Source> source = src.lock();
4911 Glib::Threads::Mutex::Lock lm (source_lock);
4913 if ((i = sources.find (source->id())) != sources.end()) {
4915 SourceRemoved(source);
4919 if (!in_cleanup () && !loading ()) {
4921 /* save state so we don't end up with a session file
4922 * referring to non-existent sources.
4925 save_state (_current_snapshot_name);
4929 boost::shared_ptr<Source>
4930 Session::source_by_id (const PBD::ID& id)
4932 Glib::Threads::Mutex::Lock lm (source_lock);
4933 SourceMap::iterator i;
4934 boost::shared_ptr<Source> source;
4936 if ((i = sources.find (id)) != sources.end()) {
4943 boost::shared_ptr<AudioFileSource>
4944 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
4946 /* Restricted to audio files because only audio sources have channel
4950 Glib::Threads::Mutex::Lock lm (source_lock);
4952 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
4953 boost::shared_ptr<AudioFileSource> afs
4954 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
4956 if (afs && afs->path() == path && chn == afs->channel()) {
4961 return boost::shared_ptr<AudioFileSource>();
4964 boost::shared_ptr<MidiSource>
4965 Session::midi_source_by_path (const std::string& path, bool need_source_lock) const
4967 /* Restricted to MIDI files because audio sources require a channel
4968 for unique identification, in addition to a path.
4971 Glib::Threads::Mutex::Lock lm (source_lock, Glib::Threads::NOT_LOCK);
4972 if (need_source_lock) {
4976 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
4977 boost::shared_ptr<MidiSource> ms
4978 = boost::dynamic_pointer_cast<MidiSource>(s->second);
4979 boost::shared_ptr<FileSource> fs
4980 = boost::dynamic_pointer_cast<FileSource>(s->second);
4982 if (ms && fs && fs->path() == path) {
4987 return boost::shared_ptr<MidiSource>();
4991 Session::count_sources_by_origin (const string& path)
4994 Glib::Threads::Mutex::Lock lm (source_lock);
4996 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
4997 boost::shared_ptr<FileSource> fs
4998 = boost::dynamic_pointer_cast<FileSource>(i->second);
5000 if (fs && fs->origin() == path) {
5009 peak_file_helper (const string& peak_path, const string& file_path, const string& file_base, bool hash) {
5011 std::string checksum = Glib::Checksum::compute_checksum(Glib::Checksum::CHECKSUM_SHA1, file_path + G_DIR_SEPARATOR + file_base);
5012 return Glib::build_filename (peak_path, checksum + peakfile_suffix);
5014 return Glib::build_filename (peak_path, file_base + peakfile_suffix);
5019 Session::construct_peak_filepath (const string& filepath, const bool in_session, const bool old_peak_name) const
5021 string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
5023 if (Glib::path_is_absolute (filepath)) {
5025 /* rip the session dir from the audiofile source */
5027 string session_path;
5028 bool in_another_session = true;
5030 if (filepath.find (interchange_dir_string) != string::npos) {
5032 session_path = Glib::path_get_dirname (filepath); /* now ends in audiofiles */
5033 session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
5034 session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
5035 session_path = Glib::path_get_dirname (session_path); /* now has session path */
5037 /* see if it is within our session */
5039 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
5040 if (i->path == session_path) {
5041 in_another_session = false;
5046 in_another_session = false;
5050 if (in_another_session) {
5051 SessionDirectory sd (session_path);
5052 return peak_file_helper (sd.peak_path(), "", Glib::path_get_basename (filepath), !old_peak_name);
5056 /* 1) if file belongs to this session
5057 * it may be a relative path (interchange/...)
5058 * or just basename (session_state, remove source)
5059 * -> just use the basename
5061 std::string filename = Glib::path_get_basename (filepath);
5064 /* 2) if the file is outside our session dir:
5065 * (imported but not copied) add the path for check-summming */
5067 path = Glib::path_get_dirname (filepath);
5070 return peak_file_helper (_session_dir->peak_path(), path, Glib::path_get_basename (filepath), !old_peak_name);
5074 Session::new_audio_source_path_for_embedded (const std::string& path)
5078 * we know that the filename is already unique because it exists
5079 * out in the filesystem.
5081 * However, when we bring it into the session, we could get a
5084 * Eg. two embedded files:
5089 * When merged into session, these collide.
5091 * There will not be a conflict with in-memory sources
5092 * because when the source was created we already picked
5093 * a unique name for it.
5095 * This collision is not likely to be common, but we have to guard
5096 * against it. So, if there is a collision, take the md5 hash of the
5097 * the path, and use that as the filename instead.
5100 SessionDirectory sdir (get_best_session_directory_for_new_audio());
5101 string base = Glib::path_get_basename (path);
5102 string newpath = Glib::build_filename (sdir.sound_path(), base);
5104 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
5108 md5.digestString (path.c_str());
5109 md5.writeToString ();
5110 base = md5.digestChars;
5112 string ext = get_suffix (path);
5119 newpath = Glib::build_filename (sdir.sound_path(), base);
5121 /* if this collides, we're screwed */
5123 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
5124 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
5133 /** Return true if there are no audio file sources that use @param name as
5134 * the filename component of their path.
5136 * Return false otherwise.
5138 * This method MUST ONLY be used to check in-session, mono files since it
5139 * hard-codes the channel of the audio file source we are looking for as zero.
5141 * If/when Ardour supports native files in non-mono formats, the logic here
5142 * will need to be revisited.
5145 Session::audio_source_name_is_unique (const string& name)
5147 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
5148 vector<space_and_path>::iterator i;
5149 uint32_t existing = 0;
5151 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
5153 /* note that we search *without* the extension so that
5154 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
5155 in the event that this new name is required for
5156 a file format change.
5159 const string spath = *i;
5161 if (matching_unsuffixed_filename_exists_in (spath, name)) {
5166 /* it is possible that we have the path already
5167 * assigned to a source that has not yet been written
5168 * (ie. the write source for a diskstream). we have to
5169 * check this in order to make sure that our candidate
5170 * path isn't used again, because that can lead to
5171 * two Sources point to the same file with different
5172 * notions of their removability.
5176 string possible_path = Glib::build_filename (spath, name);
5178 if (audio_source_by_path_and_channel (possible_path, 0)) {
5184 return (existing == 0);
5188 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)
5191 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
5193 if (Profile->get_trx() && destructive) {
5195 sstr << setfill ('0') << setw (4) << cnt;
5196 sstr << legalized_base;
5198 sstr << legalized_base;
5200 if (take_required || related_exists) {
5212 } else if (nchan > 2) {
5217 /* XXX what? more than 26 channels! */
5228 /** Return a unique name based on \a base for a new internal audio source */
5230 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
5233 string possible_name;
5234 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
5236 bool some_related_source_name_exists = false;
5238 legalized = legalize_for_path (base);
5240 // Find a "version" of the base name that doesn't exist in any of the possible directories.
5242 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
5244 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
5246 if (audio_source_name_is_unique (possible_name)) {
5250 some_related_source_name_exists = true;
5253 error << string_compose(
5254 _("There are already %1 recordings for %2, which I consider too many."),
5255 limit, base) << endmsg;
5257 throw failed_constructor();
5261 /* We've established that the new name does not exist in any session
5262 * directory, so now find out which one we should use for this new
5266 SessionDirectory sdir (get_best_session_directory_for_new_audio());
5268 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
5273 /** Return a unique name based on `base` for a new internal MIDI source */
5275 Session::new_midi_source_path (const string& base, bool need_lock)
5277 string possible_path;
5278 string possible_name;
5280 possible_name = legalize_for_path (base);
5282 // Find a "version" of the file name that doesn't exist in any of the possible directories.
5283 std::vector<string> sdirs = source_search_path(DataType::MIDI);
5285 /* - the main session folder is the first in the vector.
5286 * - after checking all locations for file-name uniqueness,
5287 * we keep the one from the last iteration as new file name
5288 * - midi files are small and should just be kept in the main session-folder
5290 * -> reverse the array, check main session folder last and use that as location
5293 std::reverse(sdirs.begin(), sdirs.end());
5296 possible_name = bump_name_once (possible_name, '-');
5298 vector<space_and_path>::iterator i;
5299 uint32_t existing = 0;
5301 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
5303 possible_path = Glib::build_filename (*i, possible_name + ".mid");
5305 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
5309 if (midi_source_by_path (possible_path, need_lock)) {
5314 if (possible_path.size () >= PATH_MAX) {
5315 error << string_compose(
5316 _("There are already many recordings for %1, resulting in a too long file-path %2."),
5317 base, possible_path) << endmsg;
5322 if (existing == 0) {
5327 /* No need to "find best location" for software/app-based RAID, because
5328 MIDI is so small that we always put it in the same place.
5331 return possible_path;
5335 /** Create a new within-session audio source */
5336 boost::shared_ptr<AudioFileSource>
5337 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
5339 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
5341 if (!path.empty()) {
5342 return boost::dynamic_pointer_cast<AudioFileSource> (
5343 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, sample_rate(), true, true));
5345 throw failed_constructor ();
5349 /** Create a new within-session MIDI source */
5350 boost::shared_ptr<MidiSource>
5351 Session::create_midi_source_for_session (string const & basic_name)
5353 const string path = new_midi_source_path (basic_name);
5355 if (!path.empty()) {
5356 return boost::dynamic_pointer_cast<SMFSource> (
5357 SourceFactory::createWritable (
5358 DataType::MIDI, *this, path, false, sample_rate()));
5360 throw failed_constructor ();
5364 /** Create a new within-session MIDI source */
5365 boost::shared_ptr<MidiSource>
5366 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
5368 /* the caller passes in the track the source will be used in,
5369 so that we can keep the numbering sane.
5371 Rationale: a track with the name "Foo" that has had N
5372 captures carried out so far will ALREADY have a write source
5373 named "Foo-N+1.mid" waiting to be used for the next capture.
5375 If we call new_midi_source_name() we will get "Foo-N+2". But
5376 there is no region corresponding to "Foo-N+1", so when
5377 "Foo-N+2" appears in the track, the gap presents the user
5378 with odd behaviour - why did it skip past Foo-N+1?
5380 We could explain this to the user in some odd way, but
5381 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
5384 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
5387 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
5389 std::string name = track->steal_write_source_name ();
5392 return boost::shared_ptr<MidiSource>();
5395 /* MIDI files are small, just put them in the first location of the
5396 session source search path.
5399 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
5401 return boost::dynamic_pointer_cast<SMFSource> (
5402 SourceFactory::createWritable (
5403 DataType::MIDI, *this, path, false, sample_rate()));
5407 Session::playlist_is_active (boost::shared_ptr<Playlist> playlist)
5409 Glib::Threads::Mutex::Lock lm (_playlists->lock);
5410 for (SessionPlaylists::List::iterator i = _playlists->playlists.begin(); i != _playlists->playlists.end(); i++) {
5411 if ( (*i) == playlist ) {
5419 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
5421 if (playlist->hidden()) {
5425 _playlists->add (playlist);
5428 playlist->release();
5435 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
5437 if (deletion_in_progress ()) {
5441 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
5447 _playlists->remove (playlist);
5453 Session::set_audition (boost::shared_ptr<Region> r)
5455 pending_audition_region = r;
5456 add_post_transport_work (PostTransportAudition);
5457 _butler->schedule_transport_work ();
5461 Session::audition_playlist ()
5463 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
5464 ev->region.reset ();
5470 Session::register_lua_function (
5471 const std::string& name,
5472 const std::string& script,
5473 const LuaScriptParamList& args
5476 Glib::Threads::Mutex::Lock lm (lua_lock);
5478 lua_State* L = lua.getState();
5480 const std::string& bytecode = LuaScripting::get_factory_bytecode (script);
5481 luabridge::LuaRef tbl_arg (luabridge::newTable(L));
5482 for (LuaScriptParamList::const_iterator i = args.begin(); i != args.end(); ++i) {
5483 if ((*i)->optional && !(*i)->is_set) { continue; }
5484 tbl_arg[(*i)->name] = (*i)->value;
5486 (*_lua_add)(name, bytecode, tbl_arg); // throws luabridge::LuaException
5489 LuaScriptsChanged (); /* EMIT SIGNAL */
5494 Session::unregister_lua_function (const std::string& name)
5496 Glib::Threads::Mutex::Lock lm (lua_lock);
5497 (*_lua_del)(name); // throws luabridge::LuaException
5498 lua.collect_garbage ();
5501 LuaScriptsChanged (); /* EMIT SIGNAL */
5505 std::vector<std::string>
5506 Session::registered_lua_functions ()
5508 Glib::Threads::Mutex::Lock lm (lua_lock);
5509 std::vector<std::string> rv;
5512 luabridge::LuaRef list ((*_lua_list)());
5513 for (luabridge::Iterator i (list); !i.isNil (); ++i) {
5514 if (!i.key ().isString ()) { assert(0); continue; }
5515 rv.push_back (i.key ().cast<std::string> ());
5522 static void _lua_print (std::string s) {
5523 std::cout << "SessionLua: " << s << "\n";
5528 Session::try_run_lua (pframes_t nframes)
5530 if (_n_lua_scripts == 0) return;
5531 Glib::Threads::Mutex::Lock tm (lua_lock, Glib::Threads::TRY_LOCK);
5533 try { (*_lua_run)(nframes); } catch (...) { }
5534 lua.collect_garbage_step ();
5539 Session::setup_lua ()
5542 lua.Print.connect (&_lua_print);
5546 "function ArdourSession ()"
5547 " local self = { scripts = {}, instances = {} }"
5549 " local remove = function (n)"
5550 " self.scripts[n] = nil"
5551 " self.instances[n] = nil"
5552 " Session:scripts_changed()" // call back
5555 " local addinternal = function (n, f, a)"
5556 " assert(type(n) == 'string', 'function-name must be string')"
5557 " assert(type(f) == 'function', 'Given script is a not a function')"
5558 " assert(type(a) == 'table' or type(a) == 'nil', 'Given argument is invalid')"
5559 " assert(self.scripts[n] == nil, 'Callback \"'.. n ..'\" already exists.')"
5560 " self.scripts[n] = { ['f'] = f, ['a'] = a }"
5561 " 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, bit32=bit32, Session = Session, PBD = PBD, Timecode = Timecode, Evoral = Evoral, C = C, ARDOUR = ARDOUR }"
5562 " self.instances[n] = load (string.dump(f, true), nil, nil, env)(a)"
5563 " Session:scripts_changed()" // call back
5566 " local add = function (n, b, a)"
5567 " assert(type(b) == 'string', 'ByteCode must be string')"
5568 " load (b)()" // assigns f
5569 " assert(type(f) == 'string', 'Assigned ByteCode must be string')"
5570 " addinternal (n, load(f), a)"
5573 " local run = function (...)"
5574 " for n, s in pairs (self.instances) do"
5575 " local status, err = pcall (s, ...)"
5576 " if not status then"
5577 " print ('fn \"'.. n .. '\": ', err)"
5584 " local cleanup = function ()"
5585 " self.scripts = nil"
5586 " self.instances = nil"
5589 " local list = function ()"
5591 " for n, _ in pairs (self.scripts) do"
5597 " local function basic_serialize (o)"
5598 " if type(o) == \"number\" then"
5599 " return tostring(o)"
5601 " return string.format(\"%q\", o)"
5605 " local function serialize (name, value)"
5606 " local rv = name .. ' = '"
5608 " if type(value) == \"number\" or type(value) == \"string\" or type(value) == \"nil\" then"
5609 " return rv .. basic_serialize(value) .. ' '"
5610 " elseif type(value) == \"table\" then"
5612 " for k,v in pairs(value) do"
5613 " local fieldname = string.format(\"%s[%s]\", name, basic_serialize(k))"
5614 " rv = rv .. serialize(fieldname, v) .. ' '"
5615 " collectgarbage()" // string concatenation allocates a new string :(
5618 " elseif type(value) == \"function\" then"
5619 " return rv .. string.format(\"%q\", string.dump(value, true))"
5621 " error('cannot save a ' .. type(value))"
5626 " local save = function ()"
5627 " return (serialize('scripts', self.scripts))"
5630 " local restore = function (state)"
5631 " self.scripts = {}"
5633 " for n, s in pairs (scripts) do"
5634 " addinternal (n, load(s['f']), s['a'])"
5638 " return { run = run, add = add, remove = remove,"
5639 " list = list, restore = restore, save = save, cleanup = cleanup}"
5642 " sess = ArdourSession ()"
5643 " ArdourSession = nil"
5645 "function ardour () end"
5648 lua_State* L = lua.getState();
5651 luabridge::LuaRef lua_sess = luabridge::getGlobal (L, "sess");
5652 lua.do_command ("sess = nil"); // hide it.
5653 lua.do_command ("collectgarbage()");
5655 _lua_run = new luabridge::LuaRef(lua_sess["run"]);
5656 _lua_add = new luabridge::LuaRef(lua_sess["add"]);
5657 _lua_del = new luabridge::LuaRef(lua_sess["remove"]);
5658 _lua_list = new luabridge::LuaRef(lua_sess["list"]);
5659 _lua_save = new luabridge::LuaRef(lua_sess["save"]);
5660 _lua_load = new luabridge::LuaRef(lua_sess["restore"]);
5661 _lua_cleanup = new luabridge::LuaRef(lua_sess["cleanup"]);
5662 } catch (luabridge::LuaException const& e) {
5663 fatal << string_compose (_("programming error: %1"),
5664 std::string ("Failed to setup session Lua interpreter") + e.what ())
5666 abort(); /*NOTREACHED*/
5668 fatal << string_compose (_("programming error: %1"),
5669 X_("Failed to setup session Lua interpreter"))
5671 abort(); /*NOTREACHED*/
5675 LuaBindings::stddef (L);
5676 LuaBindings::common (L);
5677 LuaBindings::dsp (L);
5679 luabridge::push <Session *> (L, this);
5680 lua_setglobal (L, "Session");
5684 Session::scripts_changed ()
5686 assert (!lua_lock.trylock()); // must hold lua_lock
5689 luabridge::LuaRef list ((*_lua_list)());
5691 for (luabridge::Iterator i (list); !i.isNil (); ++i) {
5692 if (!i.key ().isString ()) { assert(0); continue; }
5695 _n_lua_scripts = cnt;
5696 } catch (luabridge::LuaException const& e) {
5697 fatal << string_compose (_("programming error: %1"),
5698 std::string ("Indexing Lua Session Scripts failed.") + e.what ())
5700 abort(); /*NOTREACHED*/
5702 fatal << string_compose (_("programming error: %1"),
5703 X_("Indexing Lua Session Scripts failed."))
5705 abort(); /*NOTREACHED*/
5710 Session::non_realtime_set_audition ()
5712 assert (pending_audition_region);
5713 auditioner->audition_region (pending_audition_region);
5714 pending_audition_region.reset ();
5715 AuditionActive (true); /* EMIT SIGNAL */
5719 Session::audition_region (boost::shared_ptr<Region> r)
5721 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
5727 Session::cancel_audition ()
5732 if (auditioner->auditioning()) {
5733 auditioner->cancel_audition ();
5734 AuditionActive (false); /* EMIT SIGNAL */
5739 Session::is_auditioning () const
5741 /* can be called before we have an auditioner object */
5743 return auditioner->auditioning();
5750 Session::graph_reordered ()
5752 /* don't do this stuff if we are setting up connections
5753 from a set_state() call or creating new tracks. Ditto for deletion.
5756 if (inital_connect_or_deletion_in_progress () || _adding_routes_in_progress || _reconnecting_routes_in_progress || _route_deletion_in_progress) {
5762 /* force all diskstreams to update their capture offset values to
5763 * reflect any changes in latencies within the graph.
5765 update_route_latency (false, true);
5768 /** @return Number of samples that there is disk space available to write,
5771 boost::optional<samplecnt_t>
5772 Session::available_capture_duration ()
5774 Glib::Threads::Mutex::Lock lm (space_lock);
5776 if (_total_free_4k_blocks_uncertain) {
5777 return boost::optional<samplecnt_t> ();
5780 float sample_bytes_on_disk = 4.0; // keep gcc happy
5782 switch (config.get_native_file_data_format()) {
5784 sample_bytes_on_disk = 4.0;
5788 sample_bytes_on_disk = 3.0;
5792 sample_bytes_on_disk = 2.0;
5796 /* impossible, but keep some gcc versions happy */
5797 fatal << string_compose (_("programming error: %1"),
5798 X_("illegal native file data format"))
5800 abort(); /*NOTREACHED*/
5803 double scale = 4096.0 / sample_bytes_on_disk;
5805 if (_total_free_4k_blocks * scale > (double) max_samplecnt) {
5806 return max_samplecnt;
5809 return (samplecnt_t) floor (_total_free_4k_blocks * scale);
5813 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
5816 RCUWriter<BundleList> writer (_bundles);
5817 boost::shared_ptr<BundleList> b = writer.get_copy ();
5818 b->push_back (bundle);
5822 BundleAddedOrRemoved (); /* EMIT SIGNAL */
5829 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
5831 bool removed = false;
5834 RCUWriter<BundleList> writer (_bundles);
5835 boost::shared_ptr<BundleList> b = writer.get_copy ();
5836 BundleList::iterator i = find (b->begin(), b->end(), bundle);
5838 if (i != b->end()) {
5845 BundleAddedOrRemoved (); /* EMIT SIGNAL */
5851 boost::shared_ptr<Bundle>
5852 Session::bundle_by_name (string name) const
5854 boost::shared_ptr<BundleList> b = _bundles.reader ();
5856 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
5857 if ((*i)->name() == name) {
5862 return boost::shared_ptr<Bundle> ();
5866 Session::tempo_map_changed (const PropertyChange&)
5870 _playlists->update_after_tempo_map_change ();
5872 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
5878 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
5880 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
5881 (*i)->recompute_samples_from_beat ();
5885 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
5886 * the given count with the current block size.
5889 Session::ensure_buffers (ChanCount howmany)
5891 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
5895 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
5897 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5898 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
5903 Session::next_insert_id ()
5905 /* this doesn't really loop forever. just think about it */
5908 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < insert_bitset.size(); ++n) {
5909 if (!insert_bitset[n]) {
5910 insert_bitset[n] = true;
5916 /* none available, so resize and try again */
5918 insert_bitset.resize (insert_bitset.size() + 16, false);
5923 Session::next_send_id ()
5925 /* this doesn't really loop forever. just think about it */
5928 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < send_bitset.size(); ++n) {
5929 if (!send_bitset[n]) {
5930 send_bitset[n] = true;
5936 /* none available, so resize and try again */
5938 send_bitset.resize (send_bitset.size() + 16, false);
5943 Session::next_aux_send_id ()
5945 /* this doesn't really loop forever. just think about it */
5948 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < aux_send_bitset.size(); ++n) {
5949 if (!aux_send_bitset[n]) {
5950 aux_send_bitset[n] = true;
5956 /* none available, so resize and try again */
5958 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
5963 Session::next_return_id ()
5965 /* this doesn't really loop forever. just think about it */
5968 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < return_bitset.size(); ++n) {
5969 if (!return_bitset[n]) {
5970 return_bitset[n] = true;
5976 /* none available, so resize and try again */
5978 return_bitset.resize (return_bitset.size() + 16, false);
5983 Session::mark_send_id (uint32_t id)
5985 if (id >= send_bitset.size()) {
5986 send_bitset.resize (id+16, false);
5988 if (send_bitset[id]) {
5989 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
5991 send_bitset[id] = true;
5995 Session::mark_aux_send_id (uint32_t id)
5997 if (id >= aux_send_bitset.size()) {
5998 aux_send_bitset.resize (id+16, false);
6000 if (aux_send_bitset[id]) {
6001 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
6003 aux_send_bitset[id] = true;
6007 Session::mark_return_id (uint32_t id)
6009 if (id >= return_bitset.size()) {
6010 return_bitset.resize (id+16, false);
6012 if (return_bitset[id]) {
6013 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
6015 return_bitset[id] = true;
6019 Session::mark_insert_id (uint32_t id)
6021 if (id >= insert_bitset.size()) {
6022 insert_bitset.resize (id+16, false);
6024 if (insert_bitset[id]) {
6025 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
6027 insert_bitset[id] = true;
6031 Session::unmark_send_id (uint32_t id)
6033 if (id < send_bitset.size()) {
6034 send_bitset[id] = false;
6039 Session::unmark_aux_send_id (uint32_t id)
6041 if (id < aux_send_bitset.size()) {
6042 aux_send_bitset[id] = false;
6047 Session::unmark_return_id (uint32_t id)
6049 if (deletion_in_progress ()) {
6052 if (id < return_bitset.size()) {
6053 return_bitset[id] = false;
6058 Session::unmark_insert_id (uint32_t id)
6060 if (id < insert_bitset.size()) {
6061 insert_bitset[id] = false;
6066 Session::reset_native_file_format ()
6068 boost::shared_ptr<RouteList> rl = routes.reader ();
6070 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
6071 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6073 /* don't save state as we do this, there's no point */
6074 _state_of_the_state = StateOfTheState (_state_of_the_state | InCleanup);
6075 tr->reset_write_sources (false);
6076 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
6082 Session::route_name_unique (string n) const
6084 boost::shared_ptr<RouteList> r = routes.reader ();
6086 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
6087 if ((*i)->name() == n) {
6096 Session::route_name_internal (string n) const
6098 if (auditioner && auditioner->name() == n) {
6102 if (_click_io && _click_io->name() == n) {
6110 Session::freeze_all (InterThreadInfo& itt)
6112 boost::shared_ptr<RouteList> r = routes.reader ();
6114 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6116 boost::shared_ptr<Track> t;
6118 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
6119 /* XXX this is wrong because itt.progress will keep returning to zero at the start
6129 boost::shared_ptr<Region>
6130 Session::write_one_track (Track& track, samplepos_t start, samplepos_t end,
6131 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
6132 InterThreadInfo& itt,
6133 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
6134 bool for_export, bool for_freeze)
6136 boost::shared_ptr<Region> result;
6137 boost::shared_ptr<Playlist> playlist;
6138 boost::shared_ptr<Source> source;
6139 ChanCount diskstream_channels (track.n_channels());
6140 samplepos_t position;
6141 samplecnt_t this_chunk;
6143 samplepos_t latency_skip;
6145 samplepos_t len = end - start;
6146 bool need_block_size_reset = false;
6147 ChanCount const max_proc = track.max_processor_streams ();
6148 string legal_playlist_name;
6149 string possible_path;
6151 DataType data_type = track.data_type();
6154 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
6155 end, start) << endmsg;
6159 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
6160 include_endpoint, for_export, for_freeze);
6162 if (data_type == DataType::MIDI && endpoint && !for_export && !for_freeze && diskstream_channels.n(DataType::AUDIO) > 0) {
6163 data_type = DataType::AUDIO;
6166 if (diskstream_channels.n(data_type) < 1) {
6167 error << _("Cannot write a range with no data.") << endmsg;
6171 // block all process callback handling
6173 block_processing ();
6176 // synchronize with AudioEngine::process_callback()
6177 // make sure processing is not currently running
6178 // and processing_blocked() is honored before
6179 // acquiring thread buffers
6180 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
6183 _bounce_processing_active = true;
6185 /* call tree *MUST* hold route_lock */
6187 if ((playlist = track.playlist()) == 0) {
6191 legal_playlist_name = "(bounce)" + legalize_for_path (playlist->name());
6193 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(data_type); ++chan_n) {
6195 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
6196 string path = ((data_type == DataType::AUDIO)
6197 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
6198 : new_midi_source_path (legal_playlist_name));
6205 source = SourceFactory::createWritable (data_type, *this, path, false, sample_rate());
6208 catch (failed_constructor& err) {
6209 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
6213 srcs.push_back (source);
6216 /* tell redirects that care that we are about to use a much larger
6217 * blocksize. this will flush all plugins too, so that they are ready
6218 * to be used for this process.
6221 need_block_size_reset = true;
6222 track.set_block_size (bounce_chunk_size);
6223 _engine.main_thread()->get_buffers ();
6227 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
6229 /* create a set of reasonably-sized buffers */
6230 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
6231 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
6233 buffers.set_count (max_proc);
6235 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
6236 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6237 boost::shared_ptr<MidiSource> ms;
6239 afs->prepare_for_peakfile_writes ();
6240 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
6241 Source::Lock lock(ms->mutex());
6242 ms->mark_streaming_write_started(lock);
6246 while (to_do && !itt.cancel) {
6248 this_chunk = min (to_do, bounce_chunk_size);
6250 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
6254 start += this_chunk;
6255 to_do -= this_chunk;
6256 itt.progress = (float) (1.0 - ((double) to_do / len));
6258 if (latency_skip >= bounce_chunk_size) {
6259 latency_skip -= bounce_chunk_size;
6263 const samplecnt_t current_chunk = this_chunk - latency_skip;
6266 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
6267 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6268 boost::shared_ptr<MidiSource> ms;
6271 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
6274 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
6275 Source::Lock lock(ms->mutex());
6277 const MidiBuffer& buf = buffers.get_midi(0);
6278 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
6279 Evoral::Event<samplepos_t> ev = *i;
6280 if (!endpoint || for_export) {
6281 ev.set_time(ev.time() - position);
6283 ms->append_event_samples(lock, ev, ms->natural_position());
6290 /* post-roll, pick up delayed processor output */
6291 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
6293 while (latency_skip && !itt.cancel) {
6294 this_chunk = min (latency_skip, bounce_chunk_size);
6295 latency_skip -= this_chunk;
6297 buffers.silence (this_chunk, 0);
6298 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
6301 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
6302 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6305 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
6317 xnow = localtime (&now);
6319 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
6320 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6321 boost::shared_ptr<MidiSource> ms;
6324 afs->update_header (position, *xnow, now);
6325 afs->flush_header ();
6326 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
6327 Source::Lock lock(ms->mutex());
6328 ms->mark_streaming_write_completed(lock);
6332 /* construct a region to represent the bounced material */
6336 plist.add (Properties::start, 0);
6337 plist.add (Properties::whole_file, true);
6338 plist.add (Properties::length, srcs.front()->length(srcs.front()->natural_position()));
6339 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
6341 result = RegionFactory::create (srcs, plist, true);
6347 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
6348 (*src)->mark_for_remove ();
6349 (*src)->drop_references ();
6353 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
6354 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6357 afs->done_with_peakfile_writes ();
6361 _bounce_processing_active = false;
6363 if (need_block_size_reset) {
6364 _engine.main_thread()->drop_buffers ();
6365 track.set_block_size (get_block_size());
6368 unblock_processing ();
6374 Session::gain_automation_buffer() const
6376 return ProcessThread::gain_automation_buffer ();
6380 Session::trim_automation_buffer() const
6382 return ProcessThread::trim_automation_buffer ();
6386 Session::send_gain_automation_buffer() const
6388 return ProcessThread::send_gain_automation_buffer ();
6392 Session::scratch_automation_buffer() const
6394 return ProcessThread::scratch_automation_buffer ();
6398 Session::pan_automation_buffer() const
6400 return ProcessThread::pan_automation_buffer ();
6404 Session::get_silent_buffers (ChanCount count)
6406 return ProcessThread::get_silent_buffers (count);
6410 Session::get_scratch_buffers (ChanCount count, bool silence)
6412 return ProcessThread::get_scratch_buffers (count, silence);
6416 Session::get_noinplace_buffers (ChanCount count)
6418 return ProcessThread::get_noinplace_buffers (count);
6422 Session::get_route_buffers (ChanCount count, bool silence)
6424 return ProcessThread::get_route_buffers (count, silence);
6429 Session::get_mix_buffers (ChanCount count)
6431 return ProcessThread::get_mix_buffers (count);
6435 Session::ntracks () const
6438 boost::shared_ptr<RouteList> r = routes.reader ();
6440 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
6441 if (boost::dynamic_pointer_cast<Track> (*i)) {
6450 Session::nbusses () const
6453 boost::shared_ptr<RouteList> r = routes.reader ();
6455 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
6456 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
6465 Session::nstripables (bool with_monitor) const
6467 uint32_t rv = routes.reader()->size ();
6468 rv += _vca_manager->vcas ().size ();
6482 Session::plot_process_graph (std::string const& file_name) const {
6483 return _process_graph ? _process_graph->plot (file_name) : false;
6487 Session::add_automation_list(AutomationList *al)
6489 automation_lists[al->id()] = al;
6492 /** @return true if there is at least one record-enabled track, otherwise false */
6494 Session::have_rec_enabled_track () const
6496 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
6500 Session::have_rec_disabled_track () const
6502 return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
6505 /** Update the state of our rec-enabled tracks flag */
6507 Session::update_route_record_state ()
6509 boost::shared_ptr<RouteList> rl = routes.reader ();
6510 RouteList::iterator i = rl->begin();
6511 while (i != rl->end ()) {
6513 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6514 if (tr && tr->rec_enable_control()->get_value()) {
6521 int const old = g_atomic_int_get (&_have_rec_enabled_track);
6523 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
6525 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
6526 RecordStateChanged (); /* EMIT SIGNAL */
6529 for (i = rl->begin(); i != rl->end (); ++i) {
6530 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6531 if (tr && !tr->rec_enable_control()->get_value()) {
6536 g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
6538 bool record_arm_state_changed = (old != g_atomic_int_get (&_have_rec_enabled_track) );
6540 if (record_status() == Recording && record_arm_state_changed ) {
6541 RecordArmStateChanged ();
6547 Session::listen_position_changed ()
6550 /* skip duing session restore (already taken care of) */
6553 ProcessorChangeBlocker pcb (this);
6554 boost::shared_ptr<RouteList> r = routes.reader ();
6555 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6556 (*i)->listen_position_changed ();
6561 Session::solo_control_mode_changed ()
6563 if (soloing() || listening()) {
6565 /* We can't use ::clear_all_solo_state() here because during
6566 session loading at program startup, that will queue a call
6567 to rt_clear_all_solo_state() that will not execute until
6568 AFTER solo states have been established (thus throwing away
6569 the session's saved solo state). So just explicitly turn
6572 set_controls (route_list_to_control_list (get_routes(), &Stripable::solo_control), 0.0, Controllable::NoGroup);
6574 clear_all_solo_state (get_routes());
6579 /** Called when a property of one of our route groups changes */
6581 Session::route_group_property_changed (RouteGroup* rg)
6583 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
6586 /** Called when a route is added to one of our route groups */
6588 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
6590 RouteAddedToRouteGroup (rg, r);
6593 /** Called when a route is removed from one of our route groups */
6595 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
6597 update_route_record_state ();
6598 RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
6600 if (!rg->has_control_master () && !rg->has_subgroup () && rg->empty()) {
6601 remove_route_group (*rg);
6605 boost::shared_ptr<AudioTrack>
6606 Session::get_nth_audio_track (int nth) const
6608 boost::shared_ptr<RouteList> rl = routes.reader ();
6609 rl->sort (Stripable::Sorter ());
6611 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
6612 if (!boost::dynamic_pointer_cast<AudioTrack> (*r)) {
6619 return boost::dynamic_pointer_cast<AudioTrack> (*r);
6621 return boost::shared_ptr<AudioTrack> ();
6624 boost::shared_ptr<RouteList>
6625 Session::get_tracks () const
6627 boost::shared_ptr<RouteList> rl = routes.reader ();
6628 boost::shared_ptr<RouteList> tl (new RouteList);
6630 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
6631 if (boost::dynamic_pointer_cast<Track> (*r)) {
6632 assert (!(*r)->is_auditioner()); // XXX remove me
6639 boost::shared_ptr<RouteList>
6640 Session::get_routes_with_regions_at (samplepos_t const p) const
6642 boost::shared_ptr<RouteList> r = routes.reader ();
6643 boost::shared_ptr<RouteList> rl (new RouteList);
6645 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6646 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6651 boost::shared_ptr<Playlist> pl = tr->playlist ();
6656 if (pl->has_region_at (p)) {
6665 Session::goto_end ()
6667 if (_session_range_location) {
6668 request_locate (_session_range_location->end(), false);
6670 request_locate (0, false);
6675 Session::goto_start (bool and_roll)
6677 if (_session_range_location) {
6678 request_locate (_session_range_location->start(), and_roll);
6680 request_locate (0, and_roll);
6685 Session::current_start_sample () const
6687 return _session_range_location ? _session_range_location->start() : 0;
6691 Session::current_end_sample () const
6693 return _session_range_location ? _session_range_location->end() : 0;
6697 Session::set_session_range_location (samplepos_t start, samplepos_t end)
6699 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange, 0);
6700 _locations->add (_session_range_location);
6704 Session::step_edit_status_change (bool yn)
6710 send = (_step_editors == 0);
6715 send = (_step_editors == 1);
6718 if (_step_editors > 0) {
6724 StepEditStatusChange (val);
6730 Session::start_time_changed (samplepos_t old)
6732 /* Update the auto loop range to match the session range
6733 (unless the auto loop range has been changed by the user)
6736 Location* s = _locations->session_range_location ();
6741 Location* l = _locations->auto_loop_location ();
6743 if (l && l->start() == old) {
6744 l->set_start (s->start(), true);
6750 Session::end_time_changed (samplepos_t old)
6752 /* Update the auto loop range to match the session range
6753 (unless the auto loop range has been changed by the user)
6756 Location* s = _locations->session_range_location ();
6761 Location* l = _locations->auto_loop_location ();
6763 if (l && l->end() == old) {
6764 l->set_end (s->end(), true);
6769 std::vector<std::string>
6770 Session::source_search_path (DataType type) const
6774 if (session_dirs.size() == 1) {
6776 case DataType::AUDIO:
6777 sp.push_back (_session_dir->sound_path());
6779 case DataType::MIDI:
6780 sp.push_back (_session_dir->midi_path());
6784 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
6785 SessionDirectory sdir (i->path);
6787 case DataType::AUDIO:
6788 sp.push_back (sdir.sound_path());
6790 case DataType::MIDI:
6791 sp.push_back (sdir.midi_path());
6797 if (type == DataType::AUDIO) {
6798 const string sound_path_2X = _session_dir->sound_path_2X();
6799 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
6800 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
6801 sp.push_back (sound_path_2X);
6806 // now check the explicit (possibly user-specified) search path
6809 case DataType::AUDIO:
6810 sp += Searchpath(config.get_audio_search_path ());
6812 case DataType::MIDI:
6813 sp += Searchpath(config.get_midi_search_path ());
6821 Session::ensure_search_path_includes (const string& path, DataType type)
6830 case DataType::AUDIO:
6831 sp += Searchpath(config.get_audio_search_path ());
6833 case DataType::MIDI:
6834 sp += Searchpath (config.get_midi_search_path ());
6838 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
6839 /* No need to add this new directory if it has the same inode as
6840 an existing one; checking inode rather than name prevents duplicated
6841 directories when we are using symlinks.
6843 On Windows, I think we could just do if (*i == path) here.
6845 if (PBD::equivalent_paths (*i, path)) {
6853 case DataType::AUDIO:
6854 config.set_audio_search_path (sp.to_string());
6856 case DataType::MIDI:
6857 config.set_midi_search_path (sp.to_string());
6863 Session::remove_dir_from_search_path (const string& dir, DataType type)
6868 case DataType::AUDIO:
6869 sp = Searchpath(config.get_audio_search_path ());
6871 case DataType::MIDI:
6872 sp = Searchpath (config.get_midi_search_path ());
6879 case DataType::AUDIO:
6880 config.set_audio_search_path (sp.to_string());
6882 case DataType::MIDI:
6883 config.set_midi_search_path (sp.to_string());
6889 boost::shared_ptr<Speakers>
6890 Session::get_speakers()
6896 Session::unknown_processors () const
6900 boost::shared_ptr<RouteList> r = routes.reader ();
6901 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6902 list<string> t = (*i)->unknown_processors ();
6903 copy (t.begin(), t.end(), back_inserter (p));
6913 Session::set_worst_io_latencies_x (IOChange, void *)
6915 set_worst_io_latencies ();
6919 Session::send_latency_compensation_change ()
6921 /* As a result of Send::set_output_latency()
6922 * or InternalReturn::set_playback_offset ()
6923 * the send's own latency can change (source track
6924 * is aligned with target bus).
6926 * This can only happen be triggered by
6927 * Route::update_signal_latency ()
6928 * when updating the processor latency.
6930 * We need to walk the graph again to take those changes into account
6931 * (we should probably recurse or process the graph in a 2 step process).
6933 ++_send_latency_changes;
6937 Session::update_route_latency (bool playback, bool apply_to_delayline)
6939 /* Note: RouteList is process-graph sorted */
6940 boost::shared_ptr<RouteList> r = routes.reader ();
6943 /* reverse the list so that we work backwards from the last route to run to the first,
6944 * this is not needed, but can help to reduce the iterations for aux-sends.
6946 RouteList* rl = routes.reader().get();
6947 r.reset (new RouteList (*rl));
6948 reverse (r->begin(), r->end());
6951 bool changed = false;
6954 _send_latency_changes = 0;
6955 _worst_route_latency = 0;
6957 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6958 // if (!(*i)->active()) { continue ; } // TODO
6960 if ((*i)->signal_latency () != (l = (*i)->update_signal_latency (apply_to_delayline))) {
6963 _worst_route_latency = std::max (l, _worst_route_latency);
6966 if (_send_latency_changes > 0) {
6967 // only 1 extra iteration is needed (we allow only 1 level of aux-sends)
6968 // BUT.. jack'n'sends'n'bugs
6969 if (++bailout < 5) {
6970 cerr << "restarting Session::update_latency. # of send changes: " << _send_latency_changes << " iteration: " << bailout << endl;
6975 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_route_latency, (changed ? "yes" : "no")));
6981 Session::update_latency (bool playback)
6983 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
6985 if (inital_connect_or_deletion_in_progress () || _adding_routes_in_progress || _route_deletion_in_progress) {
6988 if (!_engine.running()) {
6992 /* Note; RouteList is sorted as process-graph */
6993 boost::shared_ptr<RouteList> r = routes.reader ();
6996 /* reverse the list so that we work backwards from the last route to run to the first */
6997 RouteList* rl = routes.reader().get();
6998 r.reset (new RouteList (*rl));
6999 reverse (r->begin(), r->end());
7002 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
7003 samplecnt_t latency = (*i)->set_private_port_latencies (playback);
7004 (*i)->set_public_port_latencies (latency, playback);
7008 set_worst_output_latency ();
7009 update_route_latency (true, true);
7011 set_worst_input_latency ();
7012 update_route_latency (false, false);
7015 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
7019 Session::initialize_latencies ()
7022 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
7023 update_latency (false);
7024 update_latency (true);
7027 set_worst_io_latencies ();
7031 Session::set_worst_io_latencies ()
7033 set_worst_output_latency ();
7034 set_worst_input_latency ();
7038 Session::set_worst_output_latency ()
7040 if (inital_connect_or_deletion_in_progress ()) {
7044 _worst_output_latency = 0;
7046 if (!_engine.running()) {
7050 boost::shared_ptr<RouteList> r = routes.reader ();
7052 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
7053 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
7056 _worst_output_latency = max (_worst_output_latency, _click_io->latency());
7058 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
7062 Session::set_worst_input_latency ()
7064 if (inital_connect_or_deletion_in_progress ()) {
7068 _worst_input_latency = 0;
7070 if (!_engine.running()) {
7074 boost::shared_ptr<RouteList> r = routes.reader ();
7076 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
7077 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
7080 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
7084 Session::update_latency_compensation (bool force_whole_graph)
7086 if (inital_connect_or_deletion_in_progress ()) {
7089 /* this lock is not usually contended, but under certain conditions,
7090 * update_latency_compensation may be called concurrently.
7091 * e.g. drag/drop copy a latent plugin while rolling.
7092 * GUI thread (via route_processors_changed) and
7093 * auto_connect_thread_run may race.
7095 Glib::Threads::Mutex::Lock lx (_update_latency_lock, Glib::Threads::TRY_LOCK);
7097 /* no need to do this twice */
7101 bool some_track_latency_changed = update_route_latency (false, false);
7103 if (some_track_latency_changed || force_whole_graph) {
7104 _engine.update_latencies ();
7105 /* above call will ask the backend up update its latencies, which
7106 * eventually will trigger AudioEngine::latency_callback () and
7107 * call Session::update_latency ()
7110 boost::shared_ptr<RouteList> r = routes.reader ();
7111 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
7112 (*i)->apply_latency_compensation ();
7118 Session::session_name_is_legal (const string& path)
7120 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
7122 for (int i = 0; illegal_chars[i]; ++i) {
7123 if (path.find (illegal_chars[i]) != string::npos) {
7124 return illegal_chars[i];
7132 Session::notify_presentation_info_change ()
7134 if (deletion_in_progress()) {
7138 reassign_track_numbers();
7140 #ifdef USE_TRACKS_CODE_FEATURES
7141 /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
7142 * if track order has been changed by user
7144 reconnect_existing_routes(true, true);
7150 Session::operation_in_progress (GQuark op) const
7152 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
7155 boost::shared_ptr<Port>
7156 Session::ltc_output_port () const
7158 return _ltc_output ? _ltc_output->nth (0) : boost::shared_ptr<Port> ();
7162 Session::reconnect_ltc_output ()
7166 string src = Config->get_ltc_output_port();
7168 _ltc_output->disconnect (this);
7170 if (src != _("None") && !src.empty()) {
7171 _ltc_output->nth (0)->connect (src);
7177 Session::set_range_selection (samplepos_t start, samplepos_t end)
7179 _range_selection = Evoral::Range<samplepos_t> (start, end);
7180 #ifdef USE_TRACKS_CODE_FEATURES
7181 follow_playhead_priority ();
7186 Session::set_object_selection (samplepos_t start, samplepos_t end)
7188 _object_selection = Evoral::Range<samplepos_t> (start, end);
7189 #ifdef USE_TRACKS_CODE_FEATURES
7190 follow_playhead_priority ();
7195 Session::clear_range_selection ()
7197 _range_selection = Evoral::Range<samplepos_t> (-1,-1);
7198 #ifdef USE_TRACKS_CODE_FEATURES
7199 follow_playhead_priority ();
7204 Session::clear_object_selection ()
7206 _object_selection = Evoral::Range<samplepos_t> (-1,-1);
7207 #ifdef USE_TRACKS_CODE_FEATURES
7208 follow_playhead_priority ();
7213 Session::auto_connect_route (boost::shared_ptr<Route> route, bool connect_inputs,
7214 const ChanCount& input_start,
7215 const ChanCount& output_start,
7216 const ChanCount& input_offset,
7217 const ChanCount& output_offset)
7219 Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
7220 _auto_connect_queue.push (AutoConnectRequest (route, connect_inputs,
7221 input_start, output_start,
7222 input_offset, output_offset));
7224 auto_connect_thread_wakeup ();
7228 Session::auto_connect_thread_wakeup ()
7230 if (pthread_mutex_trylock (&_auto_connect_mutex) == 0) {
7231 pthread_cond_signal (&_auto_connect_cond);
7232 pthread_mutex_unlock (&_auto_connect_mutex);
7237 Session::queue_latency_recompute ()
7239 g_atomic_int_inc (&_latency_recompute_pending);
7240 auto_connect_thread_wakeup ();
7244 Session::auto_connect (const AutoConnectRequest& ar)
7246 boost::shared_ptr<Route> route = ar.route.lock();
7248 if (!route) { return; }
7250 if (!IO::connecting_legal) {
7254 /* If both inputs and outputs are auto-connected to physical ports,
7255 * use the max of input and output offsets to ensure auto-connected
7256 * port numbers always match up (e.g. the first audio input and the
7257 * first audio output of the route will have the same physical
7258 * port number). Otherwise just use the lowest input or output
7262 const bool in_out_physical =
7263 (Config->get_input_auto_connect() & AutoConnectPhysical)
7264 && (Config->get_output_auto_connect() & AutoConnectPhysical)
7265 && ar.connect_inputs;
7267 const ChanCount in_offset = in_out_physical
7268 ? ChanCount::max(ar.input_offset, ar.output_offset)
7271 const ChanCount out_offset = in_out_physical
7272 ? ChanCount::max(ar.input_offset, ar.output_offset)
7275 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
7276 vector<string> physinputs;
7277 vector<string> physoutputs;
7280 /* for connecting track inputs we only want MIDI ports marked
7284 get_physical_ports (physinputs, physoutputs, *t, MidiPortMusic);
7286 if (!physinputs.empty() && ar.connect_inputs) {
7287 uint32_t nphysical_in = physinputs.size();
7289 for (uint32_t i = ar.input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
7292 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
7293 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
7296 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
7302 if (!physoutputs.empty()) {
7303 uint32_t nphysical_out = physoutputs.size();
7304 for (uint32_t i = ar.output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
7308 * do not create new connections if we reached the limit of physical outputs
7311 if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
7312 ARDOUR::Profile->get_trx () &&
7313 ar.output_offset.get(*t) == nphysical_out ) {
7317 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
7318 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
7319 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
7320 /* master bus is audio only */
7321 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
7322 port = _master_out->input()->ports().port(*t,
7323 i % _master_out->input()->n_ports().get(*t))->name();
7327 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
7336 Session::auto_connect_thread_start ()
7338 if (g_atomic_int_get (&_ac_thread_active)) {
7342 while (!_auto_connect_queue.empty ()) {
7343 _auto_connect_queue.pop ();
7346 g_atomic_int_set (&_ac_thread_active, 1);
7347 if (pthread_create (&_auto_connect_thread, NULL, auto_connect_thread, this)) {
7348 g_atomic_int_set (&_ac_thread_active, 0);
7353 Session::auto_connect_thread_terminate ()
7355 if (!g_atomic_int_get (&_ac_thread_active)) {
7360 Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
7361 while (!_auto_connect_queue.empty ()) {
7362 _auto_connect_queue.pop ();
7366 /* cannot use auto_connect_thread_wakeup() because that is allowed to
7367 * fail to wakeup the thread.
7370 pthread_mutex_lock (&_auto_connect_mutex);
7371 g_atomic_int_set (&_ac_thread_active, 0);
7372 pthread_cond_signal (&_auto_connect_cond);
7373 pthread_mutex_unlock (&_auto_connect_mutex);
7376 pthread_join (_auto_connect_thread, &status);
7380 Session::auto_connect_thread (void *arg)
7382 Session *s = static_cast<Session *>(arg);
7383 s->auto_connect_thread_run ();
7389 Session::auto_connect_thread_run ()
7391 pthread_set_name (X_("autoconnect"));
7392 SessionEvent::create_per_thread_pool (X_("autoconnect"), 1024);
7393 PBD::notify_event_loops_about_thread_creation (pthread_self(), X_("autoconnect"), 1024);
7394 pthread_mutex_lock (&_auto_connect_mutex);
7395 while (g_atomic_int_get (&_ac_thread_active)) {
7397 if (!_auto_connect_queue.empty ()) {
7398 // Why would we need the process lock ??
7399 // A: if ports are added while we're connecting, the backend's iterator may be invalidated:
7400 // graph_order_callback() -> resort_routes() -> direct_feeds_according_to_reality () -> backend::connected_to()
7401 // All ardour-internal backends use a std::vector xxxAudioBackend::find_port()
7402 // We have control over those, but what does jack do?
7403 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
7405 Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
7406 while (!_auto_connect_queue.empty ()) {
7407 const AutoConnectRequest ar (_auto_connect_queue.front());
7408 _auto_connect_queue.pop ();
7415 if (!actively_recording ()) { // might not be needed,
7416 /* this is only used for updating plugin latencies, the
7417 * graph does not change. so it's safe in general.
7419 * update_latency_compensation ()
7420 * calls DiskWriter::set_capture_offset () which
7421 * modifies the capture-offset, which can be a problem.
7423 while (g_atomic_int_and (&_latency_recompute_pending, 0)) {
7424 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
7425 update_latency_compensation ();
7430 // this may call ARDOUR::Port::drop ... jack_port_unregister ()
7431 // jack1 cannot cope with removing ports while processing
7432 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
7433 AudioEngine::instance()->clear_pending_port_deletions ();
7436 pthread_cond_wait (&_auto_connect_cond, &_auto_connect_mutex);
7438 pthread_mutex_unlock (&_auto_connect_mutex);
7442 Session::cancel_all_solo ()
7446 get_stripables (sl);
7448 set_controls (stripable_list_to_control_list (sl, &Stripable::solo_control), 0.0, Controllable::NoGroup);
7449 clear_all_solo_state (routes.reader());
7453 Session::maybe_update_tempo_from_midiclock_tempo (float bpm)
7455 if (_tempo_map->n_tempos() == 1) {
7456 TempoSection& ts (_tempo_map->tempo_section_at_sample (0));
7457 if (fabs (ts.note_types_per_minute() - bpm) > (0.01 * ts.note_types_per_minute())) {
7458 const Tempo tempo (bpm, 4.0, bpm);
7459 std::cerr << "new tempo " << bpm << " old " << ts.note_types_per_minute() << std::endl;
7460 _tempo_map->replace_tempo (ts, tempo, 0.0, 0.0, AudioTime);