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/send.h"
97 #include "ardour/selection.h"
98 #include "ardour/session.h"
99 #include "ardour/session_directory.h"
100 #include "ardour/session_playlists.h"
101 #include "ardour/slave.h"
102 #include "ardour/smf_source.h"
103 #include "ardour/slave.h"
104 #include "ardour/solo_isolate_control.h"
105 #include "ardour/source_factory.h"
106 #include "ardour/speakers.h"
107 #include "ardour/tempo.h"
108 #include "ardour/ticker.h"
109 #include "ardour/track.h"
110 #include "ardour/types_convert.h"
111 #include "ardour/user_bundle.h"
112 #include "ardour/utils.h"
113 #include "ardour/vca_manager.h"
114 #include "ardour/vca.h"
116 #include "midi++/port.h"
117 #include "midi++/mmc.h"
119 #include "LuaBridge/LuaBridge.h"
121 #include "pbd/i18n.h"
123 #include <glibmm/checksum.h>
132 using namespace ARDOUR;
135 bool Session::_disable_all_loaded_plugins = false;
136 bool Session::_bypass_all_loaded_plugins = false;
137 guint Session::_name_id_counter = 0;
139 PBD::Signal1<int,uint32_t> Session::AudioEngineSetupRequired;
140 PBD::Signal1<void,std::string> Session::Dialog;
141 PBD::Signal0<int> Session::AskAboutPendingState;
142 PBD::Signal2<int, samplecnt_t, samplecnt_t> Session::AskAboutSampleRateMismatch;
143 PBD::Signal2<void, samplecnt_t, samplecnt_t> Session::NotifyAboutSampleRateMismatch;
144 PBD::Signal0<void> Session::SendFeedback;
145 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
147 PBD::Signal1<void, samplepos_t> Session::StartTimeChanged;
148 PBD::Signal1<void, samplepos_t> Session::EndTimeChanged;
149 PBD::Signal2<void,std::string, std::string> Session::Exported;
150 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
151 PBD::Signal0<void> Session::Quit;
152 PBD::Signal0<void> Session::FeedbackDetected;
153 PBD::Signal0<void> Session::SuccessfulGraphSort;
154 PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
156 const samplecnt_t Session::bounce_chunk_size = 8192;
157 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
158 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
160 // seconds should be added after the region exceeds end marker
161 #ifdef USE_TRACKS_CODE_FEATURES
162 const uint32_t Session::session_end_shift = 5;
164 const uint32_t Session::session_end_shift = 0;
167 /** @param snapshot_name Snapshot name, without .ardour suffix */
168 Session::Session (AudioEngine &eng,
169 const string& fullpath,
170 const string& snapshot_name,
171 BusProfile* bus_profile,
173 : playlists (new SessionPlaylists)
175 , process_function (&Session::process_with_events)
176 , _bounce_processing_active (false)
177 , waiting_for_sync_offset (false)
178 , _base_sample_rate (0)
179 , _nominal_sample_rate (0)
180 , _current_sample_rate (0)
181 , transport_sub_state (0)
182 , _record_status (Disabled)
183 , _transport_sample (0)
185 , _session_range_location (0)
186 , _session_range_end_is_free (true)
189 , _transport_speed (0)
190 , _default_transport_speed (1.0)
191 , _last_transport_speed (0)
192 , _signalled_varispeed (0)
193 , _target_transport_speed (0.0)
194 , auto_play_legal (false)
195 , _last_slave_transport_sample (0)
196 , maximum_output_latency (0)
197 , _requested_return_sample (-1)
198 , current_block_size (0)
199 , _worst_output_latency (0)
200 , _worst_input_latency (0)
201 , _worst_track_latency (0)
202 , _worst_track_out_latency (0)
203 , _worst_track_roll_delay (0)
204 , _have_captured (false)
205 , _non_soloed_outs_muted (false)
208 , _solo_isolated_cnt (0)
210 , _was_seamless (Config->get_seamless_loop ())
211 , _under_nsm_control (false)
213 , delta_accumulator_cnt (0)
214 , average_slave_delta (1800) // !!! why 1800 ???
216 , have_first_delta_accumulator (false)
217 , _slave_state (Stopped)
218 , _mtc_active (false)
219 , _ltc_active (false)
220 , post_export_sync (false)
221 , post_export_position (0)
223 , _export_rolling (false)
224 , _realtime_export (false)
225 , _region_export (false)
226 , _export_preroll (0)
227 , _export_latency (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_locate_roll (false)
247 , pending_locate_sample (0)
248 , pending_locate_flush (false)
249 , pending_abort (false)
250 , pending_auto_loop (false)
251 , _mempool ("Session", 3145728)
252 , lua (lua_newstate (&PBD::ReallocPool::lalloc, &_mempool))
254 , _butler (new Butler (*this))
255 , _post_transport_work (0)
256 , cumulative_rf_motion (0)
258 , _locations (new Locations (*this))
259 , _ignore_skips_updates (false)
260 , _rt_thread_active (false)
261 , _rt_emit_pending (false)
262 , _ac_thread_active (0)
263 , _latency_recompute_pending (0)
265 , outbound_mtc_timecode_frame (0)
266 , next_quarter_frame_to_send (-1)
267 , _samples_per_timecode_frame (0)
268 , _frames_per_hour (0)
269 , _timecode_frames_per_hour (0)
270 , last_timecode_valid (false)
271 , last_timecode_when (0)
272 , _send_timecode_update (false)
284 , ltc_timecode_offset (0)
285 , ltc_timecode_negative_offset (false)
286 , midi_control_ui (0)
288 , _all_route_group (new RouteGroup (*this, "all"))
289 , routes (new RouteList)
290 , _adding_routes_in_progress (false)
291 , _reconnecting_routes_in_progress (false)
292 , _route_deletion_in_progress (false)
293 , destructive_index (0)
294 , _track_number_decimals(1)
295 , default_fade_steepness (0)
296 , default_fade_msecs (0)
297 , _total_free_4k_blocks (0)
298 , _total_free_4k_blocks_uncertain (false)
299 , no_questions_about_missing_files (false)
302 , _bundles (new BundleList)
303 , _bundle_xml_node (0)
306 , _click_rec_only (false)
308 , click_emphasis_data (0)
310 , click_emphasis_length (0)
311 , _clicks_cleared (0)
312 , _count_in_samples (0)
313 , _play_range (false)
314 , _range_selection (-1,-1)
315 , _object_selection (-1,-1)
316 , _preroll_record_punch_pos (-1)
317 , _preroll_record_trim_len (0)
318 , _count_in_once (false)
320 , first_file_data_format_reset (true)
321 , first_file_header_format_reset (true)
322 , have_looped (false)
323 , _have_rec_enabled_track (false)
324 , _have_rec_disabled_track (true)
326 , _suspend_timecode_transmission (0)
327 , _speakers (new Speakers)
328 , _ignore_route_processor_changes (0)
333 , _vca_manager (new VCAManager (*this))
334 , _selection (new CoreSelection (*this))
335 , _global_locate_pending (false)
339 created_with = string_compose ("%1 %2", PROGRAM_NAME, revision);
341 pthread_mutex_init (&_rt_emit_mutex, 0);
342 pthread_cond_init (&_rt_emit_cond, 0);
344 pthread_mutex_init (&_auto_connect_mutex, 0);
345 pthread_cond_init (&_auto_connect_cond, 0);
347 init_name_id_counter (1); // reset for new sessions, start at 1
348 VCA::set_next_vca_number (1); // reset for new sessions, start at 1
350 pre_engine_init (fullpath); // sets _is_new
356 Stateful::loading_state_version = CURRENT_SESSION_FILE_VERSION;
358 #ifdef USE_TRACKS_CODE_FEATURES
359 sr = EngineStateController::instance()->get_current_sample_rate();
361 if (ensure_engine (sr, true)) {
363 throw SessionException (_("Cannot connect to audio/midi engine"));
366 // set samplerate for plugins added early
367 // e.g from templates or MB channelstrip
368 set_block_size (_engine.samples_per_cycle());
369 set_sample_rate (_engine.sample_rate());
371 if (create (mix_template, bus_profile)) {
373 throw SessionException (_("Session initialization failed"));
376 /* if a mix template was provided, then ::create() will
377 * have copied it into the session and we need to load it
378 * so that we have the state ready for ::set_state()
379 * after the engine is started.
381 * Note that we do NOT try to get the sample rate from
382 * the template at this time, though doing so would
383 * be easy if we decided this was an appropriate part
387 if (!mix_template.empty()) {
389 if (load_state (_current_snapshot_name)) {
390 throw SessionException (_("Failed to load template/snapshot state"));
392 } catch (PBD::unknown_enumeration& e) {
393 throw SessionException (_("Failed to parse template/snapshot state"));
395 store_recent_templates (mix_template);
398 /* load default session properties - if any */
403 if (load_state (_current_snapshot_name)) {
404 throw SessionException (_("Failed to load state"));
407 /* try to get sample rate from XML state so that we
408 * can influence the SR if we set up the audio
413 XMLProperty const * prop;
414 XMLNode const * root (state_tree->root());
415 if ((prop = root->property (X_("sample-rate"))) != 0) {
416 sr = atoi (prop->value());
420 if (ensure_engine (sr, false)) {
422 throw SessionException (_("Cannot connect to audio/midi engine"));
426 int err = post_engine_init ();
431 throw SessionException (string_compose (_("Cannot initialize session/engine: %1"), _("Failed to create background threads.")));
435 throw SessionException (string_compose (_("Cannot initialize session/engine: %1"), _("Invalid TempoMap in session-file.")));
438 throw SessionException (string_compose (_("Cannot initialize session/engine: %1"), _("Invalid or corrupt session state.")));
441 throw SessionException (string_compose (_("Cannot initialize session/engine: %1"), _("Port registration failed.")));
444 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")));
449 store_recent_sessions (_name, _path);
451 bool was_dirty = dirty();
453 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
455 PresentationInfo::Change.connect_same_thread (*this, boost::bind (&Session::notify_presentation_info_change, this));
457 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
458 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
461 DirtyChanged (); /* EMIT SIGNAL */
464 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
465 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
467 emit_thread_start ();
468 auto_connect_thread_start ();
470 /* hook us up to the engine since we are now completely constructed */
472 BootMessage (_("Connect to engine"));
474 _engine.set_session (this);
475 _engine.reset_timebase ();
477 #ifdef USE_TRACKS_CODE_FEATURES
479 EngineStateController::instance()->set_session(this);
482 if ( ARDOUR::Profile->get_trx () ) {
484 /* Waves Tracks: fill session with tracks basing on the amount of inputs.
485 * each available input must have corresponding track when session starts.
488 uint32_t how_many (0);
490 std::vector<std::string> inputs;
491 EngineStateController::instance()->get_physical_audio_inputs(inputs);
493 how_many = inputs.size();
495 list<boost::shared_ptr<AudioTrack> > tracks;
497 // Track names after driver
498 if (Config->get_tracks_auto_naming() == NameAfterDriver) {
499 string track_name = "";
500 for (std::vector<string>::size_type i = 0; i < inputs.size(); ++i) {
502 track_name = inputs[i];
503 replace_all (track_name, "system:capture", "");
505 list<boost::shared_ptr<AudioTrack> > single_track = new_audio_track (1, 1, Normal, 0, 1, track_name);
506 tracks.insert(tracks.begin(), single_track.front());
508 } else { // Default track names
509 tracks = new_audio_track (1, 1, Normal, 0, how_many, string());
512 if (tracks.size() != how_many) {
514 throw failed_constructor ();
520 ensure_subdirs (); // archived or zipped sessions may lack peaks/ analysis/ etc
522 if (!mix_template.empty ()) {
523 /* ::create() unsets _is_new after creating the session.
524 * But for templated sessions, the sample-rate is initially unset
525 * (not read from template), so we need to save it (again).
533 BootMessage (_("Session loading complete"));
545 Session::next_name_id ()
547 return g_atomic_int_add (&_name_id_counter, 1);
551 Session::name_id_counter ()
553 return g_atomic_int_get (&_name_id_counter);
557 Session::init_name_id_counter (guint n)
559 g_atomic_int_set (&_name_id_counter, n);
563 Session::ensure_engine (uint32_t desired_sample_rate, bool isnew)
565 if (_engine.current_backend() == 0) {
566 /* backend is unknown ... */
567 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
568 if (r.get_value_or (-1) != 0) {
571 } else if (!isnew && _engine.running() && _engine.sample_rate () == desired_sample_rate) {
573 } else if (_engine.setup_required()) {
574 /* backend is known, but setup is needed */
575 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
576 if (r.get_value_or (-1) != 0) {
579 } else if (!_engine.running()) {
580 if (_engine.start()) {
585 /* at this point the engine should be running */
587 if (!_engine.running()) {
591 return immediately_post_engine ();
596 Session::immediately_post_engine ()
598 /* Do various initializations that should take place directly after we
599 * know that the engine is running, but before we either create a
600 * session or set state for an existing one.
603 if (how_many_dsp_threads () > 1) {
604 /* For now, only create the graph if we are using >1 DSP threads, as
605 it is a bit slower than the old code with 1 thread.
607 _process_graph.reset (new Graph (*this));
610 /* every time we reconnect, recompute worst case output latencies */
612 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
614 if (synced_to_engine()) {
615 _engine.transport_stop ();
618 if (config.get_jack_time_master()) {
619 _engine.transport_locate (_transport_sample);
623 BootMessage (_("Set up LTC"));
625 BootMessage (_("Set up Click"));
627 BootMessage (_("Set up standard connections"));
631 catch (failed_constructor& err) {
635 /* TODO, connect in different thread. (PortRegisteredOrUnregistered may be in RT context)
637 _engine.PortRegisteredOrUnregistered.connect_same_thread (*this, boost::bind (&Session::setup_bundles, this));
645 vector<void*> debug_pointers;
647 /* if we got to here, leaving pending capture state around
651 remove_pending_capture_state ();
655 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
658 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
664 /* disconnect from any and all signals that we are connected to */
666 Port::PortSignalDrop (); /* EMIT SIGNAL */
669 /* shutdown control surface protocols while we still have ports
670 * and the engine to move data to any devices.
673 /* remove I/O objects before unsetting the engine session */
676 _ltc_output.reset ();
678 ControlProtocolManager::instance().drop_protocols ();
680 /* stop auto dis/connecting */
681 auto_connect_thread_terminate ();
683 MIDI::Name::MidiPatchManager::instance().remove_search_path(session_directory().midi_patch_path());
685 _engine.remove_session ();
687 #ifdef USE_TRACKS_CODE_FEATURES
688 EngineStateController::instance()->remove_session();
691 /* drop slave, if any. We don't use use_sync_source (0) because
692 * there's no reason to do all the other stuff that may happen
693 * when calling that method.
697 /* deregister all ports - there will be no process or any other
698 * callbacks from the engine any more.
701 Port::PortDrop (); /* EMIT SIGNAL */
703 /* clear history so that no references to objects are held any more */
707 /* clear state tree so that no references to objects are held any more */
713 /* unregister all lua functions, drop held references (if any) */
714 Glib::Threads::Mutex::Lock tm (lua_lock, Glib::Threads::TRY_LOCK);
716 lua.do_command ("Session = nil");
724 lua.collect_garbage ();
727 /* reset dynamic state version back to default */
728 Stateful::loading_state_version = 0;
730 _butler->drop_references ();
734 delete _all_route_group;
736 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
737 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
741 if (click_data != default_click) {
742 delete [] click_data;
745 if (click_emphasis_data != default_click_emphasis) {
746 delete [] click_emphasis_data;
751 /* need to remove auditioner before monitoring section
752 * otherwise it is re-connected */
753 auditioner->drop_references ();
756 /* drop references to routes held by the monitoring section
757 * specifically _monitor_out aux/listen references */
758 remove_monitor_section();
760 /* clear out any pending dead wood from RCU managed objects */
765 DiskReader::free_working_buffers();
767 /* tell everyone who is still standing that we're about to die */
770 /* tell everyone to drop references and delete objects as we go */
772 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
773 RegionFactory::delete_all_regions ();
775 /* Do this early so that VCAs no longer hold references to routes */
777 DEBUG_TRACE (DEBUG::Destruction, "delete vcas\n");
780 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
782 /* reset these three references to special routes before we do the usual route delete thing */
784 _master_out.reset ();
785 _monitor_out.reset ();
788 RCUWriter<RouteList> writer (routes);
789 boost::shared_ptr<RouteList> r = writer.get_copy ();
791 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
792 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
793 (*i)->drop_references ();
797 /* writer goes out of scope and updates master */
802 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
803 Glib::Threads::Mutex::Lock lm (source_lock);
804 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
805 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
806 i->second->drop_references ();
812 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
815 emit_thread_terminate ();
817 pthread_cond_destroy (&_rt_emit_cond);
818 pthread_mutex_destroy (&_rt_emit_mutex);
820 pthread_cond_destroy (&_auto_connect_cond);
821 pthread_mutex_destroy (&_auto_connect_mutex);
823 delete _scene_changer; _scene_changer = 0;
824 delete midi_control_ui; midi_control_ui = 0;
826 delete _mmc; _mmc = 0;
827 delete _midi_ports; _midi_ports = 0;
828 delete _locations; _locations = 0;
833 /* clear event queue, the session is gone, nobody is interested in
834 * those anymore, but they do leak memory if not removed
836 while (!immediate_events.empty ()) {
837 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
838 SessionEvent *ev = immediate_events.front ();
839 DEBUG_TRACE (DEBUG::SessionEvents, string_compose ("Drop event: %1\n", enum_2_string (ev->type)));
840 immediate_events.pop_front ();
844 case SessionEvent::AutoLoop:
845 case SessionEvent::AutoLoopDeclick:
846 case SessionEvent::Skip:
847 case SessionEvent::PunchIn:
848 case SessionEvent::PunchOut:
849 case SessionEvent::RecordStart:
850 case SessionEvent::StopOnce:
851 case SessionEvent::RangeStop:
852 case SessionEvent::RangeLocate:
856 case SessionEvent::RealTimeOperation:
863 del = del && !_remove_event (ev);
871 /* unregister all dropped ports, process pending port deletion. */
872 // this may call ARDOUR::Port::drop ... jack_port_unregister ()
873 // jack1 cannot cope with removing ports while processing
874 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
875 AudioEngine::instance()->clear_pending_port_deletions ();
878 DEBUG_TRACE (DEBUG::Destruction, "delete selection\n");
882 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
884 BOOST_SHOW_POINTERS ();
888 Session::setup_ltc ()
892 _ltc_input.reset (new IO (*this, X_("LTC In"), IO::Input));
893 _ltc_output.reset (new IO (*this, X_("LTC Out"), IO::Output));
895 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC In"))) != 0) {
896 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
899 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
900 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
901 // TODO use auto-connect thread somehow (needs a route currently)
902 // see note in Session::auto_connect_thread_run() why process lock is needed.
903 reconnect_ltc_input ();
907 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC Out"))) != 0) {
908 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
911 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
912 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
913 // TODO use auto-connect thread
914 reconnect_ltc_output ();
918 /* fix up names of LTC ports because we don't want the normal
919 * IO style of NAME/TYPE-{in,out}N
922 _ltc_input->nth (0)->set_name (X_("LTC-in"));
923 _ltc_output->nth (0)->set_name (X_("LTC-out"));
927 Session::setup_click ()
931 boost::shared_ptr<AutomationList> gl (new AutomationList (Evoral::Parameter (GainAutomation)));
932 boost::shared_ptr<GainControl> gain_control = boost::shared_ptr<GainControl> (new GainControl (*this, Evoral::Parameter(GainAutomation), gl));
934 _click_io.reset (new ClickIO (*this, X_("Click")));
935 _click_gain.reset (new Amp (*this, _("Fader"), gain_control, true));
936 _click_gain->activate ();
938 setup_click_state (state_tree->root());
940 setup_click_state (0);
945 Session::setup_click_state (const XMLNode* node)
947 const XMLNode* child = 0;
949 if (node && (child = find_named_node (*node, "Click")) != 0) {
951 /* existing state for Click */
954 if (Stateful::loading_state_version < 3000) {
955 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
957 const XMLNodeList& children (child->children());
958 XMLNodeList::const_iterator i = children.begin();
959 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
961 if (i != children.end()) {
962 c = _click_gain->set_state (**i, Stateful::loading_state_version);
968 _clicking = Config->get_clicking ();
972 error << _("could not setup Click I/O") << endmsg;
979 /* default state for Click: dual-mono to first 2 physical outputs */
982 _engine.get_physical_outputs (DataType::AUDIO, outs);
984 for (uint32_t physport = 0; physport < 2; ++physport) {
985 if (outs.size() > physport) {
986 if (_click_io->add_port (outs[physport], this)) {
987 // relax, even though its an error
992 if (_click_io->n_ports () > ChanCount::ZERO) {
993 _clicking = Config->get_clicking ();
999 Session::get_physical_ports (vector<string>& inputs, vector<string>& outputs, DataType type,
1000 MidiPortFlags include, MidiPortFlags exclude)
1002 _engine.get_physical_inputs (type, inputs, include, exclude);
1003 _engine.get_physical_outputs (type, outputs, include, exclude);
1007 Session::setup_bundles ()
1011 RCUWriter<BundleList> writer (_bundles);
1012 boost::shared_ptr<BundleList> b = writer.get_copy ();
1013 for (BundleList::iterator i = b->begin(); i != b->end();) {
1014 if (boost::dynamic_pointer_cast<UserBundle>(*i)) {
1022 vector<string> inputs[DataType::num_types];
1023 vector<string> outputs[DataType::num_types];
1025 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1026 get_physical_ports (inputs[i], outputs[i], DataType (DataType::Symbol (i)),
1027 MidiPortFlags (0), /* no specific inclusions */
1028 MidiPortFlags (MidiPortControl|MidiPortVirtual) /* exclude control & virtual ports */
1032 /* Create a set of Bundle objects that map
1033 to the physical I/O currently available. We create both
1034 mono and stereo bundles, so that the common cases of mono
1035 and stereo tracks get bundles to put in their mixer strip
1036 in / out menus. There may be a nicer way of achieving that;
1037 it doesn't really scale that well to higher channel counts
1040 /* mono output bundles */
1042 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
1044 std::string pn = _engine.get_pretty_name_by_name (outputs[DataType::AUDIO][np]);
1046 snprintf (buf, sizeof (buf), _("out %s"), pn.c_str());
1048 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
1051 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
1052 c->add_channel (_("mono"), DataType::AUDIO);
1053 c->set_port (0, outputs[DataType::AUDIO][np]);
1055 add_bundle (c, false);
1058 /* stereo output bundles */
1060 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
1061 if (np + 1 < outputs[DataType::AUDIO].size()) {
1063 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
1064 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
1065 c->add_channel (_("L"), DataType::AUDIO);
1066 c->set_port (0, outputs[DataType::AUDIO][np]);
1067 c->add_channel (_("R"), DataType::AUDIO);
1068 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
1070 add_bundle (c, false);
1074 /* mono input bundles */
1076 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
1078 std::string pn = _engine.get_pretty_name_by_name (inputs[DataType::AUDIO][np]);
1080 snprintf (buf, sizeof (buf), _("in %s"), pn.c_str());
1082 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
1085 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
1086 c->add_channel (_("mono"), DataType::AUDIO);
1087 c->set_port (0, inputs[DataType::AUDIO][np]);
1089 add_bundle (c, false);
1092 /* stereo input bundles */
1094 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
1095 if (np + 1 < inputs[DataType::AUDIO].size()) {
1097 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
1099 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
1100 c->add_channel (_("L"), DataType::AUDIO);
1101 c->set_port (0, inputs[DataType::AUDIO][np]);
1102 c->add_channel (_("R"), DataType::AUDIO);
1103 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
1105 add_bundle (c, false);
1109 /* MIDI input bundles */
1111 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
1112 string n = inputs[DataType::MIDI][np];
1114 std::string pn = _engine.get_pretty_name_by_name (n);
1118 boost::erase_first (n, X_("alsa_pcm:"));
1120 boost::shared_ptr<Bundle> c (new Bundle (n, false));
1121 c->add_channel ("", DataType::MIDI);
1122 c->set_port (0, inputs[DataType::MIDI][np]);
1123 add_bundle (c, false);
1126 /* MIDI output bundles */
1128 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
1129 string n = outputs[DataType::MIDI][np];
1130 std::string pn = _engine.get_pretty_name_by_name (n);
1134 boost::erase_first (n, X_("alsa_pcm:"));
1136 boost::shared_ptr<Bundle> c (new Bundle (n, true));
1137 c->add_channel ("", DataType::MIDI);
1138 c->set_port (0, outputs[DataType::MIDI][np]);
1139 add_bundle (c, false);
1142 // we trust the backend to only calls us if there's a change
1143 BundleAddedOrRemoved (); /* EMIT SIGNAL */
1147 Session::auto_connect_master_bus ()
1149 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
1153 // Waves Tracks: Do not connect master bas for Tracks if AutoConnectMaster option is not set
1154 // In this case it means "Multi Out" output mode
1155 if (ARDOUR::Profile->get_trx() && !(Config->get_output_auto_connect() & AutoConnectMaster) ) {
1159 /* if requested auto-connect the outputs to the first N physical ports.
1162 uint32_t limit = _master_out->n_outputs().n_total();
1163 vector<string> outputs[DataType::num_types];
1165 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1166 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1169 for (uint32_t n = 0; n < limit; ++n) {
1170 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
1172 if (outputs[p->type()].size() > n) {
1173 connect_to = outputs[p->type()][n];
1176 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
1177 if (_master_out->output()->connect (p, connect_to, this)) {
1178 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
1187 Session::remove_monitor_section ()
1189 if (!_monitor_out || Profile->get_trx()) {
1193 /* force reversion to Solo-In-Place */
1194 Config->set_solo_control_is_listen_control (false);
1196 /* if we are auditioning, cancel it ... this is a workaround
1197 to a problem (auditioning does not execute the process graph,
1198 which is needed to remove routes when using >1 core for processing)
1203 /* Hold process lock while doing this so that we don't hear bits and
1204 * pieces of audio as we work on each route.
1207 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1209 /* Connect tracks to monitor section. Note that in an
1210 existing session, the internal sends will already exist, but we want the
1211 routes to notice that they connect to the control out specifically.
1215 boost::shared_ptr<RouteList> r = routes.reader ();
1216 ProcessorChangeBlocker pcb (this, false);
1218 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
1220 if ((*x)->is_monitor()) {
1222 } else if ((*x)->is_master()) {
1225 (*x)->remove_aux_or_listen (_monitor_out);
1230 remove_route (_monitor_out);
1231 if (_state_of_the_state & Deletion) {
1235 auto_connect_master_bus ();
1238 auditioner->connect ();
1241 Config->ParameterChanged ("use-monitor-bus");
1245 Session::add_monitor_section ()
1249 if (_monitor_out || !_master_out || Profile->get_trx()) {
1253 boost::shared_ptr<Route> r (new Route (*this, _("Monitor"), PresentationInfo::MonitorOut, DataType::AUDIO));
1259 BOOST_MARK_ROUTE(r);
1262 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1263 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1264 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1266 error << _("Cannot create monitor section. 'Monitor' Port name is not unique.") << endmsg;
1271 add_routes (rl, false, false, false, 0);
1273 assert (_monitor_out);
1275 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
1276 are undefined, at best.
1279 uint32_t limit = _monitor_out->n_inputs().n_audio();
1283 /* connect the inputs to the master bus outputs. this
1284 * represents a separate data feed from the internal sends from
1285 * each route. as of jan 2011, it allows the monitor section to
1286 * conditionally ignore either the internal sends or the normal
1287 * input feed, but we should really find a better way to do
1291 _master_out->output()->disconnect (this);
1293 for (uint32_t n = 0; n < limit; ++n) {
1294 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1295 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1298 string connect_to = o->name();
1299 if (_monitor_out->input()->connect (p, connect_to, this)) {
1300 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1308 /* if monitor section is not connected, connect it to physical outs
1311 if ((Config->get_auto_connect_standard_busses () || Profile->get_mixbus ()) && !_monitor_out->output()->connected ()) {
1313 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1315 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1318 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1320 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1321 Config->get_monitor_bus_preferred_bundle())
1327 /* Monitor bus is audio only */
1329 vector<string> outputs[DataType::num_types];
1331 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1332 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1335 uint32_t mod = outputs[DataType::AUDIO].size();
1336 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1340 for (uint32_t n = 0; n < limit; ++n) {
1342 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1344 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1345 connect_to = outputs[DataType::AUDIO][n % mod];
1348 if (!connect_to.empty()) {
1349 if (_monitor_out->output()->connect (p, connect_to, this)) {
1350 error << string_compose (
1351 _("cannot connect control output %1 to %2"),
1362 /* Hold process lock while doing this so that we don't hear bits and
1363 * pieces of audio as we work on each route.
1366 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1368 /* Connect tracks to monitor section. Note that in an
1369 existing session, the internal sends will already exist, but we want the
1370 routes to notice that they connect to the control out specifically.
1374 boost::shared_ptr<RouteList> rls = routes.reader ();
1376 ProcessorChangeBlocker pcb (this, false /* XXX */);
1378 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1380 if ((*x)->is_monitor()) {
1382 } else if ((*x)->is_master()) {
1385 (*x)->enable_monitor_send ();
1390 auditioner->connect ();
1392 Config->ParameterChanged ("use-monitor-bus");
1396 Session::reset_monitor_section ()
1398 /* Process lock should be held by the caller.*/
1400 if (!_monitor_out || Profile->get_trx()) {
1404 uint32_t limit = _master_out->n_outputs().n_audio();
1406 /* connect the inputs to the master bus outputs. this
1407 * represents a separate data feed from the internal sends from
1408 * each route. as of jan 2011, it allows the monitor section to
1409 * conditionally ignore either the internal sends or the normal
1410 * input feed, but we should really find a better way to do
1414 _master_out->output()->disconnect (this);
1415 _monitor_out->output()->disconnect (this);
1417 // monitor section follow master bus - except midi
1418 ChanCount mon_chn (_master_out->output()->n_ports());
1419 mon_chn.set_midi (0);
1421 _monitor_out->input()->ensure_io (mon_chn, false, this);
1422 _monitor_out->output()->ensure_io (mon_chn, false, this);
1424 for (uint32_t n = 0; n < limit; ++n) {
1425 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1426 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1429 string connect_to = o->name();
1430 if (_monitor_out->input()->connect (p, connect_to, this)) {
1431 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1438 /* connect monitor section to physical outs
1441 if (Config->get_auto_connect_standard_busses()) {
1443 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1445 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1448 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1450 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1451 Config->get_monitor_bus_preferred_bundle())
1457 /* Monitor bus is audio only */
1459 vector<string> outputs[DataType::num_types];
1461 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1462 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1465 uint32_t mod = outputs[DataType::AUDIO].size();
1466 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1470 for (uint32_t n = 0; n < limit; ++n) {
1472 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1474 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1475 connect_to = outputs[DataType::AUDIO][n % mod];
1478 if (!connect_to.empty()) {
1479 if (_monitor_out->output()->connect (p, connect_to, this)) {
1480 error << string_compose (
1481 _("cannot connect control output %1 to %2"),
1492 /* Connect tracks to monitor section. Note that in an
1493 existing session, the internal sends will already exist, but we want the
1494 routes to notice that they connect to the control out specifically.
1498 boost::shared_ptr<RouteList> rls = routes.reader ();
1500 ProcessorChangeBlocker pcb (this, false);
1502 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1504 if ((*x)->is_monitor()) {
1506 } else if ((*x)->is_master()) {
1509 (*x)->enable_monitor_send ();
1515 Session::add_master_bus (ChanCount const& count)
1517 if (master_out ()) {
1523 boost::shared_ptr<Route> r (new Route (*this, _("Master"), PresentationInfo::MasterOut, DataType::AUDIO));
1528 BOOST_MARK_ROUTE(r);
1531 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1532 r->input()->ensure_io (count, false, this);
1533 r->output()->ensure_io (count, false, this);
1537 add_routes (rl, false, false, false, PresentationInfo::max_order);
1542 Session::hookup_io ()
1544 /* stop graph reordering notifications from
1545 causing resorts, etc.
1548 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
1552 /* we delay creating the auditioner till now because
1553 it makes its own connections to ports.
1557 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
1559 throw failed_constructor ();
1564 catch (failed_constructor& err) {
1565 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
1569 /* load bundles, which we may have postponed earlier on */
1570 if (_bundle_xml_node) {
1571 load_bundles (*_bundle_xml_node);
1572 delete _bundle_xml_node;
1575 /* Tell all IO objects to connect themselves together */
1577 IO::enable_connecting ();
1579 /* Now tell all "floating" ports to connect to whatever
1580 they should be connected to.
1583 AudioEngine::instance()->reconnect_ports ();
1585 /* Anyone who cares about input state, wake up and do something */
1587 IOConnectionsComplete (); /* EMIT SIGNAL */
1589 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
1591 /* now handle the whole enchilada as if it was one
1592 graph reorder event.
1597 /* update the full solo state, which can't be
1598 correctly determined on a per-route basis, but
1599 needs the global overview that only the session
1603 update_route_solo_state ();
1607 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
1609 boost::shared_ptr<Track> track = wp.lock ();
1614 boost::shared_ptr<Playlist> playlist;
1616 if ((playlist = track->playlist()) != 0) {
1617 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
1618 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
1619 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
1624 Session::record_enabling_legal () const
1626 /* this used to be in here, but survey says.... we don't need to restrict it */
1627 // if (record_status() == Recording) {
1631 if (Config->get_all_safe()) {
1638 Session::set_track_monitor_input_status (bool yn)
1640 boost::shared_ptr<RouteList> rl = routes.reader ();
1641 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1642 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1643 if (tr && tr->rec_enable_control()->get_value()) {
1644 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1645 tr->request_input_monitoring (yn);
1651 Session::auto_punch_start_changed (Location* location)
1653 replace_event (SessionEvent::PunchIn, location->start());
1655 if (get_record_enabled() && config.get_punch_in()) {
1656 /* capture start has been changed, so save new pending state */
1657 save_state ("", true);
1662 Session::auto_punch_end_changed (Location* location)
1664 samplepos_t when_to_stop = location->end();
1665 // when_to_stop += _worst_output_latency + _worst_input_latency;
1666 replace_event (SessionEvent::PunchOut, when_to_stop);
1670 Session::auto_punch_changed (Location* location)
1672 samplepos_t when_to_stop = location->end();
1674 replace_event (SessionEvent::PunchIn, location->start());
1675 //when_to_stop += _worst_output_latency + _worst_input_latency;
1676 replace_event (SessionEvent::PunchOut, when_to_stop);
1679 /** @param loc A loop location.
1680 * @param pos Filled in with the start time of the required fade-out (in session samples).
1681 * @param length Filled in with the length of the required fade-out.
1684 Session::auto_loop_declick_range (Location* loc, samplepos_t & pos, samplepos_t & length)
1686 pos = max (loc->start(), loc->end() - 64);
1687 length = loc->end() - pos;
1691 Session::auto_loop_changed (Location* location)
1693 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1696 auto_loop_declick_range (location, dcp, dcl);
1698 if (transport_rolling() && play_loop) {
1700 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1702 // if (_transport_sample > location->end()) {
1704 if (_transport_sample < location->start() || _transport_sample > location->end()) {
1705 // relocate to beginning of loop
1706 clear_events (SessionEvent::LocateRoll);
1708 request_locate (location->start(), true);
1711 else if (Config->get_seamless_loop() && !loop_changing) {
1713 // schedule a locate-roll to refill the disk readers at the
1714 // previous loop end
1715 loop_changing = true;
1717 if (location->end() > last_loopend) {
1718 clear_events (SessionEvent::LocateRoll);
1719 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1725 clear_events (SessionEvent::AutoLoopDeclick);
1726 clear_events (SessionEvent::AutoLoop);
1729 /* possibly move playhead if not rolling; if we are rolling we'll move
1730 to the loop start on stop if that is appropriate.
1735 if (!transport_rolling() && select_playhead_priority_target (pos)) {
1736 if (pos == location->start()) {
1737 request_locate (pos);
1742 last_loopend = location->end();
1747 Session::set_auto_punch_location (Location* location)
1751 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1752 punch_connections.drop_connections();
1753 existing->set_auto_punch (false, this);
1754 remove_event (existing->start(), SessionEvent::PunchIn);
1755 clear_events (SessionEvent::PunchOut);
1756 auto_punch_location_changed (0);
1761 if (location == 0) {
1765 if (location->end() <= location->start()) {
1766 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1770 punch_connections.drop_connections ();
1772 location->StartChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, location));
1773 location->EndChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, location));
1774 location->Changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, location));
1776 location->set_auto_punch (true, this);
1778 auto_punch_changed (location);
1780 auto_punch_location_changed (location);
1784 Session::set_session_extents (samplepos_t start, samplepos_t end)
1787 if ((existing = _locations->session_range_location()) == 0) {
1788 //if there is no existing session, we need to make a new session location (should never happen)
1789 existing = new Location (*this, 0, 0, _("session"), Location::IsSessionRange, 0);
1793 error << _("Session: you can't use that location for session start/end)") << endmsg;
1797 existing->set( start, end );
1803 Session::set_auto_loop_location (Location* location)
1807 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1808 loop_connections.drop_connections ();
1809 existing->set_auto_loop (false, this);
1810 remove_event (existing->end(), SessionEvent::AutoLoop);
1813 auto_loop_declick_range (existing, dcp, dcl);
1814 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1815 auto_loop_location_changed (0);
1820 if (location == 0) {
1824 if (location->end() <= location->start()) {
1825 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1829 last_loopend = location->end();
1831 loop_connections.drop_connections ();
1833 location->StartChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1834 location->EndChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1835 location->Changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1836 location->FlagsChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1838 location->set_auto_loop (true, this);
1840 if (Config->get_loop_is_mode() && play_loop && Config->get_seamless_loop()) {
1841 // set all tracks to use internal looping
1842 boost::shared_ptr<RouteList> rl = routes.reader ();
1843 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1844 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1845 if (tr && !tr->is_private_route()) {
1846 tr->set_loop (location);
1851 /* take care of our stuff first */
1853 auto_loop_changed (location);
1855 /* now tell everyone else */
1857 auto_loop_location_changed (location);
1861 Session::update_marks (Location*)
1867 Session::update_skips (Location* loc, bool consolidate)
1869 if (_ignore_skips_updates) {
1873 Locations::LocationList skips;
1876 PBD::Unwinder<bool> uw (_ignore_skips_updates, true);
1877 consolidate_skips (loc);
1880 sync_locations_to_skips ();
1886 Session::consolidate_skips (Location* loc)
1888 Locations::LocationList all_locations = _locations->list ();
1890 for (Locations::LocationList::iterator l = all_locations.begin(); l != all_locations.end(); ) {
1892 if (!(*l)->is_skip ()) {
1897 /* don't test against self */
1904 switch (Evoral::coverage ((*l)->start(), (*l)->end(), loc->start(), loc->end())) {
1905 case Evoral::OverlapInternal:
1906 case Evoral::OverlapExternal:
1907 case Evoral::OverlapStart:
1908 case Evoral::OverlapEnd:
1909 /* adjust new location to cover existing one */
1910 loc->set_start (min (loc->start(), (*l)->start()));
1911 loc->set_end (max (loc->end(), (*l)->end()));
1912 /* we don't need this one any more */
1913 _locations->remove (*l);
1914 /* the location has been deleted, so remove reference to it in our local list */
1915 l = all_locations.erase (l);
1918 case Evoral::OverlapNone:
1926 Session::sync_locations_to_skips ()
1928 /* This happens asynchronously (in the audioengine thread). After the clear is done, we will call
1929 * Session::_sync_locations_to_skips() from the audioengine thread.
1931 clear_events (SessionEvent::Skip, boost::bind (&Session::_sync_locations_to_skips, this));
1935 Session::_sync_locations_to_skips ()
1937 /* called as a callback after existing Skip events have been cleared from a realtime audioengine thread */
1939 Locations::LocationList const & locs (_locations->list());
1941 for (Locations::LocationList::const_iterator i = locs.begin(); i != locs.end(); ++i) {
1943 Location* location = *i;
1945 if (location->is_skip() && location->is_skipping()) {
1946 SessionEvent* ev = new SessionEvent (SessionEvent::Skip, SessionEvent::Add, location->start(), location->end(), 1.0);
1954 Session::location_added (Location *location)
1956 if (location->is_auto_punch()) {
1957 set_auto_punch_location (location);
1960 if (location->is_auto_loop()) {
1961 set_auto_loop_location (location);
1964 if (location->is_session_range()) {
1965 /* no need for any signal handling or event setting with the session range,
1966 because we keep a direct reference to it and use its start/end directly.
1968 _session_range_location = location;
1971 if (location->is_mark()) {
1972 /* listen for per-location signals that require us to do any * global updates for marks */
1974 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1975 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1976 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1977 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1978 location->PositionLockStyleChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1981 if (location->is_range_marker()) {
1982 /* listen for per-location signals that require us to do any * global updates for marks */
1984 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1985 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1986 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1987 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1988 location->PositionLockStyleChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1991 if (location->is_skip()) {
1992 /* listen for per-location signals that require us to update skip-locate events */
1994 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1995 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1996 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1997 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, false));
1998 location->PositionLockStyleChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
2000 update_skips (location, true);
2007 Session::location_removed (Location *location)
2009 if (location->is_auto_loop()) {
2010 set_auto_loop_location (0);
2011 set_track_loop (false);
2014 if (location->is_auto_punch()) {
2015 set_auto_punch_location (0);
2018 if (location->is_session_range()) {
2019 /* this is never supposed to happen */
2020 error << _("programming error: session range removed!") << endl;
2023 if (location->is_skip()) {
2025 update_skips (location, false);
2032 Session::locations_changed ()
2034 _locations->apply (*this, &Session::_locations_changed);
2038 Session::_locations_changed (const Locations::LocationList& locations)
2040 /* There was some mass-change in the Locations object.
2042 We might be re-adding a location here but it doesn't actually matter
2043 for all the locations that the Session takes an interest in.
2047 PBD::Unwinder<bool> protect_ignore_skip_updates (_ignore_skips_updates, true);
2048 for (Locations::LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
2049 location_added (*i);
2053 update_skips (NULL, false);
2057 Session::enable_record ()
2059 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
2060 /* no recording at anything except normal speed */
2065 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
2067 if (rs == Recording) {
2071 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
2073 _last_record_location = _transport_sample;
2074 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
2076 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
2077 set_track_monitor_input_status (true);
2080 RecordStateChanged ();
2087 Session::set_all_tracks_record_enabled (bool enable )
2089 boost::shared_ptr<RouteList> rl = routes.reader();
2090 set_controls (route_list_to_control_list (rl, &Stripable::rec_enable_control), enable, Controllable::NoGroup);
2094 Session::disable_record (bool rt_context, bool force)
2098 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
2100 if (!Config->get_latched_record_enable () || force) {
2101 g_atomic_int_set (&_record_status, Disabled);
2102 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
2104 if (rs == Recording) {
2105 g_atomic_int_set (&_record_status, Enabled);
2109 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
2110 set_track_monitor_input_status (false);
2113 RecordStateChanged (); /* emit signal */
2116 remove_pending_capture_state ();
2118 unset_preroll_record_punch ();
2123 Session::step_back_from_record ()
2125 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
2127 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
2128 set_track_monitor_input_status (false);
2131 RecordStateChanged (); /* emit signal */
2136 Session::maybe_enable_record (bool rt_context)
2138 if (_step_editors > 0) {
2142 g_atomic_int_set (&_record_status, Enabled);
2144 /* This function is currently called from somewhere other than an RT thread.
2145 * (except maybe lua scripts, which can use rt_context = true)
2146 * This save_state() call therefore doesn't impact anything. Doing it here
2147 * means that we save pending state of which sources the next record will use,
2148 * which gives us some chance of recovering from a crash during the record.
2152 save_state ("", true);
2155 if (_transport_speed) {
2156 if (!config.get_punch_in() && !preroll_record_punch_enabled ()) {
2160 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
2161 RecordStateChanged (); /* EMIT SIGNAL */
2168 Session::audible_sample (bool* latent_locate) const
2172 sampleoffset_t offset = worst_playback_latency (); // - _engine.samples_since_cycle_start ();
2173 offset *= transport_speed ();
2174 if (latent_locate) {
2175 *latent_locate = false;
2178 if (synced_to_engine()) {
2179 /* Note: this is basically just sync-to-JACK */
2180 ret = _engine.transport_sample();
2182 ret = _transport_sample;
2185 if (transport_rolling()) {
2188 /* Check to see if we have passed the first guaranteed
2189 * audible sample past our last start position. if not,
2190 * return that last start point because in terms
2191 * of audible samples, we have not moved yet.
2193 * `Start position' in this context means the time we last
2194 * either started, located, or changed transport direction.
2197 if (_transport_speed > 0.0f) {
2199 if (!play_loop || !have_looped) {
2200 if (ret < _last_roll_or_reversal_location) {
2201 if (latent_locate) {
2202 *latent_locate = true;
2204 return _last_roll_or_reversal_location;
2207 /* the play-position wrapped at the loop-point
2208 * ardour is already playing the beginning of the loop,
2209 * but due to playback latency, the "audible frame"
2210 * is still at the end of the loop.
2212 Location *location = _locations->auto_loop_location();
2213 sampleoffset_t lo = location->start() - ret;
2215 ret = location->end () - lo;
2216 if (latent_locate) {
2217 *latent_locate = true;
2222 } else if (_transport_speed < 0.0f) {
2224 /* XXX wot? no backward looping? */
2226 if (ret > _last_roll_or_reversal_location) {
2227 return _last_roll_or_reversal_location;
2232 return std::max ((samplepos_t)0, ret);
2237 Session::preroll_samples (samplepos_t pos) const
2239 const float pr = Config->get_preroll_seconds();
2240 if (pos >= 0 && pr < 0) {
2241 const Tempo& tempo = _tempo_map->tempo_at_sample (pos);
2242 const Meter& meter = _tempo_map->meter_at_sample (pos);
2243 return meter.samples_per_bar (tempo, sample_rate()) * -pr;
2248 return pr * sample_rate();
2252 Session::set_sample_rate (samplecnt_t frames_per_second)
2254 /** \fn void Session::set_sample_size(samplecnt_t)
2255 the AudioEngine object that calls this guarantees
2256 that it will not be called while we are also in
2257 ::process(). Its fine to do things that block
2261 if (_base_sample_rate == 0) {
2262 _base_sample_rate = frames_per_second;
2264 else if (_base_sample_rate != frames_per_second && frames_per_second != _nominal_sample_rate) {
2265 NotifyAboutSampleRateMismatch (_base_sample_rate, frames_per_second);
2267 _nominal_sample_rate = frames_per_second;
2272 reset_write_sources (false);
2274 // XXX we need some equivalent to this, somehow
2275 // SndFileSource::setup_standard_crossfades (frames_per_second);
2279 /* XXX need to reset/reinstantiate all LADSPA plugins */
2283 Session::set_block_size (pframes_t nframes)
2285 /* the AudioEngine guarantees
2286 that it will not be called while we are also in
2287 ::process(). It is therefore fine to do things that block
2292 current_block_size = nframes;
2296 boost::shared_ptr<RouteList> r = routes.reader ();
2298 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2299 (*i)->set_block_size (nframes);
2302 boost::shared_ptr<RouteList> rl = routes.reader ();
2303 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2304 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2306 tr->set_block_size (nframes);
2310 set_worst_io_latencies ();
2316 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
2318 boost::shared_ptr<Route> r2;
2320 if (r1->feeds (rbase) && rbase->feeds (r1)) {
2321 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
2325 /* make a copy of the existing list of routes that feed r1 */
2327 Route::FedBy existing (r1->fed_by());
2329 /* for each route that feeds r1, recurse, marking it as feeding
2333 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
2334 if (!(r2 = i->r.lock ())) {
2335 /* (*i) went away, ignore it */
2339 /* r2 is a route that feeds r1 which somehow feeds base. mark
2340 base as being fed by r2
2343 rbase->add_fed_by (r2, i->sends_only);
2347 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
2351 if (r1->feeds (r2) && r2->feeds (r1)) {
2355 /* now recurse, so that we can mark base as being fed by
2356 all routes that feed r2
2359 trace_terminal (r2, rbase);
2366 Session::resort_routes ()
2368 /* don't do anything here with signals emitted
2369 by Routes during initial setup or while we
2370 are being destroyed.
2373 if (_state_of_the_state & (InitialConnecting | Deletion)) {
2377 if (_route_deletion_in_progress) {
2382 RCUWriter<RouteList> writer (routes);
2383 boost::shared_ptr<RouteList> r = writer.get_copy ();
2384 resort_routes_using (r);
2385 /* writer goes out of scope and forces update */
2389 if (DEBUG_ENABLED(DEBUG::Graph)) {
2390 boost::shared_ptr<RouteList> rl = routes.reader ();
2391 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2392 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
2394 const Route::FedBy& fb ((*i)->fed_by());
2396 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
2397 boost::shared_ptr<Route> sf = f->r.lock();
2399 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
2408 /** This is called whenever we need to rebuild the graph of how we will process
2410 * @param r List of routes, in any order.
2414 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
2416 /* We are going to build a directed graph of our routes;
2417 this is where the edges of that graph are put.
2422 /* Go through all routes doing two things:
2424 * 1. Collect the edges of the route graph. Each of these edges
2425 * is a pair of routes, one of which directly feeds the other
2426 * either by a JACK connection or by an internal send.
2428 * 2. Begin the process of making routes aware of which other
2429 * routes directly or indirectly feed them. This information
2430 * is used by the solo code.
2433 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2435 /* Clear out the route's list of direct or indirect feeds */
2436 (*i)->clear_fed_by ();
2438 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
2440 bool via_sends_only;
2442 /* See if this *j feeds *i according to the current state of the JACK
2443 connections and internal sends.
2445 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
2446 /* add the edge to the graph (part #1) */
2447 edges.add (*j, *i, via_sends_only);
2448 /* tell the route (for part #2) */
2449 (*i)->add_fed_by (*j, via_sends_only);
2454 /* Attempt a topological sort of the route graph */
2455 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
2457 if (sorted_routes) {
2458 /* We got a satisfactory topological sort, so there is no feedback;
2461 Note: the process graph rechain does not require a
2462 topologically-sorted list, but hey ho.
2464 if (_process_graph) {
2465 _process_graph->rechain (sorted_routes, edges);
2468 _current_route_graph = edges;
2470 /* Complete the building of the routes' lists of what directly
2471 or indirectly feeds them.
2473 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2474 trace_terminal (*i, *i);
2477 *r = *sorted_routes;
2480 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
2481 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2482 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 presentation order %2\n", (*i)->name(), (*i)->presentation_info().order()));
2486 SuccessfulGraphSort (); /* EMIT SIGNAL */
2489 /* The topological sort failed, so we have a problem. Tell everyone
2490 and stick to the old graph; this will continue to be processed, so
2491 until the feedback is fixed, what is played back will not quite
2492 reflect what is actually connected. Note also that we do not
2493 do trace_terminal here, as it would fail due to an endless recursion,
2494 so the solo code will think that everything is still connected
2498 FeedbackDetected (); /* EMIT SIGNAL */
2503 /** Find a route name starting with \a base, maybe followed by the
2504 * lowest \a id. \a id will always be added if \a definitely_add_number
2505 * is true on entry; otherwise it will only be added if required
2506 * to make the name unique.
2508 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
2509 * The available route name with the lowest ID will be used, and \a id
2510 * will be set to the ID.
2512 * \return false if a route name could not be found, and \a track_name
2513 * and \a id do not reflect a free route name.
2516 Session::find_route_name (string const & base, uint32_t& id, string& name, bool definitely_add_number)
2518 /* the base may conflict with ports that do not belong to existing
2519 routes, but hidden objects like the click track. So check port names
2520 before anything else.
2523 for (map<string,bool>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
2524 if (base == reserved->first) {
2525 /* Check if this reserved name already exists, and if
2526 so, disallow it without a numeric suffix.
2528 if (!reserved->second || route_by_name (reserved->first)) {
2529 definitely_add_number = true;
2538 /* if we have "base 1" already, it doesn't make sense to add "base"
2539 * if "base 1" has been deleted, adding "base" is no worse than "base 1"
2541 if (!definitely_add_number && route_by_name (base) == 0 && (route_by_name (string_compose("%1 1", base)) == 0)) {
2542 /* just use the base */
2548 name = string_compose ("%1 %2", base, id);
2550 if (route_by_name (name) == 0) {
2556 } while (id < (UINT_MAX-1));
2561 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
2563 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
2565 in = ChanCount::ZERO;
2566 out = ChanCount::ZERO;
2568 boost::shared_ptr<RouteList> r = routes.reader ();
2570 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2571 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2575 assert (!tr->is_auditioner()); // XXX remove me
2576 in += tr->n_inputs();
2577 out += tr->n_outputs();
2582 Session::default_track_name_pattern (DataType t)
2585 case DataType::AUDIO:
2586 if (Profile->get_trx()) {
2593 case DataType::MIDI:
2600 /** Caller must not hold process lock
2601 * @param name_template string to use for the start of the name, or "" to use "MIDI".
2602 * @param instrument plugin info for the instrument to insert pre-fader, if any
2604 list<boost::shared_ptr<MidiTrack> >
2605 Session::new_midi_track (const ChanCount& input, const ChanCount& output, bool strict_io,
2606 boost::shared_ptr<PluginInfo> instrument, Plugin::PresetRecord* pset,
2607 RouteGroup* route_group, uint32_t how_many,
2608 string name_template, PresentationInfo::order_t order,
2612 uint32_t track_id = 0;
2614 RouteList new_routes;
2615 list<boost::shared_ptr<MidiTrack> > ret;
2617 const string name_pattern = default_track_name_pattern (DataType::MIDI);
2618 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
2621 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, use_number)) {
2622 error << "cannot find name for new midi track" << endmsg;
2626 boost::shared_ptr<MidiTrack> track;
2629 track.reset (new MidiTrack (*this, track_name, mode));
2631 if (track->init ()) {
2636 track->set_strict_io (true);
2639 BOOST_MARK_TRACK (track);
2642 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2643 if (track->input()->ensure_io (input, false, this)) {
2644 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
2648 if (track->output()->ensure_io (output, false, this)) {
2649 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
2655 route_group->add (track);
2658 new_routes.push_back (track);
2659 ret.push_back (track);
2662 catch (failed_constructor &err) {
2663 error << _("Session: could not create new midi track.") << endmsg;
2667 catch (AudioEngine::PortRegistrationFailure& pfe) {
2669 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;
2677 if (!new_routes.empty()) {
2678 StateProtector sp (this);
2679 if (Profile->get_trx()) {
2680 add_routes (new_routes, false, false, false, order);
2682 add_routes (new_routes, true, true, false, order);
2686 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
2687 PluginPtr plugin = instrument->load (*this);
2689 warning << "Failed to add Synth Plugin to newly created track." << endmsg;
2693 plugin->load_preset (*pset);
2695 boost::shared_ptr<PluginInsert> pi (new PluginInsert (*this, plugin));
2697 pi->set_strict_io (true);
2700 (*r)->add_processor (pi, PreFader);
2702 if (Profile->get_mixbus () && pi->configured () && pi->output_streams().n_audio() > 2) {
2703 (*r)->move_instrument_down (false);
2713 Session::new_midi_route (RouteGroup* route_group, uint32_t how_many, string name_template, bool strict_io,
2714 boost::shared_ptr<PluginInfo> instrument, Plugin::PresetRecord* pset,
2715 PresentationInfo::Flag flag, PresentationInfo::order_t order)
2718 uint32_t bus_id = 0;
2722 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Midi Bus");
2725 if (!find_route_name (name_template.empty () ? _("Midi Bus") : name_template, ++bus_id, bus_name, use_number)) {
2726 error << "cannot find name for new midi bus" << endmsg;
2731 boost::shared_ptr<Route> bus (new Route (*this, bus_name, flag, DataType::AUDIO)); // XXX Editor::add_routes is not ready for ARDOUR::DataType::MIDI
2738 bus->set_strict_io (true);
2741 BOOST_MARK_ROUTE(bus);
2744 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2746 if (bus->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
2747 error << _("cannot configure new midi bus input") << endmsg;
2752 if (bus->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
2753 error << _("cannot configure new midi bus output") << endmsg;
2759 route_group->add (bus);
2762 bus->add_internal_return ();
2763 ret.push_back (bus);
2766 catch (failed_constructor &err) {
2767 error << _("Session: could not create new audio route.") << endmsg;
2771 catch (AudioEngine::PortRegistrationFailure& pfe) {
2772 error << pfe.what() << endmsg;
2782 StateProtector sp (this);
2783 add_routes (ret, false, false, false, order);
2786 for (RouteList::iterator r = ret.begin(); r != ret.end(); ++r) {
2787 PluginPtr plugin = instrument->load (*this);
2789 warning << "Failed to add Synth Plugin to newly created track." << endmsg;
2793 plugin->load_preset (*pset);
2795 boost::shared_ptr<PluginInsert> pi (new PluginInsert (*this, plugin));
2797 pi->set_strict_io (true);
2800 (*r)->add_processor (pi, PreFader);
2802 if (Profile->get_mixbus () && pi->configured () && pi->output_streams().n_audio() > 2) {
2803 (*r)->move_instrument_down (false);
2815 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2817 boost::shared_ptr<Route> midi_track (wmt.lock());
2823 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2825 if (change.after.n_audio() <= change.before.n_audio()) {
2829 /* new audio ports: make sure the audio goes somewhere useful,
2830 * unless the user has no-auto-connect selected.
2832 * The existing ChanCounts don't matter for this call as they are only
2833 * to do with matching input and output indices, and we are only changing
2836 auto_connect_route (midi_track, false, ChanCount(), change.before);
2840 #ifdef USE_TRACKS_CODE_FEATURES
2843 compare_routes_by_remote_id (const boost::shared_ptr<Route>& route1, const boost::shared_ptr<Route>& route2)
2845 return route1->remote_control_id() < route2->remote_control_id();
2849 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2851 // it is not allowed to perform connection
2852 if (!IO::connecting_legal) {
2856 // if we are deleting routes we will call this once at the end
2857 if (_route_deletion_in_progress) {
2861 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2867 // We need to disconnect the route's inputs and outputs first
2868 // basing on autoconnect configuration
2869 bool reconnectIputs = !(Config->get_input_auto_connect() & ManualConnect) && reconnect_inputs;
2870 bool reconnectOutputs = !(Config->get_output_auto_connect() & ManualConnect) && reconnect_outputs;
2872 ChanCount existing_inputs;
2873 ChanCount existing_outputs;
2874 count_existing_track_channels (existing_inputs, existing_outputs);
2876 //ChanCount inputs = ChanCount::ZERO;
2877 //ChanCount outputs = ChanCount::ZERO;
2879 RouteList existing_routes = *routes.reader ();
2880 existing_routes.sort (compare_routes_by_remote_id);
2883 PBD::Unwinder<bool> protect_ignore_changes (_reconnecting_routes_in_progress, true);
2885 vector<string> physinputs;
2886 vector<string> physoutputs;
2888 EngineStateController::instance()->get_physical_audio_outputs(physoutputs);
2889 EngineStateController::instance()->get_physical_audio_inputs(physinputs);
2891 uint32_t input_n = 0;
2892 uint32_t output_n = 0;
2893 RouteList::iterator rIter = existing_routes.begin();
2894 const AutoConnectOption current_input_auto_connection (Config->get_input_auto_connect());
2895 const AutoConnectOption current_output_auto_connection (Config->get_output_auto_connect());
2896 for (; rIter != existing_routes.end(); ++rIter) {
2897 if (*rIter == _master_out || *rIter == _monitor_out ) {
2901 if (current_output_auto_connection == AutoConnectPhysical) {
2902 (*rIter)->amp()->deactivate();
2903 } else if (current_output_auto_connection == AutoConnectMaster) {
2904 (*rIter)->amp()->activate();
2907 if (reconnectIputs) {
2908 (*rIter)->input()->disconnect (this); //GZ: check this; could be heavy
2910 for (uint32_t route_input_n = 0; route_input_n < (*rIter)->n_inputs().get(DataType::AUDIO); ++route_input_n) {
2912 if (current_input_auto_connection & AutoConnectPhysical) {
2914 if ( input_n == physinputs.size() ) {
2918 string port = physinputs[input_n];
2920 if (port.empty() ) {
2921 error << "Physical Input number "<< input_n << " is unavailable and cannot be connected" << endmsg;
2924 //GZ: check this; could be heavy
2925 (*rIter)->input()->connect ((*rIter)->input()->ports().port(DataType::AUDIO, route_input_n), port, this);
2931 if (reconnectOutputs) {
2933 //normalize route ouptuts: reduce the amount outputs to be equal to the amount of inputs
2934 if (current_output_auto_connection & AutoConnectPhysical) {
2936 //GZ: check this; could be heavy
2937 (*rIter)->output()->disconnect (this);
2938 size_t route_inputs_count = (*rIter)->n_inputs().get(DataType::AUDIO);
2940 //GZ: check this; could be heavy
2941 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, route_inputs_count), false, this );
2943 } else if (current_output_auto_connection & AutoConnectMaster){
2945 if (!reconnect_master) {
2949 //GZ: check this; could be heavy
2950 (*rIter)->output()->disconnect (this);
2953 uint32_t master_inputs_count = _master_out->n_inputs().get(DataType::AUDIO);
2954 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, master_inputs_count), false, this );
2956 error << error << "Master bus is not available" << endmsg;
2961 for (uint32_t route_output_n = 0; route_output_n < (*rIter)->n_outputs().get(DataType::AUDIO); ++route_output_n) {
2962 if (current_output_auto_connection & AutoConnectPhysical) {
2964 if ( output_n == physoutputs.size() ) {
2968 string port = physoutputs[output_n];
2970 if (port.empty() ) {
2971 error << "Physical Output number "<< output_n << " is unavailable and cannot be connected" << endmsg;
2974 //GZ: check this; could be heavy
2975 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2978 } else if (current_output_auto_connection & AutoConnectMaster) {
2980 if ( route_output_n == _master_out->n_inputs().get(DataType::AUDIO) ) {
2984 // connect to master bus
2985 string port = _master_out->input()->ports().port(DataType::AUDIO, route_output_n)->name();
2987 if (port.empty() ) {
2988 error << "MasterBus Input number "<< route_output_n << " is unavailable and cannot be connected" << endmsg;
2992 //GZ: check this; could be heavy
2993 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
3000 _master_out->output()->disconnect (this);
3001 auto_connect_master_bus ();
3006 session_routes_reconnected (); /* EMIT SIGNAL */
3010 Session::reconnect_midi_scene_ports(bool inputs)
3014 boost::shared_ptr<MidiPort> scene_in_ptr = scene_in();
3016 scene_in_ptr->disconnect_all ();
3018 std::vector<EngineStateController::MidiPortState> midi_port_states;
3019 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
3021 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
3023 for (; state_iter != midi_port_states.end(); ++state_iter) {
3024 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
3025 scene_in_ptr->connect (state_iter->name);
3032 boost::shared_ptr<MidiPort> scene_out_ptr = scene_out();
3034 if (scene_out_ptr ) {
3035 scene_out_ptr->disconnect_all ();
3037 std::vector<EngineStateController::MidiPortState> midi_port_states;
3038 EngineStateController::instance()->get_physical_midi_output_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->active && state_iter->available && state_iter->scene_connected) {
3044 scene_out_ptr->connect (state_iter->name);
3052 Session::reconnect_mtc_ports ()
3054 boost::shared_ptr<MidiPort> mtc_in_ptr = _midi_ports->mtc_input_port();
3060 mtc_in_ptr->disconnect_all ();
3062 std::vector<EngineStateController::MidiPortState> midi_port_states;
3063 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
3065 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
3067 for (; state_iter != midi_port_states.end(); ++state_iter) {
3068 if (state_iter->available && state_iter->mtc_in) {
3069 mtc_in_ptr->connect (state_iter->name);
3073 if (!_midi_ports->mtc_input_port ()->connected () &&
3074 config.get_external_sync () &&
3075 (Config->get_sync_source () == MTC) ) {
3076 config.set_external_sync (false);
3079 if ( ARDOUR::Profile->get_trx () ) {
3080 // Tracks need this signal to update timecode_source_dropdown
3081 MtcOrLtcInputPortChanged (); //emit signal
3086 Session::reconnect_mmc_ports(bool inputs)
3088 if (inputs ) { // get all enabled midi input ports
3090 boost::shared_ptr<MidiPort> mmc_in_ptr = _midi_ports->mmc_in();
3092 mmc_in_ptr->disconnect_all ();
3093 std::vector<std::string> enabled_midi_inputs;
3094 EngineStateController::instance()->get_physical_midi_inputs (enabled_midi_inputs);
3096 std::vector<std::string>::iterator port_iter = enabled_midi_inputs.begin();
3098 for (; port_iter != enabled_midi_inputs.end(); ++port_iter) {
3099 mmc_in_ptr->connect (*port_iter);
3103 } else { // get all enabled midi output ports
3105 boost::shared_ptr<MidiPort> mmc_out_ptr = _midi_ports->mmc_out();
3107 mmc_out_ptr->disconnect_all ();
3108 std::vector<std::string> enabled_midi_outputs;
3109 EngineStateController::instance()->get_physical_midi_outputs (enabled_midi_outputs);
3111 std::vector<std::string>::iterator port_iter = enabled_midi_outputs.begin();
3113 for (; port_iter != enabled_midi_outputs.end(); ++port_iter) {
3114 mmc_out_ptr->connect (*port_iter);
3123 Session::ensure_stripable_sort_order ()
3126 get_stripables (sl);
3127 sl.sort (Stripable::Sorter ());
3129 bool change = false;
3130 PresentationInfo::order_t order = 0;
3132 for (StripableList::iterator si = sl.begin(); si != sl.end(); ++si) {
3133 boost::shared_ptr<Stripable> s (*si);
3134 assert (!s->is_auditioner ()); // XXX remove me
3135 if (s->is_monitor ()) {
3138 if (order != s->presentation_info().order()) {
3139 s->set_presentation_order (order);
3148 Session::ensure_route_presentation_info_gap (PresentationInfo::order_t first_new_order, uint32_t how_many)
3150 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("ensure order gap starting at %1 for %2\n", first_new_order, how_many));
3152 if (first_new_order == PresentationInfo::max_order) {
3153 /* adding at end, no worries */
3157 /* create a gap in the presentation info to accomodate @param how_many
3161 get_stripables (sl);
3163 for (StripableList::iterator si = sl.begin(); si != sl.end(); ++si) {
3164 boost::shared_ptr<Stripable> s (*si);
3166 if (s->presentation_info().special (false)) {
3170 if (!s->presentation_info().order_set()) {
3174 if (s->presentation_info().order () >= first_new_order) {
3175 s->set_presentation_order (s->presentation_info().order () + how_many);
3180 /** Caller must not hold process lock
3181 * @param name_template string to use for the start of the name, or "" to use "Audio".
3183 list< boost::shared_ptr<AudioTrack> >
3184 Session::new_audio_track (int input_channels, int output_channels, RouteGroup* route_group,
3185 uint32_t how_many, string name_template, PresentationInfo::order_t order,
3189 uint32_t track_id = 0;
3191 RouteList new_routes;
3192 list<boost::shared_ptr<AudioTrack> > ret;
3194 const string name_pattern = default_track_name_pattern (DataType::AUDIO);
3195 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
3199 if (!find_route_name (name_template.empty() ? _(name_pattern.c_str()) : name_template, ++track_id, track_name, use_number)) {
3200 error << "cannot find name for new audio track" << endmsg;
3204 boost::shared_ptr<AudioTrack> track;
3207 track.reset (new AudioTrack (*this, track_name, mode));
3209 if (track->init ()) {
3213 if (Profile->get_mixbus ()) {
3214 track->set_strict_io (true);
3217 if (ARDOUR::Profile->get_trx ()) {
3218 // TRACKS considers it's not a USE CASE, it's
3219 // a piece of behavior of the session model:
3221 // Gain for a newly created route depends on
3222 // the current output_auto_connect mode:
3224 // 0 for Stereo Out mode
3226 if (Config->get_output_auto_connect() & AutoConnectMaster) {
3227 track->gain_control()->set_value (dB_to_coefficient (0), Controllable::NoGroup);
3231 BOOST_MARK_TRACK (track);
3234 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3236 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
3237 error << string_compose (
3238 _("cannot configure %1 in/%2 out configuration for new audio track"),
3239 input_channels, output_channels)
3244 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
3245 error << string_compose (
3246 _("cannot configure %1 in/%2 out configuration for new audio track"),
3247 input_channels, output_channels)
3254 route_group->add (track);
3257 new_routes.push_back (track);
3258 ret.push_back (track);
3261 catch (failed_constructor &err) {
3262 error << _("Session: could not create new audio track.") << endmsg;
3266 catch (AudioEngine::PortRegistrationFailure& pfe) {
3268 error << pfe.what() << endmsg;
3276 if (!new_routes.empty()) {
3277 StateProtector sp (this);
3278 if (Profile->get_trx()) {
3279 add_routes (new_routes, false, false, false, order);
3281 add_routes (new_routes, true, true, false, order);
3288 /** Caller must not hold process lock.
3289 * @param name_template string to use for the start of the name, or "" to use "Bus".
3292 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template,
3293 PresentationInfo::Flag flags, PresentationInfo::order_t order)
3296 uint32_t bus_id = 0;
3300 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
3303 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, use_number)) {
3304 error << "cannot find name for new audio bus" << endmsg;
3309 boost::shared_ptr<Route> bus (new Route (*this, bus_name, flags, DataType::AUDIO));
3315 if (Profile->get_mixbus ()) {
3316 bus->set_strict_io (true);
3319 BOOST_MARK_ROUTE(bus);
3322 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3324 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
3325 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
3326 input_channels, output_channels)
3332 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
3333 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
3334 input_channels, output_channels)
3341 route_group->add (bus);
3344 bus->add_internal_return ();
3345 ret.push_back (bus);
3348 catch (failed_constructor &err) {
3349 error << _("Session: could not create new audio route.") << endmsg;
3353 catch (AudioEngine::PortRegistrationFailure& pfe) {
3354 error << pfe.what() << endmsg;
3364 StateProtector sp (this);
3365 if (Profile->get_trx()) {
3366 add_routes (ret, false, false, false, order);
3368 add_routes (ret, false, true, true, order); // autoconnect // outputs only
3377 Session::new_route_from_template (uint32_t how_many, PresentationInfo::order_t insert_at, const std::string& template_path, const std::string& name_base,
3378 PlaylistDisposition pd)
3382 if (!tree.read (template_path.c_str())) {
3386 return new_route_from_template (how_many, insert_at, *tree.root(), name_base, pd);
3390 Session::new_route_from_template (uint32_t how_many, PresentationInfo::order_t insert_at, XMLNode& node, const std::string& name_base, PlaylistDisposition pd)
3393 uint32_t number = 0;
3394 const uint32_t being_added = how_many;
3395 /* This will prevent the use of any existing XML-provided PBD::ID
3398 Stateful::ForceIDRegeneration force_ids;
3399 IO::disable_connecting ();
3403 /* We're going to modify the node contents a bit so take a
3404 * copy. The node may be re-used when duplicating more than once.
3407 XMLNode node_copy (node);
3412 if (!name_base.empty()) {
3414 /* if we're adding more than one routes, force
3415 * all the names of the new routes to be
3416 * numbered, via the final parameter.
3419 if (!find_route_name (name_base.c_str(), ++number, name, (being_added > 1))) {
3420 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3426 string const route_name = node_copy.property(X_("name"))->value ();
3428 /* generate a new name by adding a number to the end of the template name */
3429 if (!find_route_name (route_name.c_str(), ++number, name, true)) {
3430 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3431 abort(); /*NOTREACHED*/
3435 /* set this name in the XML description that we are about to use */
3437 if (pd == CopyPlaylist) {
3438 XMLNode* ds_node = find_named_node (node_copy, "Diskstream");
3440 const std::string playlist_name = ds_node->property (X_("playlist"))->value ();
3441 boost::shared_ptr<Playlist> playlist = playlists->by_name (playlist_name);
3442 // Use same name as Route::set_name_in_state so playlist copy
3443 // is picked up when creating the Route in XMLRouteFactory below
3444 playlist = PlaylistFactory::create (playlist, string_compose ("%1.1", name));
3445 playlist->reset_shares ();
3447 } else if (pd == SharePlaylist) {
3448 XMLNode* ds_node = find_named_node (node_copy, "Diskstream");
3450 const std::string playlist_name = ds_node->property (X_("playlist"))->value ();
3451 boost::shared_ptr<Playlist> playlist = playlists->by_name (playlist_name);
3452 playlist->share_with ((node_copy.property (X_("id")))->value());
3456 bool rename_playlist = (pd == CopyPlaylist || pd == NewPlaylist);
3458 Route::set_name_in_state (node_copy, name, rename_playlist);
3460 /* trim bitslots from listen sends so that new ones are used */
3461 XMLNodeList children = node_copy.children ();
3462 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
3463 if ((*i)->name() == X_("Processor")) {
3464 /* ForceIDRegeneration does not catch the following */
3465 XMLProperty const * role = (*i)->property (X_("role"));
3466 XMLProperty const * type = (*i)->property (X_("type"));
3467 if (role && role->value() == X_("Aux")) {
3468 /* check if the target bus exists.
3469 * we should not save aux-sends in templates.
3471 XMLProperty const * target = (*i)->property (X_("target"));
3473 (*i)->set_property ("type", "dangling-aux-send");
3476 boost::shared_ptr<Route> r = route_by_id (target->value());
3477 if (!r || boost::dynamic_pointer_cast<Track>(r)) {
3478 (*i)->set_property ("type", "dangling-aux-send");
3482 if (role && role->value() == X_("Listen")) {
3483 (*i)->remove_property (X_("bitslot"));
3485 else if (role && (role->value() == X_("Send") || role->value() == X_("Aux"))) {
3486 Delivery::Role xrole;
3487 uint32_t bitslot = 0;
3488 xrole = Delivery::Role (string_2_enum (role->value(), xrole));
3489 std::string name = Send::name_and_id_new_send(*this, xrole, bitslot, false);
3490 (*i)->remove_property (X_("bitslot"));
3491 (*i)->remove_property (X_("name"));
3492 (*i)->set_property ("bitslot", bitslot);
3493 (*i)->set_property ("name", name);
3495 else if (type && type->value() == X_("intreturn")) {
3496 (*i)->remove_property (X_("bitslot"));
3497 (*i)->set_property ("ignore-bitslot", "1");
3499 else if (type && type->value() == X_("return")) {
3500 // Return::set_state() generates a new one
3501 (*i)->remove_property (X_("bitslot"));
3503 else if (type && type->value() == X_("port")) {
3504 // PortInsert::set_state() handles the bitslot
3505 (*i)->remove_property (X_("bitslot"));
3506 (*i)->set_property ("ignore-name", "1");
3511 /* new routes start off unsoloed to avoid issues related to
3512 upstream / downstream buses. */
3513 node_copy.remove_node_and_delete (X_("Controllable"), X_("name"), X_("solo"));
3515 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
3518 error << _("Session: cannot create track/bus from template description") << endmsg;
3522 if (boost::dynamic_pointer_cast<Track>(route)) {
3523 /* force input/output change signals so that the new diskstream
3524 picks up the configuration of the route. During session
3525 loading this normally happens in a different way.
3528 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3530 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
3531 change.after = route->input()->n_ports();
3532 route->input()->changed (change, this);
3533 change.after = route->output()->n_ports();
3534 route->output()->changed (change, this);
3537 ret.push_back (route);
3540 catch (failed_constructor &err) {
3541 error << _("Session: could not create new route from template") << endmsg;
3545 catch (AudioEngine::PortRegistrationFailure& pfe) {
3546 error << pfe.what() << endmsg;
3555 StateProtector sp (this);
3556 if (Profile->get_trx()) {
3557 add_routes (ret, false, false, false, insert_at);
3559 add_routes (ret, true, true, false, insert_at);
3561 IO::enable_connecting ();
3568 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save, PresentationInfo::order_t order)
3571 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
3572 add_routes_inner (new_routes, input_auto_connect, output_auto_connect, order);
3575 error << _("Adding new tracks/busses failed") << endmsg;
3580 update_latency (true);
3581 update_latency (false);
3586 save_state (_current_snapshot_name);
3589 update_route_record_state ();
3591 RouteAdded (new_routes); /* EMIT SIGNAL */
3595 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, PresentationInfo::order_t order)
3597 ChanCount existing_inputs;
3598 ChanCount existing_outputs;
3602 count_existing_track_channels (existing_inputs, existing_outputs);
3605 RCUWriter<RouteList> writer (routes);
3606 boost::shared_ptr<RouteList> r = writer.get_copy ();
3607 n_routes = r->size();
3608 r->insert (r->end(), new_routes.begin(), new_routes.end());
3610 /* if there is no control out and we're not in the middle of loading,
3611 * resort the graph here. if there is a control out, we will resort
3612 * toward the end of this method. if we are in the middle of loading,
3613 * we will resort when done.
3616 if (!_monitor_out && IO::connecting_legal) {
3617 resort_routes_using (r);
3621 /* monitor is not part of the order */
3623 assert (n_routes > 0);
3628 PresentationInfo::ChangeSuspender cs;
3629 ensure_route_presentation_info_gap (order, new_routes.size());
3631 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x, ++added) {
3633 boost::weak_ptr<Route> wpr (*x);
3634 boost::shared_ptr<Route> r (*x);
3636 r->solo_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2,wpr));
3637 r->solo_isolate_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, wpr));
3638 r->mute_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this));
3640 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
3641 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
3642 r->processor_latency_changed.connect_same_thread (*this, boost::bind (&Session::queue_latency_recompute, this));
3644 if (r->is_master()) {
3648 if (r->is_monitor()) {
3652 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
3654 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
3655 track_playlist_changed (boost::weak_ptr<Track> (tr));
3656 tr->rec_enable_control()->Changed.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
3658 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
3660 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
3661 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
3662 mt->presentation_info().PropertyChanged.connect_same_thread (*this, boost::bind (&Session::midi_track_presentation_info_changed, this, _1, boost::weak_ptr<MidiTrack>(mt)));
3666 if (!r->presentation_info().special (false)) {
3668 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("checking PI state for %1\n", r->name()));
3670 /* presentation info order may already have been set from XML */
3672 if (!r->presentation_info().order_set()) {
3673 if (order == PresentationInfo::max_order) {
3674 /* just add to the end */
3675 r->set_presentation_order (n_routes + added);
3676 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order not set, set to NR %1 + %2 = %3\n", n_routes, added, n_routes + added));
3678 r->set_presentation_order (order + added);
3679 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order not set, set to %1 + %2 = %3\n", order, added, order + added));
3682 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order already set to %1\n", r->presentation_info().order()));
3686 #if !defined(__APPLE__) && !defined(__FreeBSD__)
3687 /* clang complains: 'operator<<' should be declared prior to the call site or in an associated namespace of one of its
3688 * arguments std::ostream& operator<<(std::ostream& o, ARDOUR::PresentationInfo const& rid)"
3690 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("added route %1, group order %2 type %3 (summary: %4)\n",
3692 r->presentation_info().order(),
3693 enum_2_string (r->presentation_info().flags()),
3694 r->presentation_info()));
3698 if (input_auto_connect || output_auto_connect) {
3699 auto_connect_route (r, input_auto_connect, ChanCount (), ChanCount (), existing_inputs, existing_outputs);
3700 existing_inputs += r->n_inputs();
3701 existing_outputs += r->n_outputs();
3706 ensure_stripable_sort_order ();
3709 if (_monitor_out && IO::connecting_legal) {
3710 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
3712 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3713 if ((*x)->is_monitor()) {
3715 } else if ((*x)->is_master()) {
3718 (*x)->enable_monitor_send ();
3723 reassign_track_numbers ();
3727 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
3729 boost::shared_ptr<RouteList> r = routes.reader ();
3730 boost::shared_ptr<Send> s;
3732 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3733 if ((s = (*i)->internal_send_for (dest)) != 0) {
3734 s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO, Controllable::NoGroup);
3740 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
3742 boost::shared_ptr<RouteList> r = routes.reader ();
3743 boost::shared_ptr<Send> s;
3745 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3746 if ((s = (*i)->internal_send_for (dest)) != 0) {
3747 s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY, Controllable::NoGroup);
3753 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
3755 boost::shared_ptr<RouteList> r = routes.reader ();
3756 boost::shared_ptr<Send> s;
3758 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3759 if ((s = (*i)->internal_send_for (dest)) != 0) {
3760 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value(), Controllable::NoGroup);
3765 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
3767 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
3769 boost::shared_ptr<RouteList> r = routes.reader ();
3770 boost::shared_ptr<RouteList> t (new RouteList);
3772 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3773 /* no MIDI sends because there are no MIDI busses yet */
3774 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
3779 add_internal_sends (dest, p, t);
3783 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
3785 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
3786 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
3791 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
3793 add_internal_send (dest, sender->before_processor_for_index (index), sender);
3797 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
3799 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
3803 if (!dest->internal_return()) {
3804 dest->add_internal_return ();
3807 sender->add_aux_send (dest, before);
3813 Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
3815 bool mute_changed = false;
3816 bool send_selected = false;
3818 { // RCU Writer scope
3819 PBD::Unwinder<bool> uw_flag (_route_deletion_in_progress, true);
3820 RCUWriter<RouteList> writer (routes);
3821 boost::shared_ptr<RouteList> rs = writer.get_copy ();
3823 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3825 if (_selection->selected (*iter)) {
3826 send_selected = true;
3829 if (*iter == _master_out) {
3833 /* speed up session deletion, don't do the solo dance */
3834 if (0 == (_state_of_the_state & Deletion)) {
3835 (*iter)->solo_control()->set_value (0.0, Controllable::NoGroup);
3838 if ((*iter)->mute_control()->muted ()) {
3839 mute_changed = true;
3844 /* deleting the master out seems like a dumb
3845 idea, but its more of a UI policy issue
3849 if (*iter == _master_out) {
3850 _master_out = boost::shared_ptr<Route> ();
3853 if (*iter == _monitor_out) {
3854 _monitor_out.reset ();
3857 // We need to disconnect the route's inputs and outputs
3859 (*iter)->input()->disconnect (0);
3860 (*iter)->output()->disconnect (0);
3862 /* if the route had internal sends sending to it, remove them */
3863 if ((*iter)->internal_return()) {
3865 boost::shared_ptr<RouteList> r = routes.reader ();
3866 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3867 boost::shared_ptr<Send> s = (*i)->internal_send_for (*iter);
3869 (*i)->remove_processor (s);
3874 /* if the monitoring section had a pointer to this route, remove it */
3875 if (_monitor_out && !(*iter)->is_master() && !(*iter)->is_monitor()) {
3876 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3877 ProcessorChangeBlocker pcb (this, false);
3878 (*iter)->remove_aux_or_listen (_monitor_out);
3881 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*iter);
3882 if (mt && mt->step_editing()) {
3883 if (_step_editors > 0) {
3889 /* writer goes out of scope, forces route list update */
3891 } // end of RCU Writer scope
3894 MuteChanged (); /* EMIT SIGNAL */
3897 update_route_solo_state ();
3898 update_latency_compensation ();
3901 /* Re-sort routes to remove the graph's current references to the one that is
3902 * going away, then flush old references out of the graph.
3903 * Wave Tracks: reconnect routes
3906 #ifdef USE_TRACKS_CODE_FEATURES
3907 reconnect_existing_routes(true, false);
3909 routes.flush (); // maybe unsafe, see below.
3913 if (_process_graph && !(_state_of_the_state & Deletion)) {
3914 _process_graph->clear_other_chain ();
3917 /* get rid of it from the dead wood collection in the route list manager */
3918 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
3922 /* remove these routes from the selection if appropriate, and signal
3923 * the change *before* we call DropReferences for them.
3926 if (send_selected && !deletion_in_progress()) {
3927 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3928 _selection->remove_stripable_by_id ((*iter)->id());
3931 pc.add (Properties::selected);
3932 PresentationInfo::Change (pc);
3935 /* try to cause everyone to drop their references
3936 * and unregister ports from the backend
3939 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3940 (*iter)->drop_references ();
3943 if (deletion_in_progress()) {
3948 pc.add (Properties::order);
3949 PresentationInfo::Change (pc);
3951 /* save the new state of the world */
3953 if (save_state (_current_snapshot_name)) {
3954 save_history (_current_snapshot_name);
3957 update_route_record_state ();
3961 Session::remove_route (boost::shared_ptr<Route> route)
3963 boost::shared_ptr<RouteList> rl (new RouteList);
3964 rl->push_back (route);
3969 Session::route_mute_changed ()
3971 MuteChanged (); /* EMIT SIGNAL */
3976 Session::route_listen_changed (Controllable::GroupControlDisposition group_override, boost::weak_ptr<Route> wpr)
3978 boost::shared_ptr<Route> route (wpr.lock());
3984 assert (Config->get_solo_control_is_listen_control());
3986 if (route->solo_control()->soloed_by_self_or_masters()) {
3988 if (Config->get_exclusive_solo()) {
3990 RouteGroup* rg = route->route_group ();
3991 const bool group_already_accounted_for = (group_override == Controllable::ForGroup);
3993 boost::shared_ptr<RouteList> r = routes.reader ();
3995 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3996 if ((*i) == route) {
3997 /* already changed */
4001 if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
4002 /* route does not get solo propagated to it */
4006 if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
4007 /* this route is a part of the same solo group as the route
4008 * that was changed. Changing that route did change or will
4009 * change all group members appropriately, so we can ignore it
4014 (*i)->solo_control()->set_value (0.0, Controllable::NoGroup);
4020 } else if (_listen_cnt > 0) {
4027 Session::route_solo_isolated_changed (boost::weak_ptr<Route> wpr)
4029 boost::shared_ptr<Route> route (wpr.lock());
4035 bool send_changed = false;
4037 if (route->solo_isolate_control()->solo_isolated()) {
4038 if (_solo_isolated_cnt == 0) {
4039 send_changed = true;
4041 _solo_isolated_cnt++;
4042 } else if (_solo_isolated_cnt > 0) {
4043 _solo_isolated_cnt--;
4044 if (_solo_isolated_cnt == 0) {
4045 send_changed = true;
4050 IsolatedChanged (); /* EMIT SIGNAL */
4055 Session::route_solo_changed (bool self_solo_changed, Controllable::GroupControlDisposition group_override, boost::weak_ptr<Route> wpr)
4057 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1, update\n", self_solo_changed));
4059 boost::shared_ptr<Route> route (wpr.lock());
4065 if (Config->get_solo_control_is_listen_control()) {
4066 route_listen_changed (group_override, wpr);
4070 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()));
4072 if (route->solo_control()->transitioned_into_solo() == 0) {
4073 /* route solo changed by upstream/downstream or clear all solo state; not interesting
4076 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()));
4080 boost::shared_ptr<RouteList> r = routes.reader ();
4081 int32_t delta = route->solo_control()->transitioned_into_solo ();
4083 /* the route may be a member of a group that has shared-solo
4084 * semantics. If so, then all members of that group should follow the
4085 * solo of the changed route. But ... this is optional, controlled by a
4086 * Controllable::GroupControlDisposition.
4088 * The first argument to the signal that this method is connected to is the
4089 * GroupControlDisposition value that was used to change solo.
4091 * If the solo change was done with group semantics (either InverseGroup
4092 * (force the entire group to change even if the group shared solo is
4093 * disabled) or UseGroup (use the group, which may or may not have the
4094 * shared solo property enabled)) then as we propagate the change to
4095 * the entire session we should IGNORE THE GROUP that the changed route
4099 RouteGroup* rg = route->route_group ();
4100 const bool group_already_accounted_for = (group_override == Controllable::ForGroup);
4102 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate to session, group accounted for ? %1\n", group_already_accounted_for));
4104 if (delta == 1 && Config->get_exclusive_solo()) {
4106 /* new solo: disable all other solos, but not the group if its solo-enabled */
4108 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4110 if ((*i) == route) {
4111 /* already changed */
4115 if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
4116 /* route does not get solo propagated to it */
4120 if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
4121 /* this route is a part of the same solo group as the route
4122 * that was changed. Changing that route did change or will
4123 * change all group members appropriately, so we can ignore it
4129 (*i)->solo_control()->set_value (0.0, group_override);
4133 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
4135 RouteList uninvolved;
4137 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
4139 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4140 bool via_sends_only;
4141 bool in_signal_flow;
4143 if ((*i) == route) {
4144 /* already changed */
4148 if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
4149 /* route does not get solo propagated to it */
4150 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(),
4155 if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
4156 /* this route is a part of the same solo group as the route
4157 * that was changed. Changing that route did change or will
4158 * change all group members appropriately, so we can ignore it
4164 in_signal_flow = false;
4166 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
4168 if ((*i)->feeds (route, &via_sends_only)) {
4169 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
4170 if (!via_sends_only) {
4171 if (!route->soloed_by_others_upstream()) {
4172 (*i)->solo_control()->mod_solo_by_others_downstream (delta);
4174 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others upstream\n");
4177 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
4179 in_signal_flow = true;
4181 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
4184 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
4186 if (route->feeds (*i, &via_sends_only)) {
4187 /* propagate solo upstream only if routing other than
4188 sends is involved, but do consider the other route
4189 (*i) to be part of the signal flow even if only
4192 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
4196 route->soloed_by_others_downstream(),
4197 route->soloed_by_others_upstream()));
4198 if (!via_sends_only) {
4199 //NB. Triggers Invert Push, which handles soloed by downstream
4200 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
4201 (*i)->solo_control()->mod_solo_by_others_upstream (delta);
4203 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
4205 in_signal_flow = true;
4207 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
4210 if (!in_signal_flow) {
4211 uninvolved.push_back (*i);
4215 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
4217 /* now notify that the mute state of the routes not involved in the signal
4218 pathway of the just-solo-changed route may have altered.
4221 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
4222 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
4223 (*i)->act_on_mute ();
4224 /* Session will emit SoloChanged() after all solo changes are
4225 * complete, which should be used by UIs to update mute status
4231 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
4233 /* now figure out if anything that matters is soloed (or is "listening")*/
4235 bool something_soloed = false;
4236 bool something_listening = false;
4237 uint32_t listeners = 0;
4238 uint32_t isolated = 0;
4241 r = routes.reader();
4244 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4245 if ((*i)->can_solo()) {
4246 if (Config->get_solo_control_is_listen_control()) {
4247 if ((*i)->solo_control()->soloed_by_self_or_masters()) {
4249 something_listening = true;
4252 (*i)->set_listen (false);
4253 if ((*i)->can_solo() && (*i)->solo_control()->soloed_by_self_or_masters()) {
4254 something_soloed = true;
4259 if ((*i)->solo_isolate_control()->solo_isolated()) {
4264 if (something_soloed != _non_soloed_outs_muted) {
4265 _non_soloed_outs_muted = something_soloed;
4266 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
4269 if (something_listening != _listening) {
4270 _listening = something_listening;
4271 SoloActive (_listening);
4274 _listen_cnt = listeners;
4276 if (isolated != _solo_isolated_cnt) {
4277 _solo_isolated_cnt = isolated;
4278 IsolatedChanged (); /* EMIT SIGNAL */
4281 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
4282 something_soloed, listeners, isolated));
4285 SoloChanged (); /* EMIT SIGNAL */
4290 Session::muted () const
4292 // TODO consider caching the value on every MuteChanged signal,
4293 // Note that API users may also subscribe to MuteChanged and hence
4294 // this method needs to be called first.
4297 get_stripables (all);
4298 for (StripableList::const_iterator i = all.begin(); i != all.end(); ++i) {
4299 assert (!(*i)->is_auditioner()); // XXX remove me
4300 if ((*i)->is_monitor()) {
4303 boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route>(*i);
4304 if (r && !r->active()) {
4307 boost::shared_ptr<MuteControl> mc = (*i)->mute_control();
4308 if (mc && mc->muted ()) {
4316 std::vector<boost::weak_ptr<AutomationControl> >
4317 Session::cancel_all_mute ()
4320 get_stripables (all);
4321 std::vector<boost::weak_ptr<AutomationControl> > muted;
4322 boost::shared_ptr<ControlList> cl (new ControlList);
4323 for (StripableList::const_iterator i = all.begin(); i != all.end(); ++i) {
4324 assert (!(*i)->is_auditioner());
4325 if ((*i)->is_monitor()) {
4328 boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route> (*i);
4329 if (r && !r->active()) {
4332 boost::shared_ptr<AutomationControl> ac = (*i)->mute_control();
4333 if (ac && ac->get_value () > 0) {
4335 muted.push_back (boost::weak_ptr<AutomationControl>(ac));
4338 if (!cl->empty ()) {
4339 set_controls (cl, 0.0, PBD::Controllable::UseGroup);
4345 Session::get_stripables (StripableList& sl) const
4347 boost::shared_ptr<RouteList> r = routes.reader ();
4348 sl.insert (sl.end(), r->begin(), r->end());
4350 VCAList v = _vca_manager->vcas ();
4351 sl.insert (sl.end(), v.begin(), v.end());
4355 Session::get_stripables () const
4358 Session::get_stripables (rv);
4359 rv.sort (Stripable::Sorter ());
4363 boost::shared_ptr<RouteList>
4364 Session::get_routes_with_internal_returns() const
4366 boost::shared_ptr<RouteList> r = routes.reader ();
4367 boost::shared_ptr<RouteList> rl (new RouteList);
4369 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4370 if ((*i)->internal_return ()) {
4378 Session::io_name_is_legal (const std::string& name) const
4380 boost::shared_ptr<RouteList> r = routes.reader ();
4382 for (map<string,bool>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
4383 if (name == reserved->first) {
4384 if (!route_by_name (reserved->first)) {
4385 /* first instance of a reserved name is allowed for some */
4386 return reserved->second;
4388 /* all other instances of a reserved name are not allowed */
4393 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4394 if ((*i)->name() == name) {
4398 if ((*i)->has_io_processor_named (name)) {
4407 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
4410 vector<string> connections;
4412 /* if we are passed only a single route and we're not told to turn
4413 * others off, then just do the simple thing.
4416 if (flip_others == false && rl->size() == 1) {
4417 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
4419 mt->set_input_active (onoff);
4424 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
4426 PortSet& ps ((*rt)->input()->ports());
4428 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
4429 p->get_connections (connections);
4432 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
4433 routes_using_input_from (*s, rl2);
4436 /* scan all relevant routes to see if others are on or off */
4438 bool others_are_already_on = false;
4440 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
4442 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
4448 if ((*r) != (*rt)) {
4449 if (mt->input_active()) {
4450 others_are_already_on = true;
4453 /* this one needs changing */
4454 mt->set_input_active (onoff);
4460 /* globally reverse other routes */
4462 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
4463 if ((*r) != (*rt)) {
4464 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
4466 mt->set_input_active (!others_are_already_on);
4475 Session::routes_using_input_from (const string& str, RouteList& rl)
4477 boost::shared_ptr<RouteList> r = routes.reader();
4479 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4480 if ((*i)->input()->connected_to (str)) {
4486 boost::shared_ptr<Route>
4487 Session::route_by_name (string name) const
4489 boost::shared_ptr<RouteList> r = routes.reader ();
4491 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4492 if ((*i)->name() == name) {
4497 return boost::shared_ptr<Route> ((Route*) 0);
4500 boost::shared_ptr<Route>
4501 Session::route_by_id (PBD::ID id) const
4503 boost::shared_ptr<RouteList> r = routes.reader ();
4505 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4506 if ((*i)->id() == id) {
4511 return boost::shared_ptr<Route> ((Route*) 0);
4515 boost::shared_ptr<Stripable>
4516 Session::stripable_by_id (PBD::ID id) const
4519 get_stripables (sl);
4521 for (StripableList::const_iterator s = sl.begin(); s != sl.end(); ++s) {
4522 if ((*s)->id() == id) {
4527 return boost::shared_ptr<Stripable>();
4530 boost::shared_ptr<Processor>
4531 Session::processor_by_id (PBD::ID id) const
4533 boost::shared_ptr<RouteList> r = routes.reader ();
4535 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4536 boost::shared_ptr<Processor> p = (*i)->Route::processor_by_id (id);
4542 return boost::shared_ptr<Processor> ();
4545 boost::shared_ptr<Route>
4546 Session::get_remote_nth_route (PresentationInfo::order_t n) const
4548 return boost::dynamic_pointer_cast<Route> (get_remote_nth_stripable (n, PresentationInfo::Route));
4551 boost::shared_ptr<Stripable>
4552 Session::get_remote_nth_stripable (PresentationInfo::order_t n, PresentationInfo::Flag flags) const
4555 PresentationInfo::order_t match_cnt = 0;
4557 get_stripables (sl);
4558 sl.sort (Stripable::Sorter());
4560 for (StripableList::const_iterator s = sl.begin(); s != sl.end(); ++s) {
4562 if ((*s)->presentation_info().hidden()) {
4563 /* if the caller didn't explicitly ask for hidden
4564 stripables, ignore hidden ones. This matches
4565 the semantics of the pre-PresentationOrder
4566 "get by RID" logic of Ardour 4.x and earlier.
4568 XXX at some point we should likely reverse
4569 the logic of the flags, because asking for "the
4570 hidden stripables" is not going to be common,
4571 whereas asking for visible ones is normal.
4574 if (! (flags & PresentationInfo::Hidden)) {
4579 if ((*s)->presentation_info().flag_match (flags)) {
4580 if (match_cnt++ == n) {
4586 /* there is no nth stripable that matches the given flags */
4587 return boost::shared_ptr<Stripable>();
4590 boost::shared_ptr<Route>
4591 Session::route_by_selected_count (uint32_t id) const
4593 RouteList r (*(routes.reader ()));
4594 r.sort (Stripable::Sorter());
4596 RouteList::iterator i;
4598 for (i = r.begin(); i != r.end(); ++i) {
4599 if ((*i)->is_selected()) {
4607 return boost::shared_ptr<Route> ();
4611 Session::reassign_track_numbers ()
4615 RouteList r (*(routes.reader ()));
4616 r.sort (Stripable::Sorter());
4618 StateProtector sp (this);
4620 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4621 assert (!(*i)->is_auditioner());
4622 if (boost::dynamic_pointer_cast<Track> (*i)) {
4623 (*i)->set_track_number(++tn);
4625 else if (!(*i)->is_master() && !(*i)->is_monitor()) {
4626 (*i)->set_track_number(--bn);
4629 const uint32_t decimals = ceilf (log10f (tn + 1));
4630 const bool decimals_changed = _track_number_decimals != decimals;
4631 _track_number_decimals = decimals;
4633 if (decimals_changed && config.get_track_name_number ()) {
4634 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4635 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
4637 t->resync_track_name();
4640 // trigger GUI re-layout
4641 config.ParameterChanged("track-name-number");
4645 if (DEBUG_ENABLED(DEBUG::OrderKeys)) {
4646 boost::shared_ptr<RouteList> rl = routes.reader ();
4647 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4648 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 numbered %2\n", (*i)->name(), (*i)->track_number()));
4656 Session::playlist_region_added (boost::weak_ptr<Region> w)
4658 boost::shared_ptr<Region> r = w.lock ();
4663 /* These are the operations that are currently in progress... */
4664 list<GQuark> curr = _current_trans_quarks;
4667 /* ...and these are the operations during which we want to update
4668 the session range location markers.
4671 ops.push_back (Operations::capture);
4672 ops.push_back (Operations::paste);
4673 ops.push_back (Operations::duplicate_region);
4674 ops.push_back (Operations::insert_file);
4675 ops.push_back (Operations::insert_region);
4676 ops.push_back (Operations::drag_region_brush);
4677 ops.push_back (Operations::region_drag);
4678 ops.push_back (Operations::selection_grab);
4679 ops.push_back (Operations::region_fill);
4680 ops.push_back (Operations::fill_selection);
4681 ops.push_back (Operations::create_region);
4682 ops.push_back (Operations::region_copy);
4683 ops.push_back (Operations::fixed_time_region_copy);
4686 /* See if any of the current operations match the ones that we want */
4688 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
4690 /* If so, update the session range markers */
4692 maybe_update_session_range (r->position (), r->last_sample ());
4696 /** Update the session range markers if a is before the current start or
4697 * b is after the current end.
4700 Session::maybe_update_session_range (samplepos_t a, samplepos_t b)
4702 if (_state_of_the_state & Loading) {
4706 samplepos_t session_end_marker_shift_samples = session_end_shift * _nominal_sample_rate;
4708 if (_session_range_location == 0) {
4710 set_session_range_location (a, b + session_end_marker_shift_samples);
4714 if (a < _session_range_location->start()) {
4715 _session_range_location->set_start (a);
4718 if (_session_range_end_is_free && (b > _session_range_location->end())) {
4719 _session_range_location->set_end (b);
4725 Session::set_end_is_free (bool yn)
4727 _session_range_end_is_free = yn;
4731 Session::playlist_ranges_moved (list<Evoral::RangeMove<samplepos_t> > const & ranges)
4733 for (list<Evoral::RangeMove<samplepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4734 maybe_update_session_range (i->to, i->to + i->length);
4739 Session::playlist_regions_extended (list<Evoral::Range<samplepos_t> > const & ranges)
4741 for (list<Evoral::Range<samplepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4742 maybe_update_session_range (i->from, i->to);
4746 /* Region management */
4748 boost::shared_ptr<Region>
4749 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
4751 const RegionFactory::RegionMap& regions (RegionFactory::regions());
4752 RegionFactory::RegionMap::const_iterator i;
4753 boost::shared_ptr<Region> region;
4755 Glib::Threads::Mutex::Lock lm (region_lock);
4757 for (i = regions.begin(); i != regions.end(); ++i) {
4761 if (region->whole_file()) {
4763 if (child->source_equivalent (region)) {
4769 return boost::shared_ptr<Region> ();
4773 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
4775 set<boost::shared_ptr<Region> > relevant_regions;
4777 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
4778 RegionFactory::get_regions_using_source (*s, relevant_regions);
4781 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
4782 set<boost::shared_ptr<Region> >::iterator tmp;
4787 playlists->destroy_region (*r);
4788 RegionFactory::map_remove (*r);
4790 (*r)->drop_sources ();
4791 (*r)->drop_references ();
4793 relevant_regions.erase (r);
4798 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
4801 Glib::Threads::Mutex::Lock ls (source_lock);
4802 /* remove from the main source list */
4803 sources.erase ((*s)->id());
4806 (*s)->mark_for_remove ();
4807 (*s)->drop_references ();
4816 Session::remove_last_capture ()
4818 list<boost::shared_ptr<Source> > srcs;
4820 boost::shared_ptr<RouteList> rl = routes.reader ();
4821 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4822 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4827 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
4830 srcs.insert (srcs.end(), l.begin(), l.end());
4835 destroy_sources (srcs);
4837 save_state (_current_snapshot_name);
4842 /* Source Management */
4845 Session::add_source (boost::shared_ptr<Source> source)
4847 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
4848 pair<SourceMap::iterator,bool> result;
4850 entry.first = source->id();
4851 entry.second = source;
4854 Glib::Threads::Mutex::Lock lm (source_lock);
4855 result = sources.insert (entry);
4858 if (result.second) {
4860 /* yay, new source */
4862 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
4865 if (!fs->within_session()) {
4866 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
4872 boost::shared_ptr<AudioFileSource> afs;
4874 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
4875 if (Config->get_auto_analyse_audio()) {
4876 Analyser::queue_source_for_analysis (source, false);
4880 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
4885 Session::remove_source (boost::weak_ptr<Source> src)
4887 if (_state_of_the_state & Deletion) {
4891 SourceMap::iterator i;
4892 boost::shared_ptr<Source> source = src.lock();
4899 Glib::Threads::Mutex::Lock lm (source_lock);
4901 if ((i = sources.find (source->id())) != sources.end()) {
4906 if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
4908 /* save state so we don't end up with a session file
4909 referring to non-existent sources.
4912 save_state (_current_snapshot_name);
4916 boost::shared_ptr<Source>
4917 Session::source_by_id (const PBD::ID& id)
4919 Glib::Threads::Mutex::Lock lm (source_lock);
4920 SourceMap::iterator i;
4921 boost::shared_ptr<Source> source;
4923 if ((i = sources.find (id)) != sources.end()) {
4930 boost::shared_ptr<AudioFileSource>
4931 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
4933 /* Restricted to audio files because only audio sources have channel
4937 Glib::Threads::Mutex::Lock lm (source_lock);
4939 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
4940 boost::shared_ptr<AudioFileSource> afs
4941 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
4943 if (afs && afs->path() == path && chn == afs->channel()) {
4948 return boost::shared_ptr<AudioFileSource>();
4951 boost::shared_ptr<MidiSource>
4952 Session::midi_source_by_path (const std::string& path, bool need_source_lock) const
4954 /* Restricted to MIDI files because audio sources require a channel
4955 for unique identification, in addition to a path.
4958 Glib::Threads::Mutex::Lock lm (source_lock, Glib::Threads::NOT_LOCK);
4959 if (need_source_lock) {
4963 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
4964 boost::shared_ptr<MidiSource> ms
4965 = boost::dynamic_pointer_cast<MidiSource>(s->second);
4966 boost::shared_ptr<FileSource> fs
4967 = boost::dynamic_pointer_cast<FileSource>(s->second);
4969 if (ms && fs && fs->path() == path) {
4974 return boost::shared_ptr<MidiSource>();
4978 Session::count_sources_by_origin (const string& path)
4981 Glib::Threads::Mutex::Lock lm (source_lock);
4983 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
4984 boost::shared_ptr<FileSource> fs
4985 = boost::dynamic_pointer_cast<FileSource>(i->second);
4987 if (fs && fs->origin() == path) {
4996 peak_file_helper (const string& peak_path, const string& file_path, const string& file_base, bool hash) {
4998 std::string checksum = Glib::Checksum::compute_checksum(Glib::Checksum::CHECKSUM_SHA1, file_path + G_DIR_SEPARATOR + file_base);
4999 return Glib::build_filename (peak_path, checksum + peakfile_suffix);
5001 return Glib::build_filename (peak_path, file_base + peakfile_suffix);
5006 Session::construct_peak_filepath (const string& filepath, const bool in_session, const bool old_peak_name) const
5008 string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
5010 if (Glib::path_is_absolute (filepath)) {
5012 /* rip the session dir from the audiofile source */
5014 string session_path;
5015 bool in_another_session = true;
5017 if (filepath.find (interchange_dir_string) != string::npos) {
5019 session_path = Glib::path_get_dirname (filepath); /* now ends in audiofiles */
5020 session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
5021 session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
5022 session_path = Glib::path_get_dirname (session_path); /* now has session path */
5024 /* see if it is within our session */
5026 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
5027 if (i->path == session_path) {
5028 in_another_session = false;
5033 in_another_session = false;
5037 if (in_another_session) {
5038 SessionDirectory sd (session_path);
5039 return peak_file_helper (sd.peak_path(), "", Glib::path_get_basename (filepath), !old_peak_name);
5043 /* 1) if file belongs to this session
5044 * it may be a relative path (interchange/...)
5045 * or just basename (session_state, remove source)
5046 * -> just use the basename
5048 std::string filename = Glib::path_get_basename (filepath);
5051 /* 2) if the file is outside our session dir:
5052 * (imported but not copied) add the path for check-summming */
5054 path = Glib::path_get_dirname (filepath);
5057 return peak_file_helper (_session_dir->peak_path(), path, Glib::path_get_basename (filepath), !old_peak_name);
5061 Session::new_audio_source_path_for_embedded (const std::string& path)
5065 * we know that the filename is already unique because it exists
5066 * out in the filesystem.
5068 * However, when we bring it into the session, we could get a
5071 * Eg. two embedded files:
5076 * When merged into session, these collide.
5078 * There will not be a conflict with in-memory sources
5079 * because when the source was created we already picked
5080 * a unique name for it.
5082 * This collision is not likely to be common, but we have to guard
5083 * against it. So, if there is a collision, take the md5 hash of the
5084 * the path, and use that as the filename instead.
5087 SessionDirectory sdir (get_best_session_directory_for_new_audio());
5088 string base = Glib::path_get_basename (path);
5089 string newpath = Glib::build_filename (sdir.sound_path(), base);
5091 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
5095 md5.digestString (path.c_str());
5096 md5.writeToString ();
5097 base = md5.digestChars;
5099 string ext = get_suffix (path);
5106 newpath = Glib::build_filename (sdir.sound_path(), base);
5108 /* if this collides, we're screwed */
5110 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
5111 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
5120 /** Return true if there are no audio file sources that use @param name as
5121 * the filename component of their path.
5123 * Return false otherwise.
5125 * This method MUST ONLY be used to check in-session, mono files since it
5126 * hard-codes the channel of the audio file source we are looking for as zero.
5128 * If/when Ardour supports native files in non-mono formats, the logic here
5129 * will need to be revisited.
5132 Session::audio_source_name_is_unique (const string& name)
5134 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
5135 vector<space_and_path>::iterator i;
5136 uint32_t existing = 0;
5138 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
5140 /* note that we search *without* the extension so that
5141 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
5142 in the event that this new name is required for
5143 a file format change.
5146 const string spath = *i;
5148 if (matching_unsuffixed_filename_exists_in (spath, name)) {
5153 /* it is possible that we have the path already
5154 * assigned to a source that has not yet been written
5155 * (ie. the write source for a diskstream). we have to
5156 * check this in order to make sure that our candidate
5157 * path isn't used again, because that can lead to
5158 * two Sources point to the same file with different
5159 * notions of their removability.
5163 string possible_path = Glib::build_filename (spath, name);
5165 if (audio_source_by_path_and_channel (possible_path, 0)) {
5171 return (existing == 0);
5175 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)
5178 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
5180 if (Profile->get_trx() && destructive) {
5182 sstr << setfill ('0') << setw (4) << cnt;
5183 sstr << legalized_base;
5185 sstr << legalized_base;
5187 if (take_required || related_exists) {
5199 } else if (nchan > 2) {
5204 /* XXX what? more than 26 channels! */
5215 /** Return a unique name based on \a base for a new internal audio source */
5217 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
5220 string possible_name;
5221 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
5223 bool some_related_source_name_exists = false;
5225 legalized = legalize_for_path (base);
5227 // Find a "version" of the base name that doesn't exist in any of the possible directories.
5229 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
5231 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
5233 if (audio_source_name_is_unique (possible_name)) {
5237 some_related_source_name_exists = true;
5240 error << string_compose(
5241 _("There are already %1 recordings for %2, which I consider too many."),
5242 limit, base) << endmsg;
5244 throw failed_constructor();
5248 /* We've established that the new name does not exist in any session
5249 * directory, so now find out which one we should use for this new
5253 SessionDirectory sdir (get_best_session_directory_for_new_audio());
5255 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
5260 /** Return a unique name based on `base` for a new internal MIDI source */
5262 Session::new_midi_source_path (const string& base, bool need_lock)
5264 string possible_path;
5265 string possible_name;
5267 possible_name = legalize_for_path (base);
5269 // Find a "version" of the file name that doesn't exist in any of the possible directories.
5270 std::vector<string> sdirs = source_search_path(DataType::MIDI);
5272 /* - the main session folder is the first in the vector.
5273 * - after checking all locations for file-name uniqueness,
5274 * we keep the one from the last iteration as new file name
5275 * - midi files are small and should just be kept in the main session-folder
5277 * -> reverse the array, check main session folder last and use that as location
5280 std::reverse(sdirs.begin(), sdirs.end());
5283 possible_name = bump_name_once (possible_name, '-');
5285 vector<space_and_path>::iterator i;
5286 uint32_t existing = 0;
5288 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
5290 possible_path = Glib::build_filename (*i, possible_name + ".mid");
5292 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
5296 if (midi_source_by_path (possible_path, need_lock)) {
5301 if (possible_path.size () >= PATH_MAX) {
5302 error << string_compose(
5303 _("There are already many recordings for %1, resulting in a too long file-path %2."),
5304 base, possible_path) << endmsg;
5309 if (existing == 0) {
5314 /* No need to "find best location" for software/app-based RAID, because
5315 MIDI is so small that we always put it in the same place.
5318 return possible_path;
5322 /** Create a new within-session audio source */
5323 boost::shared_ptr<AudioFileSource>
5324 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
5326 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
5328 if (!path.empty()) {
5329 return boost::dynamic_pointer_cast<AudioFileSource> (
5330 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, sample_rate(), true, true));
5332 throw failed_constructor ();
5336 /** Create a new within-session MIDI source */
5337 boost::shared_ptr<MidiSource>
5338 Session::create_midi_source_for_session (string const & basic_name)
5340 const string path = new_midi_source_path (basic_name);
5342 if (!path.empty()) {
5343 return boost::dynamic_pointer_cast<SMFSource> (
5344 SourceFactory::createWritable (
5345 DataType::MIDI, *this, path, false, sample_rate()));
5347 throw failed_constructor ();
5351 /** Create a new within-session MIDI source */
5352 boost::shared_ptr<MidiSource>
5353 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
5355 /* the caller passes in the track the source will be used in,
5356 so that we can keep the numbering sane.
5358 Rationale: a track with the name "Foo" that has had N
5359 captures carried out so far will ALREADY have a write source
5360 named "Foo-N+1.mid" waiting to be used for the next capture.
5362 If we call new_midi_source_name() we will get "Foo-N+2". But
5363 there is no region corresponding to "Foo-N+1", so when
5364 "Foo-N+2" appears in the track, the gap presents the user
5365 with odd behaviour - why did it skip past Foo-N+1?
5367 We could explain this to the user in some odd way, but
5368 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
5371 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
5374 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
5376 std::string name = track->steal_write_source_name ();
5379 return boost::shared_ptr<MidiSource>();
5382 /* MIDI files are small, just put them in the first location of the
5383 session source search path.
5386 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
5388 return boost::dynamic_pointer_cast<SMFSource> (
5389 SourceFactory::createWritable (
5390 DataType::MIDI, *this, path, false, sample_rate()));
5395 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
5397 if (playlist->hidden()) {
5401 playlists->add (playlist);
5404 playlist->release();
5411 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
5413 if (_state_of_the_state & Deletion) {
5417 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
5423 playlists->remove (playlist);
5429 Session::set_audition (boost::shared_ptr<Region> r)
5431 pending_audition_region = r;
5432 add_post_transport_work (PostTransportAudition);
5433 _butler->schedule_transport_work ();
5437 Session::audition_playlist ()
5439 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
5440 ev->region.reset ();
5446 Session::register_lua_function (
5447 const std::string& name,
5448 const std::string& script,
5449 const LuaScriptParamList& args
5452 Glib::Threads::Mutex::Lock lm (lua_lock);
5454 lua_State* L = lua.getState();
5456 const std::string& bytecode = LuaScripting::get_factory_bytecode (script);
5457 luabridge::LuaRef tbl_arg (luabridge::newTable(L));
5458 for (LuaScriptParamList::const_iterator i = args.begin(); i != args.end(); ++i) {
5459 if ((*i)->optional && !(*i)->is_set) { continue; }
5460 tbl_arg[(*i)->name] = (*i)->value;
5462 (*_lua_add)(name, bytecode, tbl_arg); // throws luabridge::LuaException
5465 LuaScriptsChanged (); /* EMIT SIGNAL */
5470 Session::unregister_lua_function (const std::string& name)
5472 Glib::Threads::Mutex::Lock lm (lua_lock);
5473 (*_lua_del)(name); // throws luabridge::LuaException
5474 lua.collect_garbage ();
5477 LuaScriptsChanged (); /* EMIT SIGNAL */
5481 std::vector<std::string>
5482 Session::registered_lua_functions ()
5484 Glib::Threads::Mutex::Lock lm (lua_lock);
5485 std::vector<std::string> rv;
5488 luabridge::LuaRef list ((*_lua_list)());
5489 for (luabridge::Iterator i (list); !i.isNil (); ++i) {
5490 if (!i.key ().isString ()) { assert(0); continue; }
5491 rv.push_back (i.key ().cast<std::string> ());
5498 static void _lua_print (std::string s) {
5499 std::cout << "SessionLua: " << s << "\n";
5504 Session::try_run_lua (pframes_t nframes)
5506 if (_n_lua_scripts == 0) return;
5507 Glib::Threads::Mutex::Lock tm (lua_lock, Glib::Threads::TRY_LOCK);
5509 try { (*_lua_run)(nframes); } catch (...) { }
5510 lua.collect_garbage_step ();
5515 Session::setup_lua ()
5518 lua.Print.connect (&_lua_print);
5523 "function ArdourSession ()"
5524 " local self = { scripts = {}, instances = {} }"
5526 " local remove = function (n)"
5527 " self.scripts[n] = nil"
5528 " self.instances[n] = nil"
5529 " Session:scripts_changed()" // call back
5532 " local addinternal = function (n, f, a)"
5533 " assert(type(n) == 'string', 'function-name must be string')"
5534 " assert(type(f) == 'function', 'Given script is a not a function')"
5535 " assert(type(a) == 'table' or type(a) == 'nil', 'Given argument is invalid')"
5536 " assert(self.scripts[n] == nil, 'Callback \"'.. n ..'\" already exists.')"
5537 " self.scripts[n] = { ['f'] = f, ['a'] = a }"
5538 " 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 }"
5539 " self.instances[n] = load (string.dump(f, true), nil, nil, env)(a)"
5540 " Session:scripts_changed()" // call back
5543 " local add = function (n, b, a)"
5544 " assert(type(b) == 'string', 'ByteCode must be string')"
5545 " load (b)()" // assigns f
5546 " assert(type(f) == 'string', 'Assigned ByteCode must be string')"
5547 " addinternal (n, load(f), a)"
5550 " local run = function (...)"
5551 " for n, s in pairs (self.instances) do"
5552 " local status, err = pcall (s, ...)"
5553 " if not status then"
5554 " print ('fn \"'.. n .. '\": ', err)"
5561 " local cleanup = function ()"
5562 " self.scripts = nil"
5563 " self.instances = nil"
5566 " local list = function ()"
5568 " for n, _ in pairs (self.scripts) do"
5574 " local function basic_serialize (o)"
5575 " if type(o) == \"number\" then"
5576 " return tostring(o)"
5578 " return string.format(\"%q\", o)"
5582 " local function serialize (name, value)"
5583 " local rv = name .. ' = '"
5585 " if type(value) == \"number\" or type(value) == \"string\" or type(value) == \"nil\" then"
5586 " return rv .. basic_serialize(value) .. ' '"
5587 " elseif type(value) == \"table\" then"
5589 " for k,v in pairs(value) do"
5590 " local fieldname = string.format(\"%s[%s]\", name, basic_serialize(k))"
5591 " rv = rv .. serialize(fieldname, v) .. ' '"
5592 " collectgarbage()" // string concatenation allocates a new string :(
5595 " elseif type(value) == \"function\" then"
5596 " return rv .. string.format(\"%q\", string.dump(value, true))"
5598 " error('cannot save a ' .. type(value))"
5603 " local save = function ()"
5604 " return (serialize('scripts', self.scripts))"
5607 " local restore = function (state)"
5608 " self.scripts = {}"
5610 " for n, s in pairs (scripts) do"
5611 " addinternal (n, load(s['f']), s['a'])"
5615 " return { run = run, add = add, remove = remove,"
5616 " list = list, restore = restore, save = save, cleanup = cleanup}"
5619 " sess = ArdourSession ()"
5620 " ArdourSession = nil"
5622 "function ardour () end"
5625 lua_State* L = lua.getState();
5628 luabridge::LuaRef lua_sess = luabridge::getGlobal (L, "sess");
5629 lua.do_command ("sess = nil"); // hide it.
5630 lua.do_command ("collectgarbage()");
5632 _lua_run = new luabridge::LuaRef(lua_sess["run"]);
5633 _lua_add = new luabridge::LuaRef(lua_sess["add"]);
5634 _lua_del = new luabridge::LuaRef(lua_sess["remove"]);
5635 _lua_list = new luabridge::LuaRef(lua_sess["list"]);
5636 _lua_save = new luabridge::LuaRef(lua_sess["save"]);
5637 _lua_load = new luabridge::LuaRef(lua_sess["restore"]);
5638 _lua_cleanup = new luabridge::LuaRef(lua_sess["cleanup"]);
5639 } catch (luabridge::LuaException const& e) {
5640 fatal << string_compose (_("programming error: %1"),
5641 std::string ("Failed to setup session Lua interpreter") + e.what ())
5643 abort(); /*NOTREACHED*/
5645 fatal << string_compose (_("programming error: %1"),
5646 X_("Failed to setup session Lua interpreter"))
5648 abort(); /*NOTREACHED*/
5651 LuaBindings::stddef (L);
5652 LuaBindings::common (L);
5653 LuaBindings::dsp (L);
5654 luabridge::push <Session *> (L, this);
5655 lua_setglobal (L, "Session");
5659 Session::scripts_changed ()
5661 assert (!lua_lock.trylock()); // must hold lua_lock
5664 luabridge::LuaRef list ((*_lua_list)());
5666 for (luabridge::Iterator i (list); !i.isNil (); ++i) {
5667 if (!i.key ().isString ()) { assert(0); continue; }
5670 _n_lua_scripts = cnt;
5671 } catch (luabridge::LuaException const& e) {
5672 fatal << string_compose (_("programming error: %1"),
5673 std::string ("Indexing Lua Session Scripts failed.") + e.what ())
5675 abort(); /*NOTREACHED*/
5677 fatal << string_compose (_("programming error: %1"),
5678 X_("Indexing Lua Session Scripts failed."))
5680 abort(); /*NOTREACHED*/
5685 Session::non_realtime_set_audition ()
5687 assert (pending_audition_region);
5688 auditioner->audition_region (pending_audition_region);
5689 pending_audition_region.reset ();
5690 AuditionActive (true); /* EMIT SIGNAL */
5694 Session::audition_region (boost::shared_ptr<Region> r)
5696 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
5702 Session::cancel_audition ()
5707 if (auditioner->auditioning()) {
5708 auditioner->cancel_audition ();
5709 AuditionActive (false); /* EMIT SIGNAL */
5714 Session::is_auditioning () const
5716 /* can be called before we have an auditioner object */
5718 return auditioner->auditioning();
5725 Session::graph_reordered ()
5727 /* don't do this stuff if we are setting up connections
5728 from a set_state() call or creating new tracks. Ditto for deletion.
5731 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _reconnecting_routes_in_progress || _route_deletion_in_progress) {
5737 /* force all diskstreams to update their capture offset values to
5738 reflect any changes in latencies within the graph.
5741 boost::shared_ptr<RouteList> rl = routes.reader ();
5742 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5743 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5745 tr->update_latency_information ();
5750 /** @return Number of samples that there is disk space available to write,
5753 boost::optional<samplecnt_t>
5754 Session::available_capture_duration ()
5756 Glib::Threads::Mutex::Lock lm (space_lock);
5758 if (_total_free_4k_blocks_uncertain) {
5759 return boost::optional<samplecnt_t> ();
5762 float sample_bytes_on_disk = 4.0; // keep gcc happy
5764 switch (config.get_native_file_data_format()) {
5766 sample_bytes_on_disk = 4.0;
5770 sample_bytes_on_disk = 3.0;
5774 sample_bytes_on_disk = 2.0;
5778 /* impossible, but keep some gcc versions happy */
5779 fatal << string_compose (_("programming error: %1"),
5780 X_("illegal native file data format"))
5782 abort(); /*NOTREACHED*/
5785 double scale = 4096.0 / sample_bytes_on_disk;
5787 if (_total_free_4k_blocks * scale > (double) max_samplecnt) {
5788 return max_samplecnt;
5791 return (samplecnt_t) floor (_total_free_4k_blocks * scale);
5795 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
5798 RCUWriter<BundleList> writer (_bundles);
5799 boost::shared_ptr<BundleList> b = writer.get_copy ();
5800 b->push_back (bundle);
5804 BundleAddedOrRemoved (); /* EMIT SIGNAL */
5811 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
5813 bool removed = false;
5816 RCUWriter<BundleList> writer (_bundles);
5817 boost::shared_ptr<BundleList> b = writer.get_copy ();
5818 BundleList::iterator i = find (b->begin(), b->end(), bundle);
5820 if (i != b->end()) {
5827 BundleAddedOrRemoved (); /* EMIT SIGNAL */
5833 boost::shared_ptr<Bundle>
5834 Session::bundle_by_name (string name) const
5836 boost::shared_ptr<BundleList> b = _bundles.reader ();
5838 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
5839 if ((*i)->name() == name) {
5844 return boost::shared_ptr<Bundle> ();
5848 Session::tempo_map_changed (const PropertyChange&)
5852 playlists->update_after_tempo_map_change ();
5854 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
5860 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
5862 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
5863 (*i)->recompute_samples_from_beat ();
5867 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
5868 * the given count with the current block size.
5871 Session::ensure_buffers (ChanCount howmany)
5873 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
5877 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
5879 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5880 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
5885 Session::next_insert_id ()
5887 /* this doesn't really loop forever. just think about it */
5890 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < insert_bitset.size(); ++n) {
5891 if (!insert_bitset[n]) {
5892 insert_bitset[n] = true;
5898 /* none available, so resize and try again */
5900 insert_bitset.resize (insert_bitset.size() + 16, false);
5905 Session::next_send_id ()
5907 /* this doesn't really loop forever. just think about it */
5910 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < send_bitset.size(); ++n) {
5911 if (!send_bitset[n]) {
5912 send_bitset[n] = true;
5918 /* none available, so resize and try again */
5920 send_bitset.resize (send_bitset.size() + 16, false);
5925 Session::next_aux_send_id ()
5927 /* this doesn't really loop forever. just think about it */
5930 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < aux_send_bitset.size(); ++n) {
5931 if (!aux_send_bitset[n]) {
5932 aux_send_bitset[n] = true;
5938 /* none available, so resize and try again */
5940 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
5945 Session::next_return_id ()
5947 /* this doesn't really loop forever. just think about it */
5950 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < return_bitset.size(); ++n) {
5951 if (!return_bitset[n]) {
5952 return_bitset[n] = true;
5958 /* none available, so resize and try again */
5960 return_bitset.resize (return_bitset.size() + 16, false);
5965 Session::mark_send_id (uint32_t id)
5967 if (id >= send_bitset.size()) {
5968 send_bitset.resize (id+16, false);
5970 if (send_bitset[id]) {
5971 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
5973 send_bitset[id] = true;
5977 Session::mark_aux_send_id (uint32_t id)
5979 if (id >= aux_send_bitset.size()) {
5980 aux_send_bitset.resize (id+16, false);
5982 if (aux_send_bitset[id]) {
5983 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
5985 aux_send_bitset[id] = true;
5989 Session::mark_return_id (uint32_t id)
5991 if (id >= return_bitset.size()) {
5992 return_bitset.resize (id+16, false);
5994 if (return_bitset[id]) {
5995 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
5997 return_bitset[id] = true;
6001 Session::mark_insert_id (uint32_t id)
6003 if (id >= insert_bitset.size()) {
6004 insert_bitset.resize (id+16, false);
6006 if (insert_bitset[id]) {
6007 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
6009 insert_bitset[id] = true;
6013 Session::unmark_send_id (uint32_t id)
6015 if (id < send_bitset.size()) {
6016 send_bitset[id] = false;
6021 Session::unmark_aux_send_id (uint32_t id)
6023 if (id < aux_send_bitset.size()) {
6024 aux_send_bitset[id] = false;
6029 Session::unmark_return_id (uint32_t id)
6031 if (_state_of_the_state & Deletion) { return; }
6032 if (id < return_bitset.size()) {
6033 return_bitset[id] = false;
6038 Session::unmark_insert_id (uint32_t id)
6040 if (id < insert_bitset.size()) {
6041 insert_bitset[id] = false;
6046 Session::reset_native_file_format ()
6048 boost::shared_ptr<RouteList> rl = routes.reader ();
6050 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
6051 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6053 /* don't save state as we do this, there's no point
6055 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
6056 tr->reset_write_sources (false);
6057 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
6063 Session::route_name_unique (string n) const
6065 boost::shared_ptr<RouteList> r = routes.reader ();
6067 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
6068 if ((*i)->name() == n) {
6077 Session::route_name_internal (string n) const
6079 if (auditioner && auditioner->name() == n) {
6083 if (_click_io && _click_io->name() == n) {
6091 Session::freeze_all (InterThreadInfo& itt)
6093 boost::shared_ptr<RouteList> r = routes.reader ();
6095 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6097 boost::shared_ptr<Track> t;
6099 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
6100 /* XXX this is wrong because itt.progress will keep returning to zero at the start
6110 boost::shared_ptr<Region>
6111 Session::write_one_track (Track& track, samplepos_t start, samplepos_t end,
6112 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
6113 InterThreadInfo& itt,
6114 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
6115 bool for_export, bool for_freeze)
6117 boost::shared_ptr<Region> result;
6118 boost::shared_ptr<Playlist> playlist;
6119 boost::shared_ptr<Source> source;
6120 ChanCount diskstream_channels (track.n_channels());
6121 samplepos_t position;
6122 samplecnt_t this_chunk;
6124 samplepos_t latency_skip;
6126 samplepos_t len = end - start;
6127 bool need_block_size_reset = false;
6128 ChanCount const max_proc = track.max_processor_streams ();
6129 string legal_playlist_name;
6130 string possible_path;
6133 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
6134 end, start) << endmsg;
6138 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
6139 include_endpoint, for_export, for_freeze);
6141 if (diskstream_channels.n(track.data_type()) < 1) {
6142 error << _("Cannot write a range with no data.") << endmsg;
6146 // block all process callback handling
6148 block_processing ();
6151 // synchronize with AudioEngine::process_callback()
6152 // make sure processing is not currently running
6153 // and processing_blocked() is honored before
6154 // acquiring thread buffers
6155 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
6158 _bounce_processing_active = true;
6160 /* call tree *MUST* hold route_lock */
6162 if ((playlist = track.playlist()) == 0) {
6166 legal_playlist_name = legalize_for_path (playlist->name());
6168 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
6170 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
6171 string path = ((track.data_type() == DataType::AUDIO)
6172 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
6173 : new_midi_source_path (legal_playlist_name));
6180 source = SourceFactory::createWritable (track.data_type(), *this, path, false, sample_rate());
6183 catch (failed_constructor& err) {
6184 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
6188 srcs.push_back (source);
6191 /* tell redirects that care that we are about to use a much larger
6192 * blocksize. this will flush all plugins too, so that they are ready
6193 * to be used for this process.
6196 need_block_size_reset = true;
6197 track.set_block_size (bounce_chunk_size);
6198 _engine.main_thread()->get_buffers ();
6202 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
6204 /* create a set of reasonably-sized buffers */
6205 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
6206 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
6208 buffers.set_count (max_proc);
6210 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
6211 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6212 boost::shared_ptr<MidiSource> ms;
6214 afs->prepare_for_peakfile_writes ();
6215 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
6216 Source::Lock lock(ms->mutex());
6217 ms->mark_streaming_write_started(lock);
6221 while (to_do && !itt.cancel) {
6223 this_chunk = min (to_do, bounce_chunk_size);
6225 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
6229 start += this_chunk;
6230 to_do -= this_chunk;
6231 itt.progress = (float) (1.0 - ((double) to_do / len));
6233 if (latency_skip >= bounce_chunk_size) {
6234 latency_skip -= bounce_chunk_size;
6238 const samplecnt_t current_chunk = this_chunk - latency_skip;
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);
6243 boost::shared_ptr<MidiSource> ms;
6246 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
6249 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
6250 Source::Lock lock(ms->mutex());
6252 const MidiBuffer& buf = buffers.get_midi(0);
6253 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
6254 Evoral::Event<samplepos_t> ev = *i;
6255 ev.set_time(ev.time() - position);
6256 ms->append_event_samples(lock, ev, ms->timeline_position());
6263 /* post-roll, pick up delayed processor output */
6264 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
6266 while (latency_skip && !itt.cancel) {
6267 this_chunk = min (latency_skip, bounce_chunk_size);
6268 latency_skip -= this_chunk;
6270 buffers.silence (this_chunk, 0);
6271 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
6274 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
6275 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6278 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
6290 xnow = localtime (&now);
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);
6294 boost::shared_ptr<MidiSource> ms;
6297 afs->update_header (position, *xnow, now);
6298 afs->flush_header ();
6299 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
6300 Source::Lock lock(ms->mutex());
6301 ms->mark_streaming_write_completed(lock);
6305 /* construct a region to represent the bounced material */
6309 plist.add (Properties::start, 0);
6310 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
6311 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
6313 result = RegionFactory::create (srcs, plist);
6319 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
6320 (*src)->mark_for_remove ();
6321 (*src)->drop_references ();
6325 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
6326 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6329 afs->done_with_peakfile_writes ();
6333 _bounce_processing_active = false;
6335 if (need_block_size_reset) {
6336 _engine.main_thread()->drop_buffers ();
6337 track.set_block_size (get_block_size());
6340 unblock_processing ();
6346 Session::gain_automation_buffer() const
6348 return ProcessThread::gain_automation_buffer ();
6352 Session::trim_automation_buffer() const
6354 return ProcessThread::trim_automation_buffer ();
6358 Session::send_gain_automation_buffer() const
6360 return ProcessThread::send_gain_automation_buffer ();
6364 Session::scratch_automation_buffer() const
6366 return ProcessThread::scratch_automation_buffer ();
6370 Session::pan_automation_buffer() const
6372 return ProcessThread::pan_automation_buffer ();
6376 Session::get_silent_buffers (ChanCount count)
6378 return ProcessThread::get_silent_buffers (count);
6382 Session::get_scratch_buffers (ChanCount count, bool silence)
6384 return ProcessThread::get_scratch_buffers (count, silence);
6388 Session::get_noinplace_buffers (ChanCount count)
6390 return ProcessThread::get_noinplace_buffers (count);
6394 Session::get_route_buffers (ChanCount count, bool silence)
6396 return ProcessThread::get_route_buffers (count, silence);
6401 Session::get_mix_buffers (ChanCount count)
6403 return ProcessThread::get_mix_buffers (count);
6407 Session::ntracks () const
6410 boost::shared_ptr<RouteList> r = routes.reader ();
6412 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
6413 if (boost::dynamic_pointer_cast<Track> (*i)) {
6422 Session::nbusses () const
6425 boost::shared_ptr<RouteList> r = routes.reader ();
6427 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
6428 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
6437 Session::nstripables (bool with_monitor) const
6439 uint32_t rv = routes.reader()->size ();
6440 rv += _vca_manager->vcas ().size ();
6454 Session::add_automation_list(AutomationList *al)
6456 automation_lists[al->id()] = al;
6459 /** @return true if there is at least one record-enabled track, otherwise false */
6461 Session::have_rec_enabled_track () const
6463 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
6467 Session::have_rec_disabled_track () const
6469 return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
6472 /** Update the state of our rec-enabled tracks flag */
6474 Session::update_route_record_state ()
6476 boost::shared_ptr<RouteList> rl = routes.reader ();
6477 RouteList::iterator i = rl->begin();
6478 while (i != rl->end ()) {
6480 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6481 if (tr && tr->rec_enable_control()->get_value()) {
6488 int const old = g_atomic_int_get (&_have_rec_enabled_track);
6490 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
6492 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
6493 RecordStateChanged (); /* EMIT SIGNAL */
6496 for (i = rl->begin(); i != rl->end (); ++i) {
6497 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6498 if (tr && !tr->rec_enable_control()->get_value()) {
6503 g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
6505 bool record_arm_state_changed = (old != g_atomic_int_get (&_have_rec_enabled_track) );
6507 if (record_status() == Recording && record_arm_state_changed ) {
6508 RecordArmStateChanged ();
6514 Session::listen_position_changed ()
6516 ProcessorChangeBlocker pcb (this);
6517 boost::shared_ptr<RouteList> r = routes.reader ();
6518 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6519 (*i)->listen_position_changed ();
6524 Session::solo_control_mode_changed ()
6526 if (soloing() || listening()) {
6528 /* We can't use ::clear_all_solo_state() here because during
6529 session loading at program startup, that will queue a call
6530 to rt_clear_all_solo_state() that will not execute until
6531 AFTER solo states have been established (thus throwing away
6532 the session's saved solo state). So just explicitly turn
6535 set_controls (route_list_to_control_list (get_routes(), &Stripable::solo_control), 0.0, Controllable::NoGroup);
6537 clear_all_solo_state (get_routes());
6542 /** Called when a property of one of our route groups changes */
6544 Session::route_group_property_changed (RouteGroup* rg)
6546 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
6549 /** Called when a route is added to one of our route groups */
6551 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
6553 RouteAddedToRouteGroup (rg, r);
6556 /** Called when a route is removed from one of our route groups */
6558 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
6560 update_route_record_state ();
6561 RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
6563 if (!rg->has_control_master () && !rg->has_subgroup () && rg->empty()) {
6564 remove_route_group (*rg);
6568 boost::shared_ptr<RouteList>
6569 Session::get_tracks () const
6571 boost::shared_ptr<RouteList> rl = routes.reader ();
6572 boost::shared_ptr<RouteList> tl (new RouteList);
6574 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
6575 if (boost::dynamic_pointer_cast<Track> (*r)) {
6576 assert (!(*r)->is_auditioner()); // XXX remove me
6583 boost::shared_ptr<RouteList>
6584 Session::get_routes_with_regions_at (samplepos_t const p) const
6586 boost::shared_ptr<RouteList> r = routes.reader ();
6587 boost::shared_ptr<RouteList> rl (new RouteList);
6589 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6590 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6595 boost::shared_ptr<Playlist> pl = tr->playlist ();
6600 if (pl->has_region_at (p)) {
6609 Session::goto_end ()
6611 if (_session_range_location) {
6612 request_locate (_session_range_location->end(), false);
6614 request_locate (0, false);
6619 Session::goto_start (bool and_roll)
6621 if (_session_range_location) {
6622 request_locate (_session_range_location->start(), and_roll);
6624 request_locate (0, and_roll);
6629 Session::current_start_sample () const
6631 return _session_range_location ? _session_range_location->start() : 0;
6635 Session::current_end_sample () const
6637 return _session_range_location ? _session_range_location->end() : 0;
6641 Session::set_session_range_location (samplepos_t start, samplepos_t end)
6643 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange, 0);
6644 _locations->add (_session_range_location);
6648 Session::step_edit_status_change (bool yn)
6654 send = (_step_editors == 0);
6659 send = (_step_editors == 1);
6662 if (_step_editors > 0) {
6668 StepEditStatusChange (val);
6674 Session::start_time_changed (samplepos_t old)
6676 /* Update the auto loop range to match the session range
6677 (unless the auto loop range has been changed by the user)
6680 Location* s = _locations->session_range_location ();
6685 Location* l = _locations->auto_loop_location ();
6687 if (l && l->start() == old) {
6688 l->set_start (s->start(), true);
6694 Session::end_time_changed (samplepos_t old)
6696 /* Update the auto loop range to match the session range
6697 (unless the auto loop range has been changed by the user)
6700 Location* s = _locations->session_range_location ();
6705 Location* l = _locations->auto_loop_location ();
6707 if (l && l->end() == old) {
6708 l->set_end (s->end(), true);
6713 std::vector<std::string>
6714 Session::source_search_path (DataType type) const
6718 if (session_dirs.size() == 1) {
6720 case DataType::AUDIO:
6721 sp.push_back (_session_dir->sound_path());
6723 case DataType::MIDI:
6724 sp.push_back (_session_dir->midi_path());
6728 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
6729 SessionDirectory sdir (i->path);
6731 case DataType::AUDIO:
6732 sp.push_back (sdir.sound_path());
6734 case DataType::MIDI:
6735 sp.push_back (sdir.midi_path());
6741 if (type == DataType::AUDIO) {
6742 const string sound_path_2X = _session_dir->sound_path_2X();
6743 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
6744 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
6745 sp.push_back (sound_path_2X);
6750 // now check the explicit (possibly user-specified) search path
6753 case DataType::AUDIO:
6754 sp += Searchpath(config.get_audio_search_path ());
6756 case DataType::MIDI:
6757 sp += Searchpath(config.get_midi_search_path ());
6765 Session::ensure_search_path_includes (const string& path, DataType type)
6774 case DataType::AUDIO:
6775 sp += Searchpath(config.get_audio_search_path ());
6777 case DataType::MIDI:
6778 sp += Searchpath (config.get_midi_search_path ());
6782 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
6783 /* No need to add this new directory if it has the same inode as
6784 an existing one; checking inode rather than name prevents duplicated
6785 directories when we are using symlinks.
6787 On Windows, I think we could just do if (*i == path) here.
6789 if (PBD::equivalent_paths (*i, path)) {
6797 case DataType::AUDIO:
6798 config.set_audio_search_path (sp.to_string());
6800 case DataType::MIDI:
6801 config.set_midi_search_path (sp.to_string());
6807 Session::remove_dir_from_search_path (const string& dir, DataType type)
6812 case DataType::AUDIO:
6813 sp = Searchpath(config.get_audio_search_path ());
6815 case DataType::MIDI:
6816 sp = Searchpath (config.get_midi_search_path ());
6823 case DataType::AUDIO:
6824 config.set_audio_search_path (sp.to_string());
6826 case DataType::MIDI:
6827 config.set_midi_search_path (sp.to_string());
6833 boost::shared_ptr<Speakers>
6834 Session::get_speakers()
6840 Session::unknown_processors () const
6844 boost::shared_ptr<RouteList> r = routes.reader ();
6845 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6846 list<string> t = (*i)->unknown_processors ();
6847 copy (t.begin(), t.end(), back_inserter (p));
6857 Session::update_latency (bool playback)
6860 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
6862 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _route_deletion_in_progress) {
6865 if (!_engine.running()) {
6869 boost::shared_ptr<RouteList> r = routes.reader ();
6870 samplecnt_t max_latency = 0;
6873 /* reverse the list so that we work backwards from the last route to run to the first */
6874 RouteList* rl = routes.reader().get();
6875 r.reset (new RouteList (*rl));
6876 reverse (r->begin(), r->end());
6879 /* compute actual latency values for the given direction and store them all in per-port
6880 structures. this will also publish the same values (to JACK) so that computation of latency
6881 for routes can consistently use public latency values.
6884 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6885 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
6888 /* because we latency compensate playback, our published playback latencies should
6889 be the same for all output ports - all material played back by ardour has
6890 the same latency, whether its caused by plugins or by latency compensation. since
6891 these may differ from the values computed above, reset all playback port latencies
6895 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
6897 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6898 (*i)->set_public_port_latencies (max_latency, playback);
6903 post_playback_latency ();
6907 post_capture_latency ();
6910 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
6914 Session::post_playback_latency ()
6916 set_worst_playback_latency ();
6918 boost::shared_ptr<RouteList> r = routes.reader ();
6920 _worst_track_out_latency = 0;
6922 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6923 assert (!(*i)->is_auditioner()); // XXX remove me
6924 if (!(*i)->active()) { continue ; }
6925 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
6926 if (boost::dynamic_pointer_cast<Track> (*i)) {
6927 _worst_track_out_latency = max (_worst_track_out_latency, (*i)->output ()->latency ());
6931 _worst_track_roll_delay = 0;
6933 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6934 if (!(*i)->active()) { continue ; }
6935 (*i)->set_latency_compensation (_worst_track_latency + _worst_track_out_latency - (*i)->output ()->latency ());
6936 if (boost::dynamic_pointer_cast<Track> (*i)) {
6937 _worst_track_roll_delay = max (_worst_track_roll_delay, (*i)->initial_delay ());
6943 Session::post_capture_latency ()
6945 set_worst_capture_latency ();
6947 /* reflect any changes in capture latencies into capture offsets
6950 boost::shared_ptr<RouteList> rl = routes.reader();
6951 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
6952 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6954 tr->update_latency_information ();
6960 Session::initialize_latencies ()
6963 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
6964 update_latency (false);
6965 update_latency (true);
6968 set_worst_io_latencies ();
6972 Session::set_worst_io_latencies ()
6974 set_worst_playback_latency ();
6975 set_worst_capture_latency ();
6979 Session::set_worst_playback_latency ()
6981 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6985 _worst_output_latency = 0;
6987 if (!_engine.connected()) {
6991 boost::shared_ptr<RouteList> r = routes.reader ();
6993 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6994 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
6997 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
7001 Session::set_worst_capture_latency ()
7003 if (_state_of_the_state & (InitialConnecting|Deletion)) {
7007 _worst_input_latency = 0;
7009 if (!_engine.connected()) {
7013 boost::shared_ptr<RouteList> r = routes.reader ();
7015 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
7016 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
7019 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
7023 Session::update_latency_compensation (bool force_whole_graph)
7025 bool some_track_latency_changed = false;
7027 if (_state_of_the_state & (InitialConnecting|Deletion)) {
7031 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
7033 _worst_track_latency = 0;
7035 boost::shared_ptr<RouteList> r = routes.reader ();
7037 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
7038 assert (!(*i)->is_auditioner()); // XXX remove me
7039 if ((*i)->active()) {
7041 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
7042 some_track_latency_changed = true;
7044 _worst_track_latency = max (tl, _worst_track_latency);
7048 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
7049 (some_track_latency_changed ? "yes" : "no")));
7051 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
7053 if (some_track_latency_changed || force_whole_graph) {
7054 _engine.update_latencies ();
7058 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
7059 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
7063 tr->update_latency_information ();
7068 Session::session_name_is_legal (const string& path)
7070 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
7072 for (int i = 0; illegal_chars[i]; ++i) {
7073 if (path.find (illegal_chars[i]) != string::npos) {
7074 return illegal_chars[i];
7082 Session::notify_presentation_info_change ()
7084 if (deletion_in_progress()) {
7088 reassign_track_numbers();
7090 #ifdef USE_TRACKS_CODE_FEATURES
7091 /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
7092 * if track order has been changed by user
7094 reconnect_existing_routes(true, true);
7100 Session::operation_in_progress (GQuark op) const
7102 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
7105 boost::shared_ptr<Port>
7106 Session::ltc_input_port () const
7108 assert (_ltc_input);
7109 return _ltc_input->nth (0);
7112 boost::shared_ptr<Port>
7113 Session::ltc_output_port () const
7115 return _ltc_output ? _ltc_output->nth (0) : boost::shared_ptr<Port> ();
7119 Session::reconnect_ltc_input ()
7123 string src = Config->get_ltc_source_port();
7125 _ltc_input->disconnect (this);
7127 if (src != _("None") && !src.empty()) {
7128 _ltc_input->nth (0)->connect (src);
7131 if ( ARDOUR::Profile->get_trx () ) {
7132 // Tracks need this signal to update timecode_source_dropdown
7133 MtcOrLtcInputPortChanged (); //emit signal
7139 Session::reconnect_ltc_output ()
7143 string src = Config->get_ltc_output_port();
7145 _ltc_output->disconnect (this);
7147 if (src != _("None") && !src.empty()) {
7148 _ltc_output->nth (0)->connect (src);
7154 Session::set_range_selection (samplepos_t start, samplepos_t end)
7156 _range_selection = Evoral::Range<samplepos_t> (start, end);
7157 #ifdef USE_TRACKS_CODE_FEATURES
7158 follow_playhead_priority ();
7163 Session::set_object_selection (samplepos_t start, samplepos_t end)
7165 _object_selection = Evoral::Range<samplepos_t> (start, end);
7166 #ifdef USE_TRACKS_CODE_FEATURES
7167 follow_playhead_priority ();
7172 Session::clear_range_selection ()
7174 _range_selection = Evoral::Range<samplepos_t> (-1,-1);
7175 #ifdef USE_TRACKS_CODE_FEATURES
7176 follow_playhead_priority ();
7181 Session::clear_object_selection ()
7183 _object_selection = Evoral::Range<samplepos_t> (-1,-1);
7184 #ifdef USE_TRACKS_CODE_FEATURES
7185 follow_playhead_priority ();
7190 Session::auto_connect_route (boost::shared_ptr<Route> route, bool connect_inputs,
7191 const ChanCount& input_start,
7192 const ChanCount& output_start,
7193 const ChanCount& input_offset,
7194 const ChanCount& output_offset)
7196 Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
7197 _auto_connect_queue.push (AutoConnectRequest (route, connect_inputs,
7198 input_start, output_start,
7199 input_offset, output_offset));
7201 auto_connect_thread_wakeup ();
7205 Session::auto_connect_thread_wakeup ()
7207 if (pthread_mutex_trylock (&_auto_connect_mutex) == 0) {
7208 pthread_cond_signal (&_auto_connect_cond);
7209 pthread_mutex_unlock (&_auto_connect_mutex);
7214 Session::queue_latency_recompute ()
7216 g_atomic_int_inc (&_latency_recompute_pending);
7217 auto_connect_thread_wakeup ();
7221 Session::auto_connect (const AutoConnectRequest& ar)
7223 boost::shared_ptr<Route> route = ar.route.lock();
7225 if (!route) { return; }
7227 if (!IO::connecting_legal) {
7231 /* If both inputs and outputs are auto-connected to physical ports,
7232 * use the max of input and output offsets to ensure auto-connected
7233 * port numbers always match up (e.g. the first audio input and the
7234 * first audio output of the route will have the same physical
7235 * port number). Otherwise just use the lowest input or output
7239 const bool in_out_physical =
7240 (Config->get_input_auto_connect() & AutoConnectPhysical)
7241 && (Config->get_output_auto_connect() & AutoConnectPhysical)
7242 && ar.connect_inputs;
7244 const ChanCount in_offset = in_out_physical
7245 ? ChanCount::max(ar.input_offset, ar.output_offset)
7248 const ChanCount out_offset = in_out_physical
7249 ? ChanCount::max(ar.input_offset, ar.output_offset)
7252 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
7253 vector<string> physinputs;
7254 vector<string> physoutputs;
7257 /* for connecting track inputs we only want MIDI ports marked
7261 get_physical_ports (physinputs, physoutputs, *t, MidiPortMusic);
7263 if (!physinputs.empty() && ar.connect_inputs) {
7264 uint32_t nphysical_in = physinputs.size();
7266 for (uint32_t i = ar.input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
7269 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
7270 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
7273 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
7279 if (!physoutputs.empty()) {
7280 uint32_t nphysical_out = physoutputs.size();
7281 for (uint32_t i = ar.output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
7285 * do not create new connections if we reached the limit of physical outputs
7288 if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
7289 ARDOUR::Profile->get_trx () &&
7290 ar.output_offset.get(*t) == nphysical_out ) {
7294 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
7295 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
7296 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
7297 /* master bus is audio only */
7298 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
7299 port = _master_out->input()->ports().port(*t,
7300 i % _master_out->input()->n_ports().get(*t))->name();
7304 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
7313 Session::auto_connect_thread_start ()
7315 if (g_atomic_int_get (&_ac_thread_active)) {
7319 while (!_auto_connect_queue.empty ()) {
7320 _auto_connect_queue.pop ();
7323 g_atomic_int_set (&_ac_thread_active, 1);
7324 if (pthread_create (&_auto_connect_thread, NULL, auto_connect_thread, this)) {
7325 g_atomic_int_set (&_ac_thread_active, 0);
7330 Session::auto_connect_thread_terminate ()
7332 if (!g_atomic_int_get (&_ac_thread_active)) {
7337 Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
7338 while (!_auto_connect_queue.empty ()) {
7339 _auto_connect_queue.pop ();
7343 /* cannot use auto_connect_thread_wakeup() because that is allowed to
7344 * fail to wakeup the thread.
7347 pthread_mutex_lock (&_auto_connect_mutex);
7348 g_atomic_int_set (&_ac_thread_active, 0);
7349 pthread_cond_signal (&_auto_connect_cond);
7350 pthread_mutex_unlock (&_auto_connect_mutex);
7353 pthread_join (_auto_connect_thread, &status);
7357 Session::auto_connect_thread (void *arg)
7359 Session *s = static_cast<Session *>(arg);
7360 s->auto_connect_thread_run ();
7366 Session::auto_connect_thread_run ()
7368 pthread_set_name (X_("autoconnect"));
7369 SessionEvent::create_per_thread_pool (X_("autoconnect"), 1024);
7370 PBD::notify_event_loops_about_thread_creation (pthread_self(), X_("autoconnect"), 1024);
7371 pthread_mutex_lock (&_auto_connect_mutex);
7372 while (g_atomic_int_get (&_ac_thread_active)) {
7374 if (!_auto_connect_queue.empty ()) {
7375 // Why would we need the process lock ??
7376 // A: if ports are added while we're connecting, the backend's iterator may be invalidated:
7377 // graph_order_callback() -> resort_routes() -> direct_feeds_according_to_reality () -> backend::connected_to()
7378 // All ardour-internal backends use a std::vector xxxAudioBackend::find_port()
7379 // We have control over those, but what does jack do?
7380 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
7382 Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
7383 while (!_auto_connect_queue.empty ()) {
7384 const AutoConnectRequest ar (_auto_connect_queue.front());
7385 _auto_connect_queue.pop ();
7392 if (!actively_recording ()) { // might not be needed,
7393 /* this is only used for updating plugin latencies, the
7394 * graph does not change. so it's safe in general.
7396 * .. update_latency_compensation () entails Track::update_latency_information()
7397 * which calls DiskWriter::set_capture_offset () which
7398 * modifies the capture offset... which can be a proplem
7399 * in "prepare_to_stop"
7401 while (g_atomic_int_and (&_latency_recompute_pending, 0)) {
7402 update_latency_compensation ();
7407 // this may call ARDOUR::Port::drop ... jack_port_unregister ()
7408 // jack1 cannot cope with removing ports while processing
7409 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
7410 AudioEngine::instance()->clear_pending_port_deletions ();
7413 pthread_cond_wait (&_auto_connect_cond, &_auto_connect_mutex);
7415 pthread_mutex_unlock (&_auto_connect_mutex);
7419 Session::cancel_all_solo ()
7423 get_stripables (sl);
7425 set_controls (stripable_list_to_control_list (sl, &Stripable::solo_control), 0.0, Controllable::NoGroup);
7426 clear_all_solo_state (routes.reader());