2 Copyright (C) 1999-2010 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 #include <cstdio> /* sprintf(3) ... grrr */
32 #include <glibmm/threads.h>
33 #include <glibmm/miscutils.h>
34 #include <glibmm/fileutils.h>
36 #include <boost/algorithm/string/erase.hpp>
38 #include "pbd/basename.h"
39 #include "pbd/convert.h"
40 #include "pbd/error.h"
41 #include "pbd/file_utils.h"
43 #include "pbd/pthread_utils.h"
44 #include "pbd/search_path.h"
45 #include "pbd/stacktrace.h"
46 #include "pbd/stl_delete.h"
47 #include "pbd/replace_all.h"
48 #include "pbd/unwind.h"
50 #include "ardour/amp.h"
51 #include "ardour/analyser.h"
52 #include "ardour/async_midi_port.h"
53 #include "ardour/audio_buffer.h"
54 #include "ardour/audio_port.h"
55 #include "ardour/audio_track.h"
56 #include "ardour/audioengine.h"
57 #include "ardour/audiofilesource.h"
58 #include "ardour/auditioner.h"
59 #include "ardour/boost_debug.h"
60 #include "ardour/buffer_manager.h"
61 #include "ardour/buffer_set.h"
62 #include "ardour/bundle.h"
63 #include "ardour/butler.h"
64 #include "ardour/click.h"
65 #include "ardour/control_protocol_manager.h"
66 #include "ardour/data_type.h"
67 #include "ardour/debug.h"
68 #include "ardour/disk_reader.h"
69 #include "ardour/directory_names.h"
70 #ifdef USE_TRACKS_CODE_FEATURES
71 #include "ardour/engine_state_controller.h"
73 #include "ardour/filename_extensions.h"
74 #include "ardour/gain_control.h"
75 #include "ardour/graph.h"
76 #include "ardour/luabindings.h"
77 #include "ardour/midiport_manager.h"
78 #include "ardour/scene_changer.h"
79 #include "ardour/midi_patch_manager.h"
80 #include "ardour/midi_track.h"
81 #include "ardour/midi_ui.h"
82 #include "ardour/operations.h"
83 #include "ardour/playlist.h"
84 #include "ardour/playlist_factory.h"
85 #include "ardour/plugin.h"
86 #include "ardour/plugin_insert.h"
87 #include "ardour/process_thread.h"
88 #include "ardour/profile.h"
89 #include "ardour/rc_configuration.h"
90 #include "ardour/recent_sessions.h"
91 #include "ardour/region.h"
92 #include "ardour/region_factory.h"
93 #include "ardour/revision.h"
94 #include "ardour/route_graph.h"
95 #include "ardour/route_group.h"
96 #include "ardour/rt_tasklist.h"
97 #include "ardour/send.h"
98 #include "ardour/selection.h"
99 #include "ardour/session.h"
100 #include "ardour/session_directory.h"
101 #include "ardour/session_playlists.h"
102 #include "ardour/slave.h"
103 #include "ardour/smf_source.h"
104 #include "ardour/slave.h"
105 #include "ardour/solo_isolate_control.h"
106 #include "ardour/source_factory.h"
107 #include "ardour/speakers.h"
108 #include "ardour/tempo.h"
109 #include "ardour/ticker.h"
110 #include "ardour/track.h"
111 #include "ardour/types_convert.h"
112 #include "ardour/user_bundle.h"
113 #include "ardour/utils.h"
114 #include "ardour/vca_manager.h"
115 #include "ardour/vca.h"
117 #include "midi++/port.h"
118 #include "midi++/mmc.h"
120 #include "LuaBridge/LuaBridge.h"
122 #include "pbd/i18n.h"
124 #include <glibmm/checksum.h>
133 using namespace ARDOUR;
136 bool Session::_disable_all_loaded_plugins = false;
137 bool Session::_bypass_all_loaded_plugins = false;
138 guint Session::_name_id_counter = 0;
140 PBD::Signal1<int,uint32_t> Session::AudioEngineSetupRequired;
141 PBD::Signal1<void,std::string> Session::Dialog;
142 PBD::Signal0<int> Session::AskAboutPendingState;
143 PBD::Signal2<int, samplecnt_t, samplecnt_t> Session::AskAboutSampleRateMismatch;
144 PBD::Signal2<void, samplecnt_t, samplecnt_t> Session::NotifyAboutSampleRateMismatch;
145 PBD::Signal0<void> Session::SendFeedback;
146 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
148 PBD::Signal1<void, samplepos_t> Session::StartTimeChanged;
149 PBD::Signal1<void, samplepos_t> Session::EndTimeChanged;
150 PBD::Signal2<void,std::string, std::string> Session::Exported;
151 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
152 PBD::Signal0<void> Session::Quit;
153 PBD::Signal0<void> Session::FeedbackDetected;
154 PBD::Signal0<void> Session::SuccessfulGraphSort;
155 PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
157 const samplecnt_t Session::bounce_chunk_size = 8192;
158 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
159 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
161 // seconds should be added after the region exceeds end marker
162 #ifdef USE_TRACKS_CODE_FEATURES
163 const uint32_t Session::session_end_shift = 5;
165 const uint32_t Session::session_end_shift = 0;
168 /** @param snapshot_name Snapshot name, without .ardour suffix */
169 Session::Session (AudioEngine &eng,
170 const string& fullpath,
171 const string& snapshot_name,
172 BusProfile* bus_profile,
174 : playlists (new SessionPlaylists)
176 , process_function (&Session::process_with_events)
177 , _bounce_processing_active (false)
178 , waiting_for_sync_offset (false)
179 , _base_sample_rate (0)
180 , _nominal_sample_rate (0)
181 , _current_sample_rate (0)
182 , transport_sub_state (0)
183 , _record_status (Disabled)
184 , _transport_sample (0)
186 , _session_range_location (0)
187 , _session_range_end_is_free (true)
190 , _remaining_latency_preroll (0)
191 , _engine_speed (1.0)
192 , _transport_speed (0)
193 , _default_transport_speed (1.0)
194 , _last_transport_speed (0)
195 , _signalled_varispeed (0)
196 , _target_transport_speed (0.0)
197 , auto_play_legal (false)
198 , _last_slave_transport_sample (0)
199 , _requested_return_sample (-1)
200 , current_block_size (0)
201 , _worst_output_latency (0)
202 , _worst_input_latency (0)
203 , _worst_route_latency (0)
204 , _send_latency_changes (0)
205 , _have_captured (false)
206 , _non_soloed_outs_muted (false)
209 , _solo_isolated_cnt (0)
211 , _was_seamless (Config->get_seamless_loop ())
212 , _under_nsm_control (false)
214 , delta_accumulator_cnt (0)
215 , average_slave_delta (1800) // !!! why 1800 ???
217 , have_first_delta_accumulator (false)
218 , _slave_state (Stopped)
219 , _mtc_active (false)
220 , _ltc_active (false)
221 , post_export_sync (false)
222 , post_export_position (0)
224 , _export_rolling (false)
225 , _realtime_export (false)
226 , _region_export (false)
227 , _export_preroll (0)
228 , _pre_export_mmc_enabled (false)
229 , _name (snapshot_name)
231 , _send_qf_mtc (false)
232 , _pframes_since_last_mtc (0)
234 , loop_changing (false)
236 , _session_dir (new SessionDirectory (fullpath))
237 , _current_snapshot_name (snapshot_name)
239 , state_was_pending (false)
240 , _state_of_the_state (StateOfTheState(CannotSave|InitialConnecting|Loading))
242 , _save_queued (false)
243 , _last_roll_location (0)
244 , _last_roll_or_reversal_location (0)
245 , _last_record_location (0)
246 , pending_auto_loop (false)
247 , _mempool ("Session", 3145728)
248 , lua (lua_newstate (&PBD::ReallocPool::lalloc, &_mempool))
250 , _butler (new Butler (*this))
251 , _post_transport_work (0)
252 , cumulative_rf_motion (0)
254 , _locations (new Locations (*this))
255 , _ignore_skips_updates (false)
256 , _rt_thread_active (false)
257 , _rt_emit_pending (false)
258 , _ac_thread_active (0)
259 , _latency_recompute_pending (0)
261 , outbound_mtc_timecode_frame (0)
262 , next_quarter_frame_to_send (-1)
263 , _samples_per_timecode_frame (0)
264 , _frames_per_hour (0)
265 , _timecode_frames_per_hour (0)
266 , last_timecode_valid (false)
267 , last_timecode_when (0)
268 , _send_timecode_update (false)
280 , ltc_timecode_offset (0)
281 , ltc_timecode_negative_offset (false)
282 , midi_control_ui (0)
284 , _all_route_group (new RouteGroup (*this, "all"))
285 , routes (new RouteList)
286 , _adding_routes_in_progress (false)
287 , _reconnecting_routes_in_progress (false)
288 , _route_deletion_in_progress (false)
289 , destructive_index (0)
290 , _track_number_decimals(1)
291 , default_fade_steepness (0)
292 , default_fade_msecs (0)
293 , _total_free_4k_blocks (0)
294 , _total_free_4k_blocks_uncertain (false)
295 , no_questions_about_missing_files (false)
298 , _bundles (new BundleList)
299 , _bundle_xml_node (0)
302 , _click_rec_only (false)
304 , click_emphasis_data (0)
306 , click_emphasis_length (0)
307 , _clicks_cleared (0)
308 , _count_in_samples (0)
309 , _play_range (false)
310 , _range_selection (-1,-1)
311 , _object_selection (-1,-1)
312 , _preroll_record_trim_len (0)
313 , _count_in_once (false)
315 , first_file_data_format_reset (true)
316 , first_file_header_format_reset (true)
317 , have_looped (false)
318 , _have_rec_enabled_track (false)
319 , _have_rec_disabled_track (true)
321 , _suspend_timecode_transmission (0)
322 , _speakers (new Speakers)
323 , _ignore_route_processor_changes (0)
328 , _vca_manager (new VCAManager (*this))
329 , _selection (new CoreSelection (*this))
330 , _global_locate_pending (false)
334 created_with = string_compose ("%1 %2", PROGRAM_NAME, revision);
336 pthread_mutex_init (&_rt_emit_mutex, 0);
337 pthread_cond_init (&_rt_emit_cond, 0);
339 pthread_mutex_init (&_auto_connect_mutex, 0);
340 pthread_cond_init (&_auto_connect_cond, 0);
342 init_name_id_counter (1); // reset for new sessions, start at 1
343 VCA::set_next_vca_number (1); // reset for new sessions, start at 1
345 pre_engine_init (fullpath); // sets _is_new
351 Stateful::loading_state_version = CURRENT_SESSION_FILE_VERSION;
353 #ifdef USE_TRACKS_CODE_FEATURES
354 sr = EngineStateController::instance()->get_current_sample_rate();
356 if (ensure_engine (sr, true)) {
358 throw SessionException (_("Cannot connect to audio/midi engine"));
361 // set samplerate for plugins added early
362 // e.g from templates or MB channelstrip
363 set_block_size (_engine.samples_per_cycle());
364 set_sample_rate (_engine.sample_rate());
366 if (create (mix_template, bus_profile)) {
368 throw SessionException (_("Session initialization failed"));
371 /* if a mix template was provided, then ::create() will
372 * have copied it into the session and we need to load it
373 * so that we have the state ready for ::set_state()
374 * after the engine is started.
376 * Note that we do NOT try to get the sample rate from
377 * the template at this time, though doing so would
378 * be easy if we decided this was an appropriate part
382 if (!mix_template.empty()) {
384 if (load_state (_current_snapshot_name)) {
385 throw SessionException (_("Failed to load template/snapshot state"));
387 } catch (PBD::unknown_enumeration& e) {
388 throw SessionException (_("Failed to parse template/snapshot state"));
390 store_recent_templates (mix_template);
393 /* load default session properties - if any */
398 if (load_state (_current_snapshot_name)) {
399 throw SessionException (_("Failed to load state"));
402 /* try to get sample rate from XML state so that we
403 * can influence the SR if we set up the audio
408 XMLProperty const * prop;
409 XMLNode const * root (state_tree->root());
410 if ((prop = root->property (X_("sample-rate"))) != 0) {
411 sr = atoi (prop->value());
415 if (ensure_engine (sr, false)) {
417 throw SessionException (_("Cannot connect to audio/midi engine"));
421 int err = post_engine_init ();
426 throw SessionException (string_compose (_("Cannot initialize session/engine: %1"), _("Failed to create background threads.")));
430 throw SessionException (string_compose (_("Cannot initialize session/engine: %1"), _("Invalid TempoMap in session-file.")));
433 throw SessionException (string_compose (_("Cannot initialize session/engine: %1"), _("Invalid or corrupt session state.")));
436 throw SessionException (string_compose (_("Cannot initialize session/engine: %1"), _("Port registration failed.")));
439 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")));
444 store_recent_sessions (_name, _path);
446 bool was_dirty = dirty();
448 _state_of_the_state = StateOfTheState (_state_of_the_state & ~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 ());
663 /* disconnect from any and all signals that we are connected to */
665 Port::PortSignalDrop (); /* EMIT SIGNAL */
668 /* shutdown control surface protocols while we still have ports
669 * and the engine to move data to any devices.
672 /* remove I/O objects before unsetting the engine session */
675 _ltc_output.reset ();
677 ControlProtocolManager::instance().drop_protocols ();
679 /* stop auto dis/connecting */
680 auto_connect_thread_terminate ();
682 MIDI::Name::MidiPatchManager::instance().remove_search_path(session_directory().midi_patch_path());
684 _engine.remove_session ();
686 #ifdef USE_TRACKS_CODE_FEATURES
687 EngineStateController::instance()->remove_session();
690 /* drop slave, if any. We don't use use_sync_source (0) because
691 * there's no reason to do all the other stuff that may happen
692 * when calling that method.
696 /* deregister all ports - there will be no process or any other
697 * callbacks from the engine any more.
700 Port::PortDrop (); /* EMIT SIGNAL */
702 /* clear history so that no references to objects are held any more */
706 /* clear state tree so that no references to objects are held any more */
712 /* unregister all lua functions, drop held references (if any) */
713 Glib::Threads::Mutex::Lock tm (lua_lock, Glib::Threads::TRY_LOCK);
715 lua.do_command ("Session = nil");
723 lua.collect_garbage ();
726 /* reset dynamic state version back to default */
727 Stateful::loading_state_version = 0;
729 _butler->drop_references ();
733 delete _all_route_group;
735 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
736 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
740 if (click_data != default_click) {
741 delete [] click_data;
744 if (click_emphasis_data != default_click_emphasis) {
745 delete [] click_emphasis_data;
750 /* need to remove auditioner before monitoring section
751 * otherwise it is re-connected.
752 * Note: If a session was never successfully loaded, there
753 * may not yet be an auditioner.
756 auditioner->drop_references ();
760 /* drop references to routes held by the monitoring section
761 * specifically _monitor_out aux/listen references */
762 remove_monitor_section();
764 /* clear out any pending dead wood from RCU managed objects */
769 DiskReader::free_working_buffers();
771 /* tell everyone who is still standing that we're about to die */
774 /* tell everyone to drop references and delete objects as we go */
776 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
777 RegionFactory::delete_all_regions ();
779 /* Do this early so that VCAs no longer hold references to routes */
781 DEBUG_TRACE (DEBUG::Destruction, "delete vcas\n");
784 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
786 /* reset these three references to special routes before we do the usual route delete thing */
788 _master_out.reset ();
789 _monitor_out.reset ();
792 RCUWriter<RouteList> writer (routes);
793 boost::shared_ptr<RouteList> r = writer.get_copy ();
795 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
796 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
797 (*i)->drop_references ();
801 /* writer goes out of scope and updates master */
806 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
807 Glib::Threads::Mutex::Lock lm (source_lock);
808 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
809 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
810 i->second->drop_references ();
816 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
819 emit_thread_terminate ();
821 pthread_cond_destroy (&_rt_emit_cond);
822 pthread_mutex_destroy (&_rt_emit_mutex);
824 pthread_cond_destroy (&_auto_connect_cond);
825 pthread_mutex_destroy (&_auto_connect_mutex);
827 delete _scene_changer; _scene_changer = 0;
828 delete midi_control_ui; midi_control_ui = 0;
830 delete _mmc; _mmc = 0;
831 delete _midi_ports; _midi_ports = 0;
832 delete _locations; _locations = 0;
837 /* clear event queue, the session is gone, nobody is interested in
838 * those anymore, but they do leak memory if not removed
840 while (!immediate_events.empty ()) {
841 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
842 SessionEvent *ev = immediate_events.front ();
843 DEBUG_TRACE (DEBUG::SessionEvents, string_compose ("Drop event: %1\n", enum_2_string (ev->type)));
844 immediate_events.pop_front ();
848 case SessionEvent::AutoLoop:
849 case SessionEvent::AutoLoopDeclick:
850 case SessionEvent::Skip:
851 case SessionEvent::PunchIn:
852 case SessionEvent::PunchOut:
853 case SessionEvent::StopOnce:
854 case SessionEvent::RangeStop:
855 case SessionEvent::RangeLocate:
859 case SessionEvent::RealTimeOperation:
866 del = del && !_remove_event (ev);
874 /* unregister all dropped ports, process pending port deletion. */
875 // this may call ARDOUR::Port::drop ... jack_port_unregister ()
876 // jack1 cannot cope with removing ports while processing
877 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
878 AudioEngine::instance()->clear_pending_port_deletions ();
881 DEBUG_TRACE (DEBUG::Destruction, "delete selection\n");
885 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
887 BOOST_SHOW_POINTERS ();
891 Session::setup_ltc ()
895 _ltc_input.reset (new IO (*this, X_("LTC In"), IO::Input));
896 _ltc_output.reset (new IO (*this, X_("LTC Out"), IO::Output));
898 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC In"))) != 0) {
899 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
902 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
903 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
904 // TODO use auto-connect thread somehow (needs a route currently)
905 // see note in Session::auto_connect_thread_run() why process lock is needed.
906 reconnect_ltc_input ();
910 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC Out"))) != 0) {
911 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
914 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
915 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
916 // TODO use auto-connect thread
917 reconnect_ltc_output ();
921 /* fix up names of LTC ports because we don't want the normal
922 * IO style of NAME/TYPE-{in,out}N
925 _ltc_input->nth (0)->set_name (X_("LTC-in"));
926 _ltc_output->nth (0)->set_name (X_("LTC-out"));
930 Session::setup_click ()
934 boost::shared_ptr<AutomationList> gl (new AutomationList (Evoral::Parameter (GainAutomation)));
935 boost::shared_ptr<GainControl> gain_control = boost::shared_ptr<GainControl> (new GainControl (*this, Evoral::Parameter(GainAutomation), gl));
937 _click_io.reset (new ClickIO (*this, X_("Click")));
938 _click_gain.reset (new Amp (*this, _("Fader"), gain_control, true));
939 _click_gain->activate ();
941 setup_click_state (state_tree->root());
943 setup_click_state (0);
948 Session::setup_click_state (const XMLNode* node)
950 const XMLNode* child = 0;
952 if (node && (child = find_named_node (*node, "Click")) != 0) {
954 /* existing state for Click */
957 if (Stateful::loading_state_version < 3000) {
958 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
960 const XMLNodeList& children (child->children());
961 XMLNodeList::const_iterator i = children.begin();
962 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
964 if (i != children.end()) {
965 c = _click_gain->set_state (**i, Stateful::loading_state_version);
971 _clicking = Config->get_clicking ();
975 error << _("could not setup Click I/O") << endmsg;
982 /* default state for Click: dual-mono to first 2 physical outputs */
985 _engine.get_physical_outputs (DataType::AUDIO, outs);
987 for (uint32_t physport = 0; physport < 2; ++physport) {
988 if (outs.size() > physport) {
989 if (_click_io->add_port (outs[physport], this)) {
990 // relax, even though its an error
995 if (_click_io->n_ports () > ChanCount::ZERO) {
996 _clicking = Config->get_clicking ();
1002 Session::get_physical_ports (vector<string>& inputs, vector<string>& outputs, DataType type,
1003 MidiPortFlags include, MidiPortFlags exclude)
1005 _engine.get_physical_inputs (type, inputs, include, exclude);
1006 _engine.get_physical_outputs (type, outputs, include, exclude);
1010 Session::setup_bundles ()
1014 RCUWriter<BundleList> writer (_bundles);
1015 boost::shared_ptr<BundleList> b = writer.get_copy ();
1016 for (BundleList::iterator i = b->begin(); i != b->end();) {
1017 if (boost::dynamic_pointer_cast<UserBundle>(*i)) {
1025 vector<string> inputs[DataType::num_types];
1026 vector<string> outputs[DataType::num_types];
1028 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1029 get_physical_ports (inputs[i], outputs[i], DataType (DataType::Symbol (i)),
1030 MidiPortFlags (0), /* no specific inclusions */
1031 MidiPortFlags (MidiPortControl|MidiPortVirtual) /* exclude control & virtual ports */
1035 /* Create a set of Bundle objects that map
1036 to the physical I/O currently available. We create both
1037 mono and stereo bundles, so that the common cases of mono
1038 and stereo tracks get bundles to put in their mixer strip
1039 in / out menus. There may be a nicer way of achieving that;
1040 it doesn't really scale that well to higher channel counts
1043 /* mono output bundles */
1045 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
1047 std::string pn = _engine.get_pretty_name_by_name (outputs[DataType::AUDIO][np]);
1049 snprintf (buf, sizeof (buf), _("out %s"), pn.c_str());
1051 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
1054 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
1055 c->add_channel (_("mono"), DataType::AUDIO);
1056 c->set_port (0, outputs[DataType::AUDIO][np]);
1058 add_bundle (c, false);
1061 /* stereo output bundles */
1063 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
1064 if (np + 1 < outputs[DataType::AUDIO].size()) {
1066 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
1067 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
1068 c->add_channel (_("L"), DataType::AUDIO);
1069 c->set_port (0, outputs[DataType::AUDIO][np]);
1070 c->add_channel (_("R"), DataType::AUDIO);
1071 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
1073 add_bundle (c, false);
1077 /* mono input bundles */
1079 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
1081 std::string pn = _engine.get_pretty_name_by_name (inputs[DataType::AUDIO][np]);
1083 snprintf (buf, sizeof (buf), _("in %s"), pn.c_str());
1085 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
1088 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
1089 c->add_channel (_("mono"), DataType::AUDIO);
1090 c->set_port (0, inputs[DataType::AUDIO][np]);
1092 add_bundle (c, false);
1095 /* stereo input bundles */
1097 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
1098 if (np + 1 < inputs[DataType::AUDIO].size()) {
1100 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
1102 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
1103 c->add_channel (_("L"), DataType::AUDIO);
1104 c->set_port (0, inputs[DataType::AUDIO][np]);
1105 c->add_channel (_("R"), DataType::AUDIO);
1106 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
1108 add_bundle (c, false);
1112 /* MIDI input bundles */
1114 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
1115 string n = inputs[DataType::MIDI][np];
1117 std::string pn = _engine.get_pretty_name_by_name (n);
1121 boost::erase_first (n, X_("alsa_pcm:"));
1123 boost::shared_ptr<Bundle> c (new Bundle (n, false));
1124 c->add_channel ("", DataType::MIDI);
1125 c->set_port (0, inputs[DataType::MIDI][np]);
1126 add_bundle (c, false);
1129 /* MIDI output bundles */
1131 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
1132 string n = outputs[DataType::MIDI][np];
1133 std::string pn = _engine.get_pretty_name_by_name (n);
1137 boost::erase_first (n, X_("alsa_pcm:"));
1139 boost::shared_ptr<Bundle> c (new Bundle (n, true));
1140 c->add_channel ("", DataType::MIDI);
1141 c->set_port (0, outputs[DataType::MIDI][np]);
1142 add_bundle (c, false);
1145 // we trust the backend to only calls us if there's a change
1146 BundleAddedOrRemoved (); /* EMIT SIGNAL */
1150 Session::auto_connect_master_bus ()
1152 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
1156 // Waves Tracks: Do not connect master bas for Tracks if AutoConnectMaster option is not set
1157 // In this case it means "Multi Out" output mode
1158 if (ARDOUR::Profile->get_trx() && !(Config->get_output_auto_connect() & AutoConnectMaster) ) {
1162 /* if requested auto-connect the outputs to the first N physical ports.
1165 uint32_t limit = _master_out->n_outputs().n_total();
1166 vector<string> outputs[DataType::num_types];
1168 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1169 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1172 for (uint32_t n = 0; n < limit; ++n) {
1173 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
1175 if (outputs[p->type()].size() > n) {
1176 connect_to = outputs[p->type()][n];
1179 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
1180 if (_master_out->output()->connect (p, connect_to, this)) {
1181 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
1190 Session::remove_monitor_section ()
1192 if (!_monitor_out || Profile->get_trx()) {
1196 /* force reversion to Solo-In-Place */
1197 Config->set_solo_control_is_listen_control (false);
1199 /* if we are auditioning, cancel it ... this is a workaround
1200 to a problem (auditioning does not execute the process graph,
1201 which is needed to remove routes when using >1 core for processing)
1206 /* Hold process lock while doing this so that we don't hear bits and
1207 * pieces of audio as we work on each route.
1210 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1212 /* Connect tracks to monitor section. Note that in an
1213 existing session, the internal sends will already exist, but we want the
1214 routes to notice that they connect to the control out specifically.
1218 boost::shared_ptr<RouteList> r = routes.reader ();
1219 ProcessorChangeBlocker pcb (this, false);
1221 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
1223 if ((*x)->is_monitor()) {
1225 } else if ((*x)->is_master()) {
1228 (*x)->remove_aux_or_listen (_monitor_out);
1233 remove_route (_monitor_out);
1234 if (_state_of_the_state & Deletion) {
1238 auto_connect_master_bus ();
1241 auditioner->connect ();
1244 Config->ParameterChanged ("use-monitor-bus");
1248 Session::add_monitor_section ()
1252 if (_monitor_out || !_master_out || Profile->get_trx()) {
1256 boost::shared_ptr<Route> r (new Route (*this, _("Monitor"), PresentationInfo::MonitorOut, DataType::AUDIO));
1262 BOOST_MARK_ROUTE(r);
1265 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1266 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1267 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1269 error << _("Cannot create monitor section. 'Monitor' Port name is not unique.") << endmsg;
1274 add_routes (rl, false, false, false, 0);
1276 assert (_monitor_out);
1278 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
1279 are undefined, at best.
1282 uint32_t limit = _monitor_out->n_inputs().n_audio();
1286 /* connect the inputs to the master bus outputs. this
1287 * represents a separate data feed from the internal sends from
1288 * each route. as of jan 2011, it allows the monitor section to
1289 * conditionally ignore either the internal sends or the normal
1290 * input feed, but we should really find a better way to do
1294 _master_out->output()->disconnect (this);
1296 for (uint32_t n = 0; n < limit; ++n) {
1297 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1298 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1301 string connect_to = o->name();
1302 if (_monitor_out->input()->connect (p, connect_to, this)) {
1303 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1311 /* if monitor section is not connected, connect it to physical outs
1314 if ((Config->get_auto_connect_standard_busses () || Profile->get_mixbus ()) && !_monitor_out->output()->connected ()) {
1316 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1318 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1321 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1323 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1324 Config->get_monitor_bus_preferred_bundle())
1330 /* Monitor bus is audio only */
1332 vector<string> outputs[DataType::num_types];
1334 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1335 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1338 uint32_t mod = outputs[DataType::AUDIO].size();
1339 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1343 for (uint32_t n = 0; n < limit; ++n) {
1345 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1347 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1348 connect_to = outputs[DataType::AUDIO][n % mod];
1351 if (!connect_to.empty()) {
1352 if (_monitor_out->output()->connect (p, connect_to, this)) {
1353 error << string_compose (
1354 _("cannot connect control output %1 to %2"),
1365 /* Hold process lock while doing this so that we don't hear bits and
1366 * pieces of audio as we work on each route.
1369 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1371 /* Connect tracks to monitor section. Note that in an
1372 existing session, the internal sends will already exist, but we want the
1373 routes to notice that they connect to the control out specifically.
1377 boost::shared_ptr<RouteList> rls = routes.reader ();
1379 ProcessorChangeBlocker pcb (this, false /* XXX */);
1381 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1383 if ((*x)->is_monitor()) {
1385 } else if ((*x)->is_master()) {
1388 (*x)->enable_monitor_send ();
1393 auditioner->connect ();
1395 Config->ParameterChanged ("use-monitor-bus");
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 /* this used to be in here, but survey says.... we don't need to restrict it */
1630 // if (record_status() == Recording) {
1634 if (Config->get_all_safe()) {
1641 Session::set_track_monitor_input_status (bool yn)
1643 boost::shared_ptr<RouteList> rl = routes.reader ();
1644 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1645 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1646 if (tr && tr->rec_enable_control()->get_value()) {
1647 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1648 tr->request_input_monitoring (yn);
1654 Session::auto_punch_start_changed (Location* location)
1656 replace_event (SessionEvent::PunchIn, location->start());
1658 if (get_record_enabled() && config.get_punch_in() && !actively_recording ()) {
1659 /* capture start has been changed, so save new pending state */
1660 save_state ("", true);
1665 Session::auto_punch_end_changed (Location* location)
1667 replace_event (SessionEvent::PunchOut, location->end());
1671 Session::auto_punch_changed (Location* location)
1673 auto_punch_start_changed (location);
1674 auto_punch_end_changed (location);
1677 /** @param loc A loop location.
1678 * @param pos Filled in with the start time of the required fade-out (in session samples).
1679 * @param length Filled in with the length of the required fade-out.
1682 Session::auto_loop_declick_range (Location* loc, samplepos_t & pos, samplepos_t & length)
1684 pos = max (loc->start(), loc->end() - 64);
1685 length = loc->end() - pos;
1689 Session::auto_loop_changed (Location* location)
1691 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1694 auto_loop_declick_range (location, dcp, dcl);
1696 if (transport_rolling() && play_loop) {
1698 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1700 // if (_transport_sample > location->end()) {
1702 if (_transport_sample < location->start() || _transport_sample > location->end()) {
1703 // relocate to beginning of loop
1704 clear_events (SessionEvent::LocateRoll);
1706 request_locate (location->start(), true);
1709 else if (Config->get_seamless_loop() && !loop_changing) {
1711 // schedule a locate-roll to refill the disk readers at the
1712 // previous loop end
1713 loop_changing = true;
1715 if (location->end() > last_loopend) {
1716 clear_events (SessionEvent::LocateRoll);
1717 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1723 clear_events (SessionEvent::AutoLoopDeclick);
1724 clear_events (SessionEvent::AutoLoop);
1727 /* possibly move playhead if not rolling; if we are rolling we'll move
1728 to the loop start on stop if that is appropriate.
1733 if (!transport_rolling() && select_playhead_priority_target (pos)) {
1734 if (pos == location->start()) {
1735 request_locate (pos);
1740 last_loopend = location->end();
1745 Session::set_auto_punch_location (Location* location)
1749 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1750 punch_connections.drop_connections();
1751 existing->set_auto_punch (false, this);
1752 clear_events (SessionEvent::PunchIn);
1753 clear_events (SessionEvent::PunchOut);
1754 auto_punch_location_changed (0);
1759 if (location == 0) {
1763 if (location->end() <= location->start()) {
1764 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1768 punch_connections.drop_connections ();
1770 location->StartChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, location));
1771 location->EndChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, location));
1772 location->Changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, location));
1774 location->set_auto_punch (true, this);
1776 auto_punch_changed (location);
1778 auto_punch_location_changed (location);
1782 Session::set_session_extents (samplepos_t start, samplepos_t end)
1785 if ((existing = _locations->session_range_location()) == 0) {
1786 //if there is no existing session, we need to make a new session location (should never happen)
1787 existing = new Location (*this, 0, 0, _("session"), Location::IsSessionRange, 0);
1791 error << _("Session: you can't use that location for session start/end)") << endmsg;
1795 existing->set( start, end );
1801 Session::set_auto_loop_location (Location* location)
1805 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1806 loop_connections.drop_connections ();
1807 existing->set_auto_loop (false, this);
1808 remove_event (existing->end(), SessionEvent::AutoLoop);
1811 auto_loop_declick_range (existing, dcp, dcl);
1812 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1813 auto_loop_location_changed (0);
1818 if (location == 0) {
1822 if (location->end() <= location->start()) {
1823 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1827 last_loopend = location->end();
1829 loop_connections.drop_connections ();
1831 location->StartChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1832 location->EndChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1833 location->Changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1834 location->FlagsChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1836 location->set_auto_loop (true, this);
1838 if (Config->get_loop_is_mode() && play_loop && Config->get_seamless_loop()) {
1839 // set all tracks to use internal looping
1840 boost::shared_ptr<RouteList> rl = routes.reader ();
1841 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1842 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1843 if (tr && !tr->is_private_route()) {
1844 tr->set_loop (location);
1849 /* take care of our stuff first */
1851 auto_loop_changed (location);
1853 /* now tell everyone else */
1855 auto_loop_location_changed (location);
1859 Session::update_marks (Location*)
1865 Session::update_skips (Location* loc, bool consolidate)
1867 if (_ignore_skips_updates) {
1871 Locations::LocationList skips;
1874 PBD::Unwinder<bool> uw (_ignore_skips_updates, true);
1875 consolidate_skips (loc);
1878 sync_locations_to_skips ();
1884 Session::consolidate_skips (Location* loc)
1886 Locations::LocationList all_locations = _locations->list ();
1888 for (Locations::LocationList::iterator l = all_locations.begin(); l != all_locations.end(); ) {
1890 if (!(*l)->is_skip ()) {
1895 /* don't test against self */
1902 switch (Evoral::coverage ((*l)->start(), (*l)->end(), loc->start(), loc->end())) {
1903 case Evoral::OverlapInternal:
1904 case Evoral::OverlapExternal:
1905 case Evoral::OverlapStart:
1906 case Evoral::OverlapEnd:
1907 /* adjust new location to cover existing one */
1908 loc->set_start (min (loc->start(), (*l)->start()));
1909 loc->set_end (max (loc->end(), (*l)->end()));
1910 /* we don't need this one any more */
1911 _locations->remove (*l);
1912 /* the location has been deleted, so remove reference to it in our local list */
1913 l = all_locations.erase (l);
1916 case Evoral::OverlapNone:
1924 Session::sync_locations_to_skips ()
1926 /* This happens asynchronously (in the audioengine thread). After the clear is done, we will call
1927 * Session::_sync_locations_to_skips() from the audioengine thread.
1929 clear_events (SessionEvent::Skip, boost::bind (&Session::_sync_locations_to_skips, this));
1933 Session::_sync_locations_to_skips ()
1935 /* called as a callback after existing Skip events have been cleared from a realtime audioengine thread */
1937 Locations::LocationList const & locs (_locations->list());
1939 for (Locations::LocationList::const_iterator i = locs.begin(); i != locs.end(); ++i) {
1941 Location* location = *i;
1943 if (location->is_skip() && location->is_skipping()) {
1944 SessionEvent* ev = new SessionEvent (SessionEvent::Skip, SessionEvent::Add, location->start(), location->end(), 1.0);
1952 Session::location_added (Location *location)
1954 if (location->is_auto_punch()) {
1955 set_auto_punch_location (location);
1958 if (location->is_auto_loop()) {
1959 set_auto_loop_location (location);
1962 if (location->is_session_range()) {
1963 /* no need for any signal handling or event setting with the session range,
1964 because we keep a direct reference to it and use its start/end directly.
1966 _session_range_location = location;
1969 if (location->is_mark()) {
1970 /* listen for per-location signals that require us to do any * global updates for marks */
1972 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1973 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1974 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1975 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1976 location->PositionLockStyleChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1979 if (location->is_range_marker()) {
1980 /* listen for per-location signals that require us to do any * global updates for marks */
1982 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1983 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1984 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1985 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1986 location->PositionLockStyleChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1989 if (location->is_skip()) {
1990 /* listen for per-location signals that require us to update skip-locate events */
1992 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1993 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1994 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1995 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, false));
1996 location->PositionLockStyleChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1998 update_skips (location, true);
2005 Session::location_removed (Location *location)
2007 if (location->is_auto_loop()) {
2008 set_auto_loop_location (0);
2009 set_track_loop (false);
2012 if (location->is_auto_punch()) {
2013 set_auto_punch_location (0);
2016 if (location->is_session_range()) {
2017 /* this is never supposed to happen */
2018 error << _("programming error: session range removed!") << endl;
2021 if (location->is_skip()) {
2023 update_skips (location, false);
2030 Session::locations_changed ()
2032 _locations->apply (*this, &Session::_locations_changed);
2036 Session::_locations_changed (const Locations::LocationList& locations)
2038 /* There was some mass-change in the Locations object.
2040 We might be re-adding a location here but it doesn't actually matter
2041 for all the locations that the Session takes an interest in.
2045 PBD::Unwinder<bool> protect_ignore_skip_updates (_ignore_skips_updates, true);
2046 for (Locations::LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
2047 location_added (*i);
2051 update_skips (NULL, false);
2055 Session::enable_record ()
2057 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
2058 /* no recording at anything except normal speed */
2063 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
2065 if (rs == Recording) {
2069 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
2071 _last_record_location = _transport_sample;
2072 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
2074 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
2075 set_track_monitor_input_status (true);
2078 RecordStateChanged ();
2085 Session::set_all_tracks_record_enabled (bool enable )
2087 boost::shared_ptr<RouteList> rl = routes.reader();
2088 set_controls (route_list_to_control_list (rl, &Stripable::rec_enable_control), enable, Controllable::NoGroup);
2092 Session::disable_record (bool rt_context, bool force)
2096 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
2098 if (!Config->get_latched_record_enable () || force) {
2099 g_atomic_int_set (&_record_status, Disabled);
2100 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
2102 if (rs == Recording) {
2103 g_atomic_int_set (&_record_status, Enabled);
2107 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
2108 set_track_monitor_input_status (false);
2111 RecordStateChanged (); /* emit signal */
2114 remove_pending_capture_state ();
2120 Session::step_back_from_record ()
2122 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
2124 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
2125 set_track_monitor_input_status (false);
2128 RecordStateChanged (); /* emit signal */
2133 Session::maybe_enable_record (bool rt_context)
2135 if (_step_editors > 0) {
2139 g_atomic_int_set (&_record_status, Enabled);
2141 /* This function is currently called from somewhere other than an RT thread.
2142 * (except maybe lua scripts, which can use rt_context = true)
2143 * This save_state() call therefore doesn't impact anything. Doing it here
2144 * means that we save pending state of which sources the next record will use,
2145 * which gives us some chance of recovering from a crash during the record.
2149 save_state ("", true);
2152 if (_transport_speed) {
2153 if (!config.get_punch_in()) {
2157 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
2158 RecordStateChanged (); /* EMIT SIGNAL */
2165 Session::audible_sample (bool* latent_locate) const
2167 if (latent_locate) {
2168 *latent_locate = false;
2173 if (synced_to_engine()) {
2174 /* Note: this is basically just sync-to-JACK */
2175 ret = _engine.transport_sample();
2177 ret = _transport_sample;
2182 if (!transport_rolling()) {
2186 #if 0 // TODO looping
2187 if (_transport_speed > 0.0f) {
2188 if (play_loop && have_looped) {
2189 /* the play-position wrapped at the loop-point
2190 * ardour is already playing the beginning of the loop,
2191 * but due to playback latency, the "audible frame"
2192 * is still at the end of the loop.
2194 Location *location = _locations->auto_loop_location();
2195 sampleoffset_t lo = location->start() - ret;
2197 ret = location->end () - lo;
2198 if (latent_locate) {
2199 *latent_locate = true;
2203 } else if (_transport_speed < 0.0f) {
2204 /* XXX wot? no backward looping? */
2208 return std::max ((samplepos_t)0, ret);
2212 Session::preroll_samples (samplepos_t pos) const
2214 const float pr = Config->get_preroll_seconds();
2215 if (pos >= 0 && pr < 0) {
2216 const Tempo& tempo = _tempo_map->tempo_at_sample (pos);
2217 const Meter& meter = _tempo_map->meter_at_sample (pos);
2218 return meter.samples_per_bar (tempo, sample_rate()) * -pr;
2223 return pr * sample_rate();
2227 Session::set_sample_rate (samplecnt_t frames_per_second)
2229 /** \fn void Session::set_sample_size(samplecnt_t)
2230 the AudioEngine object that calls this guarantees
2231 that it will not be called while we are also in
2232 ::process(). Its fine to do things that block
2236 if (_base_sample_rate == 0) {
2237 _base_sample_rate = frames_per_second;
2239 else if (_base_sample_rate != frames_per_second && frames_per_second != _nominal_sample_rate) {
2240 NotifyAboutSampleRateMismatch (_base_sample_rate, frames_per_second);
2242 _nominal_sample_rate = frames_per_second;
2247 reset_write_sources (false);
2249 // XXX we need some equivalent to this, somehow
2250 // SndFileSource::setup_standard_crossfades (frames_per_second);
2254 /* XXX need to reset/reinstantiate all LADSPA plugins */
2258 Session::set_block_size (pframes_t nframes)
2260 /* the AudioEngine guarantees
2261 that it will not be called while we are also in
2262 ::process(). It is therefore fine to do things that block
2267 current_block_size = nframes;
2271 boost::shared_ptr<RouteList> r = routes.reader ();
2273 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2274 (*i)->set_block_size (nframes);
2277 boost::shared_ptr<RouteList> rl = routes.reader ();
2278 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2279 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2281 tr->set_block_size (nframes);
2285 set_worst_io_latencies ();
2291 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
2293 boost::shared_ptr<Route> r2;
2295 if (r1->feeds (rbase) && rbase->feeds (r1)) {
2296 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
2300 /* make a copy of the existing list of routes that feed r1 */
2302 Route::FedBy existing (r1->fed_by());
2304 /* for each route that feeds r1, recurse, marking it as feeding
2308 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
2309 if (!(r2 = i->r.lock ())) {
2310 /* (*i) went away, ignore it */
2314 /* r2 is a route that feeds r1 which somehow feeds base. mark
2315 base as being fed by r2
2318 rbase->add_fed_by (r2, i->sends_only);
2322 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
2326 if (r1->feeds (r2) && r2->feeds (r1)) {
2330 /* now recurse, so that we can mark base as being fed by
2331 all routes that feed r2
2334 trace_terminal (r2, rbase);
2341 Session::resort_routes ()
2343 /* don't do anything here with signals emitted
2344 by Routes during initial setup or while we
2345 are being destroyed.
2348 if (_state_of_the_state & (InitialConnecting | Deletion)) {
2352 if (_route_deletion_in_progress) {
2357 RCUWriter<RouteList> writer (routes);
2358 boost::shared_ptr<RouteList> r = writer.get_copy ();
2359 resort_routes_using (r);
2360 /* writer goes out of scope and forces update */
2364 if (DEBUG_ENABLED(DEBUG::Graph)) {
2365 boost::shared_ptr<RouteList> rl = routes.reader ();
2366 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2367 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
2369 const Route::FedBy& fb ((*i)->fed_by());
2371 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
2372 boost::shared_ptr<Route> sf = f->r.lock();
2374 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
2383 /** This is called whenever we need to rebuild the graph of how we will process
2385 * @param r List of routes, in any order.
2389 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
2391 /* We are going to build a directed graph of our routes;
2392 this is where the edges of that graph are put.
2397 /* Go through all routes doing two things:
2399 * 1. Collect the edges of the route graph. Each of these edges
2400 * is a pair of routes, one of which directly feeds the other
2401 * either by a JACK connection or by an internal send.
2403 * 2. Begin the process of making routes aware of which other
2404 * routes directly or indirectly feed them. This information
2405 * is used by the solo code.
2408 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2410 /* Clear out the route's list of direct or indirect feeds */
2411 (*i)->clear_fed_by ();
2413 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
2415 bool via_sends_only;
2417 /* See if this *j feeds *i according to the current state of the JACK
2418 connections and internal sends.
2420 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
2421 /* add the edge to the graph (part #1) */
2422 edges.add (*j, *i, via_sends_only);
2423 /* tell the route (for part #2) */
2424 (*i)->add_fed_by (*j, via_sends_only);
2429 /* Attempt a topological sort of the route graph */
2430 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
2432 if (sorted_routes) {
2433 /* We got a satisfactory topological sort, so there is no feedback;
2436 Note: the process graph rechain does not require a
2437 topologically-sorted list, but hey ho.
2439 if (_process_graph) {
2440 _process_graph->rechain (sorted_routes, edges);
2443 _current_route_graph = edges;
2445 /* Complete the building of the routes' lists of what directly
2446 or indirectly feeds them.
2448 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2449 trace_terminal (*i, *i);
2452 *r = *sorted_routes;
2455 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
2456 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2457 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 presentation order %2\n", (*i)->name(), (*i)->presentation_info().order()));
2461 SuccessfulGraphSort (); /* EMIT SIGNAL */
2464 /* The topological sort failed, so we have a problem. Tell everyone
2465 and stick to the old graph; this will continue to be processed, so
2466 until the feedback is fixed, what is played back will not quite
2467 reflect what is actually connected. Note also that we do not
2468 do trace_terminal here, as it would fail due to an endless recursion,
2469 so the solo code will think that everything is still connected
2473 FeedbackDetected (); /* EMIT SIGNAL */
2478 /** Find a route name starting with \a base, maybe followed by the
2479 * lowest \a id. \a id will always be added if \a definitely_add_number
2480 * is true on entry; otherwise it will only be added if required
2481 * to make the name unique.
2483 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
2484 * The available route name with the lowest ID will be used, and \a id
2485 * will be set to the ID.
2487 * \return false if a route name could not be found, and \a track_name
2488 * and \a id do not reflect a free route name.
2491 Session::find_route_name (string const & base, uint32_t& id, string& name, bool definitely_add_number)
2493 /* the base may conflict with ports that do not belong to existing
2494 routes, but hidden objects like the click track. So check port names
2495 before anything else.
2498 for (map<string,bool>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
2499 if (base == reserved->first) {
2500 /* Check if this reserved name already exists, and if
2501 so, disallow it without a numeric suffix.
2503 if (!reserved->second || route_by_name (reserved->first)) {
2504 definitely_add_number = true;
2513 /* if we have "base 1" already, it doesn't make sense to add "base"
2514 * if "base 1" has been deleted, adding "base" is no worse than "base 1"
2516 if (!definitely_add_number && route_by_name (base) == 0 && (route_by_name (string_compose("%1 1", base)) == 0)) {
2517 /* just use the base */
2523 name = string_compose ("%1 %2", base, id);
2525 if (route_by_name (name) == 0) {
2531 } while (id < (UINT_MAX-1));
2536 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
2538 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
2540 in = ChanCount::ZERO;
2541 out = ChanCount::ZERO;
2543 boost::shared_ptr<RouteList> r = routes.reader ();
2545 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2546 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2550 assert (!tr->is_auditioner()); // XXX remove me
2551 in += tr->n_inputs();
2552 out += tr->n_outputs();
2557 Session::default_track_name_pattern (DataType t)
2560 case DataType::AUDIO:
2561 if (Profile->get_trx()) {
2568 case DataType::MIDI:
2575 /** Caller must not hold process lock
2576 * @param name_template string to use for the start of the name, or "" to use "MIDI".
2577 * @param instrument plugin info for the instrument to insert pre-fader, if any
2579 list<boost::shared_ptr<MidiTrack> >
2580 Session::new_midi_track (const ChanCount& input, const ChanCount& output, bool strict_io,
2581 boost::shared_ptr<PluginInfo> instrument, Plugin::PresetRecord* pset,
2582 RouteGroup* route_group, uint32_t how_many,
2583 string name_template, PresentationInfo::order_t order,
2587 uint32_t track_id = 0;
2589 RouteList new_routes;
2590 list<boost::shared_ptr<MidiTrack> > ret;
2592 const string name_pattern = default_track_name_pattern (DataType::MIDI);
2593 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
2596 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, use_number)) {
2597 error << "cannot find name for new midi track" << endmsg;
2601 boost::shared_ptr<MidiTrack> track;
2604 track.reset (new MidiTrack (*this, track_name, mode));
2606 if (track->init ()) {
2611 track->set_strict_io (true);
2614 BOOST_MARK_TRACK (track);
2617 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2618 if (track->input()->ensure_io (input, false, this)) {
2619 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
2623 if (track->output()->ensure_io (output, false, this)) {
2624 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
2630 route_group->add (track);
2633 new_routes.push_back (track);
2634 ret.push_back (track);
2637 catch (failed_constructor &err) {
2638 error << _("Session: could not create new midi track.") << endmsg;
2642 catch (AudioEngine::PortRegistrationFailure& pfe) {
2644 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;
2652 if (!new_routes.empty()) {
2653 StateProtector sp (this);
2654 if (Profile->get_trx()) {
2655 add_routes (new_routes, false, false, false, order);
2657 add_routes (new_routes, true, true, false, order);
2661 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
2662 PluginPtr plugin = instrument->load (*this);
2664 warning << "Failed to add Synth Plugin to newly created track." << endmsg;
2668 plugin->load_preset (*pset);
2670 boost::shared_ptr<PluginInsert> pi (new PluginInsert (*this, plugin));
2672 pi->set_strict_io (true);
2675 (*r)->add_processor (pi, PreFader);
2677 if (Profile->get_mixbus () && pi->configured () && pi->output_streams().n_audio() > 2) {
2678 (*r)->move_instrument_down (false);
2688 Session::new_midi_route (RouteGroup* route_group, uint32_t how_many, string name_template, bool strict_io,
2689 boost::shared_ptr<PluginInfo> instrument, Plugin::PresetRecord* pset,
2690 PresentationInfo::Flag flag, PresentationInfo::order_t order)
2693 uint32_t bus_id = 0;
2697 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Midi Bus");
2700 if (!find_route_name (name_template.empty () ? _("Midi Bus") : name_template, ++bus_id, bus_name, use_number)) {
2701 error << "cannot find name for new midi bus" << endmsg;
2706 boost::shared_ptr<Route> bus (new Route (*this, bus_name, flag, DataType::AUDIO)); // XXX Editor::add_routes is not ready for ARDOUR::DataType::MIDI
2713 bus->set_strict_io (true);
2716 BOOST_MARK_ROUTE(bus);
2719 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2721 if (bus->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
2722 error << _("cannot configure new midi bus input") << endmsg;
2727 if (bus->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
2728 error << _("cannot configure new midi bus output") << endmsg;
2734 route_group->add (bus);
2737 bus->add_internal_return ();
2738 ret.push_back (bus);
2741 catch (failed_constructor &err) {
2742 error << _("Session: could not create new audio route.") << endmsg;
2746 catch (AudioEngine::PortRegistrationFailure& pfe) {
2747 error << pfe.what() << endmsg;
2757 StateProtector sp (this);
2758 add_routes (ret, false, false, false, order);
2761 for (RouteList::iterator r = ret.begin(); r != ret.end(); ++r) {
2762 PluginPtr plugin = instrument->load (*this);
2764 warning << "Failed to add Synth Plugin to newly created track." << endmsg;
2768 plugin->load_preset (*pset);
2770 boost::shared_ptr<PluginInsert> pi (new PluginInsert (*this, plugin));
2772 pi->set_strict_io (true);
2775 (*r)->add_processor (pi, PreFader);
2777 if (Profile->get_mixbus () && pi->configured () && pi->output_streams().n_audio() > 2) {
2778 (*r)->move_instrument_down (false);
2790 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2792 boost::shared_ptr<Route> midi_track (wmt.lock());
2798 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2800 if (change.after.n_audio() <= change.before.n_audio()) {
2804 /* new audio ports: make sure the audio goes somewhere useful,
2805 * unless the user has no-auto-connect selected.
2807 * The existing ChanCounts don't matter for this call as they are only
2808 * to do with matching input and output indices, and we are only changing
2811 auto_connect_route (midi_track, false, ChanCount(), change.before);
2815 #ifdef USE_TRACKS_CODE_FEATURES
2818 compare_routes_by_remote_id (const boost::shared_ptr<Route>& route1, const boost::shared_ptr<Route>& route2)
2820 return route1->remote_control_id() < route2->remote_control_id();
2824 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2826 // it is not allowed to perform connection
2827 if (!IO::connecting_legal) {
2831 // if we are deleting routes we will call this once at the end
2832 if (_route_deletion_in_progress) {
2836 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2842 // We need to disconnect the route's inputs and outputs first
2843 // basing on autoconnect configuration
2844 bool reconnectIputs = !(Config->get_input_auto_connect() & ManualConnect) && reconnect_inputs;
2845 bool reconnectOutputs = !(Config->get_output_auto_connect() & ManualConnect) && reconnect_outputs;
2847 ChanCount existing_inputs;
2848 ChanCount existing_outputs;
2849 count_existing_track_channels (existing_inputs, existing_outputs);
2851 //ChanCount inputs = ChanCount::ZERO;
2852 //ChanCount outputs = ChanCount::ZERO;
2854 RouteList existing_routes = *routes.reader ();
2855 existing_routes.sort (compare_routes_by_remote_id);
2858 PBD::Unwinder<bool> protect_ignore_changes (_reconnecting_routes_in_progress, true);
2860 vector<string> physinputs;
2861 vector<string> physoutputs;
2863 EngineStateController::instance()->get_physical_audio_outputs(physoutputs);
2864 EngineStateController::instance()->get_physical_audio_inputs(physinputs);
2866 uint32_t input_n = 0;
2867 uint32_t output_n = 0;
2868 RouteList::iterator rIter = existing_routes.begin();
2869 const AutoConnectOption current_input_auto_connection (Config->get_input_auto_connect());
2870 const AutoConnectOption current_output_auto_connection (Config->get_output_auto_connect());
2871 for (; rIter != existing_routes.end(); ++rIter) {
2872 if (*rIter == _master_out || *rIter == _monitor_out ) {
2876 if (current_output_auto_connection == AutoConnectPhysical) {
2877 (*rIter)->amp()->deactivate();
2878 } else if (current_output_auto_connection == AutoConnectMaster) {
2879 (*rIter)->amp()->activate();
2882 if (reconnectIputs) {
2883 (*rIter)->input()->disconnect (this); //GZ: check this; could be heavy
2885 for (uint32_t route_input_n = 0; route_input_n < (*rIter)->n_inputs().get(DataType::AUDIO); ++route_input_n) {
2887 if (current_input_auto_connection & AutoConnectPhysical) {
2889 if ( input_n == physinputs.size() ) {
2893 string port = physinputs[input_n];
2895 if (port.empty() ) {
2896 error << "Physical Input number "<< input_n << " is unavailable and cannot be connected" << endmsg;
2899 //GZ: check this; could be heavy
2900 (*rIter)->input()->connect ((*rIter)->input()->ports().port(DataType::AUDIO, route_input_n), port, this);
2906 if (reconnectOutputs) {
2908 //normalize route ouptuts: reduce the amount outputs to be equal to the amount of inputs
2909 if (current_output_auto_connection & AutoConnectPhysical) {
2911 //GZ: check this; could be heavy
2912 (*rIter)->output()->disconnect (this);
2913 size_t route_inputs_count = (*rIter)->n_inputs().get(DataType::AUDIO);
2915 //GZ: check this; could be heavy
2916 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, route_inputs_count), false, this );
2918 } else if (current_output_auto_connection & AutoConnectMaster){
2920 if (!reconnect_master) {
2924 //GZ: check this; could be heavy
2925 (*rIter)->output()->disconnect (this);
2928 uint32_t master_inputs_count = _master_out->n_inputs().get(DataType::AUDIO);
2929 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, master_inputs_count), false, this );
2931 error << error << "Master bus is not available" << endmsg;
2936 for (uint32_t route_output_n = 0; route_output_n < (*rIter)->n_outputs().get(DataType::AUDIO); ++route_output_n) {
2937 if (current_output_auto_connection & AutoConnectPhysical) {
2939 if ( output_n == physoutputs.size() ) {
2943 string port = physoutputs[output_n];
2945 if (port.empty() ) {
2946 error << "Physical Output number "<< output_n << " is unavailable and cannot be connected" << endmsg;
2949 //GZ: check this; could be heavy
2950 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2953 } else if (current_output_auto_connection & AutoConnectMaster) {
2955 if ( route_output_n == _master_out->n_inputs().get(DataType::AUDIO) ) {
2959 // connect to master bus
2960 string port = _master_out->input()->ports().port(DataType::AUDIO, route_output_n)->name();
2962 if (port.empty() ) {
2963 error << "MasterBus Input number "<< route_output_n << " is unavailable and cannot be connected" << endmsg;
2967 //GZ: check this; could be heavy
2968 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2975 _master_out->output()->disconnect (this);
2976 auto_connect_master_bus ();
2981 session_routes_reconnected (); /* EMIT SIGNAL */
2985 Session::reconnect_midi_scene_ports(bool inputs)
2989 boost::shared_ptr<MidiPort> scene_in_ptr = scene_in();
2991 scene_in_ptr->disconnect_all ();
2993 std::vector<EngineStateController::MidiPortState> midi_port_states;
2994 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2996 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2998 for (; state_iter != midi_port_states.end(); ++state_iter) {
2999 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
3000 scene_in_ptr->connect (state_iter->name);
3007 boost::shared_ptr<MidiPort> scene_out_ptr = scene_out();
3009 if (scene_out_ptr ) {
3010 scene_out_ptr->disconnect_all ();
3012 std::vector<EngineStateController::MidiPortState> midi_port_states;
3013 EngineStateController::instance()->get_physical_midi_output_states (midi_port_states);
3015 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
3017 for (; state_iter != midi_port_states.end(); ++state_iter) {
3018 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
3019 scene_out_ptr->connect (state_iter->name);
3027 Session::reconnect_mtc_ports ()
3029 boost::shared_ptr<MidiPort> mtc_in_ptr = _midi_ports->mtc_input_port();
3035 mtc_in_ptr->disconnect_all ();
3037 std::vector<EngineStateController::MidiPortState> midi_port_states;
3038 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
3040 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
3042 for (; state_iter != midi_port_states.end(); ++state_iter) {
3043 if (state_iter->available && state_iter->mtc_in) {
3044 mtc_in_ptr->connect (state_iter->name);
3048 if (!_midi_ports->mtc_input_port ()->connected () &&
3049 config.get_external_sync () &&
3050 (Config->get_sync_source () == MTC) ) {
3051 config.set_external_sync (false);
3054 if ( ARDOUR::Profile->get_trx () ) {
3055 // Tracks need this signal to update timecode_source_dropdown
3056 MtcOrLtcInputPortChanged (); //emit signal
3061 Session::reconnect_mmc_ports(bool inputs)
3063 if (inputs ) { // get all enabled midi input ports
3065 boost::shared_ptr<MidiPort> mmc_in_ptr = _midi_ports->mmc_in();
3067 mmc_in_ptr->disconnect_all ();
3068 std::vector<std::string> enabled_midi_inputs;
3069 EngineStateController::instance()->get_physical_midi_inputs (enabled_midi_inputs);
3071 std::vector<std::string>::iterator port_iter = enabled_midi_inputs.begin();
3073 for (; port_iter != enabled_midi_inputs.end(); ++port_iter) {
3074 mmc_in_ptr->connect (*port_iter);
3078 } else { // get all enabled midi output ports
3080 boost::shared_ptr<MidiPort> mmc_out_ptr = _midi_ports->mmc_out();
3082 mmc_out_ptr->disconnect_all ();
3083 std::vector<std::string> enabled_midi_outputs;
3084 EngineStateController::instance()->get_physical_midi_outputs (enabled_midi_outputs);
3086 std::vector<std::string>::iterator port_iter = enabled_midi_outputs.begin();
3088 for (; port_iter != enabled_midi_outputs.end(); ++port_iter) {
3089 mmc_out_ptr->connect (*port_iter);
3098 Session::ensure_stripable_sort_order ()
3101 get_stripables (sl);
3102 sl.sort (Stripable::Sorter ());
3104 bool change = false;
3105 PresentationInfo::order_t order = 0;
3107 for (StripableList::iterator si = sl.begin(); si != sl.end(); ++si) {
3108 boost::shared_ptr<Stripable> s (*si);
3109 assert (!s->is_auditioner ()); // XXX remove me
3110 if (s->is_monitor ()) {
3113 if (order != s->presentation_info().order()) {
3114 s->set_presentation_order (order);
3123 Session::ensure_route_presentation_info_gap (PresentationInfo::order_t first_new_order, uint32_t how_many)
3125 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("ensure order gap starting at %1 for %2\n", first_new_order, how_many));
3127 if (first_new_order == PresentationInfo::max_order) {
3128 /* adding at end, no worries */
3132 /* create a gap in the presentation info to accomodate @param how_many
3136 get_stripables (sl);
3138 for (StripableList::iterator si = sl.begin(); si != sl.end(); ++si) {
3139 boost::shared_ptr<Stripable> s (*si);
3141 if (s->presentation_info().special (false)) {
3145 if (!s->presentation_info().order_set()) {
3149 if (s->presentation_info().order () >= first_new_order) {
3150 s->set_presentation_order (s->presentation_info().order () + how_many);
3155 /** Caller must not hold process lock
3156 * @param name_template string to use for the start of the name, or "" to use "Audio".
3158 list< boost::shared_ptr<AudioTrack> >
3159 Session::new_audio_track (int input_channels, int output_channels, RouteGroup* route_group,
3160 uint32_t how_many, string name_template, PresentationInfo::order_t order,
3164 uint32_t track_id = 0;
3166 RouteList new_routes;
3167 list<boost::shared_ptr<AudioTrack> > ret;
3169 const string name_pattern = default_track_name_pattern (DataType::AUDIO);
3170 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
3174 if (!find_route_name (name_template.empty() ? _(name_pattern.c_str()) : name_template, ++track_id, track_name, use_number)) {
3175 error << "cannot find name for new audio track" << endmsg;
3179 boost::shared_ptr<AudioTrack> track;
3182 track.reset (new AudioTrack (*this, track_name, mode));
3184 if (track->init ()) {
3188 if (Profile->get_mixbus ()) {
3189 track->set_strict_io (true);
3192 if (ARDOUR::Profile->get_trx ()) {
3193 // TRACKS considers it's not a USE CASE, it's
3194 // a piece of behavior of the session model:
3196 // Gain for a newly created route depends on
3197 // the current output_auto_connect mode:
3199 // 0 for Stereo Out mode
3201 if (Config->get_output_auto_connect() & AutoConnectMaster) {
3202 track->gain_control()->set_value (dB_to_coefficient (0), Controllable::NoGroup);
3206 BOOST_MARK_TRACK (track);
3209 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3211 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
3212 error << string_compose (
3213 _("cannot configure %1 in/%2 out configuration for new audio track"),
3214 input_channels, output_channels)
3219 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
3220 error << string_compose (
3221 _("cannot configure %1 in/%2 out configuration for new audio track"),
3222 input_channels, output_channels)
3229 route_group->add (track);
3232 new_routes.push_back (track);
3233 ret.push_back (track);
3236 catch (failed_constructor &err) {
3237 error << _("Session: could not create new audio track.") << endmsg;
3241 catch (AudioEngine::PortRegistrationFailure& pfe) {
3243 error << pfe.what() << endmsg;
3251 if (!new_routes.empty()) {
3252 StateProtector sp (this);
3253 if (Profile->get_trx()) {
3254 add_routes (new_routes, false, false, false, order);
3256 add_routes (new_routes, true, true, false, order);
3263 /** Caller must not hold process lock.
3264 * @param name_template string to use for the start of the name, or "" to use "Bus".
3267 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template,
3268 PresentationInfo::Flag flags, PresentationInfo::order_t order)
3271 uint32_t bus_id = 0;
3275 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
3278 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, use_number)) {
3279 error << "cannot find name for new audio bus" << endmsg;
3284 boost::shared_ptr<Route> bus (new Route (*this, bus_name, flags, DataType::AUDIO));
3290 if (Profile->get_mixbus ()) {
3291 bus->set_strict_io (true);
3294 BOOST_MARK_ROUTE(bus);
3297 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3299 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
3300 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
3301 input_channels, output_channels)
3307 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
3308 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
3309 input_channels, output_channels)
3316 route_group->add (bus);
3319 bus->add_internal_return ();
3320 ret.push_back (bus);
3323 catch (failed_constructor &err) {
3324 error << _("Session: could not create new audio route.") << endmsg;
3328 catch (AudioEngine::PortRegistrationFailure& pfe) {
3329 error << pfe.what() << endmsg;
3339 StateProtector sp (this);
3340 if (Profile->get_trx()) {
3341 add_routes (ret, false, false, false, order);
3343 add_routes (ret, false, true, true, order); // autoconnect // outputs only
3352 Session::new_route_from_template (uint32_t how_many, PresentationInfo::order_t insert_at, const std::string& template_path, const std::string& name_base,
3353 PlaylistDisposition pd)
3357 if (!tree.read (template_path.c_str())) {
3361 return new_route_from_template (how_many, insert_at, *tree.root(), name_base, pd);
3365 Session::new_route_from_template (uint32_t how_many, PresentationInfo::order_t insert_at, XMLNode& node, const std::string& name_base, PlaylistDisposition pd)
3368 uint32_t number = 0;
3369 const uint32_t being_added = how_many;
3370 /* This will prevent the use of any existing XML-provided PBD::ID
3373 Stateful::ForceIDRegeneration force_ids;
3374 IO::disable_connecting ();
3378 /* We're going to modify the node contents a bit so take a
3379 * copy. The node may be re-used when duplicating more than once.
3382 XMLNode node_copy (node);
3387 if (!name_base.empty()) {
3389 /* if we're adding more than one routes, force
3390 * all the names of the new routes to be
3391 * numbered, via the final parameter.
3394 if (!find_route_name (name_base.c_str(), ++number, name, (being_added > 1))) {
3395 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3401 string const route_name = node_copy.property(X_("name"))->value ();
3403 /* generate a new name by adding a number to the end of the template name */
3404 if (!find_route_name (route_name.c_str(), ++number, name, true)) {
3405 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3406 abort(); /*NOTREACHED*/
3410 /* set this name in the XML description that we are about to use */
3411 #warning fixme -- no more Diskstream
3412 if (pd == CopyPlaylist) {
3413 XMLNode* ds_node = find_named_node (node_copy, "Diskstream");
3415 const std::string playlist_name = ds_node->property (X_("playlist"))->value ();
3416 boost::shared_ptr<Playlist> playlist = playlists->by_name (playlist_name);
3417 // Use same name as Route::set_name_in_state so playlist copy
3418 // is picked up when creating the Route in XMLRouteFactory below
3419 playlist = PlaylistFactory::create (playlist, string_compose ("%1.1", name));
3420 playlist->reset_shares ();
3422 } else if (pd == SharePlaylist) {
3423 XMLNode* ds_node = find_named_node (node_copy, "Diskstream");
3425 const std::string playlist_name = ds_node->property (X_("playlist"))->value ();
3426 boost::shared_ptr<Playlist> playlist = playlists->by_name (playlist_name);
3427 playlist->share_with ((node_copy.property (X_("id")))->value());
3431 bool rename_playlist = (pd == CopyPlaylist || pd == NewPlaylist);
3433 Route::set_name_in_state (node_copy, name, rename_playlist);
3435 /* trim bitslots from listen sends so that new ones are used */
3436 XMLNodeList children = node_copy.children ();
3437 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
3438 if ((*i)->name() == X_("Processor")) {
3439 /* ForceIDRegeneration does not catch the following */
3440 XMLProperty const * role = (*i)->property (X_("role"));
3441 XMLProperty const * type = (*i)->property (X_("type"));
3442 if (role && role->value() == X_("Aux")) {
3443 /* check if the target bus exists.
3444 * we should not save aux-sends in templates.
3446 XMLProperty const * target = (*i)->property (X_("target"));
3448 (*i)->set_property ("type", "dangling-aux-send");
3451 boost::shared_ptr<Route> r = route_by_id (target->value());
3452 if (!r || boost::dynamic_pointer_cast<Track>(r)) {
3453 (*i)->set_property ("type", "dangling-aux-send");
3457 if (role && role->value() == X_("Listen")) {
3458 (*i)->remove_property (X_("bitslot"));
3460 else if (role && (role->value() == X_("Send") || role->value() == X_("Aux"))) {
3461 Delivery::Role xrole;
3462 uint32_t bitslot = 0;
3463 xrole = Delivery::Role (string_2_enum (role->value(), xrole));
3464 std::string name = Send::name_and_id_new_send(*this, xrole, bitslot, false);
3465 (*i)->remove_property (X_("bitslot"));
3466 (*i)->remove_property (X_("name"));
3467 (*i)->set_property ("bitslot", bitslot);
3468 (*i)->set_property ("name", name);
3470 else if (type && type->value() == X_("intreturn")) {
3471 (*i)->remove_property (X_("bitslot"));
3472 (*i)->set_property ("ignore-bitslot", "1");
3474 else if (type && type->value() == X_("return")) {
3475 // Return::set_state() generates a new one
3476 (*i)->remove_property (X_("bitslot"));
3478 else if (type && type->value() == X_("port")) {
3479 IOProcessor::prepare_for_reset (**i, name);
3484 /* new routes start off unsoloed to avoid issues related to
3485 upstream / downstream buses. */
3486 node_copy.remove_node_and_delete (X_("Controllable"), X_("name"), X_("solo"));
3488 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
3491 error << _("Session: cannot create track/bus from template description") << endmsg;
3495 if (boost::dynamic_pointer_cast<Track>(route)) {
3496 /* force input/output change signals so that the new diskstream
3497 picks up the configuration of the route. During session
3498 loading this normally happens in a different way.
3501 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3503 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
3504 change.after = route->input()->n_ports();
3505 route->input()->changed (change, this);
3506 change.after = route->output()->n_ports();
3507 route->output()->changed (change, this);
3510 ret.push_back (route);
3513 catch (failed_constructor &err) {
3514 error << _("Session: could not create new route from template") << endmsg;
3518 catch (AudioEngine::PortRegistrationFailure& pfe) {
3519 error << pfe.what() << endmsg;
3528 StateProtector sp (this);
3529 if (Profile->get_trx()) {
3530 add_routes (ret, false, false, false, insert_at);
3532 add_routes (ret, true, true, false, insert_at);
3534 IO::enable_connecting ();
3541 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save, PresentationInfo::order_t order)
3544 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
3545 add_routes_inner (new_routes, input_auto_connect, output_auto_connect, order);
3548 error << _("Adding new tracks/busses failed") << endmsg;
3553 update_latency (false);
3554 update_latency (true);
3559 save_state (_current_snapshot_name);
3562 update_route_record_state ();
3564 RouteAdded (new_routes); /* EMIT SIGNAL */
3568 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, PresentationInfo::order_t order)
3570 ChanCount existing_inputs;
3571 ChanCount existing_outputs;
3575 count_existing_track_channels (existing_inputs, existing_outputs);
3578 RCUWriter<RouteList> writer (routes);
3579 boost::shared_ptr<RouteList> r = writer.get_copy ();
3580 n_routes = r->size();
3581 r->insert (r->end(), new_routes.begin(), new_routes.end());
3583 /* if there is no control out and we're not in the middle of loading,
3584 * resort the graph here. if there is a control out, we will resort
3585 * toward the end of this method. if we are in the middle of loading,
3586 * we will resort when done.
3589 if (!_monitor_out && IO::connecting_legal) {
3590 resort_routes_using (r);
3594 /* monitor is not part of the order */
3596 assert (n_routes > 0);
3601 PresentationInfo::ChangeSuspender cs;
3602 ensure_route_presentation_info_gap (order, new_routes.size());
3604 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x, ++added) {
3606 boost::weak_ptr<Route> wpr (*x);
3607 boost::shared_ptr<Route> r (*x);
3609 r->solo_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2,wpr));
3610 r->solo_isolate_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, wpr));
3611 r->mute_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this));
3613 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
3614 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
3615 r->processor_latency_changed.connect_same_thread (*this, boost::bind (&Session::queue_latency_recompute, this));
3617 if (r->is_master()) {
3621 if (r->is_monitor()) {
3625 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
3627 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
3628 track_playlist_changed (boost::weak_ptr<Track> (tr));
3629 tr->rec_enable_control()->Changed.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
3631 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
3633 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
3634 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
3635 mt->presentation_info().PropertyChanged.connect_same_thread (*this, boost::bind (&Session::midi_track_presentation_info_changed, this, _1, boost::weak_ptr<MidiTrack>(mt)));
3639 if (!r->presentation_info().special (false)) {
3641 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("checking PI state for %1\n", r->name()));
3643 /* presentation info order may already have been set from XML */
3645 if (!r->presentation_info().order_set()) {
3646 if (order == PresentationInfo::max_order) {
3647 /* just add to the end */
3648 r->set_presentation_order (n_routes + added);
3649 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order not set, set to NR %1 + %2 = %3\n", n_routes, added, n_routes + added));
3651 r->set_presentation_order (order + added);
3652 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order not set, set to %1 + %2 = %3\n", order, added, order + added));
3655 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order already set to %1\n", r->presentation_info().order()));
3659 #if !defined(__APPLE__) && !defined(__FreeBSD__)
3660 /* clang complains: 'operator<<' should be declared prior to the call site or in an associated namespace of one of its
3661 * arguments std::ostream& operator<<(std::ostream& o, ARDOUR::PresentationInfo const& rid)"
3663 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("added route %1, group order %2 type %3 (summary: %4)\n",
3665 r->presentation_info().order(),
3666 enum_2_string (r->presentation_info().flags()),
3667 r->presentation_info()));
3671 if (input_auto_connect || output_auto_connect) {
3672 auto_connect_route (r, input_auto_connect, ChanCount (), ChanCount (), existing_inputs, existing_outputs);
3673 existing_inputs += r->n_inputs();
3674 existing_outputs += r->n_outputs();
3679 ensure_stripable_sort_order ();
3682 if (_monitor_out && IO::connecting_legal) {
3683 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
3685 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3686 if ((*x)->is_monitor()) {
3688 } else if ((*x)->is_master()) {
3691 (*x)->enable_monitor_send ();
3696 reassign_track_numbers ();
3700 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
3702 boost::shared_ptr<RouteList> r = routes.reader ();
3703 boost::shared_ptr<Send> s;
3705 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3706 if ((s = (*i)->internal_send_for (dest)) != 0) {
3707 s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO, Controllable::NoGroup);
3713 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
3715 boost::shared_ptr<RouteList> r = routes.reader ();
3716 boost::shared_ptr<Send> s;
3718 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3719 if ((s = (*i)->internal_send_for (dest)) != 0) {
3720 s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY, Controllable::NoGroup);
3726 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
3728 boost::shared_ptr<RouteList> r = routes.reader ();
3729 boost::shared_ptr<Send> s;
3731 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3732 if ((s = (*i)->internal_send_for (dest)) != 0) {
3733 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value(), Controllable::NoGroup);
3738 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
3740 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
3742 boost::shared_ptr<RouteList> r = routes.reader ();
3743 boost::shared_ptr<RouteList> t (new RouteList);
3745 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3746 /* no MIDI sends because there are no MIDI busses yet */
3747 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
3752 add_internal_sends (dest, p, t);
3756 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
3758 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
3759 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
3764 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
3766 add_internal_send (dest, sender->before_processor_for_index (index), sender);
3770 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
3772 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
3776 if (!dest->internal_return()) {
3777 dest->add_internal_return ();
3780 sender->add_aux_send (dest, before);
3786 Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
3788 bool mute_changed = false;
3789 bool send_selected = false;
3791 { // RCU Writer scope
3792 PBD::Unwinder<bool> uw_flag (_route_deletion_in_progress, true);
3793 RCUWriter<RouteList> writer (routes);
3794 boost::shared_ptr<RouteList> rs = writer.get_copy ();
3796 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3798 if (_selection->selected (*iter)) {
3799 send_selected = true;
3802 if (*iter == _master_out) {
3806 /* speed up session deletion, don't do the solo dance */
3807 if (0 == (_state_of_the_state & Deletion)) {
3808 (*iter)->solo_control()->set_value (0.0, Controllable::NoGroup);
3811 if ((*iter)->mute_control()->muted ()) {
3812 mute_changed = true;
3817 /* deleting the master out seems like a dumb
3818 idea, but its more of a UI policy issue
3822 if (*iter == _master_out) {
3823 _master_out = boost::shared_ptr<Route> ();
3826 if (*iter == _monitor_out) {
3827 _monitor_out.reset ();
3830 // We need to disconnect the route's inputs and outputs
3832 (*iter)->input()->disconnect (0);
3833 (*iter)->output()->disconnect (0);
3835 /* if the route had internal sends sending to it, remove them */
3836 if ((*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 && !(_state_of_the_state & Deletion)) {
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, "\tno feed to\n");
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) const
4320 boost::shared_ptr<RouteList> r = routes.reader ();
4321 sl.insert (sl.end(), r->begin(), r->end());
4323 VCAList v = _vca_manager->vcas ();
4324 sl.insert (sl.end(), v.begin(), v.end());
4328 Session::get_stripables () const
4331 Session::get_stripables (rv);
4332 rv.sort (Stripable::Sorter ());
4336 boost::shared_ptr<RouteList>
4337 Session::get_routes_with_internal_returns() const
4339 boost::shared_ptr<RouteList> r = routes.reader ();
4340 boost::shared_ptr<RouteList> rl (new RouteList);
4342 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4343 if ((*i)->internal_return ()) {
4351 Session::io_name_is_legal (const std::string& name) const
4353 boost::shared_ptr<RouteList> r = routes.reader ();
4355 for (map<string,bool>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
4356 if (name == reserved->first) {
4357 if (!route_by_name (reserved->first)) {
4358 /* first instance of a reserved name is allowed for some */
4359 return reserved->second;
4361 /* all other instances of a reserved name are not allowed */
4366 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4367 if ((*i)->name() == name) {
4371 if ((*i)->has_io_processor_named (name)) {
4380 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
4383 vector<string> connections;
4385 /* if we are passed only a single route and we're not told to turn
4386 * others off, then just do the simple thing.
4389 if (flip_others == false && rl->size() == 1) {
4390 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
4392 mt->set_input_active (onoff);
4397 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
4399 PortSet& ps ((*rt)->input()->ports());
4401 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
4402 p->get_connections (connections);
4405 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
4406 routes_using_input_from (*s, rl2);
4409 /* scan all relevant routes to see if others are on or off */
4411 bool others_are_already_on = false;
4413 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
4415 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
4421 if ((*r) != (*rt)) {
4422 if (mt->input_active()) {
4423 others_are_already_on = true;
4426 /* this one needs changing */
4427 mt->set_input_active (onoff);
4433 /* globally reverse other routes */
4435 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
4436 if ((*r) != (*rt)) {
4437 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
4439 mt->set_input_active (!others_are_already_on);
4448 Session::routes_using_input_from (const string& str, RouteList& rl)
4450 boost::shared_ptr<RouteList> r = routes.reader();
4452 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4453 if ((*i)->input()->connected_to (str)) {
4459 boost::shared_ptr<Route>
4460 Session::route_by_name (string name) const
4462 boost::shared_ptr<RouteList> r = routes.reader ();
4464 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4465 if ((*i)->name() == name) {
4470 return boost::shared_ptr<Route> ((Route*) 0);
4473 boost::shared_ptr<Route>
4474 Session::route_by_id (PBD::ID id) const
4476 boost::shared_ptr<RouteList> r = routes.reader ();
4478 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4479 if ((*i)->id() == id) {
4484 return boost::shared_ptr<Route> ((Route*) 0);
4488 boost::shared_ptr<Stripable>
4489 Session::stripable_by_id (PBD::ID id) const
4492 get_stripables (sl);
4494 for (StripableList::const_iterator s = sl.begin(); s != sl.end(); ++s) {
4495 if ((*s)->id() == id) {
4500 return boost::shared_ptr<Stripable>();
4503 boost::shared_ptr<Processor>
4504 Session::processor_by_id (PBD::ID id) const
4506 boost::shared_ptr<RouteList> r = routes.reader ();
4508 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4509 boost::shared_ptr<Processor> p = (*i)->Route::processor_by_id (id);
4515 return boost::shared_ptr<Processor> ();
4518 boost::shared_ptr<Route>
4519 Session::get_remote_nth_route (PresentationInfo::order_t n) const
4521 return boost::dynamic_pointer_cast<Route> (get_remote_nth_stripable (n, PresentationInfo::Route));
4524 boost::shared_ptr<Stripable>
4525 Session::get_remote_nth_stripable (PresentationInfo::order_t n, PresentationInfo::Flag flags) const
4528 PresentationInfo::order_t match_cnt = 0;
4530 get_stripables (sl);
4531 sl.sort (Stripable::Sorter());
4533 for (StripableList::const_iterator s = sl.begin(); s != sl.end(); ++s) {
4535 if ((*s)->presentation_info().hidden()) {
4536 /* if the caller didn't explicitly ask for hidden
4537 stripables, ignore hidden ones. This matches
4538 the semantics of the pre-PresentationOrder
4539 "get by RID" logic of Ardour 4.x and earlier.
4541 XXX at some point we should likely reverse
4542 the logic of the flags, because asking for "the
4543 hidden stripables" is not going to be common,
4544 whereas asking for visible ones is normal.
4547 if (! (flags & PresentationInfo::Hidden)) {
4552 if ((*s)->presentation_info().flag_match (flags)) {
4553 if (match_cnt++ == n) {
4559 /* there is no nth stripable that matches the given flags */
4560 return boost::shared_ptr<Stripable>();
4563 boost::shared_ptr<Route>
4564 Session::route_by_selected_count (uint32_t id) const
4566 RouteList r (*(routes.reader ()));
4567 r.sort (Stripable::Sorter());
4569 RouteList::iterator i;
4571 for (i = r.begin(); i != r.end(); ++i) {
4572 if ((*i)->is_selected()) {
4580 return boost::shared_ptr<Route> ();
4584 Session::reassign_track_numbers ()
4588 RouteList r (*(routes.reader ()));
4589 r.sort (Stripable::Sorter());
4591 StateProtector sp (this);
4593 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4594 assert (!(*i)->is_auditioner());
4595 if (boost::dynamic_pointer_cast<Track> (*i)) {
4596 (*i)->set_track_number(++tn);
4598 else if (!(*i)->is_master() && !(*i)->is_monitor()) {
4599 (*i)->set_track_number(--bn);
4602 const uint32_t decimals = ceilf (log10f (tn + 1));
4603 const bool decimals_changed = _track_number_decimals != decimals;
4604 _track_number_decimals = decimals;
4606 if (decimals_changed && config.get_track_name_number ()) {
4607 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4608 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
4610 t->resync_track_name();
4613 // trigger GUI re-layout
4614 config.ParameterChanged("track-name-number");
4618 if (DEBUG_ENABLED(DEBUG::OrderKeys)) {
4619 boost::shared_ptr<RouteList> rl = routes.reader ();
4620 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4621 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 numbered %2\n", (*i)->name(), (*i)->track_number()));
4629 Session::playlist_region_added (boost::weak_ptr<Region> w)
4631 boost::shared_ptr<Region> r = w.lock ();
4636 /* These are the operations that are currently in progress... */
4637 list<GQuark> curr = _current_trans_quarks;
4640 /* ...and these are the operations during which we want to update
4641 the session range location markers.
4644 ops.push_back (Operations::capture);
4645 ops.push_back (Operations::paste);
4646 ops.push_back (Operations::duplicate_region);
4647 ops.push_back (Operations::insert_file);
4648 ops.push_back (Operations::insert_region);
4649 ops.push_back (Operations::drag_region_brush);
4650 ops.push_back (Operations::region_drag);
4651 ops.push_back (Operations::selection_grab);
4652 ops.push_back (Operations::region_fill);
4653 ops.push_back (Operations::fill_selection);
4654 ops.push_back (Operations::create_region);
4655 ops.push_back (Operations::region_copy);
4656 ops.push_back (Operations::fixed_time_region_copy);
4659 /* See if any of the current operations match the ones that we want */
4661 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
4663 /* If so, update the session range markers */
4665 maybe_update_session_range (r->position (), r->last_sample ());
4669 /** Update the session range markers if a is before the current start or
4670 * b is after the current end.
4673 Session::maybe_update_session_range (samplepos_t a, samplepos_t b)
4675 if (_state_of_the_state & Loading) {
4679 samplepos_t session_end_marker_shift_samples = session_end_shift * _nominal_sample_rate;
4681 if (_session_range_location == 0) {
4683 set_session_range_location (a, b + session_end_marker_shift_samples);
4687 if (a < _session_range_location->start()) {
4688 _session_range_location->set_start (a);
4691 if (_session_range_end_is_free && (b > _session_range_location->end())) {
4692 _session_range_location->set_end (b);
4698 Session::set_end_is_free (bool yn)
4700 _session_range_end_is_free = yn;
4704 Session::playlist_ranges_moved (list<Evoral::RangeMove<samplepos_t> > const & ranges)
4706 for (list<Evoral::RangeMove<samplepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4707 maybe_update_session_range (i->to, i->to + i->length);
4712 Session::playlist_regions_extended (list<Evoral::Range<samplepos_t> > const & ranges)
4714 for (list<Evoral::Range<samplepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4715 maybe_update_session_range (i->from, i->to);
4719 /* Region management */
4721 boost::shared_ptr<Region>
4722 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
4724 const RegionFactory::RegionMap& regions (RegionFactory::regions());
4725 RegionFactory::RegionMap::const_iterator i;
4726 boost::shared_ptr<Region> region;
4728 Glib::Threads::Mutex::Lock lm (region_lock);
4730 for (i = regions.begin(); i != regions.end(); ++i) {
4734 if (region->whole_file()) {
4736 if (child->source_equivalent (region)) {
4742 return boost::shared_ptr<Region> ();
4746 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
4748 set<boost::shared_ptr<Region> > relevant_regions;
4750 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
4751 RegionFactory::get_regions_using_source (*s, relevant_regions);
4754 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
4755 set<boost::shared_ptr<Region> >::iterator tmp;
4760 playlists->destroy_region (*r);
4761 RegionFactory::map_remove (*r);
4763 (*r)->drop_sources ();
4764 (*r)->drop_references ();
4766 relevant_regions.erase (r);
4771 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
4774 Glib::Threads::Mutex::Lock ls (source_lock);
4775 /* remove from the main source list */
4776 sources.erase ((*s)->id());
4779 (*s)->mark_for_remove ();
4780 (*s)->drop_references ();
4789 Session::remove_last_capture ()
4791 list<boost::shared_ptr<Source> > srcs;
4793 boost::shared_ptr<RouteList> rl = routes.reader ();
4794 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4795 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4800 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
4803 srcs.insert (srcs.end(), l.begin(), l.end());
4808 destroy_sources (srcs);
4810 save_state (_current_snapshot_name);
4815 /* Source Management */
4818 Session::add_source (boost::shared_ptr<Source> source)
4820 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
4821 pair<SourceMap::iterator,bool> result;
4823 entry.first = source->id();
4824 entry.second = source;
4827 Glib::Threads::Mutex::Lock lm (source_lock);
4828 result = sources.insert (entry);
4831 if (result.second) {
4833 /* yay, new source */
4835 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
4838 if (!fs->within_session()) {
4839 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
4845 boost::shared_ptr<AudioFileSource> afs;
4847 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
4848 if (Config->get_auto_analyse_audio()) {
4849 Analyser::queue_source_for_analysis (source, false);
4853 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
4858 Session::remove_source (boost::weak_ptr<Source> src)
4860 if (_state_of_the_state & Deletion) {
4864 SourceMap::iterator i;
4865 boost::shared_ptr<Source> source = src.lock();
4872 Glib::Threads::Mutex::Lock lm (source_lock);
4874 if ((i = sources.find (source->id())) != sources.end()) {
4879 if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
4881 /* save state so we don't end up with a session file
4882 referring to non-existent sources.
4885 save_state (_current_snapshot_name);
4889 boost::shared_ptr<Source>
4890 Session::source_by_id (const PBD::ID& id)
4892 Glib::Threads::Mutex::Lock lm (source_lock);
4893 SourceMap::iterator i;
4894 boost::shared_ptr<Source> source;
4896 if ((i = sources.find (id)) != sources.end()) {
4903 boost::shared_ptr<AudioFileSource>
4904 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
4906 /* Restricted to audio files because only audio sources have channel
4910 Glib::Threads::Mutex::Lock lm (source_lock);
4912 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
4913 boost::shared_ptr<AudioFileSource> afs
4914 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
4916 if (afs && afs->path() == path && chn == afs->channel()) {
4921 return boost::shared_ptr<AudioFileSource>();
4924 boost::shared_ptr<MidiSource>
4925 Session::midi_source_by_path (const std::string& path, bool need_source_lock) const
4927 /* Restricted to MIDI files because audio sources require a channel
4928 for unique identification, in addition to a path.
4931 Glib::Threads::Mutex::Lock lm (source_lock, Glib::Threads::NOT_LOCK);
4932 if (need_source_lock) {
4936 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
4937 boost::shared_ptr<MidiSource> ms
4938 = boost::dynamic_pointer_cast<MidiSource>(s->second);
4939 boost::shared_ptr<FileSource> fs
4940 = boost::dynamic_pointer_cast<FileSource>(s->second);
4942 if (ms && fs && fs->path() == path) {
4947 return boost::shared_ptr<MidiSource>();
4951 Session::count_sources_by_origin (const string& path)
4954 Glib::Threads::Mutex::Lock lm (source_lock);
4956 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
4957 boost::shared_ptr<FileSource> fs
4958 = boost::dynamic_pointer_cast<FileSource>(i->second);
4960 if (fs && fs->origin() == path) {
4969 peak_file_helper (const string& peak_path, const string& file_path, const string& file_base, bool hash) {
4971 std::string checksum = Glib::Checksum::compute_checksum(Glib::Checksum::CHECKSUM_SHA1, file_path + G_DIR_SEPARATOR + file_base);
4972 return Glib::build_filename (peak_path, checksum + peakfile_suffix);
4974 return Glib::build_filename (peak_path, file_base + peakfile_suffix);
4979 Session::construct_peak_filepath (const string& filepath, const bool in_session, const bool old_peak_name) const
4981 string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
4983 if (Glib::path_is_absolute (filepath)) {
4985 /* rip the session dir from the audiofile source */
4987 string session_path;
4988 bool in_another_session = true;
4990 if (filepath.find (interchange_dir_string) != string::npos) {
4992 session_path = Glib::path_get_dirname (filepath); /* now ends in audiofiles */
4993 session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
4994 session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
4995 session_path = Glib::path_get_dirname (session_path); /* now has session path */
4997 /* see if it is within our session */
4999 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
5000 if (i->path == session_path) {
5001 in_another_session = false;
5006 in_another_session = false;
5010 if (in_another_session) {
5011 SessionDirectory sd (session_path);
5012 return peak_file_helper (sd.peak_path(), "", Glib::path_get_basename (filepath), !old_peak_name);
5016 /* 1) if file belongs to this session
5017 * it may be a relative path (interchange/...)
5018 * or just basename (session_state, remove source)
5019 * -> just use the basename
5021 std::string filename = Glib::path_get_basename (filepath);
5024 /* 2) if the file is outside our session dir:
5025 * (imported but not copied) add the path for check-summming */
5027 path = Glib::path_get_dirname (filepath);
5030 return peak_file_helper (_session_dir->peak_path(), path, Glib::path_get_basename (filepath), !old_peak_name);
5034 Session::new_audio_source_path_for_embedded (const std::string& path)
5038 * we know that the filename is already unique because it exists
5039 * out in the filesystem.
5041 * However, when we bring it into the session, we could get a
5044 * Eg. two embedded files:
5049 * When merged into session, these collide.
5051 * There will not be a conflict with in-memory sources
5052 * because when the source was created we already picked
5053 * a unique name for it.
5055 * This collision is not likely to be common, but we have to guard
5056 * against it. So, if there is a collision, take the md5 hash of the
5057 * the path, and use that as the filename instead.
5060 SessionDirectory sdir (get_best_session_directory_for_new_audio());
5061 string base = Glib::path_get_basename (path);
5062 string newpath = Glib::build_filename (sdir.sound_path(), base);
5064 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
5068 md5.digestString (path.c_str());
5069 md5.writeToString ();
5070 base = md5.digestChars;
5072 string ext = get_suffix (path);
5079 newpath = Glib::build_filename (sdir.sound_path(), base);
5081 /* if this collides, we're screwed */
5083 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
5084 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
5093 /** Return true if there are no audio file sources that use @param name as
5094 * the filename component of their path.
5096 * Return false otherwise.
5098 * This method MUST ONLY be used to check in-session, mono files since it
5099 * hard-codes the channel of the audio file source we are looking for as zero.
5101 * If/when Ardour supports native files in non-mono formats, the logic here
5102 * will need to be revisited.
5105 Session::audio_source_name_is_unique (const string& name)
5107 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
5108 vector<space_and_path>::iterator i;
5109 uint32_t existing = 0;
5111 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
5113 /* note that we search *without* the extension so that
5114 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
5115 in the event that this new name is required for
5116 a file format change.
5119 const string spath = *i;
5121 if (matching_unsuffixed_filename_exists_in (spath, name)) {
5126 /* it is possible that we have the path already
5127 * assigned to a source that has not yet been written
5128 * (ie. the write source for a diskstream). we have to
5129 * check this in order to make sure that our candidate
5130 * path isn't used again, because that can lead to
5131 * two Sources point to the same file with different
5132 * notions of their removability.
5136 string possible_path = Glib::build_filename (spath, name);
5138 if (audio_source_by_path_and_channel (possible_path, 0)) {
5144 return (existing == 0);
5148 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)
5151 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
5153 if (Profile->get_trx() && destructive) {
5155 sstr << setfill ('0') << setw (4) << cnt;
5156 sstr << legalized_base;
5158 sstr << legalized_base;
5160 if (take_required || related_exists) {
5172 } else if (nchan > 2) {
5177 /* XXX what? more than 26 channels! */
5188 /** Return a unique name based on \a base for a new internal audio source */
5190 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
5193 string possible_name;
5194 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
5196 bool some_related_source_name_exists = false;
5198 legalized = legalize_for_path (base);
5200 // Find a "version" of the base name that doesn't exist in any of the possible directories.
5202 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
5204 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
5206 if (audio_source_name_is_unique (possible_name)) {
5210 some_related_source_name_exists = true;
5213 error << string_compose(
5214 _("There are already %1 recordings for %2, which I consider too many."),
5215 limit, base) << endmsg;
5217 throw failed_constructor();
5221 /* We've established that the new name does not exist in any session
5222 * directory, so now find out which one we should use for this new
5226 SessionDirectory sdir (get_best_session_directory_for_new_audio());
5228 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
5233 /** Return a unique name based on `base` for a new internal MIDI source */
5235 Session::new_midi_source_path (const string& base, bool need_lock)
5237 string possible_path;
5238 string possible_name;
5240 possible_name = legalize_for_path (base);
5242 // Find a "version" of the file name that doesn't exist in any of the possible directories.
5243 std::vector<string> sdirs = source_search_path(DataType::MIDI);
5245 /* - the main session folder is the first in the vector.
5246 * - after checking all locations for file-name uniqueness,
5247 * we keep the one from the last iteration as new file name
5248 * - midi files are small and should just be kept in the main session-folder
5250 * -> reverse the array, check main session folder last and use that as location
5253 std::reverse(sdirs.begin(), sdirs.end());
5256 possible_name = bump_name_once (possible_name, '-');
5258 vector<space_and_path>::iterator i;
5259 uint32_t existing = 0;
5261 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
5263 possible_path = Glib::build_filename (*i, possible_name + ".mid");
5265 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
5269 if (midi_source_by_path (possible_path, need_lock)) {
5274 if (possible_path.size () >= PATH_MAX) {
5275 error << string_compose(
5276 _("There are already many recordings for %1, resulting in a too long file-path %2."),
5277 base, possible_path) << endmsg;
5282 if (existing == 0) {
5287 /* No need to "find best location" for software/app-based RAID, because
5288 MIDI is so small that we always put it in the same place.
5291 return possible_path;
5295 /** Create a new within-session audio source */
5296 boost::shared_ptr<AudioFileSource>
5297 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
5299 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
5301 if (!path.empty()) {
5302 return boost::dynamic_pointer_cast<AudioFileSource> (
5303 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, sample_rate(), true, true));
5305 throw failed_constructor ();
5309 /** Create a new within-session MIDI source */
5310 boost::shared_ptr<MidiSource>
5311 Session::create_midi_source_for_session (string const & basic_name)
5313 const string path = new_midi_source_path (basic_name);
5315 if (!path.empty()) {
5316 return boost::dynamic_pointer_cast<SMFSource> (
5317 SourceFactory::createWritable (
5318 DataType::MIDI, *this, path, false, sample_rate()));
5320 throw failed_constructor ();
5324 /** Create a new within-session MIDI source */
5325 boost::shared_ptr<MidiSource>
5326 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
5328 /* the caller passes in the track the source will be used in,
5329 so that we can keep the numbering sane.
5331 Rationale: a track with the name "Foo" that has had N
5332 captures carried out so far will ALREADY have a write source
5333 named "Foo-N+1.mid" waiting to be used for the next capture.
5335 If we call new_midi_source_name() we will get "Foo-N+2". But
5336 there is no region corresponding to "Foo-N+1", so when
5337 "Foo-N+2" appears in the track, the gap presents the user
5338 with odd behaviour - why did it skip past Foo-N+1?
5340 We could explain this to the user in some odd way, but
5341 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
5344 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
5347 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
5349 std::string name = track->steal_write_source_name ();
5352 return boost::shared_ptr<MidiSource>();
5355 /* MIDI files are small, just put them in the first location of the
5356 session source search path.
5359 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
5361 return boost::dynamic_pointer_cast<SMFSource> (
5362 SourceFactory::createWritable (
5363 DataType::MIDI, *this, path, false, sample_rate()));
5368 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
5370 if (playlist->hidden()) {
5374 playlists->add (playlist);
5377 playlist->release();
5384 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
5386 if (_state_of_the_state & Deletion) {
5390 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
5396 playlists->remove (playlist);
5402 Session::set_audition (boost::shared_ptr<Region> r)
5404 pending_audition_region = r;
5405 add_post_transport_work (PostTransportAudition);
5406 _butler->schedule_transport_work ();
5410 Session::audition_playlist ()
5412 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
5413 ev->region.reset ();
5419 Session::register_lua_function (
5420 const std::string& name,
5421 const std::string& script,
5422 const LuaScriptParamList& args
5425 Glib::Threads::Mutex::Lock lm (lua_lock);
5427 lua_State* L = lua.getState();
5429 const std::string& bytecode = LuaScripting::get_factory_bytecode (script);
5430 luabridge::LuaRef tbl_arg (luabridge::newTable(L));
5431 for (LuaScriptParamList::const_iterator i = args.begin(); i != args.end(); ++i) {
5432 if ((*i)->optional && !(*i)->is_set) { continue; }
5433 tbl_arg[(*i)->name] = (*i)->value;
5435 (*_lua_add)(name, bytecode, tbl_arg); // throws luabridge::LuaException
5438 LuaScriptsChanged (); /* EMIT SIGNAL */
5443 Session::unregister_lua_function (const std::string& name)
5445 Glib::Threads::Mutex::Lock lm (lua_lock);
5446 (*_lua_del)(name); // throws luabridge::LuaException
5447 lua.collect_garbage ();
5450 LuaScriptsChanged (); /* EMIT SIGNAL */
5454 std::vector<std::string>
5455 Session::registered_lua_functions ()
5457 Glib::Threads::Mutex::Lock lm (lua_lock);
5458 std::vector<std::string> rv;
5461 luabridge::LuaRef list ((*_lua_list)());
5462 for (luabridge::Iterator i (list); !i.isNil (); ++i) {
5463 if (!i.key ().isString ()) { assert(0); continue; }
5464 rv.push_back (i.key ().cast<std::string> ());
5471 static void _lua_print (std::string s) {
5472 std::cout << "SessionLua: " << s << "\n";
5477 Session::try_run_lua (pframes_t nframes)
5479 if (_n_lua_scripts == 0) return;
5480 Glib::Threads::Mutex::Lock tm (lua_lock, Glib::Threads::TRY_LOCK);
5482 try { (*_lua_run)(nframes); } catch (...) { }
5483 lua.collect_garbage_step ();
5488 Session::setup_lua ()
5491 lua.Print.connect (&_lua_print);
5495 "function ArdourSession ()"
5496 " local self = { scripts = {}, instances = {} }"
5498 " local remove = function (n)"
5499 " self.scripts[n] = nil"
5500 " self.instances[n] = nil"
5501 " Session:scripts_changed()" // call back
5504 " local addinternal = function (n, f, a)"
5505 " assert(type(n) == 'string', 'function-name must be string')"
5506 " assert(type(f) == 'function', 'Given script is a not a function')"
5507 " assert(type(a) == 'table' or type(a) == 'nil', 'Given argument is invalid')"
5508 " assert(self.scripts[n] == nil, 'Callback \"'.. n ..'\" already exists.')"
5509 " self.scripts[n] = { ['f'] = f, ['a'] = a }"
5510 " 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 }"
5511 " self.instances[n] = load (string.dump(f, true), nil, nil, env)(a)"
5512 " Session:scripts_changed()" // call back
5515 " local add = function (n, b, a)"
5516 " assert(type(b) == 'string', 'ByteCode must be string')"
5517 " load (b)()" // assigns f
5518 " assert(type(f) == 'string', 'Assigned ByteCode must be string')"
5519 " addinternal (n, load(f), a)"
5522 " local run = function (...)"
5523 " for n, s in pairs (self.instances) do"
5524 " local status, err = pcall (s, ...)"
5525 " if not status then"
5526 " print ('fn \"'.. n .. '\": ', err)"
5533 " local cleanup = function ()"
5534 " self.scripts = nil"
5535 " self.instances = nil"
5538 " local list = function ()"
5540 " for n, _ in pairs (self.scripts) do"
5546 " local function basic_serialize (o)"
5547 " if type(o) == \"number\" then"
5548 " return tostring(o)"
5550 " return string.format(\"%q\", o)"
5554 " local function serialize (name, value)"
5555 " local rv = name .. ' = '"
5557 " if type(value) == \"number\" or type(value) == \"string\" or type(value) == \"nil\" then"
5558 " return rv .. basic_serialize(value) .. ' '"
5559 " elseif type(value) == \"table\" then"
5561 " for k,v in pairs(value) do"
5562 " local fieldname = string.format(\"%s[%s]\", name, basic_serialize(k))"
5563 " rv = rv .. serialize(fieldname, v) .. ' '"
5564 " collectgarbage()" // string concatenation allocates a new string :(
5567 " elseif type(value) == \"function\" then"
5568 " return rv .. string.format(\"%q\", string.dump(value, true))"
5570 " error('cannot save a ' .. type(value))"
5575 " local save = function ()"
5576 " return (serialize('scripts', self.scripts))"
5579 " local restore = function (state)"
5580 " self.scripts = {}"
5582 " for n, s in pairs (scripts) do"
5583 " addinternal (n, load(s['f']), s['a'])"
5587 " return { run = run, add = add, remove = remove,"
5588 " list = list, restore = restore, save = save, cleanup = cleanup}"
5591 " sess = ArdourSession ()"
5592 " ArdourSession = nil"
5594 "function ardour () end"
5597 lua_State* L = lua.getState();
5600 luabridge::LuaRef lua_sess = luabridge::getGlobal (L, "sess");
5601 lua.do_command ("sess = nil"); // hide it.
5602 lua.do_command ("collectgarbage()");
5604 _lua_run = new luabridge::LuaRef(lua_sess["run"]);
5605 _lua_add = new luabridge::LuaRef(lua_sess["add"]);
5606 _lua_del = new luabridge::LuaRef(lua_sess["remove"]);
5607 _lua_list = new luabridge::LuaRef(lua_sess["list"]);
5608 _lua_save = new luabridge::LuaRef(lua_sess["save"]);
5609 _lua_load = new luabridge::LuaRef(lua_sess["restore"]);
5610 _lua_cleanup = new luabridge::LuaRef(lua_sess["cleanup"]);
5611 } catch (luabridge::LuaException const& e) {
5612 fatal << string_compose (_("programming error: %1"),
5613 std::string ("Failed to setup session Lua interpreter") + e.what ())
5615 abort(); /*NOTREACHED*/
5617 fatal << string_compose (_("programming error: %1"),
5618 X_("Failed to setup session Lua interpreter"))
5620 abort(); /*NOTREACHED*/
5624 LuaBindings::stddef (L);
5625 LuaBindings::common (L);
5626 LuaBindings::dsp (L);
5628 luabridge::push <Session *> (L, this);
5629 lua_setglobal (L, "Session");
5633 Session::scripts_changed ()
5635 assert (!lua_lock.trylock()); // must hold lua_lock
5638 luabridge::LuaRef list ((*_lua_list)());
5640 for (luabridge::Iterator i (list); !i.isNil (); ++i) {
5641 if (!i.key ().isString ()) { assert(0); continue; }
5644 _n_lua_scripts = cnt;
5645 } catch (luabridge::LuaException const& e) {
5646 fatal << string_compose (_("programming error: %1"),
5647 std::string ("Indexing Lua Session Scripts failed.") + e.what ())
5649 abort(); /*NOTREACHED*/
5651 fatal << string_compose (_("programming error: %1"),
5652 X_("Indexing Lua Session Scripts failed."))
5654 abort(); /*NOTREACHED*/
5659 Session::non_realtime_set_audition ()
5661 assert (pending_audition_region);
5662 auditioner->audition_region (pending_audition_region);
5663 pending_audition_region.reset ();
5664 AuditionActive (true); /* EMIT SIGNAL */
5668 Session::audition_region (boost::shared_ptr<Region> r)
5670 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
5676 Session::cancel_audition ()
5681 if (auditioner->auditioning()) {
5682 auditioner->cancel_audition ();
5683 AuditionActive (false); /* EMIT SIGNAL */
5688 Session::is_auditioning () const
5690 /* can be called before we have an auditioner object */
5692 return auditioner->auditioning();
5699 Session::graph_reordered ()
5701 /* don't do this stuff if we are setting up connections
5702 from a set_state() call or creating new tracks. Ditto for deletion.
5705 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _reconnecting_routes_in_progress || _route_deletion_in_progress) {
5711 /* force all diskstreams to update their capture offset values to
5712 * reflect any changes in latencies within the graph.
5714 update_route_latency (false, true);
5717 /** @return Number of samples that there is disk space available to write,
5720 boost::optional<samplecnt_t>
5721 Session::available_capture_duration ()
5723 Glib::Threads::Mutex::Lock lm (space_lock);
5725 if (_total_free_4k_blocks_uncertain) {
5726 return boost::optional<samplecnt_t> ();
5729 float sample_bytes_on_disk = 4.0; // keep gcc happy
5731 switch (config.get_native_file_data_format()) {
5733 sample_bytes_on_disk = 4.0;
5737 sample_bytes_on_disk = 3.0;
5741 sample_bytes_on_disk = 2.0;
5745 /* impossible, but keep some gcc versions happy */
5746 fatal << string_compose (_("programming error: %1"),
5747 X_("illegal native file data format"))
5749 abort(); /*NOTREACHED*/
5752 double scale = 4096.0 / sample_bytes_on_disk;
5754 if (_total_free_4k_blocks * scale > (double) max_samplecnt) {
5755 return max_samplecnt;
5758 return (samplecnt_t) floor (_total_free_4k_blocks * scale);
5762 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
5765 RCUWriter<BundleList> writer (_bundles);
5766 boost::shared_ptr<BundleList> b = writer.get_copy ();
5767 b->push_back (bundle);
5771 BundleAddedOrRemoved (); /* EMIT SIGNAL */
5778 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
5780 bool removed = false;
5783 RCUWriter<BundleList> writer (_bundles);
5784 boost::shared_ptr<BundleList> b = writer.get_copy ();
5785 BundleList::iterator i = find (b->begin(), b->end(), bundle);
5787 if (i != b->end()) {
5794 BundleAddedOrRemoved (); /* EMIT SIGNAL */
5800 boost::shared_ptr<Bundle>
5801 Session::bundle_by_name (string name) const
5803 boost::shared_ptr<BundleList> b = _bundles.reader ();
5805 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
5806 if ((*i)->name() == name) {
5811 return boost::shared_ptr<Bundle> ();
5815 Session::tempo_map_changed (const PropertyChange&)
5819 playlists->update_after_tempo_map_change ();
5821 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
5827 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
5829 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
5830 (*i)->recompute_samples_from_beat ();
5834 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
5835 * the given count with the current block size.
5838 Session::ensure_buffers (ChanCount howmany)
5840 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
5844 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
5846 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5847 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
5852 Session::next_insert_id ()
5854 /* this doesn't really loop forever. just think about it */
5857 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < insert_bitset.size(); ++n) {
5858 if (!insert_bitset[n]) {
5859 insert_bitset[n] = true;
5865 /* none available, so resize and try again */
5867 insert_bitset.resize (insert_bitset.size() + 16, false);
5872 Session::next_send_id ()
5874 /* this doesn't really loop forever. just think about it */
5877 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < send_bitset.size(); ++n) {
5878 if (!send_bitset[n]) {
5879 send_bitset[n] = true;
5885 /* none available, so resize and try again */
5887 send_bitset.resize (send_bitset.size() + 16, false);
5892 Session::next_aux_send_id ()
5894 /* this doesn't really loop forever. just think about it */
5897 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < aux_send_bitset.size(); ++n) {
5898 if (!aux_send_bitset[n]) {
5899 aux_send_bitset[n] = true;
5905 /* none available, so resize and try again */
5907 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
5912 Session::next_return_id ()
5914 /* this doesn't really loop forever. just think about it */
5917 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < return_bitset.size(); ++n) {
5918 if (!return_bitset[n]) {
5919 return_bitset[n] = true;
5925 /* none available, so resize and try again */
5927 return_bitset.resize (return_bitset.size() + 16, false);
5932 Session::mark_send_id (uint32_t id)
5934 if (id >= send_bitset.size()) {
5935 send_bitset.resize (id+16, false);
5937 if (send_bitset[id]) {
5938 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
5940 send_bitset[id] = true;
5944 Session::mark_aux_send_id (uint32_t id)
5946 if (id >= aux_send_bitset.size()) {
5947 aux_send_bitset.resize (id+16, false);
5949 if (aux_send_bitset[id]) {
5950 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
5952 aux_send_bitset[id] = true;
5956 Session::mark_return_id (uint32_t id)
5958 if (id >= return_bitset.size()) {
5959 return_bitset.resize (id+16, false);
5961 if (return_bitset[id]) {
5962 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
5964 return_bitset[id] = true;
5968 Session::mark_insert_id (uint32_t id)
5970 if (id >= insert_bitset.size()) {
5971 insert_bitset.resize (id+16, false);
5973 if (insert_bitset[id]) {
5974 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
5976 insert_bitset[id] = true;
5980 Session::unmark_send_id (uint32_t id)
5982 if (id < send_bitset.size()) {
5983 send_bitset[id] = false;
5988 Session::unmark_aux_send_id (uint32_t id)
5990 if (id < aux_send_bitset.size()) {
5991 aux_send_bitset[id] = false;
5996 Session::unmark_return_id (uint32_t id)
5998 if (_state_of_the_state & Deletion) { return; }
5999 if (id < return_bitset.size()) {
6000 return_bitset[id] = false;
6005 Session::unmark_insert_id (uint32_t id)
6007 if (id < insert_bitset.size()) {
6008 insert_bitset[id] = false;
6013 Session::reset_native_file_format ()
6015 boost::shared_ptr<RouteList> rl = routes.reader ();
6017 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
6018 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6020 /* don't save state as we do this, there's no point
6022 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
6023 tr->reset_write_sources (false);
6024 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
6030 Session::route_name_unique (string n) const
6032 boost::shared_ptr<RouteList> r = routes.reader ();
6034 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
6035 if ((*i)->name() == n) {
6044 Session::route_name_internal (string n) const
6046 if (auditioner && auditioner->name() == n) {
6050 if (_click_io && _click_io->name() == n) {
6058 Session::freeze_all (InterThreadInfo& itt)
6060 boost::shared_ptr<RouteList> r = routes.reader ();
6062 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6064 boost::shared_ptr<Track> t;
6066 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
6067 /* XXX this is wrong because itt.progress will keep returning to zero at the start
6077 boost::shared_ptr<Region>
6078 Session::write_one_track (Track& track, samplepos_t start, samplepos_t end,
6079 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
6080 InterThreadInfo& itt,
6081 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
6082 bool for_export, bool for_freeze)
6084 boost::shared_ptr<Region> result;
6085 boost::shared_ptr<Playlist> playlist;
6086 boost::shared_ptr<Source> source;
6087 ChanCount diskstream_channels (track.n_channels());
6088 samplepos_t position;
6089 samplecnt_t this_chunk;
6091 samplepos_t latency_skip;
6093 samplepos_t len = end - start;
6094 bool need_block_size_reset = false;
6095 ChanCount const max_proc = track.max_processor_streams ();
6096 string legal_playlist_name;
6097 string possible_path;
6100 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
6101 end, start) << endmsg;
6105 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
6106 include_endpoint, for_export, for_freeze);
6108 if (diskstream_channels.n(track.data_type()) < 1) {
6109 error << _("Cannot write a range with no data.") << endmsg;
6113 // block all process callback handling
6115 block_processing ();
6118 // synchronize with AudioEngine::process_callback()
6119 // make sure processing is not currently running
6120 // and processing_blocked() is honored before
6121 // acquiring thread buffers
6122 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
6125 _bounce_processing_active = true;
6127 /* call tree *MUST* hold route_lock */
6129 if ((playlist = track.playlist()) == 0) {
6133 legal_playlist_name = legalize_for_path (playlist->name());
6135 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
6137 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
6138 string path = ((track.data_type() == DataType::AUDIO)
6139 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
6140 : new_midi_source_path (legal_playlist_name));
6147 source = SourceFactory::createWritable (track.data_type(), *this, path, false, sample_rate());
6150 catch (failed_constructor& err) {
6151 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
6155 srcs.push_back (source);
6158 /* tell redirects that care that we are about to use a much larger
6159 * blocksize. this will flush all plugins too, so that they are ready
6160 * to be used for this process.
6163 need_block_size_reset = true;
6164 track.set_block_size (bounce_chunk_size);
6165 _engine.main_thread()->get_buffers ();
6169 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
6171 /* create a set of reasonably-sized buffers */
6172 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
6173 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
6175 buffers.set_count (max_proc);
6177 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
6178 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6179 boost::shared_ptr<MidiSource> ms;
6181 afs->prepare_for_peakfile_writes ();
6182 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
6183 Source::Lock lock(ms->mutex());
6184 ms->mark_streaming_write_started(lock);
6188 while (to_do && !itt.cancel) {
6190 this_chunk = min (to_do, bounce_chunk_size);
6192 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
6196 start += this_chunk;
6197 to_do -= this_chunk;
6198 itt.progress = (float) (1.0 - ((double) to_do / len));
6200 if (latency_skip >= bounce_chunk_size) {
6201 latency_skip -= bounce_chunk_size;
6205 const samplecnt_t current_chunk = this_chunk - latency_skip;
6208 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
6209 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6210 boost::shared_ptr<MidiSource> ms;
6213 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
6216 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
6217 Source::Lock lock(ms->mutex());
6219 const MidiBuffer& buf = buffers.get_midi(0);
6220 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
6221 Evoral::Event<samplepos_t> ev = *i;
6222 ev.set_time(ev.time() - position);
6223 ms->append_event_samples(lock, ev, ms->timeline_position());
6230 /* post-roll, pick up delayed processor output */
6231 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
6233 while (latency_skip && !itt.cancel) {
6234 this_chunk = min (latency_skip, bounce_chunk_size);
6235 latency_skip -= this_chunk;
6237 buffers.silence (this_chunk, 0);
6238 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
6241 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
6242 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6245 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
6257 xnow = localtime (&now);
6259 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
6260 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6261 boost::shared_ptr<MidiSource> ms;
6264 afs->update_header (position, *xnow, now);
6265 afs->flush_header ();
6266 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
6267 Source::Lock lock(ms->mutex());
6268 ms->mark_streaming_write_completed(lock);
6272 /* construct a region to represent the bounced material */
6276 plist.add (Properties::start, 0);
6277 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
6278 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
6280 result = RegionFactory::create (srcs, plist);
6286 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
6287 (*src)->mark_for_remove ();
6288 (*src)->drop_references ();
6292 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
6293 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6296 afs->done_with_peakfile_writes ();
6300 _bounce_processing_active = false;
6302 if (need_block_size_reset) {
6303 _engine.main_thread()->drop_buffers ();
6304 track.set_block_size (get_block_size());
6307 unblock_processing ();
6313 Session::gain_automation_buffer() const
6315 return ProcessThread::gain_automation_buffer ();
6319 Session::trim_automation_buffer() const
6321 return ProcessThread::trim_automation_buffer ();
6325 Session::send_gain_automation_buffer() const
6327 return ProcessThread::send_gain_automation_buffer ();
6331 Session::scratch_automation_buffer() const
6333 return ProcessThread::scratch_automation_buffer ();
6337 Session::pan_automation_buffer() const
6339 return ProcessThread::pan_automation_buffer ();
6343 Session::get_silent_buffers (ChanCount count)
6345 return ProcessThread::get_silent_buffers (count);
6349 Session::get_scratch_buffers (ChanCount count, bool silence)
6351 return ProcessThread::get_scratch_buffers (count, silence);
6355 Session::get_noinplace_buffers (ChanCount count)
6357 return ProcessThread::get_noinplace_buffers (count);
6361 Session::get_route_buffers (ChanCount count, bool silence)
6363 return ProcessThread::get_route_buffers (count, silence);
6368 Session::get_mix_buffers (ChanCount count)
6370 return ProcessThread::get_mix_buffers (count);
6374 Session::ntracks () const
6377 boost::shared_ptr<RouteList> r = routes.reader ();
6379 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
6380 if (boost::dynamic_pointer_cast<Track> (*i)) {
6389 Session::nbusses () const
6392 boost::shared_ptr<RouteList> r = routes.reader ();
6394 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
6395 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
6404 Session::nstripables (bool with_monitor) const
6406 uint32_t rv = routes.reader()->size ();
6407 rv += _vca_manager->vcas ().size ();
6421 Session::add_automation_list(AutomationList *al)
6423 automation_lists[al->id()] = al;
6426 /** @return true if there is at least one record-enabled track, otherwise false */
6428 Session::have_rec_enabled_track () const
6430 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
6434 Session::have_rec_disabled_track () const
6436 return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
6439 /** Update the state of our rec-enabled tracks flag */
6441 Session::update_route_record_state ()
6443 boost::shared_ptr<RouteList> rl = routes.reader ();
6444 RouteList::iterator i = rl->begin();
6445 while (i != rl->end ()) {
6447 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6448 if (tr && tr->rec_enable_control()->get_value()) {
6455 int const old = g_atomic_int_get (&_have_rec_enabled_track);
6457 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
6459 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
6460 RecordStateChanged (); /* EMIT SIGNAL */
6463 for (i = rl->begin(); i != rl->end (); ++i) {
6464 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6465 if (tr && !tr->rec_enable_control()->get_value()) {
6470 g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
6472 bool record_arm_state_changed = (old != g_atomic_int_get (&_have_rec_enabled_track) );
6474 if (record_status() == Recording && record_arm_state_changed ) {
6475 RecordArmStateChanged ();
6481 Session::listen_position_changed ()
6483 ProcessorChangeBlocker pcb (this);
6484 boost::shared_ptr<RouteList> r = routes.reader ();
6485 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6486 (*i)->listen_position_changed ();
6491 Session::solo_control_mode_changed ()
6493 if (soloing() || listening()) {
6495 /* We can't use ::clear_all_solo_state() here because during
6496 session loading at program startup, that will queue a call
6497 to rt_clear_all_solo_state() that will not execute until
6498 AFTER solo states have been established (thus throwing away
6499 the session's saved solo state). So just explicitly turn
6502 set_controls (route_list_to_control_list (get_routes(), &Stripable::solo_control), 0.0, Controllable::NoGroup);
6504 clear_all_solo_state (get_routes());
6509 /** Called when a property of one of our route groups changes */
6511 Session::route_group_property_changed (RouteGroup* rg)
6513 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
6516 /** Called when a route is added to one of our route groups */
6518 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
6520 RouteAddedToRouteGroup (rg, r);
6523 /** Called when a route is removed from one of our route groups */
6525 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
6527 update_route_record_state ();
6528 RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
6530 if (!rg->has_control_master () && !rg->has_subgroup () && rg->empty()) {
6531 remove_route_group (*rg);
6535 boost::shared_ptr<RouteList>
6536 Session::get_tracks () const
6538 boost::shared_ptr<RouteList> rl = routes.reader ();
6539 boost::shared_ptr<RouteList> tl (new RouteList);
6541 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
6542 if (boost::dynamic_pointer_cast<Track> (*r)) {
6543 assert (!(*r)->is_auditioner()); // XXX remove me
6550 boost::shared_ptr<RouteList>
6551 Session::get_routes_with_regions_at (samplepos_t const p) const
6553 boost::shared_ptr<RouteList> r = routes.reader ();
6554 boost::shared_ptr<RouteList> rl (new RouteList);
6556 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6557 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6562 boost::shared_ptr<Playlist> pl = tr->playlist ();
6567 if (pl->has_region_at (p)) {
6576 Session::goto_end ()
6578 if (_session_range_location) {
6579 request_locate (_session_range_location->end(), false);
6581 request_locate (0, false);
6586 Session::goto_start (bool and_roll)
6588 if (_session_range_location) {
6589 request_locate (_session_range_location->start(), and_roll);
6591 request_locate (0, and_roll);
6596 Session::current_start_sample () const
6598 return _session_range_location ? _session_range_location->start() : 0;
6602 Session::current_end_sample () const
6604 return _session_range_location ? _session_range_location->end() : 0;
6608 Session::set_session_range_location (samplepos_t start, samplepos_t end)
6610 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange, 0);
6611 _locations->add (_session_range_location);
6615 Session::step_edit_status_change (bool yn)
6621 send = (_step_editors == 0);
6626 send = (_step_editors == 1);
6629 if (_step_editors > 0) {
6635 StepEditStatusChange (val);
6641 Session::start_time_changed (samplepos_t old)
6643 /* Update the auto loop range to match the session range
6644 (unless the auto loop range has been changed by the user)
6647 Location* s = _locations->session_range_location ();
6652 Location* l = _locations->auto_loop_location ();
6654 if (l && l->start() == old) {
6655 l->set_start (s->start(), true);
6661 Session::end_time_changed (samplepos_t old)
6663 /* Update the auto loop range to match the session range
6664 (unless the auto loop range has been changed by the user)
6667 Location* s = _locations->session_range_location ();
6672 Location* l = _locations->auto_loop_location ();
6674 if (l && l->end() == old) {
6675 l->set_end (s->end(), true);
6680 std::vector<std::string>
6681 Session::source_search_path (DataType type) const
6685 if (session_dirs.size() == 1) {
6687 case DataType::AUDIO:
6688 sp.push_back (_session_dir->sound_path());
6690 case DataType::MIDI:
6691 sp.push_back (_session_dir->midi_path());
6695 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
6696 SessionDirectory sdir (i->path);
6698 case DataType::AUDIO:
6699 sp.push_back (sdir.sound_path());
6701 case DataType::MIDI:
6702 sp.push_back (sdir.midi_path());
6708 if (type == DataType::AUDIO) {
6709 const string sound_path_2X = _session_dir->sound_path_2X();
6710 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
6711 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
6712 sp.push_back (sound_path_2X);
6717 // now check the explicit (possibly user-specified) search path
6720 case DataType::AUDIO:
6721 sp += Searchpath(config.get_audio_search_path ());
6723 case DataType::MIDI:
6724 sp += Searchpath(config.get_midi_search_path ());
6732 Session::ensure_search_path_includes (const string& path, DataType type)
6741 case DataType::AUDIO:
6742 sp += Searchpath(config.get_audio_search_path ());
6744 case DataType::MIDI:
6745 sp += Searchpath (config.get_midi_search_path ());
6749 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
6750 /* No need to add this new directory if it has the same inode as
6751 an existing one; checking inode rather than name prevents duplicated
6752 directories when we are using symlinks.
6754 On Windows, I think we could just do if (*i == path) here.
6756 if (PBD::equivalent_paths (*i, path)) {
6764 case DataType::AUDIO:
6765 config.set_audio_search_path (sp.to_string());
6767 case DataType::MIDI:
6768 config.set_midi_search_path (sp.to_string());
6774 Session::remove_dir_from_search_path (const string& dir, DataType type)
6779 case DataType::AUDIO:
6780 sp = Searchpath(config.get_audio_search_path ());
6782 case DataType::MIDI:
6783 sp = Searchpath (config.get_midi_search_path ());
6790 case DataType::AUDIO:
6791 config.set_audio_search_path (sp.to_string());
6793 case DataType::MIDI:
6794 config.set_midi_search_path (sp.to_string());
6800 boost::shared_ptr<Speakers>
6801 Session::get_speakers()
6807 Session::unknown_processors () const
6811 boost::shared_ptr<RouteList> r = routes.reader ();
6812 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6813 list<string> t = (*i)->unknown_processors ();
6814 copy (t.begin(), t.end(), back_inserter (p));
6824 Session::set_worst_io_latencies_x (IOChange, void *)
6826 set_worst_io_latencies ();
6830 Session::send_latency_compensation_change ()
6832 /* As a result of Send::set_output_latency()
6833 * or InternalReturn::set_playback_offset ()
6834 * the send's own latency can change (source track
6835 * is aligned with target bus).
6837 * This can only happen be triggered by
6838 * Route::update_signal_latency ()
6839 * when updating the processor latency.
6841 * We need to walk the graph again to take those changes into account
6842 * (we should probably recurse or process the graph in a 2 step process).
6844 ++_send_latency_changes;
6848 Session::update_route_latency (bool playback, bool apply_to_delayline)
6850 /* Note: RouteList is process-graph sorted */
6851 boost::shared_ptr<RouteList> r = routes.reader ();
6854 /* reverse the list so that we work backwards from the last route to run to the first,
6855 * this is not needed, but can help to reduce the iterations for aux-sends.
6857 RouteList* rl = routes.reader().get();
6858 r.reset (new RouteList (*rl));
6859 reverse (r->begin(), r->end());
6862 bool changed = false;
6865 _send_latency_changes = 0;
6866 _worst_route_latency = 0;
6868 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6869 // if (!(*i)->active()) { continue ; } // TODO
6871 if ((*i)->signal_latency () != (l = (*i)->update_signal_latency (apply_to_delayline))) {
6874 _worst_route_latency = std::max (l, _worst_route_latency);
6877 if (_send_latency_changes > 0) {
6878 // only 1 extra iteration is needed (we allow only 1 level of aux-sends)
6879 // BUT.. jack'n'sends'n'bugs
6880 if (++bailout < 5) {
6881 cerr << "restarting Session::update_latency. # of send changes: " << _send_latency_changes << " iteration: " << bailout << endl;
6886 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_route_latency, (changed ? "yes" : "no")));
6892 Session::update_latency (bool playback)
6894 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
6896 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _route_deletion_in_progress) {
6899 if (!_engine.running()) {
6903 /* Note; RouteList is sorted as process-graph */
6904 boost::shared_ptr<RouteList> r = routes.reader ();
6907 /* reverse the list so that we work backwards from the last route to run to the first */
6908 RouteList* rl = routes.reader().get();
6909 r.reset (new RouteList (*rl));
6910 reverse (r->begin(), r->end());
6913 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6914 samplecnt_t latency = (*i)->set_private_port_latencies (playback);
6915 (*i)->set_public_port_latencies (latency, playback);
6919 set_worst_output_latency ();
6920 update_route_latency (true, true);
6922 set_worst_input_latency ();
6923 update_route_latency (false, false);
6926 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
6930 Session::initialize_latencies ()
6933 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
6934 update_latency (false);
6935 update_latency (true);
6938 set_worst_io_latencies ();
6942 Session::set_worst_io_latencies ()
6944 set_worst_output_latency ();
6945 set_worst_input_latency ();
6949 Session::set_worst_output_latency ()
6951 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6955 _worst_output_latency = 0;
6957 if (!_engine.connected()) {
6961 boost::shared_ptr<RouteList> r = routes.reader ();
6963 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6964 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
6967 _worst_output_latency = max (_worst_output_latency, _click_io->latency());
6969 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
6973 Session::set_worst_input_latency ()
6975 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6979 _worst_input_latency = 0;
6981 if (!_engine.connected()) {
6985 boost::shared_ptr<RouteList> r = routes.reader ();
6987 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6988 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
6991 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
6995 Session::update_latency_compensation (bool force_whole_graph)
6997 if (_state_of_the_state & (InitialConnecting|Deletion)) {
7001 bool some_track_latency_changed = update_route_latency (false, false);
7003 if (some_track_latency_changed || force_whole_graph) {
7004 _engine.update_latencies ();
7005 /* above call will ask the backend up update its latencies, which
7006 * eventually will trigger AudioEngine::latency_callback () and
7007 * call Session::update_latency ()
7010 boost::shared_ptr<RouteList> r = routes.reader ();
7011 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
7012 (*i)->apply_latency_compensation ();
7018 Session::session_name_is_legal (const string& path)
7020 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
7022 for (int i = 0; illegal_chars[i]; ++i) {
7023 if (path.find (illegal_chars[i]) != string::npos) {
7024 return illegal_chars[i];
7032 Session::notify_presentation_info_change ()
7034 if (deletion_in_progress()) {
7038 reassign_track_numbers();
7040 #ifdef USE_TRACKS_CODE_FEATURES
7041 /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
7042 * if track order has been changed by user
7044 reconnect_existing_routes(true, true);
7050 Session::operation_in_progress (GQuark op) const
7052 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
7055 boost::shared_ptr<Port>
7056 Session::ltc_input_port () const
7058 assert (_ltc_input);
7059 return _ltc_input->nth (0);
7062 boost::shared_ptr<Port>
7063 Session::ltc_output_port () const
7065 return _ltc_output ? _ltc_output->nth (0) : boost::shared_ptr<Port> ();
7069 Session::reconnect_ltc_input ()
7073 string src = Config->get_ltc_source_port();
7075 _ltc_input->disconnect (this);
7077 if (src != _("None") && !src.empty()) {
7078 _ltc_input->nth (0)->connect (src);
7081 if ( ARDOUR::Profile->get_trx () ) {
7082 // Tracks need this signal to update timecode_source_dropdown
7083 MtcOrLtcInputPortChanged (); //emit signal
7089 Session::reconnect_ltc_output ()
7093 string src = Config->get_ltc_output_port();
7095 _ltc_output->disconnect (this);
7097 if (src != _("None") && !src.empty()) {
7098 _ltc_output->nth (0)->connect (src);
7104 Session::set_range_selection (samplepos_t start, samplepos_t end)
7106 _range_selection = Evoral::Range<samplepos_t> (start, end);
7107 #ifdef USE_TRACKS_CODE_FEATURES
7108 follow_playhead_priority ();
7113 Session::set_object_selection (samplepos_t start, samplepos_t end)
7115 _object_selection = Evoral::Range<samplepos_t> (start, end);
7116 #ifdef USE_TRACKS_CODE_FEATURES
7117 follow_playhead_priority ();
7122 Session::clear_range_selection ()
7124 _range_selection = Evoral::Range<samplepos_t> (-1,-1);
7125 #ifdef USE_TRACKS_CODE_FEATURES
7126 follow_playhead_priority ();
7131 Session::clear_object_selection ()
7133 _object_selection = Evoral::Range<samplepos_t> (-1,-1);
7134 #ifdef USE_TRACKS_CODE_FEATURES
7135 follow_playhead_priority ();
7140 Session::auto_connect_route (boost::shared_ptr<Route> route, bool connect_inputs,
7141 const ChanCount& input_start,
7142 const ChanCount& output_start,
7143 const ChanCount& input_offset,
7144 const ChanCount& output_offset)
7146 Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
7147 _auto_connect_queue.push (AutoConnectRequest (route, connect_inputs,
7148 input_start, output_start,
7149 input_offset, output_offset));
7151 auto_connect_thread_wakeup ();
7155 Session::auto_connect_thread_wakeup ()
7157 if (pthread_mutex_trylock (&_auto_connect_mutex) == 0) {
7158 pthread_cond_signal (&_auto_connect_cond);
7159 pthread_mutex_unlock (&_auto_connect_mutex);
7164 Session::queue_latency_recompute ()
7166 g_atomic_int_inc (&_latency_recompute_pending);
7167 auto_connect_thread_wakeup ();
7171 Session::auto_connect (const AutoConnectRequest& ar)
7173 boost::shared_ptr<Route> route = ar.route.lock();
7175 if (!route) { return; }
7177 if (!IO::connecting_legal) {
7181 /* If both inputs and outputs are auto-connected to physical ports,
7182 * use the max of input and output offsets to ensure auto-connected
7183 * port numbers always match up (e.g. the first audio input and the
7184 * first audio output of the route will have the same physical
7185 * port number). Otherwise just use the lowest input or output
7189 const bool in_out_physical =
7190 (Config->get_input_auto_connect() & AutoConnectPhysical)
7191 && (Config->get_output_auto_connect() & AutoConnectPhysical)
7192 && ar.connect_inputs;
7194 const ChanCount in_offset = in_out_physical
7195 ? ChanCount::max(ar.input_offset, ar.output_offset)
7198 const ChanCount out_offset = in_out_physical
7199 ? ChanCount::max(ar.input_offset, ar.output_offset)
7202 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
7203 vector<string> physinputs;
7204 vector<string> physoutputs;
7207 /* for connecting track inputs we only want MIDI ports marked
7211 get_physical_ports (physinputs, physoutputs, *t, MidiPortMusic);
7213 if (!physinputs.empty() && ar.connect_inputs) {
7214 uint32_t nphysical_in = physinputs.size();
7216 for (uint32_t i = ar.input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
7219 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
7220 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
7223 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
7229 if (!physoutputs.empty()) {
7230 uint32_t nphysical_out = physoutputs.size();
7231 for (uint32_t i = ar.output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
7235 * do not create new connections if we reached the limit of physical outputs
7238 if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
7239 ARDOUR::Profile->get_trx () &&
7240 ar.output_offset.get(*t) == nphysical_out ) {
7244 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
7245 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
7246 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
7247 /* master bus is audio only */
7248 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
7249 port = _master_out->input()->ports().port(*t,
7250 i % _master_out->input()->n_ports().get(*t))->name();
7254 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
7263 Session::auto_connect_thread_start ()
7265 if (g_atomic_int_get (&_ac_thread_active)) {
7269 while (!_auto_connect_queue.empty ()) {
7270 _auto_connect_queue.pop ();
7273 g_atomic_int_set (&_ac_thread_active, 1);
7274 if (pthread_create (&_auto_connect_thread, NULL, auto_connect_thread, this)) {
7275 g_atomic_int_set (&_ac_thread_active, 0);
7280 Session::auto_connect_thread_terminate ()
7282 if (!g_atomic_int_get (&_ac_thread_active)) {
7287 Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
7288 while (!_auto_connect_queue.empty ()) {
7289 _auto_connect_queue.pop ();
7293 /* cannot use auto_connect_thread_wakeup() because that is allowed to
7294 * fail to wakeup the thread.
7297 pthread_mutex_lock (&_auto_connect_mutex);
7298 g_atomic_int_set (&_ac_thread_active, 0);
7299 pthread_cond_signal (&_auto_connect_cond);
7300 pthread_mutex_unlock (&_auto_connect_mutex);
7303 pthread_join (_auto_connect_thread, &status);
7307 Session::auto_connect_thread (void *arg)
7309 Session *s = static_cast<Session *>(arg);
7310 s->auto_connect_thread_run ();
7316 Session::auto_connect_thread_run ()
7318 pthread_set_name (X_("autoconnect"));
7319 SessionEvent::create_per_thread_pool (X_("autoconnect"), 1024);
7320 PBD::notify_event_loops_about_thread_creation (pthread_self(), X_("autoconnect"), 1024);
7321 pthread_mutex_lock (&_auto_connect_mutex);
7322 while (g_atomic_int_get (&_ac_thread_active)) {
7324 if (!_auto_connect_queue.empty ()) {
7325 // Why would we need the process lock ??
7326 // A: if ports are added while we're connecting, the backend's iterator may be invalidated:
7327 // graph_order_callback() -> resort_routes() -> direct_feeds_according_to_reality () -> backend::connected_to()
7328 // All ardour-internal backends use a std::vector xxxAudioBackend::find_port()
7329 // We have control over those, but what does jack do?
7330 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
7332 Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
7333 while (!_auto_connect_queue.empty ()) {
7334 const AutoConnectRequest ar (_auto_connect_queue.front());
7335 _auto_connect_queue.pop ();
7342 if (!actively_recording ()) { // might not be needed,
7343 /* this is only used for updating plugin latencies, the
7344 * graph does not change. so it's safe in general.
7346 * update_latency_compensation ()
7347 * calls DiskWriter::set_capture_offset () which
7348 * modifies the capture-offset, which can be a problem.
7350 while (g_atomic_int_and (&_latency_recompute_pending, 0)) {
7351 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
7352 update_latency_compensation ();
7357 // this may call ARDOUR::Port::drop ... jack_port_unregister ()
7358 // jack1 cannot cope with removing ports while processing
7359 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
7360 AudioEngine::instance()->clear_pending_port_deletions ();
7363 pthread_cond_wait (&_auto_connect_cond, &_auto_connect_mutex);
7365 pthread_mutex_unlock (&_auto_connect_mutex);
7369 Session::cancel_all_solo ()
7373 get_stripables (sl);
7375 set_controls (stripable_list_to_control_list (sl, &Stripable::solo_control), 0.0, Controllable::NoGroup);
7376 clear_all_solo_state (routes.reader());