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 */
2093 remove_pending_capture_state ();
2099 Session::step_back_from_record ()
2101 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
2103 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
2104 set_track_monitor_input_status (false);
2107 RecordStateChanged (); /* emit signal */
2112 Session::maybe_enable_record (bool rt_context)
2114 if (_step_editors > 0) {
2118 g_atomic_int_set (&_record_status, Enabled);
2120 /* This function is currently called from somewhere other than an RT thread.
2121 * (except maybe lua scripts, which can use rt_context = true)
2122 * This save_state() call therefore doesn't impact anything. Doing it here
2123 * means that we save pending state of which sources the next record will use,
2124 * which gives us some chance of recovering from a crash during the record.
2128 save_state ("", true);
2131 if (_transport_speed) {
2132 if (!config.get_punch_in()) {
2136 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
2137 RecordStateChanged (); /* EMIT SIGNAL */
2144 Session::audible_sample (bool* latent_locate) const
2146 if (latent_locate) {
2147 *latent_locate = false;
2152 if (synced_to_engine()) {
2153 /* Note: this is basically just sync-to-JACK */
2154 ret = _engine.transport_sample();
2156 ret = _transport_sample;
2161 if (!transport_rolling()) {
2165 #if 0 // TODO looping
2166 if (_transport_speed > 0.0f) {
2167 if (play_loop && have_looped) {
2168 /* the play-position wrapped at the loop-point
2169 * ardour is already playing the beginning of the loop,
2170 * but due to playback latency, the "audible frame"
2171 * is still at the end of the loop.
2173 Location *location = _locations->auto_loop_location();
2174 sampleoffset_t lo = location->start() - ret;
2176 ret = location->end () - lo;
2177 if (latent_locate) {
2178 *latent_locate = true;
2182 } else if (_transport_speed < 0.0f) {
2183 /* XXX wot? no backward looping? */
2187 return std::max ((samplepos_t)0, ret);
2191 Session::preroll_samples (samplepos_t pos) const
2193 const float pr = Config->get_preroll_seconds();
2194 if (pos >= 0 && pr < 0) {
2195 const Tempo& tempo = _tempo_map->tempo_at_sample (pos);
2196 const Meter& meter = _tempo_map->meter_at_sample (pos);
2197 return meter.samples_per_bar (tempo, sample_rate()) * -pr;
2202 return pr * sample_rate();
2206 Session::set_sample_rate (samplecnt_t frames_per_second)
2208 /** \fn void Session::set_sample_size(samplecnt_t)
2209 the AudioEngine object that calls this guarantees
2210 that it will not be called while we are also in
2211 ::process(). Its fine to do things that block
2215 if (_base_sample_rate == 0) {
2216 _base_sample_rate = frames_per_second;
2218 else if (_base_sample_rate != frames_per_second && frames_per_second != _nominal_sample_rate) {
2219 NotifyAboutSampleRateMismatch (_base_sample_rate, frames_per_second);
2221 _nominal_sample_rate = frames_per_second;
2226 reset_write_sources (false);
2228 // XXX we need some equivalent to this, somehow
2229 // SndFileSource::setup_standard_crossfades (frames_per_second);
2233 /* XXX need to reset/reinstantiate all LADSPA plugins */
2237 Session::set_block_size (pframes_t nframes)
2239 /* the AudioEngine guarantees
2240 that it will not be called while we are also in
2241 ::process(). It is therefore fine to do things that block
2246 current_block_size = nframes;
2250 boost::shared_ptr<RouteList> r = routes.reader ();
2252 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2253 (*i)->set_block_size (nframes);
2256 boost::shared_ptr<RouteList> rl = routes.reader ();
2257 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2258 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2260 tr->set_block_size (nframes);
2264 set_worst_io_latencies ();
2270 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase, bool sends_only)
2272 boost::shared_ptr<Route> r2;
2274 if (r1->feeds (rbase) && rbase->feeds (r1)) {
2275 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
2279 /* make a copy of the existing list of routes that feed r1 */
2281 Route::FedBy existing (r1->fed_by());
2283 /* for each route that feeds r1, recurse, marking it as feeding
2287 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
2288 if (!(r2 = i->r.lock ())) {
2289 /* (*i) went away, ignore it */
2293 /* r2 is a route that feeds r1 which somehow feeds base. mark
2294 base as being fed by r2
2297 rbase->add_fed_by (r2, i->sends_only || sends_only);
2301 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
2305 if (r1->feeds (r2) && r2->feeds (r1)) {
2309 /* now recurse, so that we can mark base as being fed by
2310 all routes that feed r2
2313 trace_terminal (r2, rbase, i->sends_only || sends_only);
2320 Session::resort_routes ()
2322 /* don't do anything here with signals emitted
2323 by Routes during initial setup or while we
2324 are being destroyed.
2327 if (inital_connect_or_deletion_in_progress ()) {
2331 if (_route_deletion_in_progress) {
2336 RCUWriter<RouteList> writer (routes);
2337 boost::shared_ptr<RouteList> r = writer.get_copy ();
2338 resort_routes_using (r);
2339 /* writer goes out of scope and forces update */
2343 if (DEBUG_ENABLED(DEBUG::Graph)) {
2344 boost::shared_ptr<RouteList> rl = routes.reader ();
2345 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2346 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
2348 const Route::FedBy& fb ((*i)->fed_by());
2350 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
2351 boost::shared_ptr<Route> sf = f->r.lock();
2353 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
2362 /** This is called whenever we need to rebuild the graph of how we will process
2364 * @param r List of routes, in any order.
2368 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
2370 /* We are going to build a directed graph of our routes;
2371 this is where the edges of that graph are put.
2376 /* Go through all routes doing two things:
2378 * 1. Collect the edges of the route graph. Each of these edges
2379 * is a pair of routes, one of which directly feeds the other
2380 * either by a JACK connection or by an internal send.
2382 * 2. Begin the process of making routes aware of which other
2383 * routes directly or indirectly feed them. This information
2384 * is used by the solo code.
2387 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2389 /* Clear out the route's list of direct or indirect feeds */
2390 (*i)->clear_fed_by ();
2392 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
2394 bool via_sends_only;
2396 /* See if this *j feeds *i according to the current state of the JACK
2397 connections and internal sends.
2399 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
2400 /* add the edge to the graph (part #1) */
2401 edges.add (*j, *i, via_sends_only);
2402 /* tell the route (for part #2) */
2403 (*i)->add_fed_by (*j, via_sends_only);
2408 /* Attempt a topological sort of the route graph */
2409 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
2411 if (sorted_routes) {
2412 /* We got a satisfactory topological sort, so there is no feedback;
2415 Note: the process graph rechain does not require a
2416 topologically-sorted list, but hey ho.
2418 if (_process_graph) {
2419 _process_graph->rechain (sorted_routes, edges);
2422 _current_route_graph = edges;
2424 /* Complete the building of the routes' lists of what directly
2425 or indirectly feeds them.
2427 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2428 trace_terminal (*i, *i, false);
2431 *r = *sorted_routes;
2434 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
2435 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2436 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 presentation order %2\n", (*i)->name(), (*i)->presentation_info().order()));
2440 SuccessfulGraphSort (); /* EMIT SIGNAL */
2443 /* The topological sort failed, so we have a problem. Tell everyone
2444 and stick to the old graph; this will continue to be processed, so
2445 until the feedback is fixed, what is played back will not quite
2446 reflect what is actually connected. Note also that we do not
2447 do trace_terminal here, as it would fail due to an endless recursion,
2448 so the solo code will think that everything is still connected
2452 FeedbackDetected (); /* EMIT SIGNAL */
2457 /** Find a route name starting with \a base, maybe followed by the
2458 * lowest \a id. \a id will always be added if \a definitely_add_number
2459 * is true on entry; otherwise it will only be added if required
2460 * to make the name unique.
2462 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
2463 * The available route name with the lowest ID will be used, and \a id
2464 * will be set to the ID.
2466 * \return false if a route name could not be found, and \a track_name
2467 * and \a id do not reflect a free route name.
2470 Session::find_route_name (string const & base, uint32_t& id, string& name, bool definitely_add_number)
2472 /* the base may conflict with ports that do not belong to existing
2473 routes, but hidden objects like the click track. So check port names
2474 before anything else.
2477 for (map<string,bool>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
2478 if (base == reserved->first) {
2479 /* Check if this reserved name already exists, and if
2480 so, disallow it without a numeric suffix.
2482 if (!reserved->second || route_by_name (reserved->first)) {
2483 definitely_add_number = true;
2492 /* if we have "base 1" already, it doesn't make sense to add "base"
2493 * if "base 1" has been deleted, adding "base" is no worse than "base 1"
2495 if (!definitely_add_number && route_by_name (base) == 0 && (route_by_name (string_compose("%1 1", base)) == 0)) {
2496 /* just use the base */
2502 name = string_compose ("%1 %2", base, id);
2504 if (route_by_name (name) == 0) {
2510 } while (id < (UINT_MAX-1));
2515 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
2517 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
2519 in = ChanCount::ZERO;
2520 out = ChanCount::ZERO;
2522 boost::shared_ptr<RouteList> r = routes.reader ();
2524 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2525 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2529 assert (!tr->is_auditioner()); // XXX remove me
2530 in += tr->n_inputs();
2531 out += tr->n_outputs();
2536 Session::default_track_name_pattern (DataType t)
2539 case DataType::AUDIO:
2540 if (Profile->get_trx()) {
2547 case DataType::MIDI:
2554 /** Caller must not hold process lock
2555 * @param name_template string to use for the start of the name, or "" to use "MIDI".
2556 * @param instrument plugin info for the instrument to insert pre-fader, if any
2558 list<boost::shared_ptr<MidiTrack> >
2559 Session::new_midi_track (const ChanCount& input, const ChanCount& output, bool strict_io,
2560 boost::shared_ptr<PluginInfo> instrument, Plugin::PresetRecord* pset,
2561 RouteGroup* route_group, uint32_t how_many,
2562 string name_template, PresentationInfo::order_t order,
2566 uint32_t track_id = 0;
2568 RouteList new_routes;
2569 list<boost::shared_ptr<MidiTrack> > ret;
2571 const string name_pattern = default_track_name_pattern (DataType::MIDI);
2572 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
2575 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, use_number)) {
2576 error << "cannot find name for new midi track" << endmsg;
2580 boost::shared_ptr<MidiTrack> track;
2583 track.reset (new MidiTrack (*this, track_name, mode));
2585 if (track->init ()) {
2590 track->set_strict_io (true);
2593 BOOST_MARK_TRACK (track);
2596 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2597 if (track->input()->ensure_io (input, false, this)) {
2598 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
2602 if (track->output()->ensure_io (output, false, this)) {
2603 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
2609 route_group->add (track);
2612 new_routes.push_back (track);
2613 ret.push_back (track);
2616 catch (failed_constructor &err) {
2617 error << _("Session: could not create new midi track.") << endmsg;
2621 catch (AudioEngine::PortRegistrationFailure& pfe) {
2623 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;
2631 if (!new_routes.empty()) {
2632 StateProtector sp (this);
2633 if (Profile->get_trx()) {
2634 add_routes (new_routes, false, false, false, order);
2636 add_routes (new_routes, true, true, false, order);
2640 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
2641 PluginPtr plugin = instrument->load (*this);
2643 warning << "Failed to add Synth Plugin to newly created track." << endmsg;
2647 plugin->load_preset (*pset);
2649 boost::shared_ptr<PluginInsert> pi (new PluginInsert (*this, plugin));
2651 pi->set_strict_io (true);
2654 (*r)->add_processor (pi, PreFader);
2656 if (Profile->get_mixbus () && pi->configured () && pi->output_streams().n_audio() > 2) {
2657 (*r)->move_instrument_down (false);
2667 Session::new_midi_route (RouteGroup* route_group, uint32_t how_many, string name_template, bool strict_io,
2668 boost::shared_ptr<PluginInfo> instrument, Plugin::PresetRecord* pset,
2669 PresentationInfo::Flag flag, PresentationInfo::order_t order)
2672 uint32_t bus_id = 0;
2676 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Midi Bus");
2679 if (!find_route_name (name_template.empty () ? _("Midi Bus") : name_template, ++bus_id, bus_name, use_number)) {
2680 error << "cannot find name for new midi bus" << endmsg;
2685 boost::shared_ptr<Route> bus (new Route (*this, bus_name, flag, DataType::AUDIO)); // XXX Editor::add_routes is not ready for ARDOUR::DataType::MIDI
2692 bus->set_strict_io (true);
2695 BOOST_MARK_ROUTE(bus);
2698 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2700 if (bus->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
2701 error << _("cannot configure new midi bus input") << endmsg;
2706 if (bus->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
2707 error << _("cannot configure new midi bus output") << endmsg;
2713 route_group->add (bus);
2716 bus->add_internal_return ();
2717 ret.push_back (bus);
2720 catch (failed_constructor &err) {
2721 error << _("Session: could not create new audio route.") << endmsg;
2725 catch (AudioEngine::PortRegistrationFailure& pfe) {
2726 error << pfe.what() << endmsg;
2736 StateProtector sp (this);
2737 add_routes (ret, false, false, false, order);
2740 for (RouteList::iterator r = ret.begin(); r != ret.end(); ++r) {
2741 PluginPtr plugin = instrument->load (*this);
2743 warning << "Failed to add Synth Plugin to newly created track." << endmsg;
2747 plugin->load_preset (*pset);
2749 boost::shared_ptr<PluginInsert> pi (new PluginInsert (*this, plugin));
2751 pi->set_strict_io (true);
2754 (*r)->add_processor (pi, PreFader);
2756 if (Profile->get_mixbus () && pi->configured () && pi->output_streams().n_audio() > 2) {
2757 (*r)->move_instrument_down (false);
2769 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2771 boost::shared_ptr<Route> midi_track (wmt.lock());
2777 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2779 if (change.after.n_audio() <= change.before.n_audio()) {
2783 /* new audio ports: make sure the audio goes somewhere useful,
2784 * unless the user has no-auto-connect selected.
2786 * The existing ChanCounts don't matter for this call as they are only
2787 * to do with matching input and output indices, and we are only changing
2790 auto_connect_route (midi_track, false, ChanCount(), change.before);
2794 #ifdef USE_TRACKS_CODE_FEATURES
2797 compare_routes_by_remote_id (const boost::shared_ptr<Route>& route1, const boost::shared_ptr<Route>& route2)
2799 return route1->remote_control_id() < route2->remote_control_id();
2803 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2805 // it is not allowed to perform connection
2806 if (!IO::connecting_legal) {
2810 // if we are deleting routes we will call this once at the end
2811 if (_route_deletion_in_progress) {
2815 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2821 // We need to disconnect the route's inputs and outputs first
2822 // basing on autoconnect configuration
2823 bool reconnectIputs = !(Config->get_input_auto_connect() & ManualConnect) && reconnect_inputs;
2824 bool reconnectOutputs = !(Config->get_output_auto_connect() & ManualConnect) && reconnect_outputs;
2826 ChanCount existing_inputs;
2827 ChanCount existing_outputs;
2828 count_existing_track_channels (existing_inputs, existing_outputs);
2830 //ChanCount inputs = ChanCount::ZERO;
2831 //ChanCount outputs = ChanCount::ZERO;
2833 RouteList existing_routes = *routes.reader ();
2834 existing_routes.sort (compare_routes_by_remote_id);
2837 PBD::Unwinder<bool> protect_ignore_changes (_reconnecting_routes_in_progress, true);
2839 vector<string> physinputs;
2840 vector<string> physoutputs;
2842 EngineStateController::instance()->get_physical_audio_outputs(physoutputs);
2843 EngineStateController::instance()->get_physical_audio_inputs(physinputs);
2845 uint32_t input_n = 0;
2846 uint32_t output_n = 0;
2847 RouteList::iterator rIter = existing_routes.begin();
2848 const AutoConnectOption current_input_auto_connection (Config->get_input_auto_connect());
2849 const AutoConnectOption current_output_auto_connection (Config->get_output_auto_connect());
2850 for (; rIter != existing_routes.end(); ++rIter) {
2851 if (*rIter == _master_out || *rIter == _monitor_out ) {
2855 if (current_output_auto_connection == AutoConnectPhysical) {
2856 (*rIter)->amp()->deactivate();
2857 } else if (current_output_auto_connection == AutoConnectMaster) {
2858 (*rIter)->amp()->activate();
2861 if (reconnectIputs) {
2862 (*rIter)->input()->disconnect (this); //GZ: check this; could be heavy
2864 for (uint32_t route_input_n = 0; route_input_n < (*rIter)->n_inputs().get(DataType::AUDIO); ++route_input_n) {
2866 if (current_input_auto_connection & AutoConnectPhysical) {
2868 if ( input_n == physinputs.size() ) {
2872 string port = physinputs[input_n];
2874 if (port.empty() ) {
2875 error << "Physical Input number "<< input_n << " is unavailable and cannot be connected" << endmsg;
2878 //GZ: check this; could be heavy
2879 (*rIter)->input()->connect ((*rIter)->input()->ports().port(DataType::AUDIO, route_input_n), port, this);
2885 if (reconnectOutputs) {
2887 //normalize route ouptuts: reduce the amount outputs to be equal to the amount of inputs
2888 if (current_output_auto_connection & AutoConnectPhysical) {
2890 //GZ: check this; could be heavy
2891 (*rIter)->output()->disconnect (this);
2892 size_t route_inputs_count = (*rIter)->n_inputs().get(DataType::AUDIO);
2894 //GZ: check this; could be heavy
2895 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, route_inputs_count), false, this );
2897 } else if (current_output_auto_connection & AutoConnectMaster){
2899 if (!reconnect_master) {
2903 //GZ: check this; could be heavy
2904 (*rIter)->output()->disconnect (this);
2907 uint32_t master_inputs_count = _master_out->n_inputs().get(DataType::AUDIO);
2908 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, master_inputs_count), false, this );
2910 error << error << "Master bus is not available" << endmsg;
2915 for (uint32_t route_output_n = 0; route_output_n < (*rIter)->n_outputs().get(DataType::AUDIO); ++route_output_n) {
2916 if (current_output_auto_connection & AutoConnectPhysical) {
2918 if ( output_n == physoutputs.size() ) {
2922 string port = physoutputs[output_n];
2924 if (port.empty() ) {
2925 error << "Physical Output number "<< output_n << " is unavailable and cannot be connected" << endmsg;
2928 //GZ: check this; could be heavy
2929 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2932 } else if (current_output_auto_connection & AutoConnectMaster) {
2934 if ( route_output_n == _master_out->n_inputs().get(DataType::AUDIO) ) {
2938 // connect to master bus
2939 string port = _master_out->input()->ports().port(DataType::AUDIO, route_output_n)->name();
2941 if (port.empty() ) {
2942 error << "MasterBus Input number "<< route_output_n << " is unavailable and cannot be connected" << endmsg;
2946 //GZ: check this; could be heavy
2947 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2954 _master_out->output()->disconnect (this);
2955 auto_connect_master_bus ();
2960 session_routes_reconnected (); /* EMIT SIGNAL */
2964 Session::reconnect_midi_scene_ports(bool inputs)
2968 boost::shared_ptr<MidiPort> scene_in_ptr = scene_in();
2970 scene_in_ptr->disconnect_all ();
2972 std::vector<EngineStateController::MidiPortState> midi_port_states;
2973 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2975 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2977 for (; state_iter != midi_port_states.end(); ++state_iter) {
2978 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2979 scene_in_ptr->connect (state_iter->name);
2986 boost::shared_ptr<MidiPort> scene_out_ptr = scene_out();
2988 if (scene_out_ptr ) {
2989 scene_out_ptr->disconnect_all ();
2991 std::vector<EngineStateController::MidiPortState> midi_port_states;
2992 EngineStateController::instance()->get_physical_midi_output_states (midi_port_states);
2994 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2996 for (; state_iter != midi_port_states.end(); ++state_iter) {
2997 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2998 scene_out_ptr->connect (state_iter->name);
3006 Session::reconnect_mmc_ports(bool inputs)
3008 if (inputs ) { // get all enabled midi input ports
3010 boost::shared_ptr<MidiPort> mmc_in_ptr = _midi_ports->mmc_in();
3012 mmc_in_ptr->disconnect_all ();
3013 std::vector<std::string> enabled_midi_inputs;
3014 EngineStateController::instance()->get_physical_midi_inputs (enabled_midi_inputs);
3016 std::vector<std::string>::iterator port_iter = enabled_midi_inputs.begin();
3018 for (; port_iter != enabled_midi_inputs.end(); ++port_iter) {
3019 mmc_in_ptr->connect (*port_iter);
3023 } else { // get all enabled midi output ports
3025 boost::shared_ptr<MidiPort> mmc_out_ptr = _midi_ports->mmc_out();
3027 mmc_out_ptr->disconnect_all ();
3028 std::vector<std::string> enabled_midi_outputs;
3029 EngineStateController::instance()->get_physical_midi_outputs (enabled_midi_outputs);
3031 std::vector<std::string>::iterator port_iter = enabled_midi_outputs.begin();
3033 for (; port_iter != enabled_midi_outputs.end(); ++port_iter) {
3034 mmc_out_ptr->connect (*port_iter);
3043 Session::ensure_stripable_sort_order ()
3046 get_stripables (sl);
3047 sl.sort (Stripable::Sorter ());
3049 bool change = false;
3050 PresentationInfo::order_t order = 0;
3052 for (StripableList::iterator si = sl.begin(); si != sl.end(); ++si) {
3053 boost::shared_ptr<Stripable> s (*si);
3054 assert (!s->is_auditioner ()); // XXX remove me
3055 if (s->is_monitor ()) {
3058 if (order != s->presentation_info().order()) {
3059 s->set_presentation_order (order);
3068 Session::ensure_route_presentation_info_gap (PresentationInfo::order_t first_new_order, uint32_t how_many)
3070 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("ensure order gap starting at %1 for %2\n", first_new_order, how_many));
3072 if (first_new_order == PresentationInfo::max_order) {
3073 /* adding at end, no worries */
3077 /* create a gap in the presentation info to accomodate @param how_many
3081 get_stripables (sl);
3083 for (StripableList::iterator si = sl.begin(); si != sl.end(); ++si) {
3084 boost::shared_ptr<Stripable> s (*si);
3086 if (s->presentation_info().special (false)) {
3090 if (!s->presentation_info().order_set()) {
3094 if (s->presentation_info().order () >= first_new_order) {
3095 s->set_presentation_order (s->presentation_info().order () + how_many);
3100 /** Caller must not hold process lock
3101 * @param name_template string to use for the start of the name, or "" to use "Audio".
3103 list< boost::shared_ptr<AudioTrack> >
3104 Session::new_audio_track (int input_channels, int output_channels, RouteGroup* route_group,
3105 uint32_t how_many, string name_template, PresentationInfo::order_t order,
3109 uint32_t track_id = 0;
3111 RouteList new_routes;
3112 list<boost::shared_ptr<AudioTrack> > ret;
3114 const string name_pattern = default_track_name_pattern (DataType::AUDIO);
3115 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
3119 if (!find_route_name (name_template.empty() ? _(name_pattern.c_str()) : name_template, ++track_id, track_name, use_number)) {
3120 error << "cannot find name for new audio track" << endmsg;
3124 boost::shared_ptr<AudioTrack> track;
3127 track.reset (new AudioTrack (*this, track_name, mode));
3129 if (track->init ()) {
3133 if (Profile->get_mixbus ()) {
3134 track->set_strict_io (true);
3137 if (ARDOUR::Profile->get_trx ()) {
3138 // TRACKS considers it's not a USE CASE, it's
3139 // a piece of behavior of the session model:
3141 // Gain for a newly created route depends on
3142 // the current output_auto_connect mode:
3144 // 0 for Stereo Out mode
3146 if (Config->get_output_auto_connect() & AutoConnectMaster) {
3147 track->gain_control()->set_value (dB_to_coefficient (0), Controllable::NoGroup);
3151 BOOST_MARK_TRACK (track);
3154 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3156 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
3157 error << string_compose (
3158 _("cannot configure %1 in/%2 out configuration for new audio track"),
3159 input_channels, output_channels)
3164 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
3165 error << string_compose (
3166 _("cannot configure %1 in/%2 out configuration for new audio track"),
3167 input_channels, output_channels)
3174 route_group->add (track);
3177 new_routes.push_back (track);
3178 ret.push_back (track);
3181 catch (failed_constructor &err) {
3182 error << _("Session: could not create new audio track.") << endmsg;
3186 catch (AudioEngine::PortRegistrationFailure& pfe) {
3188 error << pfe.what() << endmsg;
3196 if (!new_routes.empty()) {
3197 StateProtector sp (this);
3198 if (Profile->get_trx()) {
3199 add_routes (new_routes, false, false, false, order);
3201 add_routes (new_routes, true, true, false, order);
3208 /** Caller must not hold process lock.
3209 * @param name_template string to use for the start of the name, or "" to use "Bus".
3212 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template,
3213 PresentationInfo::Flag flags, PresentationInfo::order_t order)
3216 uint32_t bus_id = 0;
3220 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
3223 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, use_number)) {
3224 error << "cannot find name for new audio bus" << endmsg;
3229 boost::shared_ptr<Route> bus (new Route (*this, bus_name, flags, DataType::AUDIO));
3235 if (Profile->get_mixbus ()) {
3236 bus->set_strict_io (true);
3239 BOOST_MARK_ROUTE(bus);
3242 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3244 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
3245 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
3246 input_channels, output_channels)
3252 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
3253 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
3254 input_channels, output_channels)
3261 route_group->add (bus);
3264 bus->add_internal_return ();
3265 ret.push_back (bus);
3268 catch (failed_constructor &err) {
3269 error << _("Session: could not create new audio route.") << endmsg;
3273 catch (AudioEngine::PortRegistrationFailure& pfe) {
3274 error << pfe.what() << endmsg;
3284 StateProtector sp (this);
3285 if (Profile->get_trx()) {
3286 add_routes (ret, false, false, false, order);
3287 } else if (flags == PresentationInfo::FoldbackBus) {
3288 add_routes (ret, false, false, true, order); // no autoconnect
3290 add_routes (ret, false, true, true, order); // autoconnect // outputs only
3299 Session::new_route_from_template (uint32_t how_many, PresentationInfo::order_t insert_at, const std::string& template_path, const std::string& name_base,
3300 PlaylistDisposition pd)
3304 if (!tree.read (template_path.c_str())) {
3308 return new_route_from_template (how_many, insert_at, *tree.root(), name_base, pd);
3312 Session::new_route_from_template (uint32_t how_many, PresentationInfo::order_t insert_at, XMLNode& node, const std::string& name_base, PlaylistDisposition pd)
3315 uint32_t number = 0;
3316 const uint32_t being_added = how_many;
3317 /* This will prevent the use of any existing XML-provided PBD::ID
3320 Stateful::ForceIDRegeneration force_ids;
3321 IO::disable_connecting ();
3325 /* We're going to modify the node contents a bit so take a
3326 * copy. The node may be re-used when duplicating more than once.
3329 XMLNode node_copy (node);
3330 std::vector<boost::shared_ptr<Playlist> > shared_playlists;
3335 if (!name_base.empty()) {
3337 /* if we're adding more than one routes, force
3338 * all the names of the new routes to be
3339 * numbered, via the final parameter.
3342 if (!find_route_name (name_base.c_str(), ++number, name, (being_added > 1))) {
3343 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3349 string const route_name = node_copy.property(X_("name"))->value ();
3351 /* generate a new name by adding a number to the end of the template name */
3352 if (!find_route_name (route_name.c_str(), ++number, name, true)) {
3353 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3354 abort(); /*NOTREACHED*/
3358 /* figure out the appropriate playlist setup. The track
3359 * (if the Route we're creating is a track) will find
3363 if (pd == CopyPlaylist) {
3365 PBD::ID playlist_id;
3367 if (node_copy.get_property (X_("audio-playlist"), playlist_id)) {
3368 boost::shared_ptr<Playlist> playlist = _playlists->by_id (playlist_id);
3369 playlist = PlaylistFactory::create (playlist, string_compose ("%1.1", name));
3370 playlist->reset_shares ();
3371 node_copy.set_property (X_("audio-playlist"), playlist->id());
3374 if (node_copy.get_property (X_("midi-playlist"), playlist_id)) {
3375 boost::shared_ptr<Playlist> playlist = _playlists->by_id (playlist_id);
3376 playlist = PlaylistFactory::create (playlist, string_compose ("%1.1", name));
3377 playlist->reset_shares ();
3378 node_copy.set_property (X_("midi-playlist"), playlist->id());
3381 } else if (pd == SharePlaylist) {
3382 PBD::ID playlist_id;
3384 if (node_copy.get_property (X_("audio-playlist"), playlist_id)) {
3385 boost::shared_ptr<Playlist> playlist = _playlists->by_id (playlist_id);
3386 shared_playlists.push_back (playlist);
3389 if (node_copy.get_property (X_("midi-playlist"), playlist_id)) {
3390 boost::shared_ptr<Playlist> playlist = _playlists->by_id (playlist_id);
3391 shared_playlists.push_back (playlist);
3394 } else { /* NewPlaylist */
3398 if (node_copy.get_property (X_("audio-playlist"), pid)) {
3399 boost::shared_ptr<Playlist> playlist = PlaylistFactory::create (DataType::AUDIO, *this, name, false);
3400 node_copy.set_property (X_("audio-playlist"), playlist->id());
3403 if (node_copy.get_property (X_("midi-playlist"), pid)) {
3404 boost::shared_ptr<Playlist> playlist = PlaylistFactory::create (DataType::MIDI, *this, name, false);
3405 node_copy.set_property (X_("midi-playlist"), playlist->id());
3409 /* Fix up new name in the XML node */
3411 Route::set_name_in_state (node_copy, name);
3413 /* trim bitslots from listen sends so that new ones are used */
3414 XMLNodeList children = node_copy.children ();
3415 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
3416 if ((*i)->name() == X_("Processor")) {
3417 /* ForceIDRegeneration does not catch the following */
3418 XMLProperty const * role = (*i)->property (X_("role"));
3419 XMLProperty const * type = (*i)->property (X_("type"));
3420 if (role && role->value() == X_("Aux")) {
3421 /* check if the target bus exists.
3422 * we should not save aux-sends in templates.
3424 XMLProperty const * target = (*i)->property (X_("target"));
3426 (*i)->set_property ("type", "dangling-aux-send");
3429 boost::shared_ptr<Route> r = route_by_id (target->value());
3430 if (!r || boost::dynamic_pointer_cast<Track>(r)) {
3431 (*i)->set_property ("type", "dangling-aux-send");
3435 if (role && role->value() == X_("Listen")) {
3436 (*i)->remove_property (X_("bitslot"));
3438 else if (role && (role->value() == X_("Send") || role->value() == X_("Aux"))) {
3439 Delivery::Role xrole;
3440 uint32_t bitslot = 0;
3441 xrole = Delivery::Role (string_2_enum (role->value(), xrole));
3442 std::string name = Send::name_and_id_new_send(*this, xrole, bitslot, false);
3443 (*i)->remove_property (X_("bitslot"));
3444 (*i)->remove_property (X_("name"));
3445 (*i)->set_property ("bitslot", bitslot);
3446 (*i)->set_property ("name", name);
3447 XMLNodeList io_kids = (*i)->children ();
3448 for (XMLNodeList::iterator j = io_kids.begin(); j != io_kids.end(); ++j) {
3449 if ((*j)->name() != X_("IO")) {
3452 (*j)->remove_property (X_("name"));
3453 (*j)->set_property ("name", name);
3456 else if (type && type->value() == X_("intreturn")) {
3457 (*i)->remove_property (X_("bitslot"));
3458 (*i)->set_property ("ignore-bitslot", "1");
3460 else if (type && type->value() == X_("return")) {
3461 // Return::set_state() generates a new one
3462 (*i)->remove_property (X_("bitslot"));
3464 else if (type && type->value() == X_("port")) {
3465 IOProcessor::prepare_for_reset (**i, name);
3470 /* new routes start off unsoloed to avoid issues related to
3471 upstream / downstream buses.
3473 node_copy.remove_node_and_delete (X_("Controllable"), X_("name"), X_("solo"));
3475 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
3478 error << _("Session: cannot create track/bus from template description") << endmsg;
3482 /* Fix up sharing of playlists with the new Route/Track */
3484 for (vector<boost::shared_ptr<Playlist> >::iterator sp = shared_playlists.begin(); sp != shared_playlists.end(); ++sp) {
3485 (*sp)->share_with (route->id());
3488 if (boost::dynamic_pointer_cast<Track>(route)) {
3489 /* force input/output change signals so that the new diskstream
3490 picks up the configuration of the route. During session
3491 loading this normally happens in a different way.
3494 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3496 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
3497 change.after = route->input()->n_ports();
3498 route->input()->changed (change, this);
3499 change.after = route->output()->n_ports();
3500 route->output()->changed (change, this);
3503 ret.push_back (route);
3506 catch (failed_constructor &err) {
3507 error << _("Session: could not create new route from template") << endmsg;
3511 catch (AudioEngine::PortRegistrationFailure& pfe) {
3512 error << pfe.what() << endmsg;
3517 IO::enable_connecting ();
3526 StateProtector sp (this);
3527 if (Profile->get_trx()) {
3528 add_routes (ret, false, false, false, insert_at);
3530 add_routes (ret, true, true, false, insert_at);
3534 IO::enable_connecting ();
3540 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save, PresentationInfo::order_t order)
3543 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
3544 add_routes_inner (new_routes, input_auto_connect, output_auto_connect, order);
3547 error << _("Adding new tracks/busses failed") << endmsg;
3552 update_latency (false);
3553 update_latency (true);
3558 save_state (_current_snapshot_name);
3561 update_route_record_state ();
3563 RouteAdded (new_routes); /* EMIT SIGNAL */
3567 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, PresentationInfo::order_t order)
3569 ChanCount existing_inputs;
3570 ChanCount existing_outputs;
3574 count_existing_track_channels (existing_inputs, existing_outputs);
3577 RCUWriter<RouteList> writer (routes);
3578 boost::shared_ptr<RouteList> r = writer.get_copy ();
3579 n_routes = r->size();
3580 r->insert (r->end(), new_routes.begin(), new_routes.end());
3582 /* if there is no control out and we're not in the middle of loading,
3583 * resort the graph here. if there is a control out, we will resort
3584 * toward the end of this method. if we are in the middle of loading,
3585 * we will resort when done.
3588 if (!_monitor_out && IO::connecting_legal) {
3589 resort_routes_using (r);
3593 /* monitor is not part of the order */
3595 assert (n_routes > 0);
3600 PresentationInfo::ChangeSuspender cs;
3601 ensure_route_presentation_info_gap (order, new_routes.size());
3603 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x, ++added) {
3605 boost::weak_ptr<Route> wpr (*x);
3606 boost::shared_ptr<Route> r (*x);
3608 r->solo_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2,wpr));
3609 r->solo_isolate_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, wpr));
3610 r->mute_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this));
3612 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
3613 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
3614 r->processor_latency_changed.connect_same_thread (*this, boost::bind (&Session::queue_latency_recompute, this));
3616 if (r->is_master()) {
3620 if (r->is_monitor()) {
3624 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
3626 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
3627 track_playlist_changed (boost::weak_ptr<Track> (tr));
3628 tr->rec_enable_control()->Changed.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
3630 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
3632 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
3633 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
3634 mt->presentation_info().PropertyChanged.connect_same_thread (*this, boost::bind (&Session::midi_track_presentation_info_changed, this, _1, boost::weak_ptr<MidiTrack>(mt)));
3638 if (!r->presentation_info().special (false)) {
3640 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("checking PI state for %1\n", r->name()));
3642 /* presentation info order may already have been set from XML */
3644 if (!r->presentation_info().order_set()) {
3645 if (order == PresentationInfo::max_order) {
3646 /* just add to the end */
3647 r->set_presentation_order (n_routes + added);
3648 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order not set, set to NR %1 + %2 = %3\n", n_routes, added, n_routes + added));
3650 r->set_presentation_order (order + added);
3651 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order not set, set to %1 + %2 = %3\n", order, added, order + added));
3654 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order already set to %1\n", r->presentation_info().order()));
3658 #if !defined(__APPLE__) && !defined(__FreeBSD__)
3659 /* clang complains: 'operator<<' should be declared prior to the call site or in an associated namespace of one of its
3660 * arguments std::ostream& operator<<(std::ostream& o, ARDOUR::PresentationInfo const& rid)"
3662 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("added route %1, group order %2 type %3 (summary: %4)\n",
3664 r->presentation_info().order(),
3665 enum_2_string (r->presentation_info().flags()),
3666 r->presentation_info()));
3670 if (input_auto_connect || output_auto_connect) {
3671 auto_connect_route (r, input_auto_connect, ChanCount (), ChanCount (), existing_inputs, existing_outputs);
3672 existing_inputs += r->n_inputs();
3673 existing_outputs += r->n_outputs();
3678 ensure_stripable_sort_order ();
3681 if (_monitor_out && IO::connecting_legal) {
3682 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
3684 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3685 if ((*x)->is_monitor()) {
3687 } else if ((*x)->is_master()) {
3690 (*x)->enable_monitor_send ();
3695 reassign_track_numbers ();
3699 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
3701 boost::shared_ptr<RouteList> r = routes.reader ();
3702 boost::shared_ptr<Send> s;
3704 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3705 if ((s = (*i)->internal_send_for (dest)) != 0) {
3706 s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO, Controllable::NoGroup);
3712 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
3714 boost::shared_ptr<RouteList> r = routes.reader ();
3715 boost::shared_ptr<Send> s;
3717 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3718 if ((s = (*i)->internal_send_for (dest)) != 0) {
3719 s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY, Controllable::NoGroup);
3725 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
3727 boost::shared_ptr<RouteList> r = routes.reader ();
3728 boost::shared_ptr<Send> s;
3730 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3731 if ((s = (*i)->internal_send_for (dest)) != 0) {
3732 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value(), Controllable::NoGroup);
3737 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
3739 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
3741 boost::shared_ptr<RouteList> r = routes.reader ();
3742 boost::shared_ptr<RouteList> t (new RouteList);
3744 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3745 /* no MIDI sends because there are no MIDI busses yet */
3746 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
3751 add_internal_sends (dest, p, t);
3755 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
3757 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
3758 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
3763 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
3765 add_internal_send (dest, sender->before_processor_for_index (index), sender);
3769 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
3771 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
3775 if (!dest->internal_return()) {
3776 dest->add_internal_return ();
3779 sender->add_aux_send (dest, before);
3785 Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
3787 bool mute_changed = false;
3788 bool send_selected = false;
3790 { // RCU Writer scope
3791 PBD::Unwinder<bool> uw_flag (_route_deletion_in_progress, true);
3792 RCUWriter<RouteList> writer (routes);
3793 boost::shared_ptr<RouteList> rs = writer.get_copy ();
3795 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3797 if (_selection->selected (*iter)) {
3798 send_selected = true;
3801 if (*iter == _master_out) {
3805 /* speed up session deletion, don't do the solo dance */
3806 if (!deletion_in_progress ()) {
3807 (*iter)->solo_control()->set_value (0.0, Controllable::NoGroup);
3810 if ((*iter)->mute_control()->muted ()) {
3811 mute_changed = true;
3816 /* deleting the master out seems like a dumb
3817 idea, but its more of a UI policy issue
3821 if (*iter == _master_out) {
3822 _master_out = boost::shared_ptr<Route> ();
3825 if (*iter == _monitor_out) {
3826 _monitor_out.reset ();
3829 // We need to disconnect the route's inputs and outputs
3831 (*iter)->input()->disconnect (0);
3832 (*iter)->output()->disconnect (0);
3834 /* if the route had internal sends sending to it, remove them */
3836 if (!deletion_in_progress () && (*iter)->internal_return()) {
3838 boost::shared_ptr<RouteList> r = routes.reader ();
3839 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3840 boost::shared_ptr<Send> s = (*i)->internal_send_for (*iter);
3842 (*i)->remove_processor (s);
3847 /* if the monitoring section had a pointer to this route, remove it */
3848 if (_monitor_out && !(*iter)->is_master() && !(*iter)->is_monitor()) {
3849 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3850 ProcessorChangeBlocker pcb (this, false);
3851 (*iter)->remove_aux_or_listen (_monitor_out);
3854 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*iter);
3855 if (mt && mt->step_editing()) {
3856 if (_step_editors > 0) {
3862 /* writer goes out of scope, forces route list update */
3864 } // end of RCU Writer scope
3867 MuteChanged (); /* EMIT SIGNAL */
3870 update_route_solo_state ();
3871 update_latency_compensation ();
3874 /* Re-sort routes to remove the graph's current references to the one that is
3875 * going away, then flush old references out of the graph.
3876 * Wave Tracks: reconnect routes
3879 #ifdef USE_TRACKS_CODE_FEATURES
3880 reconnect_existing_routes(true, false);
3882 routes.flush (); // maybe unsafe, see below.
3886 if (_process_graph && !deletion_in_progress() && _engine.running()) {
3887 _process_graph->clear_other_chain ();
3890 /* get rid of it from the dead wood collection in the route list manager */
3891 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
3895 /* remove these routes from the selection if appropriate, and signal
3896 * the change *before* we call DropReferences for them.
3899 if (send_selected && !deletion_in_progress()) {
3900 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3901 _selection->remove_stripable_by_id ((*iter)->id());
3904 pc.add (Properties::selected);
3905 PresentationInfo::Change (pc);
3908 /* try to cause everyone to drop their references
3909 * and unregister ports from the backend
3912 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3913 (*iter)->drop_references ();
3916 if (deletion_in_progress()) {
3921 pc.add (Properties::order);
3922 PresentationInfo::Change (pc);
3924 /* save the new state of the world */
3926 if (save_state (_current_snapshot_name)) {
3927 save_history (_current_snapshot_name);
3930 update_route_record_state ();
3934 Session::remove_route (boost::shared_ptr<Route> route)
3936 boost::shared_ptr<RouteList> rl (new RouteList);
3937 rl->push_back (route);
3942 Session::route_mute_changed ()
3944 MuteChanged (); /* EMIT SIGNAL */
3949 Session::route_listen_changed (Controllable::GroupControlDisposition group_override, boost::weak_ptr<Route> wpr)
3951 boost::shared_ptr<Route> route (wpr.lock());
3957 assert (Config->get_solo_control_is_listen_control());
3959 if (route->solo_control()->soloed_by_self_or_masters()) {
3961 if (Config->get_exclusive_solo()) {
3963 RouteGroup* rg = route->route_group ();
3964 const bool group_already_accounted_for = (group_override == Controllable::ForGroup);
3966 boost::shared_ptr<RouteList> r = routes.reader ();
3968 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3969 if ((*i) == route) {
3970 /* already changed */
3974 if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
3975 /* route does not get solo propagated to it */
3979 if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
3980 /* this route is a part of the same solo group as the route
3981 * that was changed. Changing that route did change or will
3982 * change all group members appropriately, so we can ignore it
3987 (*i)->solo_control()->set_value (0.0, Controllable::NoGroup);
3993 } else if (_listen_cnt > 0) {
4000 Session::route_solo_isolated_changed (boost::weak_ptr<Route> wpr)
4002 boost::shared_ptr<Route> route (wpr.lock());
4008 bool send_changed = false;
4010 if (route->solo_isolate_control()->solo_isolated()) {
4011 if (_solo_isolated_cnt == 0) {
4012 send_changed = true;
4014 _solo_isolated_cnt++;
4015 } else if (_solo_isolated_cnt > 0) {
4016 _solo_isolated_cnt--;
4017 if (_solo_isolated_cnt == 0) {
4018 send_changed = true;
4023 IsolatedChanged (); /* EMIT SIGNAL */
4028 Session::route_solo_changed (bool self_solo_changed, Controllable::GroupControlDisposition group_override, boost::weak_ptr<Route> wpr)
4030 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1, update\n", self_solo_changed));
4032 boost::shared_ptr<Route> route (wpr.lock());
4038 if (Config->get_solo_control_is_listen_control()) {
4039 route_listen_changed (group_override, wpr);
4043 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()));
4045 if (route->solo_control()->transitioned_into_solo() == 0) {
4046 /* route solo changed by upstream/downstream or clear all solo state; not interesting
4049 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()));
4053 boost::shared_ptr<RouteList> r = routes.reader ();
4054 int32_t delta = route->solo_control()->transitioned_into_solo ();
4056 /* the route may be a member of a group that has shared-solo
4057 * semantics. If so, then all members of that group should follow the
4058 * solo of the changed route. But ... this is optional, controlled by a
4059 * Controllable::GroupControlDisposition.
4061 * The first argument to the signal that this method is connected to is the
4062 * GroupControlDisposition value that was used to change solo.
4064 * If the solo change was done with group semantics (either InverseGroup
4065 * (force the entire group to change even if the group shared solo is
4066 * disabled) or UseGroup (use the group, which may or may not have the
4067 * shared solo property enabled)) then as we propagate the change to
4068 * the entire session we should IGNORE THE GROUP that the changed route
4072 RouteGroup* rg = route->route_group ();
4073 const bool group_already_accounted_for = (group_override == Controllable::ForGroup);
4075 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate to session, group accounted for ? %1\n", group_already_accounted_for));
4077 if (delta == 1 && Config->get_exclusive_solo()) {
4079 /* new solo: disable all other solos, but not the group if its solo-enabled */
4081 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4083 if ((*i) == route) {
4084 /* already changed */
4088 if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
4089 /* route does not get solo propagated to it */
4093 if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
4094 /* this route is a part of the same solo group as the route
4095 * that was changed. Changing that route did change or will
4096 * change all group members appropriately, so we can ignore it
4102 (*i)->solo_control()->set_value (0.0, group_override);
4106 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
4108 RouteList uninvolved;
4110 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
4112 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4113 bool via_sends_only;
4114 bool in_signal_flow;
4116 if ((*i) == route) {
4117 /* already changed */
4121 if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
4122 /* route does not get solo propagated to it */
4123 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(),
4128 if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
4129 /* this route is a part of the same solo group as the route
4130 * that was changed. Changing that route did change or will
4131 * change all group members appropriately, so we can ignore it
4137 in_signal_flow = false;
4139 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
4141 if ((*i)->feeds (route, &via_sends_only)) {
4142 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
4143 if (!via_sends_only) {
4144 if (!route->soloed_by_others_upstream()) {
4145 (*i)->solo_control()->mod_solo_by_others_downstream (delta);
4147 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others upstream\n");
4150 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
4152 in_signal_flow = true;
4154 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
4157 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
4159 if (route->feeds (*i, &via_sends_only)) {
4160 /* propagate solo upstream only if routing other than
4161 sends is involved, but do consider the other route
4162 (*i) to be part of the signal flow even if only
4165 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
4169 route->soloed_by_others_downstream(),
4170 route->soloed_by_others_upstream()));
4171 if (!via_sends_only) {
4172 //NB. Triggers Invert Push, which handles soloed by downstream
4173 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
4174 (*i)->solo_control()->mod_solo_by_others_upstream (delta);
4176 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
4178 in_signal_flow = true;
4180 DEBUG_TRACE (DEBUG::Solo, string_compose("\tno feed to %1\n", (*i)->name()) );
4183 if (!in_signal_flow) {
4184 uninvolved.push_back (*i);
4188 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
4190 /* now notify that the mute state of the routes not involved in the signal
4191 pathway of the just-solo-changed route may have altered.
4194 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
4195 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
4196 (*i)->act_on_mute ();
4197 /* Session will emit SoloChanged() after all solo changes are
4198 * complete, which should be used by UIs to update mute status
4204 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
4206 /* now figure out if anything that matters is soloed (or is "listening")*/
4208 bool something_soloed = false;
4209 bool something_listening = false;
4210 uint32_t listeners = 0;
4211 uint32_t isolated = 0;
4214 r = routes.reader();
4217 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4218 if ((*i)->can_solo()) {
4219 if (Config->get_solo_control_is_listen_control()) {
4220 if ((*i)->solo_control()->soloed_by_self_or_masters()) {
4222 something_listening = true;
4225 (*i)->set_listen (false);
4226 if ((*i)->can_solo() && (*i)->solo_control()->soloed_by_self_or_masters()) {
4227 something_soloed = true;
4232 if ((*i)->solo_isolate_control()->solo_isolated()) {
4237 if (something_soloed != _non_soloed_outs_muted) {
4238 _non_soloed_outs_muted = something_soloed;
4239 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
4242 if (something_listening != _listening) {
4243 _listening = something_listening;
4244 SoloActive (_listening);
4247 _listen_cnt = listeners;
4249 if (isolated != _solo_isolated_cnt) {
4250 _solo_isolated_cnt = isolated;
4251 IsolatedChanged (); /* EMIT SIGNAL */
4254 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
4255 something_soloed, listeners, isolated));
4258 SoloChanged (); /* EMIT SIGNAL */
4263 Session::muted () const
4265 // TODO consider caching the value on every MuteChanged signal,
4266 // Note that API users may also subscribe to MuteChanged and hence
4267 // this method needs to be called first.
4270 get_stripables (all);
4271 for (StripableList::const_iterator i = all.begin(); i != all.end(); ++i) {
4272 assert (!(*i)->is_auditioner()); // XXX remove me
4273 if ((*i)->is_monitor()) {
4276 boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route>(*i);
4277 if (r && !r->active()) {
4280 boost::shared_ptr<MuteControl> mc = (*i)->mute_control();
4281 if (mc && mc->muted ()) {
4289 std::vector<boost::weak_ptr<AutomationControl> >
4290 Session::cancel_all_mute ()
4293 get_stripables (all);
4294 std::vector<boost::weak_ptr<AutomationControl> > muted;
4295 boost::shared_ptr<ControlList> cl (new ControlList);
4296 for (StripableList::const_iterator i = all.begin(); i != all.end(); ++i) {
4297 assert (!(*i)->is_auditioner());
4298 if ((*i)->is_monitor()) {
4301 boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route> (*i);
4302 if (r && !r->active()) {
4305 boost::shared_ptr<AutomationControl> ac = (*i)->mute_control();
4306 if (ac && ac->get_value () > 0) {
4308 muted.push_back (boost::weak_ptr<AutomationControl>(ac));
4311 if (!cl->empty ()) {
4312 set_controls (cl, 0.0, PBD::Controllable::UseGroup);
4318 Session::get_stripables (StripableList& sl, PresentationInfo::Flag fl) const
4320 boost::shared_ptr<RouteList> r = routes.reader ();
4321 for (RouteList::iterator it = r->begin(); it != r->end(); ++it) {
4322 if ((*it)->presentation_info ().flags () & fl) {
4327 if (fl & PresentationInfo::VCA) {
4328 VCAList v = _vca_manager->vcas ();
4329 sl.insert (sl.end(), v.begin(), v.end());
4334 Session::get_stripables () const
4336 PresentationInfo::Flag fl = PresentationInfo::AllStripables;
4338 Session::get_stripables (rv, fl);
4339 rv.sort (Stripable::Sorter ());
4344 Session::get_routelist (bool mixer_order, PresentationInfo::Flag fl) const
4346 boost::shared_ptr<RouteList> r = routes.reader ();
4348 for (RouteList::iterator it = r->begin(); it != r->end(); ++it) {
4349 if ((*it)->presentation_info ().flags () & fl) {
4353 rv.sort (Stripable::Sorter (mixer_order));
4357 boost::shared_ptr<RouteList>
4358 Session::get_routes_with_internal_returns() const
4360 boost::shared_ptr<RouteList> r = routes.reader ();
4361 boost::shared_ptr<RouteList> rl (new RouteList);
4363 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4364 if ((*i)->internal_return ()) {
4372 Session::io_name_is_legal (const std::string& name) const
4374 boost::shared_ptr<RouteList> r = routes.reader ();
4376 for (map<string,bool>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
4377 if (name == reserved->first) {
4378 if (!route_by_name (reserved->first)) {
4379 /* first instance of a reserved name is allowed for some */
4380 return reserved->second;
4382 /* all other instances of a reserved name are not allowed */
4387 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4388 if ((*i)->name() == name) {
4392 if ((*i)->has_io_processor_named (name)) {
4401 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
4404 vector<string> connections;
4406 /* if we are passed only a single route and we're not told to turn
4407 * others off, then just do the simple thing.
4410 if (flip_others == false && rl->size() == 1) {
4411 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
4413 mt->set_input_active (onoff);
4418 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
4420 PortSet& ps ((*rt)->input()->ports());
4422 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
4423 p->get_connections (connections);
4426 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
4427 routes_using_input_from (*s, rl2);
4430 /* scan all relevant routes to see if others are on or off */
4432 bool others_are_already_on = false;
4434 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
4436 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
4442 if ((*r) != (*rt)) {
4443 if (mt->input_active()) {
4444 others_are_already_on = true;
4447 /* this one needs changing */
4448 mt->set_input_active (onoff);
4454 /* globally reverse other routes */
4456 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
4457 if ((*r) != (*rt)) {
4458 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
4460 mt->set_input_active (!others_are_already_on);
4469 Session::routes_using_input_from (const string& str, RouteList& rl)
4471 boost::shared_ptr<RouteList> r = routes.reader();
4473 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4474 if ((*i)->input()->connected_to (str)) {
4480 boost::shared_ptr<Route>
4481 Session::route_by_name (string name) const
4483 boost::shared_ptr<RouteList> r = routes.reader ();
4485 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4486 if ((*i)->name() == name) {
4491 return boost::shared_ptr<Route> ((Route*) 0);
4494 boost::shared_ptr<Route>
4495 Session::route_by_id (PBD::ID id) const
4497 boost::shared_ptr<RouteList> r = routes.reader ();
4499 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4500 if ((*i)->id() == id) {
4505 return boost::shared_ptr<Route> ((Route*) 0);
4509 boost::shared_ptr<Stripable>
4510 Session::stripable_by_id (PBD::ID id) const
4513 get_stripables (sl);
4515 for (StripableList::const_iterator s = sl.begin(); s != sl.end(); ++s) {
4516 if ((*s)->id() == id) {
4521 return boost::shared_ptr<Stripable>();
4524 boost::shared_ptr<Processor>
4525 Session::processor_by_id (PBD::ID id) const
4527 boost::shared_ptr<RouteList> r = routes.reader ();
4529 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4530 boost::shared_ptr<Processor> p = (*i)->Route::processor_by_id (id);
4536 return boost::shared_ptr<Processor> ();
4539 boost::shared_ptr<Route>
4540 Session::get_remote_nth_route (PresentationInfo::order_t n) const
4542 return boost::dynamic_pointer_cast<Route> (get_remote_nth_stripable (n, PresentationInfo::Route));
4545 boost::shared_ptr<Stripable>
4546 Session::get_remote_nth_stripable (PresentationInfo::order_t n, PresentationInfo::Flag flags) const
4549 PresentationInfo::order_t match_cnt = 0;
4551 get_stripables (sl);
4552 sl.sort (Stripable::Sorter());
4554 for (StripableList::const_iterator s = sl.begin(); s != sl.end(); ++s) {
4556 if ((*s)->presentation_info().hidden()) {
4557 /* if the caller didn't explicitly ask for hidden
4558 stripables, ignore hidden ones. This matches
4559 the semantics of the pre-PresentationOrder
4560 "get by RID" logic of Ardour 4.x and earlier.
4562 XXX at some point we should likely reverse
4563 the logic of the flags, because asking for "the
4564 hidden stripables" is not going to be common,
4565 whereas asking for visible ones is normal.
4568 if (! (flags & PresentationInfo::Hidden)) {
4573 if ((*s)->presentation_info().flag_match (flags)) {
4574 if (match_cnt++ == n) {
4580 /* there is no nth stripable that matches the given flags */
4581 return boost::shared_ptr<Stripable>();
4584 boost::shared_ptr<Route>
4585 Session::route_by_selected_count (uint32_t id) const
4587 RouteList r (*(routes.reader ()));
4588 r.sort (Stripable::Sorter());
4590 RouteList::iterator i;
4592 for (i = r.begin(); i != r.end(); ++i) {
4593 if ((*i)->is_selected()) {
4601 return boost::shared_ptr<Route> ();
4605 Session::reassign_track_numbers ()
4609 RouteList r (*(routes.reader ()));
4610 r.sort (Stripable::Sorter());
4612 StateProtector sp (this);
4614 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4615 assert (!(*i)->is_auditioner());
4616 if (boost::dynamic_pointer_cast<Track> (*i)) {
4617 (*i)->set_track_number(++tn);
4619 else if (!(*i)->is_master() && !(*i)->is_monitor()) {
4620 (*i)->set_track_number(--bn);
4623 const uint32_t decimals = ceilf (log10f (tn + 1));
4624 const bool decimals_changed = _track_number_decimals != decimals;
4625 _track_number_decimals = decimals;
4627 if (decimals_changed && config.get_track_name_number ()) {
4628 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4629 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
4631 t->resync_track_name();
4634 // trigger GUI re-layout
4635 config.ParameterChanged("track-name-number");
4639 if (DEBUG_ENABLED(DEBUG::OrderKeys)) {
4640 boost::shared_ptr<RouteList> rl = routes.reader ();
4641 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4642 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 numbered %2\n", (*i)->name(), (*i)->track_number()));
4650 Session::playlist_region_added (boost::weak_ptr<Region> w)
4652 boost::shared_ptr<Region> r = w.lock ();
4657 /* These are the operations that are currently in progress... */
4658 list<GQuark> curr = _current_trans_quarks;
4661 /* ...and these are the operations during which we want to update
4662 the session range location markers.
4665 ops.push_back (Operations::capture);
4666 ops.push_back (Operations::paste);
4667 ops.push_back (Operations::duplicate_region);
4668 ops.push_back (Operations::insert_file);
4669 ops.push_back (Operations::insert_region);
4670 ops.push_back (Operations::drag_region_brush);
4671 ops.push_back (Operations::region_drag);
4672 ops.push_back (Operations::selection_grab);
4673 ops.push_back (Operations::region_fill);
4674 ops.push_back (Operations::fill_selection);
4675 ops.push_back (Operations::create_region);
4676 ops.push_back (Operations::region_copy);
4677 ops.push_back (Operations::fixed_time_region_copy);
4680 /* See if any of the current operations match the ones that we want */
4682 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
4684 /* If so, update the session range markers */
4686 maybe_update_session_range (r->position (), r->last_sample ());
4690 /** Update the session range markers if a is before the current start or
4691 * b is after the current end.
4694 Session::maybe_update_session_range (samplepos_t a, samplepos_t b)
4700 samplepos_t session_end_marker_shift_samples = session_end_shift * _nominal_sample_rate;
4702 if (_session_range_location == 0) {
4704 set_session_range_location (a, b + session_end_marker_shift_samples);
4708 if (_session_range_is_free && (a < _session_range_location->start())) {
4709 _session_range_location->set_start (a);
4712 if (_session_range_is_free && (b > _session_range_location->end())) {
4713 _session_range_location->set_end (b);
4719 Session::set_session_range_is_free (bool yn)
4721 _session_range_is_free = yn;
4725 Session::playlist_ranges_moved (list<Evoral::RangeMove<samplepos_t> > const & ranges)
4727 for (list<Evoral::RangeMove<samplepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4728 maybe_update_session_range (i->to, i->to + i->length);
4733 Session::playlist_regions_extended (list<Evoral::Range<samplepos_t> > const & ranges)
4735 for (list<Evoral::Range<samplepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4736 maybe_update_session_range (i->from, i->to);
4740 /* Region management */
4742 boost::shared_ptr<Region>
4743 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
4745 const RegionFactory::RegionMap& regions (RegionFactory::regions());
4746 RegionFactory::RegionMap::const_iterator i;
4747 boost::shared_ptr<Region> region;
4749 Glib::Threads::Mutex::Lock lm (region_lock);
4751 for (i = regions.begin(); i != regions.end(); ++i) {
4755 if (region->whole_file()) {
4757 if (child->source_equivalent (region)) {
4763 return boost::shared_ptr<Region> ();
4767 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
4769 set<boost::shared_ptr<Region> > relevant_regions;
4771 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
4772 RegionFactory::get_regions_using_source (*s, relevant_regions);
4775 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
4776 set<boost::shared_ptr<Region> >::iterator tmp;
4781 _playlists->destroy_region (*r);
4782 RegionFactory::map_remove (*r);
4784 (*r)->drop_sources ();
4785 (*r)->drop_references ();
4787 relevant_regions.erase (r);
4792 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
4795 Glib::Threads::Mutex::Lock ls (source_lock);
4796 /* remove from the main source list */
4797 sources.erase ((*s)->id());
4800 (*s)->mark_for_remove ();
4801 (*s)->drop_references ();
4811 Session::remove_last_capture ()
4813 list<boost::shared_ptr<Source> > srcs;
4815 boost::shared_ptr<RouteList> rl = routes.reader ();
4816 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4817 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4822 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
4825 srcs.insert (srcs.end(), l.begin(), l.end());
4830 destroy_sources (srcs);
4832 save_state (_current_snapshot_name);
4838 Session::get_last_capture_sources (std::list<boost::shared_ptr<Source> >& srcs)
4840 boost::shared_ptr<RouteList> rl = routes.reader ();
4841 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4842 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4847 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
4850 srcs.insert (srcs.end(), l.begin(), l.end());
4856 /* Source Management */
4859 Session::add_source (boost::shared_ptr<Source> source)
4861 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
4862 pair<SourceMap::iterator,bool> result;
4864 entry.first = source->id();
4865 entry.second = source;
4868 Glib::Threads::Mutex::Lock lm (source_lock);
4869 result = sources.insert (entry);
4872 if (result.second) {
4874 /* yay, new source */
4876 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
4879 if (!fs->within_session()) {
4880 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
4886 boost::shared_ptr<AudioFileSource> afs;
4888 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
4889 if (Config->get_auto_analyse_audio()) {
4890 Analyser::queue_source_for_analysis (source, false);
4894 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
4896 SourceAdded(source);
4901 Session::remove_source (boost::weak_ptr<Source> src)
4903 if (deletion_in_progress ()) {
4907 SourceMap::iterator i;
4908 boost::shared_ptr<Source> source = src.lock();
4915 Glib::Threads::Mutex::Lock lm (source_lock);
4917 if ((i = sources.find (source->id())) != sources.end()) {
4919 SourceRemoved(source);
4923 if (!in_cleanup () && !loading ()) {
4925 /* save state so we don't end up with a session file
4926 * referring to non-existent sources.
4929 save_state (_current_snapshot_name);
4933 boost::shared_ptr<Source>
4934 Session::source_by_id (const PBD::ID& id)
4936 Glib::Threads::Mutex::Lock lm (source_lock);
4937 SourceMap::iterator i;
4938 boost::shared_ptr<Source> source;
4940 if ((i = sources.find (id)) != sources.end()) {
4947 boost::shared_ptr<AudioFileSource>
4948 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
4950 /* Restricted to audio files because only audio sources have channel
4954 Glib::Threads::Mutex::Lock lm (source_lock);
4956 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
4957 boost::shared_ptr<AudioFileSource> afs
4958 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
4960 if (afs && afs->path() == path && chn == afs->channel()) {
4965 return boost::shared_ptr<AudioFileSource>();
4968 boost::shared_ptr<MidiSource>
4969 Session::midi_source_by_path (const std::string& path, bool need_source_lock) const
4971 /* Restricted to MIDI files because audio sources require a channel
4972 for unique identification, in addition to a path.
4975 Glib::Threads::Mutex::Lock lm (source_lock, Glib::Threads::NOT_LOCK);
4976 if (need_source_lock) {
4980 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
4981 boost::shared_ptr<MidiSource> ms
4982 = boost::dynamic_pointer_cast<MidiSource>(s->second);
4983 boost::shared_ptr<FileSource> fs
4984 = boost::dynamic_pointer_cast<FileSource>(s->second);
4986 if (ms && fs && fs->path() == path) {
4991 return boost::shared_ptr<MidiSource>();
4995 Session::count_sources_by_origin (const string& path)
4998 Glib::Threads::Mutex::Lock lm (source_lock);
5000 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
5001 boost::shared_ptr<FileSource> fs
5002 = boost::dynamic_pointer_cast<FileSource>(i->second);
5004 if (fs && fs->origin() == path) {
5013 peak_file_helper (const string& peak_path, const string& file_path, const string& file_base, bool hash) {
5015 std::string checksum = Glib::Checksum::compute_checksum(Glib::Checksum::CHECKSUM_SHA1, file_path + G_DIR_SEPARATOR + file_base);
5016 return Glib::build_filename (peak_path, checksum + peakfile_suffix);
5018 return Glib::build_filename (peak_path, file_base + peakfile_suffix);
5023 Session::construct_peak_filepath (const string& filepath, const bool in_session, const bool old_peak_name) const
5025 string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
5027 if (Glib::path_is_absolute (filepath)) {
5029 /* rip the session dir from the audiofile source */
5031 string session_path;
5032 bool in_another_session = true;
5034 if (filepath.find (interchange_dir_string) != string::npos) {
5036 session_path = Glib::path_get_dirname (filepath); /* now ends in audiofiles */
5037 session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
5038 session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
5039 session_path = Glib::path_get_dirname (session_path); /* now has session path */
5041 /* see if it is within our session */
5043 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
5044 if (i->path == session_path) {
5045 in_another_session = false;
5050 in_another_session = false;
5054 if (in_another_session) {
5055 SessionDirectory sd (session_path);
5056 return peak_file_helper (sd.peak_path(), "", Glib::path_get_basename (filepath), !old_peak_name);
5060 /* 1) if file belongs to this session
5061 * it may be a relative path (interchange/...)
5062 * or just basename (session_state, remove source)
5063 * -> just use the basename
5065 std::string filename = Glib::path_get_basename (filepath);
5068 /* 2) if the file is outside our session dir:
5069 * (imported but not copied) add the path for check-summming */
5071 path = Glib::path_get_dirname (filepath);
5074 return peak_file_helper (_session_dir->peak_path(), path, Glib::path_get_basename (filepath), !old_peak_name);
5078 Session::new_audio_source_path_for_embedded (const std::string& path)
5082 * we know that the filename is already unique because it exists
5083 * out in the filesystem.
5085 * However, when we bring it into the session, we could get a
5088 * Eg. two embedded files:
5093 * When merged into session, these collide.
5095 * There will not be a conflict with in-memory sources
5096 * because when the source was created we already picked
5097 * a unique name for it.
5099 * This collision is not likely to be common, but we have to guard
5100 * against it. So, if there is a collision, take the md5 hash of the
5101 * the path, and use that as the filename instead.
5104 SessionDirectory sdir (get_best_session_directory_for_new_audio());
5105 string base = Glib::path_get_basename (path);
5106 string newpath = Glib::build_filename (sdir.sound_path(), base);
5108 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
5112 md5.digestString (path.c_str());
5113 md5.writeToString ();
5114 base = md5.digestChars;
5116 string ext = get_suffix (path);
5123 newpath = Glib::build_filename (sdir.sound_path(), base);
5125 /* if this collides, we're screwed */
5127 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
5128 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
5137 /** Return true if there are no audio file sources that use @param name as
5138 * the filename component of their path.
5140 * Return false otherwise.
5142 * This method MUST ONLY be used to check in-session, mono files since it
5143 * hard-codes the channel of the audio file source we are looking for as zero.
5145 * If/when Ardour supports native files in non-mono formats, the logic here
5146 * will need to be revisited.
5149 Session::audio_source_name_is_unique (const string& name)
5151 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
5152 vector<space_and_path>::iterator i;
5153 uint32_t existing = 0;
5155 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
5157 /* note that we search *without* the extension so that
5158 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
5159 in the event that this new name is required for
5160 a file format change.
5163 const string spath = *i;
5165 if (matching_unsuffixed_filename_exists_in (spath, name)) {
5170 /* it is possible that we have the path already
5171 * assigned to a source that has not yet been written
5172 * (ie. the write source for a diskstream). we have to
5173 * check this in order to make sure that our candidate
5174 * path isn't used again, because that can lead to
5175 * two Sources point to the same file with different
5176 * notions of their removability.
5180 string possible_path = Glib::build_filename (spath, name);
5182 if (audio_source_by_path_and_channel (possible_path, 0)) {
5188 return (existing == 0);
5192 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)
5195 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
5197 if (Profile->get_trx() && destructive) {
5199 sstr << setfill ('0') << setw (4) << cnt;
5200 sstr << legalized_base;
5202 sstr << legalized_base;
5204 if (take_required || related_exists) {
5216 } else if (nchan > 2) {
5221 /* XXX what? more than 26 channels! */
5232 /** Return a unique name based on \a base for a new internal audio source */
5234 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
5237 string possible_name;
5238 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
5240 bool some_related_source_name_exists = false;
5242 legalized = legalize_for_path (base);
5244 // Find a "version" of the base name that doesn't exist in any of the possible directories.
5246 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
5248 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
5250 if (audio_source_name_is_unique (possible_name)) {
5254 some_related_source_name_exists = true;
5257 error << string_compose(
5258 _("There are already %1 recordings for %2, which I consider too many."),
5259 limit, base) << endmsg;
5261 throw failed_constructor();
5265 /* We've established that the new name does not exist in any session
5266 * directory, so now find out which one we should use for this new
5270 SessionDirectory sdir (get_best_session_directory_for_new_audio());
5272 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
5277 /** Return a unique name based on `base` for a new internal MIDI source */
5279 Session::new_midi_source_path (const string& base, bool need_lock)
5281 string possible_path;
5282 string possible_name;
5284 possible_name = legalize_for_path (base);
5286 // Find a "version" of the file name that doesn't exist in any of the possible directories.
5287 std::vector<string> sdirs = source_search_path(DataType::MIDI);
5289 /* - the main session folder is the first in the vector.
5290 * - after checking all locations for file-name uniqueness,
5291 * we keep the one from the last iteration as new file name
5292 * - midi files are small and should just be kept in the main session-folder
5294 * -> reverse the array, check main session folder last and use that as location
5297 std::reverse(sdirs.begin(), sdirs.end());
5300 possible_name = bump_name_once (possible_name, '-');
5302 vector<space_and_path>::iterator i;
5303 uint32_t existing = 0;
5305 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
5307 possible_path = Glib::build_filename (*i, possible_name + ".mid");
5309 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
5313 if (midi_source_by_path (possible_path, need_lock)) {
5318 if (possible_path.size () >= PATH_MAX) {
5319 error << string_compose(
5320 _("There are already many recordings for %1, resulting in a too long file-path %2."),
5321 base, possible_path) << endmsg;
5326 if (existing == 0) {
5331 /* No need to "find best location" for software/app-based RAID, because
5332 MIDI is so small that we always put it in the same place.
5335 return possible_path;
5339 /** Create a new within-session audio source */
5340 boost::shared_ptr<AudioFileSource>
5341 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
5343 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
5345 if (!path.empty()) {
5346 return boost::dynamic_pointer_cast<AudioFileSource> (
5347 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, sample_rate(), true, true));
5349 throw failed_constructor ();
5353 /** Create a new within-session MIDI source */
5354 boost::shared_ptr<MidiSource>
5355 Session::create_midi_source_for_session (string const & basic_name)
5357 const string path = new_midi_source_path (basic_name);
5359 if (!path.empty()) {
5360 return boost::dynamic_pointer_cast<SMFSource> (
5361 SourceFactory::createWritable (
5362 DataType::MIDI, *this, path, false, sample_rate()));
5364 throw failed_constructor ();
5368 /** Create a new within-session MIDI source */
5369 boost::shared_ptr<MidiSource>
5370 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
5372 /* the caller passes in the track the source will be used in,
5373 so that we can keep the numbering sane.
5375 Rationale: a track with the name "Foo" that has had N
5376 captures carried out so far will ALREADY have a write source
5377 named "Foo-N+1.mid" waiting to be used for the next capture.
5379 If we call new_midi_source_name() we will get "Foo-N+2". But
5380 there is no region corresponding to "Foo-N+1", so when
5381 "Foo-N+2" appears in the track, the gap presents the user
5382 with odd behaviour - why did it skip past Foo-N+1?
5384 We could explain this to the user in some odd way, but
5385 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
5388 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
5391 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
5393 std::string name = track->steal_write_source_name ();
5396 return boost::shared_ptr<MidiSource>();
5399 /* MIDI files are small, just put them in the first location of the
5400 session source search path.
5403 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
5405 return boost::dynamic_pointer_cast<SMFSource> (
5406 SourceFactory::createWritable (
5407 DataType::MIDI, *this, path, false, sample_rate()));
5411 Session::playlist_is_active (boost::shared_ptr<Playlist> playlist)
5413 Glib::Threads::Mutex::Lock lm (_playlists->lock);
5414 for (SessionPlaylists::List::iterator i = _playlists->playlists.begin(); i != _playlists->playlists.end(); i++) {
5415 if ( (*i) == playlist ) {
5423 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
5425 if (playlist->hidden()) {
5429 _playlists->add (playlist);
5432 playlist->release();
5439 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
5441 if (deletion_in_progress ()) {
5445 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
5451 _playlists->remove (playlist);
5457 Session::set_audition (boost::shared_ptr<Region> r)
5459 pending_audition_region = r;
5460 add_post_transport_work (PostTransportAudition);
5461 _butler->schedule_transport_work ();
5465 Session::audition_playlist ()
5467 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
5468 ev->region.reset ();
5474 Session::register_lua_function (
5475 const std::string& name,
5476 const std::string& script,
5477 const LuaScriptParamList& args
5480 Glib::Threads::Mutex::Lock lm (lua_lock);
5482 lua_State* L = lua.getState();
5484 const std::string& bytecode = LuaScripting::get_factory_bytecode (script);
5485 luabridge::LuaRef tbl_arg (luabridge::newTable(L));
5486 for (LuaScriptParamList::const_iterator i = args.begin(); i != args.end(); ++i) {
5487 if ((*i)->optional && !(*i)->is_set) { continue; }
5488 tbl_arg[(*i)->name] = (*i)->value;
5490 (*_lua_add)(name, bytecode, tbl_arg); // throws luabridge::LuaException
5493 LuaScriptsChanged (); /* EMIT SIGNAL */
5498 Session::unregister_lua_function (const std::string& name)
5500 Glib::Threads::Mutex::Lock lm (lua_lock);
5501 (*_lua_del)(name); // throws luabridge::LuaException
5502 lua.collect_garbage ();
5505 LuaScriptsChanged (); /* EMIT SIGNAL */
5509 std::vector<std::string>
5510 Session::registered_lua_functions ()
5512 Glib::Threads::Mutex::Lock lm (lua_lock);
5513 std::vector<std::string> rv;
5516 luabridge::LuaRef list ((*_lua_list)());
5517 for (luabridge::Iterator i (list); !i.isNil (); ++i) {
5518 if (!i.key ().isString ()) { assert(0); continue; }
5519 rv.push_back (i.key ().cast<std::string> ());
5526 static void _lua_print (std::string s) {
5527 std::cout << "SessionLua: " << s << "\n";
5532 Session::try_run_lua (pframes_t nframes)
5534 if (_n_lua_scripts == 0) return;
5535 Glib::Threads::Mutex::Lock tm (lua_lock, Glib::Threads::TRY_LOCK);
5537 try { (*_lua_run)(nframes); } catch (...) { }
5538 lua.collect_garbage_step ();
5543 Session::setup_lua ()
5546 lua.Print.connect (&_lua_print);
5550 "function ArdourSession ()"
5551 " local self = { scripts = {}, instances = {} }"
5553 " local remove = function (n)"
5554 " self.scripts[n] = nil"
5555 " self.instances[n] = nil"
5556 " Session:scripts_changed()" // call back
5559 " local addinternal = function (n, f, a)"
5560 " assert(type(n) == 'string', 'function-name must be string')"
5561 " assert(type(f) == 'function', 'Given script is a not a function')"
5562 " assert(type(a) == 'table' or type(a) == 'nil', 'Given argument is invalid')"
5563 " assert(self.scripts[n] == nil, 'Callback \"'.. n ..'\" already exists.')"
5564 " self.scripts[n] = { ['f'] = f, ['a'] = a }"
5565 " 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 }"
5566 " self.instances[n] = load (string.dump(f, true), nil, nil, env)(a)"
5567 " Session:scripts_changed()" // call back
5570 " local add = function (n, b, a)"
5571 " assert(type(b) == 'string', 'ByteCode must be string')"
5572 " load (b)()" // assigns f
5573 " assert(type(f) == 'string', 'Assigned ByteCode must be string')"
5574 " addinternal (n, load(f), a)"
5577 " local run = function (...)"
5578 " for n, s in pairs (self.instances) do"
5579 " local status, err = pcall (s, ...)"
5580 " if not status then"
5581 " print ('fn \"'.. n .. '\": ', err)"
5588 " local cleanup = function ()"
5589 " self.scripts = nil"
5590 " self.instances = nil"
5593 " local list = function ()"
5595 " for n, _ in pairs (self.scripts) do"
5601 " local function basic_serialize (o)"
5602 " if type(o) == \"number\" then"
5603 " return tostring(o)"
5605 " return string.format(\"%q\", o)"
5609 " local function serialize (name, value)"
5610 " local rv = name .. ' = '"
5612 " if type(value) == \"number\" or type(value) == \"string\" or type(value) == \"nil\" then"
5613 " return rv .. basic_serialize(value) .. ' '"
5614 " elseif type(value) == \"table\" then"
5616 " for k,v in pairs(value) do"
5617 " local fieldname = string.format(\"%s[%s]\", name, basic_serialize(k))"
5618 " rv = rv .. serialize(fieldname, v) .. ' '"
5619 " collectgarbage()" // string concatenation allocates a new string :(
5622 " elseif type(value) == \"function\" then"
5623 " return rv .. string.format(\"%q\", string.dump(value, true))"
5625 " error('cannot save a ' .. type(value))"
5630 " local save = function ()"
5631 " return (serialize('scripts', self.scripts))"
5634 " local restore = function (state)"
5635 " self.scripts = {}"
5637 " for n, s in pairs (scripts) do"
5638 " addinternal (n, load(s['f']), s['a'])"
5642 " return { run = run, add = add, remove = remove,"
5643 " list = list, restore = restore, save = save, cleanup = cleanup}"
5646 " sess = ArdourSession ()"
5647 " ArdourSession = nil"
5649 "function ardour () end"
5652 lua_State* L = lua.getState();
5655 luabridge::LuaRef lua_sess = luabridge::getGlobal (L, "sess");
5656 lua.do_command ("sess = nil"); // hide it.
5657 lua.do_command ("collectgarbage()");
5659 _lua_run = new luabridge::LuaRef(lua_sess["run"]);
5660 _lua_add = new luabridge::LuaRef(lua_sess["add"]);
5661 _lua_del = new luabridge::LuaRef(lua_sess["remove"]);
5662 _lua_list = new luabridge::LuaRef(lua_sess["list"]);
5663 _lua_save = new luabridge::LuaRef(lua_sess["save"]);
5664 _lua_load = new luabridge::LuaRef(lua_sess["restore"]);
5665 _lua_cleanup = new luabridge::LuaRef(lua_sess["cleanup"]);
5666 } catch (luabridge::LuaException const& e) {
5667 fatal << string_compose (_("programming error: %1"),
5668 std::string ("Failed to setup session Lua interpreter") + e.what ())
5670 abort(); /*NOTREACHED*/
5672 fatal << string_compose (_("programming error: %1"),
5673 X_("Failed to setup session Lua interpreter"))
5675 abort(); /*NOTREACHED*/
5679 LuaBindings::stddef (L);
5680 LuaBindings::common (L);
5681 LuaBindings::dsp (L);
5683 luabridge::push <Session *> (L, this);
5684 lua_setglobal (L, "Session");
5688 Session::scripts_changed ()
5690 assert (!lua_lock.trylock()); // must hold lua_lock
5693 luabridge::LuaRef list ((*_lua_list)());
5695 for (luabridge::Iterator i (list); !i.isNil (); ++i) {
5696 if (!i.key ().isString ()) { assert(0); continue; }
5699 _n_lua_scripts = cnt;
5700 } catch (luabridge::LuaException const& e) {
5701 fatal << string_compose (_("programming error: %1"),
5702 std::string ("Indexing Lua Session Scripts failed.") + e.what ())
5704 abort(); /*NOTREACHED*/
5706 fatal << string_compose (_("programming error: %1"),
5707 X_("Indexing Lua Session Scripts failed."))
5709 abort(); /*NOTREACHED*/
5714 Session::non_realtime_set_audition ()
5716 assert (pending_audition_region);
5717 auditioner->audition_region (pending_audition_region);
5718 pending_audition_region.reset ();
5719 AuditionActive (true); /* EMIT SIGNAL */
5723 Session::audition_region (boost::shared_ptr<Region> r)
5725 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
5731 Session::cancel_audition ()
5736 if (auditioner->auditioning()) {
5737 auditioner->cancel_audition ();
5738 AuditionActive (false); /* EMIT SIGNAL */
5743 Session::is_auditioning () const
5745 /* can be called before we have an auditioner object */
5747 return auditioner->auditioning();
5754 Session::graph_reordered ()
5756 /* don't do this stuff if we are setting up connections
5757 from a set_state() call or creating new tracks. Ditto for deletion.
5760 if (inital_connect_or_deletion_in_progress () || _adding_routes_in_progress || _reconnecting_routes_in_progress || _route_deletion_in_progress) {
5766 /* force all diskstreams to update their capture offset values to
5767 * reflect any changes in latencies within the graph.
5769 update_route_latency (false, true);
5772 /** @return Number of samples that there is disk space available to write,
5775 boost::optional<samplecnt_t>
5776 Session::available_capture_duration ()
5778 Glib::Threads::Mutex::Lock lm (space_lock);
5780 if (_total_free_4k_blocks_uncertain) {
5781 return boost::optional<samplecnt_t> ();
5784 float sample_bytes_on_disk = 4.0; // keep gcc happy
5786 switch (config.get_native_file_data_format()) {
5788 sample_bytes_on_disk = 4.0;
5792 sample_bytes_on_disk = 3.0;
5796 sample_bytes_on_disk = 2.0;
5800 /* impossible, but keep some gcc versions happy */
5801 fatal << string_compose (_("programming error: %1"),
5802 X_("illegal native file data format"))
5804 abort(); /*NOTREACHED*/
5807 double scale = 4096.0 / sample_bytes_on_disk;
5809 if (_total_free_4k_blocks * scale > (double) max_samplecnt) {
5810 return max_samplecnt;
5813 return (samplecnt_t) floor (_total_free_4k_blocks * scale);
5817 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
5820 RCUWriter<BundleList> writer (_bundles);
5821 boost::shared_ptr<BundleList> b = writer.get_copy ();
5822 b->push_back (bundle);
5826 BundleAddedOrRemoved (); /* EMIT SIGNAL */
5833 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
5835 bool removed = false;
5838 RCUWriter<BundleList> writer (_bundles);
5839 boost::shared_ptr<BundleList> b = writer.get_copy ();
5840 BundleList::iterator i = find (b->begin(), b->end(), bundle);
5842 if (i != b->end()) {
5849 BundleAddedOrRemoved (); /* EMIT SIGNAL */
5855 boost::shared_ptr<Bundle>
5856 Session::bundle_by_name (string name) const
5858 boost::shared_ptr<BundleList> b = _bundles.reader ();
5860 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
5861 if ((*i)->name() == name) {
5866 return boost::shared_ptr<Bundle> ();
5870 Session::tempo_map_changed (const PropertyChange&)
5874 _playlists->update_after_tempo_map_change ();
5876 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
5882 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
5884 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
5885 (*i)->recompute_samples_from_beat ();
5889 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
5890 * the given count with the current block size.
5893 Session::ensure_buffers (ChanCount howmany)
5895 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
5899 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
5901 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5902 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
5907 Session::next_insert_id ()
5909 /* this doesn't really loop forever. just think about it */
5912 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < insert_bitset.size(); ++n) {
5913 if (!insert_bitset[n]) {
5914 insert_bitset[n] = true;
5920 /* none available, so resize and try again */
5922 insert_bitset.resize (insert_bitset.size() + 16, false);
5927 Session::next_send_id ()
5929 /* this doesn't really loop forever. just think about it */
5932 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < send_bitset.size(); ++n) {
5933 if (!send_bitset[n]) {
5934 send_bitset[n] = true;
5940 /* none available, so resize and try again */
5942 send_bitset.resize (send_bitset.size() + 16, false);
5947 Session::next_aux_send_id ()
5949 /* this doesn't really loop forever. just think about it */
5952 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < aux_send_bitset.size(); ++n) {
5953 if (!aux_send_bitset[n]) {
5954 aux_send_bitset[n] = true;
5960 /* none available, so resize and try again */
5962 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
5967 Session::next_return_id ()
5969 /* this doesn't really loop forever. just think about it */
5972 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < return_bitset.size(); ++n) {
5973 if (!return_bitset[n]) {
5974 return_bitset[n] = true;
5980 /* none available, so resize and try again */
5982 return_bitset.resize (return_bitset.size() + 16, false);
5987 Session::mark_send_id (uint32_t id)
5989 if (id >= send_bitset.size()) {
5990 send_bitset.resize (id+16, false);
5992 if (send_bitset[id]) {
5993 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
5995 send_bitset[id] = true;
5999 Session::mark_aux_send_id (uint32_t id)
6001 if (id >= aux_send_bitset.size()) {
6002 aux_send_bitset.resize (id+16, false);
6004 if (aux_send_bitset[id]) {
6005 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
6007 aux_send_bitset[id] = true;
6011 Session::mark_return_id (uint32_t id)
6013 if (id >= return_bitset.size()) {
6014 return_bitset.resize (id+16, false);
6016 if (return_bitset[id]) {
6017 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
6019 return_bitset[id] = true;
6023 Session::mark_insert_id (uint32_t id)
6025 if (id >= insert_bitset.size()) {
6026 insert_bitset.resize (id+16, false);
6028 if (insert_bitset[id]) {
6029 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
6031 insert_bitset[id] = true;
6035 Session::unmark_send_id (uint32_t id)
6037 if (id < send_bitset.size()) {
6038 send_bitset[id] = false;
6043 Session::unmark_aux_send_id (uint32_t id)
6045 if (id < aux_send_bitset.size()) {
6046 aux_send_bitset[id] = false;
6051 Session::unmark_return_id (uint32_t id)
6053 if (deletion_in_progress ()) {
6056 if (id < return_bitset.size()) {
6057 return_bitset[id] = false;
6062 Session::unmark_insert_id (uint32_t id)
6064 if (id < insert_bitset.size()) {
6065 insert_bitset[id] = false;
6070 Session::reset_native_file_format ()
6072 boost::shared_ptr<RouteList> rl = routes.reader ();
6074 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
6075 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6077 /* don't save state as we do this, there's no point */
6078 _state_of_the_state = StateOfTheState (_state_of_the_state | InCleanup);
6079 tr->reset_write_sources (false);
6080 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
6086 Session::route_name_unique (string n) const
6088 boost::shared_ptr<RouteList> r = routes.reader ();
6090 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
6091 if ((*i)->name() == n) {
6100 Session::route_name_internal (string n) const
6102 if (auditioner && auditioner->name() == n) {
6106 if (_click_io && _click_io->name() == n) {
6114 Session::freeze_all (InterThreadInfo& itt)
6116 boost::shared_ptr<RouteList> r = routes.reader ();
6118 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6120 boost::shared_ptr<Track> t;
6122 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
6123 /* XXX this is wrong because itt.progress will keep returning to zero at the start
6133 boost::shared_ptr<Region>
6134 Session::write_one_track (Track& track, samplepos_t start, samplepos_t end,
6135 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
6136 InterThreadInfo& itt,
6137 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
6138 bool for_export, bool for_freeze)
6140 boost::shared_ptr<Region> result;
6141 boost::shared_ptr<Playlist> playlist;
6142 boost::shared_ptr<Source> source;
6143 ChanCount diskstream_channels (track.n_channels());
6144 samplepos_t position;
6145 samplecnt_t this_chunk;
6147 samplepos_t latency_skip;
6149 samplepos_t len = end - start;
6150 bool need_block_size_reset = false;
6151 ChanCount const max_proc = track.max_processor_streams ();
6152 string legal_playlist_name;
6153 string possible_path;
6155 DataType data_type = track.data_type();
6158 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
6159 end, start) << endmsg;
6163 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
6164 include_endpoint, for_export, for_freeze);
6166 if (data_type == DataType::MIDI && endpoint && !for_export && !for_freeze && diskstream_channels.n(DataType::AUDIO) > 0) {
6167 data_type = DataType::AUDIO;
6170 if (diskstream_channels.n(data_type) < 1) {
6171 error << _("Cannot write a range with no data.") << endmsg;
6175 // block all process callback handling
6177 block_processing ();
6180 // synchronize with AudioEngine::process_callback()
6181 // make sure processing is not currently running
6182 // and processing_blocked() is honored before
6183 // acquiring thread buffers
6184 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
6187 _bounce_processing_active = true;
6189 /* call tree *MUST* hold route_lock */
6191 if ((playlist = track.playlist()) == 0) {
6195 legal_playlist_name = "(bounce)" + legalize_for_path (playlist->name());
6197 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(data_type); ++chan_n) {
6199 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
6200 string path = ((data_type == DataType::AUDIO)
6201 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
6202 : new_midi_source_path (legal_playlist_name));
6209 source = SourceFactory::createWritable (data_type, *this, path, false, sample_rate());
6212 catch (failed_constructor& err) {
6213 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
6217 srcs.push_back (source);
6220 /* tell redirects that care that we are about to use a much larger
6221 * blocksize. this will flush all plugins too, so that they are ready
6222 * to be used for this process.
6225 need_block_size_reset = true;
6226 track.set_block_size (bounce_chunk_size);
6227 _engine.main_thread()->get_buffers ();
6231 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
6233 /* create a set of reasonably-sized buffers */
6234 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
6235 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
6237 buffers.set_count (max_proc);
6239 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
6240 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6241 boost::shared_ptr<MidiSource> ms;
6243 afs->prepare_for_peakfile_writes ();
6244 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
6245 Source::Lock lock(ms->mutex());
6246 ms->mark_streaming_write_started(lock);
6250 while (to_do && !itt.cancel) {
6252 this_chunk = min (to_do, bounce_chunk_size);
6254 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
6258 start += this_chunk;
6259 to_do -= this_chunk;
6260 itt.progress = (float) (1.0 - ((double) to_do / len));
6262 if (latency_skip >= bounce_chunk_size) {
6263 latency_skip -= bounce_chunk_size;
6267 const samplecnt_t current_chunk = this_chunk - latency_skip;
6270 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
6271 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6272 boost::shared_ptr<MidiSource> ms;
6275 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
6278 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
6279 Source::Lock lock(ms->mutex());
6281 const MidiBuffer& buf = buffers.get_midi(0);
6282 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
6283 Evoral::Event<samplepos_t> ev = *i;
6284 if (!endpoint || for_export) {
6285 ev.set_time(ev.time() - position);
6287 ms->append_event_samples(lock, ev, ms->natural_position());
6294 /* post-roll, pick up delayed processor output */
6295 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
6297 while (latency_skip && !itt.cancel) {
6298 this_chunk = min (latency_skip, bounce_chunk_size);
6299 latency_skip -= this_chunk;
6301 buffers.silence (this_chunk, 0);
6302 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
6305 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
6306 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6309 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
6321 xnow = localtime (&now);
6323 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
6324 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6325 boost::shared_ptr<MidiSource> ms;
6328 afs->update_header (position, *xnow, now);
6329 afs->flush_header ();
6330 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
6331 Source::Lock lock(ms->mutex());
6332 ms->mark_streaming_write_completed(lock);
6336 /* construct a region to represent the bounced material */
6340 plist.add (Properties::start, 0);
6341 plist.add (Properties::whole_file, true);
6342 plist.add (Properties::length, srcs.front()->length(srcs.front()->natural_position()));
6343 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
6345 result = RegionFactory::create (srcs, plist, true);
6351 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
6352 (*src)->mark_for_remove ();
6353 (*src)->drop_references ();
6357 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
6358 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6361 afs->done_with_peakfile_writes ();
6365 _bounce_processing_active = false;
6367 if (need_block_size_reset) {
6368 _engine.main_thread()->drop_buffers ();
6369 track.set_block_size (get_block_size());
6372 unblock_processing ();
6378 Session::gain_automation_buffer() const
6380 return ProcessThread::gain_automation_buffer ();
6384 Session::trim_automation_buffer() const
6386 return ProcessThread::trim_automation_buffer ();
6390 Session::send_gain_automation_buffer() const
6392 return ProcessThread::send_gain_automation_buffer ();
6396 Session::scratch_automation_buffer() const
6398 return ProcessThread::scratch_automation_buffer ();
6402 Session::pan_automation_buffer() const
6404 return ProcessThread::pan_automation_buffer ();
6408 Session::get_silent_buffers (ChanCount count)
6410 return ProcessThread::get_silent_buffers (count);
6414 Session::get_scratch_buffers (ChanCount count, bool silence)
6416 return ProcessThread::get_scratch_buffers (count, silence);
6420 Session::get_noinplace_buffers (ChanCount count)
6422 return ProcessThread::get_noinplace_buffers (count);
6426 Session::get_route_buffers (ChanCount count, bool silence)
6428 return ProcessThread::get_route_buffers (count, silence);
6433 Session::get_mix_buffers (ChanCount count)
6435 return ProcessThread::get_mix_buffers (count);
6439 Session::ntracks () const
6442 boost::shared_ptr<RouteList> r = routes.reader ();
6444 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
6445 if (boost::dynamic_pointer_cast<Track> (*i)) {
6454 Session::nbusses () const
6457 boost::shared_ptr<RouteList> r = routes.reader ();
6459 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
6460 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
6469 Session::nstripables (bool with_monitor) const
6471 uint32_t rv = routes.reader()->size ();
6472 rv += _vca_manager->vcas ().size ();
6486 Session::plot_process_graph (std::string const& file_name) const {
6487 return _process_graph ? _process_graph->plot (file_name) : false;
6491 Session::add_automation_list(AutomationList *al)
6493 automation_lists[al->id()] = al;
6496 /** @return true if there is at least one record-enabled track, otherwise false */
6498 Session::have_rec_enabled_track () const
6500 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
6504 Session::have_rec_disabled_track () const
6506 return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
6509 /** Update the state of our rec-enabled tracks flag */
6511 Session::update_route_record_state ()
6513 boost::shared_ptr<RouteList> rl = routes.reader ();
6514 RouteList::iterator i = rl->begin();
6515 while (i != rl->end ()) {
6517 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6518 if (tr && tr->rec_enable_control()->get_value()) {
6525 int const old = g_atomic_int_get (&_have_rec_enabled_track);
6527 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
6529 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
6530 RecordStateChanged (); /* EMIT SIGNAL */
6533 for (i = rl->begin(); i != rl->end (); ++i) {
6534 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6535 if (tr && !tr->rec_enable_control()->get_value()) {
6540 g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
6542 bool record_arm_state_changed = (old != g_atomic_int_get (&_have_rec_enabled_track) );
6544 if (record_status() == Recording && record_arm_state_changed ) {
6545 RecordArmStateChanged ();
6551 Session::listen_position_changed ()
6554 /* skip duing session restore (already taken care of) */
6557 ProcessorChangeBlocker pcb (this);
6558 boost::shared_ptr<RouteList> r = routes.reader ();
6559 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6560 (*i)->listen_position_changed ();
6565 Session::solo_control_mode_changed ()
6567 if (soloing() || listening()) {
6569 /* We can't use ::clear_all_solo_state() here because during
6570 session loading at program startup, that will queue a call
6571 to rt_clear_all_solo_state() that will not execute until
6572 AFTER solo states have been established (thus throwing away
6573 the session's saved solo state). So just explicitly turn
6576 set_controls (route_list_to_control_list (get_routes(), &Stripable::solo_control), 0.0, Controllable::NoGroup);
6578 clear_all_solo_state (get_routes());
6583 /** Called when a property of one of our route groups changes */
6585 Session::route_group_property_changed (RouteGroup* rg)
6587 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
6590 /** Called when a route is added to one of our route groups */
6592 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
6594 RouteAddedToRouteGroup (rg, r);
6597 /** Called when a route is removed from one of our route groups */
6599 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
6601 update_route_record_state ();
6602 RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
6604 if (!rg->has_control_master () && !rg->has_subgroup () && rg->empty()) {
6605 remove_route_group (*rg);
6609 boost::shared_ptr<AudioTrack>
6610 Session::get_nth_audio_track (int nth) const
6612 boost::shared_ptr<RouteList> rl = routes.reader ();
6613 rl->sort (Stripable::Sorter ());
6615 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
6616 if (!boost::dynamic_pointer_cast<AudioTrack> (*r)) {
6623 return boost::dynamic_pointer_cast<AudioTrack> (*r);
6625 return boost::shared_ptr<AudioTrack> ();
6628 boost::shared_ptr<RouteList>
6629 Session::get_tracks () const
6631 boost::shared_ptr<RouteList> rl = routes.reader ();
6632 boost::shared_ptr<RouteList> tl (new RouteList);
6634 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
6635 if (boost::dynamic_pointer_cast<Track> (*r)) {
6636 assert (!(*r)->is_auditioner()); // XXX remove me
6643 boost::shared_ptr<RouteList>
6644 Session::get_routes_with_regions_at (samplepos_t const p) const
6646 boost::shared_ptr<RouteList> r = routes.reader ();
6647 boost::shared_ptr<RouteList> rl (new RouteList);
6649 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6650 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6655 boost::shared_ptr<Playlist> pl = tr->playlist ();
6660 if (pl->has_region_at (p)) {
6669 Session::goto_end ()
6671 if (_session_range_location) {
6672 request_locate (_session_range_location->end(), false);
6674 request_locate (0, false);
6679 Session::goto_start (bool and_roll)
6681 if (_session_range_location) {
6682 request_locate (_session_range_location->start(), and_roll);
6684 request_locate (0, and_roll);
6689 Session::current_start_sample () const
6691 return _session_range_location ? _session_range_location->start() : 0;
6695 Session::current_end_sample () const
6697 return _session_range_location ? _session_range_location->end() : 0;
6701 Session::set_session_range_location (samplepos_t start, samplepos_t end)
6703 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange, 0);
6704 _locations->add (_session_range_location);
6708 Session::step_edit_status_change (bool yn)
6714 send = (_step_editors == 0);
6719 send = (_step_editors == 1);
6722 if (_step_editors > 0) {
6728 StepEditStatusChange (val);
6734 Session::start_time_changed (samplepos_t old)
6736 /* Update the auto loop range to match the session range
6737 (unless the auto loop range has been changed by the user)
6740 Location* s = _locations->session_range_location ();
6745 Location* l = _locations->auto_loop_location ();
6747 if (l && l->start() == old) {
6748 l->set_start (s->start(), true);
6754 Session::end_time_changed (samplepos_t old)
6756 /* Update the auto loop range to match the session range
6757 (unless the auto loop range has been changed by the user)
6760 Location* s = _locations->session_range_location ();
6765 Location* l = _locations->auto_loop_location ();
6767 if (l && l->end() == old) {
6768 l->set_end (s->end(), true);
6773 std::vector<std::string>
6774 Session::source_search_path (DataType type) const
6778 if (session_dirs.size() == 1) {
6780 case DataType::AUDIO:
6781 sp.push_back (_session_dir->sound_path());
6783 case DataType::MIDI:
6784 sp.push_back (_session_dir->midi_path());
6788 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
6789 SessionDirectory sdir (i->path);
6791 case DataType::AUDIO:
6792 sp.push_back (sdir.sound_path());
6794 case DataType::MIDI:
6795 sp.push_back (sdir.midi_path());
6801 if (type == DataType::AUDIO) {
6802 const string sound_path_2X = _session_dir->sound_path_2X();
6803 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
6804 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
6805 sp.push_back (sound_path_2X);
6810 // now check the explicit (possibly user-specified) search path
6813 case DataType::AUDIO:
6814 sp += Searchpath(config.get_audio_search_path ());
6816 case DataType::MIDI:
6817 sp += Searchpath(config.get_midi_search_path ());
6825 Session::ensure_search_path_includes (const string& path, DataType type)
6834 case DataType::AUDIO:
6835 sp += Searchpath(config.get_audio_search_path ());
6837 case DataType::MIDI:
6838 sp += Searchpath (config.get_midi_search_path ());
6842 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
6843 /* No need to add this new directory if it has the same inode as
6844 an existing one; checking inode rather than name prevents duplicated
6845 directories when we are using symlinks.
6847 On Windows, I think we could just do if (*i == path) here.
6849 if (PBD::equivalent_paths (*i, path)) {
6857 case DataType::AUDIO:
6858 config.set_audio_search_path (sp.to_string());
6860 case DataType::MIDI:
6861 config.set_midi_search_path (sp.to_string());
6867 Session::remove_dir_from_search_path (const string& dir, DataType type)
6872 case DataType::AUDIO:
6873 sp = Searchpath(config.get_audio_search_path ());
6875 case DataType::MIDI:
6876 sp = Searchpath (config.get_midi_search_path ());
6883 case DataType::AUDIO:
6884 config.set_audio_search_path (sp.to_string());
6886 case DataType::MIDI:
6887 config.set_midi_search_path (sp.to_string());
6893 boost::shared_ptr<Speakers>
6894 Session::get_speakers()
6900 Session::unknown_processors () const
6904 boost::shared_ptr<RouteList> r = routes.reader ();
6905 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6906 list<string> t = (*i)->unknown_processors ();
6907 copy (t.begin(), t.end(), back_inserter (p));
6917 Session::set_worst_io_latencies_x (IOChange, void *)
6919 set_worst_io_latencies ();
6923 Session::send_latency_compensation_change ()
6925 /* As a result of Send::set_output_latency()
6926 * or InternalReturn::set_playback_offset ()
6927 * the send's own latency can change (source track
6928 * is aligned with target bus).
6930 * This can only happen be triggered by
6931 * Route::update_signal_latency ()
6932 * when updating the processor latency.
6934 * We need to walk the graph again to take those changes into account
6935 * (we should probably recurse or process the graph in a 2 step process).
6937 ++_send_latency_changes;
6941 Session::update_route_latency (bool playback, bool apply_to_delayline)
6943 /* Note: RouteList is process-graph sorted */
6944 boost::shared_ptr<RouteList> r = routes.reader ();
6947 /* reverse the list so that we work backwards from the last route to run to the first,
6948 * this is not needed, but can help to reduce the iterations for aux-sends.
6950 RouteList* rl = routes.reader().get();
6951 r.reset (new RouteList (*rl));
6952 reverse (r->begin(), r->end());
6955 bool changed = false;
6958 _send_latency_changes = 0;
6959 _worst_route_latency = 0;
6961 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6962 // if (!(*i)->active()) { continue ; } // TODO
6964 if ((*i)->signal_latency () != (l = (*i)->update_signal_latency (apply_to_delayline))) {
6967 _worst_route_latency = std::max (l, _worst_route_latency);
6970 if (_send_latency_changes > 0) {
6971 // only 1 extra iteration is needed (we allow only 1 level of aux-sends)
6972 // BUT.. jack'n'sends'n'bugs
6973 if (++bailout < 5) {
6974 cerr << "restarting Session::update_latency. # of send changes: " << _send_latency_changes << " iteration: " << bailout << endl;
6979 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_route_latency, (changed ? "yes" : "no")));
6985 Session::update_latency (bool playback)
6987 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
6989 if (inital_connect_or_deletion_in_progress () || _adding_routes_in_progress || _route_deletion_in_progress) {
6992 if (!_engine.running()) {
6996 /* Note; RouteList is sorted as process-graph */
6997 boost::shared_ptr<RouteList> r = routes.reader ();
7000 /* reverse the list so that we work backwards from the last route to run to the first */
7001 RouteList* rl = routes.reader().get();
7002 r.reset (new RouteList (*rl));
7003 reverse (r->begin(), r->end());
7006 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
7007 samplecnt_t latency = (*i)->set_private_port_latencies (playback);
7008 (*i)->set_public_port_latencies (latency, playback);
7012 set_worst_output_latency ();
7013 update_route_latency (true, true);
7015 set_worst_input_latency ();
7016 update_route_latency (false, false);
7019 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
7023 Session::initialize_latencies ()
7026 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
7027 update_latency (false);
7028 update_latency (true);
7031 set_worst_io_latencies ();
7035 Session::set_worst_io_latencies ()
7037 set_worst_output_latency ();
7038 set_worst_input_latency ();
7042 Session::set_worst_output_latency ()
7044 if (inital_connect_or_deletion_in_progress ()) {
7048 _worst_output_latency = 0;
7050 if (!_engine.running()) {
7054 boost::shared_ptr<RouteList> r = routes.reader ();
7056 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
7057 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
7060 _worst_output_latency = max (_worst_output_latency, _click_io->latency());
7062 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
7066 Session::set_worst_input_latency ()
7068 if (inital_connect_or_deletion_in_progress ()) {
7072 _worst_input_latency = 0;
7074 if (!_engine.running()) {
7078 boost::shared_ptr<RouteList> r = routes.reader ();
7080 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
7081 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
7084 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
7088 Session::update_latency_compensation (bool force_whole_graph)
7090 if (inital_connect_or_deletion_in_progress ()) {
7093 /* this lock is not usually contended, but under certain conditions,
7094 * update_latency_compensation may be called concurrently.
7095 * e.g. drag/drop copy a latent plugin while rolling.
7096 * GUI thread (via route_processors_changed) and
7097 * auto_connect_thread_run may race.
7099 Glib::Threads::Mutex::Lock lx (_update_latency_lock, Glib::Threads::TRY_LOCK);
7101 /* no need to do this twice */
7105 bool some_track_latency_changed = update_route_latency (false, false);
7107 if (some_track_latency_changed || force_whole_graph) {
7108 _engine.update_latencies ();
7109 /* above call will ask the backend up update its latencies, which
7110 * eventually will trigger AudioEngine::latency_callback () and
7111 * call Session::update_latency ()
7114 boost::shared_ptr<RouteList> r = routes.reader ();
7115 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
7116 (*i)->apply_latency_compensation ();
7122 Session::session_name_is_legal (const string& path)
7124 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
7126 for (int i = 0; illegal_chars[i]; ++i) {
7127 if (path.find (illegal_chars[i]) != string::npos) {
7128 return illegal_chars[i];
7136 Session::notify_presentation_info_change ()
7138 if (deletion_in_progress()) {
7142 reassign_track_numbers();
7144 #ifdef USE_TRACKS_CODE_FEATURES
7145 /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
7146 * if track order has been changed by user
7148 reconnect_existing_routes(true, true);
7154 Session::operation_in_progress (GQuark op) const
7156 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
7159 boost::shared_ptr<Port>
7160 Session::ltc_output_port () const
7162 return _ltc_output ? _ltc_output->nth (0) : boost::shared_ptr<Port> ();
7166 Session::reconnect_ltc_output ()
7170 string src = Config->get_ltc_output_port();
7172 _ltc_output->disconnect (this);
7174 if (src != _("None") && !src.empty()) {
7175 _ltc_output->nth (0)->connect (src);
7181 Session::set_range_selection (samplepos_t start, samplepos_t end)
7183 _range_selection = Evoral::Range<samplepos_t> (start, end);
7184 #ifdef USE_TRACKS_CODE_FEATURES
7185 follow_playhead_priority ();
7190 Session::set_object_selection (samplepos_t start, samplepos_t end)
7192 _object_selection = Evoral::Range<samplepos_t> (start, end);
7193 #ifdef USE_TRACKS_CODE_FEATURES
7194 follow_playhead_priority ();
7199 Session::clear_range_selection ()
7201 _range_selection = Evoral::Range<samplepos_t> (-1,-1);
7202 #ifdef USE_TRACKS_CODE_FEATURES
7203 follow_playhead_priority ();
7208 Session::clear_object_selection ()
7210 _object_selection = Evoral::Range<samplepos_t> (-1,-1);
7211 #ifdef USE_TRACKS_CODE_FEATURES
7212 follow_playhead_priority ();
7217 Session::auto_connect_route (boost::shared_ptr<Route> route, bool connect_inputs,
7218 const ChanCount& input_start,
7219 const ChanCount& output_start,
7220 const ChanCount& input_offset,
7221 const ChanCount& output_offset)
7223 Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
7224 _auto_connect_queue.push (AutoConnectRequest (route, connect_inputs,
7225 input_start, output_start,
7226 input_offset, output_offset));
7228 auto_connect_thread_wakeup ();
7232 Session::auto_connect_thread_wakeup ()
7234 if (pthread_mutex_trylock (&_auto_connect_mutex) == 0) {
7235 pthread_cond_signal (&_auto_connect_cond);
7236 pthread_mutex_unlock (&_auto_connect_mutex);
7241 Session::queue_latency_recompute ()
7243 g_atomic_int_inc (&_latency_recompute_pending);
7244 auto_connect_thread_wakeup ();
7248 Session::auto_connect (const AutoConnectRequest& ar)
7250 boost::shared_ptr<Route> route = ar.route.lock();
7252 if (!route) { return; }
7254 if (!IO::connecting_legal) {
7258 /* If both inputs and outputs are auto-connected to physical ports,
7259 * use the max of input and output offsets to ensure auto-connected
7260 * port numbers always match up (e.g. the first audio input and the
7261 * first audio output of the route will have the same physical
7262 * port number). Otherwise just use the lowest input or output
7266 const bool in_out_physical =
7267 (Config->get_input_auto_connect() & AutoConnectPhysical)
7268 && (Config->get_output_auto_connect() & AutoConnectPhysical)
7269 && ar.connect_inputs;
7271 const ChanCount in_offset = in_out_physical
7272 ? ChanCount::max(ar.input_offset, ar.output_offset)
7275 const ChanCount out_offset = in_out_physical
7276 ? ChanCount::max(ar.input_offset, ar.output_offset)
7279 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
7280 vector<string> physinputs;
7281 vector<string> physoutputs;
7284 /* for connecting track inputs we only want MIDI ports marked
7288 get_physical_ports (physinputs, physoutputs, *t, MidiPortMusic);
7290 if (!physinputs.empty() && ar.connect_inputs) {
7291 uint32_t nphysical_in = physinputs.size();
7293 for (uint32_t i = ar.input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
7296 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
7297 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
7300 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
7306 if (!physoutputs.empty()) {
7307 uint32_t nphysical_out = physoutputs.size();
7308 for (uint32_t i = ar.output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
7312 * do not create new connections if we reached the limit of physical outputs
7315 if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
7316 ARDOUR::Profile->get_trx () &&
7317 ar.output_offset.get(*t) == nphysical_out ) {
7321 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
7322 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
7323 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
7324 /* master bus is audio only */
7325 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
7326 port = _master_out->input()->ports().port(*t,
7327 i % _master_out->input()->n_ports().get(*t))->name();
7331 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
7340 Session::auto_connect_thread_start ()
7342 if (g_atomic_int_get (&_ac_thread_active)) {
7346 while (!_auto_connect_queue.empty ()) {
7347 _auto_connect_queue.pop ();
7350 g_atomic_int_set (&_ac_thread_active, 1);
7351 if (pthread_create (&_auto_connect_thread, NULL, auto_connect_thread, this)) {
7352 g_atomic_int_set (&_ac_thread_active, 0);
7357 Session::auto_connect_thread_terminate ()
7359 if (!g_atomic_int_get (&_ac_thread_active)) {
7364 Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
7365 while (!_auto_connect_queue.empty ()) {
7366 _auto_connect_queue.pop ();
7370 /* cannot use auto_connect_thread_wakeup() because that is allowed to
7371 * fail to wakeup the thread.
7374 pthread_mutex_lock (&_auto_connect_mutex);
7375 g_atomic_int_set (&_ac_thread_active, 0);
7376 pthread_cond_signal (&_auto_connect_cond);
7377 pthread_mutex_unlock (&_auto_connect_mutex);
7380 pthread_join (_auto_connect_thread, &status);
7384 Session::auto_connect_thread (void *arg)
7386 Session *s = static_cast<Session *>(arg);
7387 s->auto_connect_thread_run ();
7393 Session::auto_connect_thread_run ()
7395 pthread_set_name (X_("autoconnect"));
7396 SessionEvent::create_per_thread_pool (X_("autoconnect"), 1024);
7397 PBD::notify_event_loops_about_thread_creation (pthread_self(), X_("autoconnect"), 1024);
7398 pthread_mutex_lock (&_auto_connect_mutex);
7399 while (g_atomic_int_get (&_ac_thread_active)) {
7401 if (!_auto_connect_queue.empty ()) {
7402 // Why would we need the process lock ??
7403 // A: if ports are added while we're connecting, the backend's iterator may be invalidated:
7404 // graph_order_callback() -> resort_routes() -> direct_feeds_according_to_reality () -> backend::connected_to()
7405 // All ardour-internal backends use a std::vector xxxAudioBackend::find_port()
7406 // We have control over those, but what does jack do?
7407 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
7409 Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
7410 while (!_auto_connect_queue.empty ()) {
7411 const AutoConnectRequest ar (_auto_connect_queue.front());
7412 _auto_connect_queue.pop ();
7419 if (!actively_recording ()) { // might not be needed,
7420 /* this is only used for updating plugin latencies, the
7421 * graph does not change. so it's safe in general.
7423 * update_latency_compensation ()
7424 * calls DiskWriter::set_capture_offset () which
7425 * modifies the capture-offset, which can be a problem.
7427 while (g_atomic_int_and (&_latency_recompute_pending, 0)) {
7428 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
7429 update_latency_compensation ();
7434 // this may call ARDOUR::Port::drop ... jack_port_unregister ()
7435 // jack1 cannot cope with removing ports while processing
7436 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
7437 AudioEngine::instance()->clear_pending_port_deletions ();
7440 pthread_cond_wait (&_auto_connect_cond, &_auto_connect_mutex);
7442 pthread_mutex_unlock (&_auto_connect_mutex);
7446 Session::cancel_all_solo ()
7450 get_stripables (sl);
7452 set_controls (stripable_list_to_control_list (sl, &Stripable::solo_control), 0.0, Controllable::NoGroup);
7453 clear_all_solo_state (routes.reader());
7457 Session::maybe_update_tempo_from_midiclock_tempo (float bpm)
7459 if (_tempo_map->n_tempos() == 1) {
7460 TempoSection& ts (_tempo_map->tempo_section_at_sample (0));
7461 if (fabs (ts.note_types_per_minute() - bpm) > (0.01 * ts.note_types_per_minute())) {
7462 const Tempo tempo (bpm, 4.0, bpm);
7463 std::cerr << "new tempo " << bpm << " old " << ts.note_types_per_minute() << std::endl;
7464 _tempo_map->replace_tempo (ts, tempo, 0.0, 0.0, AudioTime);