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/convert.h"
41 #include "pbd/error.h"
42 #include "pbd/file_utils.h"
44 #include "pbd/pthread_utils.h"
45 #include "pbd/search_path.h"
46 #include "pbd/stacktrace.h"
47 #include "pbd/stl_delete.h"
48 #include "pbd/replace_all.h"
49 #include "pbd/unwind.h"
51 #include "ardour/amp.h"
52 #include "ardour/analyser.h"
53 #include "ardour/async_midi_port.h"
54 #include "ardour/audio_buffer.h"
55 #include "ardour/audio_diskstream.h"
56 #include "ardour/audio_port.h"
57 #include "ardour/audio_track.h"
58 #include "ardour/audioengine.h"
59 #include "ardour/audiofilesource.h"
60 #include "ardour/auditioner.h"
61 #include "ardour/boost_debug.h"
62 #include "ardour/buffer_manager.h"
63 #include "ardour/buffer_set.h"
64 #include "ardour/bundle.h"
65 #include "ardour/butler.h"
66 #include "ardour/click.h"
67 #include "ardour/control_protocol_manager.h"
68 #include "ardour/data_type.h"
69 #include "ardour/debug.h"
70 #include "ardour/directory_names.h"
71 #ifdef USE_TRACKS_CODE_FEATURES
72 #include "ardour/engine_state_controller.h"
74 #include "ardour/filename_extensions.h"
75 #include "ardour/gain_control.h"
76 #include "ardour/graph.h"
77 #include "ardour/luabindings.h"
78 #include "ardour/midiport_manager.h"
79 #include "ardour/scene_changer.h"
80 #include "ardour/midi_patch_manager.h"
81 #include "ardour/midi_track.h"
82 #include "ardour/midi_ui.h"
83 #include "ardour/operations.h"
84 #include "ardour/playlist.h"
85 #include "ardour/plugin.h"
86 #include "ardour/plugin_insert.h"
87 #include "ardour/process_thread.h"
88 #include "ardour/profile.h"
89 #include "ardour/rc_configuration.h"
90 #include "ardour/recent_sessions.h"
91 #include "ardour/region.h"
92 #include "ardour/region_factory.h"
93 #include "ardour/revision.h"
94 #include "ardour/route_graph.h"
95 #include "ardour/route_group.h"
96 #include "ardour/send.h"
97 #include "ardour/session.h"
98 #include "ardour/session_directory.h"
99 #include "ardour/session_playlists.h"
100 #include "ardour/smf_source.h"
101 #include "ardour/solo_isolate_control.h"
102 #include "ardour/source_factory.h"
103 #include "ardour/speakers.h"
104 #include "ardour/tempo.h"
105 #include "ardour/ticker.h"
106 #include "ardour/track.h"
107 #include "ardour/user_bundle.h"
108 #include "ardour/utils.h"
109 #include "ardour/vca_manager.h"
110 #include "ardour/vca.h"
112 #include "midi++/port.h"
113 #include "midi++/mmc.h"
115 #include "LuaBridge/LuaBridge.h"
117 #include "pbd/i18n.h"
119 #include <glibmm/checksum.h>
128 using namespace ARDOUR;
131 bool Session::_disable_all_loaded_plugins = false;
132 bool Session::_bypass_all_loaded_plugins = false;
133 guint Session::_name_id_counter = 0;
135 PBD::Signal1<int,uint32_t> Session::AudioEngineSetupRequired;
136 PBD::Signal1<void,std::string> Session::Dialog;
137 PBD::Signal0<int> Session::AskAboutPendingState;
138 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
139 PBD::Signal2<void, framecnt_t, framecnt_t> Session::NotifyAboutSampleRateMismatch;
140 PBD::Signal0<void> Session::SendFeedback;
141 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
143 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
144 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
145 PBD::Signal2<void,std::string, std::string> Session::Exported;
146 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
147 PBD::Signal0<void> Session::Quit;
148 PBD::Signal0<void> Session::FeedbackDetected;
149 PBD::Signal0<void> Session::SuccessfulGraphSort;
150 PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
152 const framecnt_t Session::bounce_chunk_size = 8192;
153 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
154 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
156 // seconds should be added after the region exceeds end marker
157 #ifdef USE_TRACKS_CODE_FEATURES
158 const uint32_t Session::session_end_shift = 5;
160 const uint32_t Session::session_end_shift = 0;
163 /** @param snapshot_name Snapshot name, without .ardour suffix */
164 Session::Session (AudioEngine &eng,
165 const string& fullpath,
166 const string& snapshot_name,
167 BusProfile* bus_profile,
169 : playlists (new SessionPlaylists)
171 , process_function (&Session::process_with_events)
172 , _bounce_processing_active (false)
173 , waiting_for_sync_offset (false)
174 , _base_frame_rate (0)
175 , _nominal_frame_rate (0)
176 , _current_frame_rate (0)
177 , transport_sub_state (0)
178 , _record_status (Disabled)
179 , _transport_frame (0)
180 , _session_range_location (0)
181 , _session_range_end_is_free (true)
184 , _transport_speed (0)
185 , _default_transport_speed (1.0)
186 , _last_transport_speed (0)
187 , _target_transport_speed (0.0)
188 , auto_play_legal (false)
189 , _last_slave_transport_frame (0)
190 , maximum_output_latency (0)
191 , _requested_return_frame (-1)
192 , current_block_size (0)
193 , _worst_output_latency (0)
194 , _worst_input_latency (0)
195 , _worst_track_latency (0)
196 , _have_captured (false)
197 , _non_soloed_outs_muted (false)
200 , _solo_isolated_cnt (0)
202 , _was_seamless (Config->get_seamless_loop ())
203 , _under_nsm_control (false)
205 , delta_accumulator_cnt (0)
206 , average_slave_delta (1800) // !!! why 1800 ???
208 , have_first_delta_accumulator (false)
209 , _slave_state (Stopped)
210 , _mtc_active (false)
211 , _ltc_active (false)
212 , post_export_sync (false)
213 , post_export_position (0)
215 , _export_rolling (false)
216 , _realtime_export (false)
217 , _export_preroll (0)
218 , _export_latency (0)
219 , _pre_export_mmc_enabled (false)
220 , _name (snapshot_name)
222 , _send_qf_mtc (false)
223 , _pframes_since_last_mtc (0)
224 , session_midi_feedback (0)
226 , loop_changing (false)
228 , _session_dir (new SessionDirectory (fullpath))
229 , _current_snapshot_name (snapshot_name)
231 , state_was_pending (false)
232 , _state_of_the_state (StateOfTheState(CannotSave|InitialConnecting|Loading))
234 , _save_queued (false)
235 , _last_roll_location (0)
236 , _last_roll_or_reversal_location (0)
237 , _last_record_location (0)
238 , pending_locate_roll (false)
239 , pending_locate_frame (0)
240 , pending_locate_flush (false)
241 , pending_abort (false)
242 , pending_auto_loop (false)
243 , _mempool ("Session", 2097152)
244 , lua (lua_newstate (&PBD::ReallocPool::lalloc, &_mempool))
246 , _butler (new Butler (*this))
247 , _post_transport_work (0)
248 , cumulative_rf_motion (0)
250 , _locations (new Locations (*this))
251 , _ignore_skips_updates (false)
252 , _rt_thread_active (false)
253 , _rt_emit_pending (false)
254 , _ac_thread_active (false)
255 , _latency_recompute_pending (0)
257 , outbound_mtc_timecode_frame (0)
258 , next_quarter_frame_to_send (-1)
259 , _frames_per_timecode_frame (0)
260 , _frames_per_hour (0)
261 , _timecode_frames_per_hour (0)
262 , last_timecode_valid (false)
263 , last_timecode_when (0)
264 , _send_timecode_update (false)
276 , ltc_timecode_offset (0)
277 , ltc_timecode_negative_offset (false)
278 , midi_control_ui (0)
280 , _all_route_group (new RouteGroup (*this, "all"))
281 , routes (new RouteList)
282 , _adding_routes_in_progress (false)
283 , _reconnecting_routes_in_progress (false)
284 , _route_deletion_in_progress (false)
285 , destructive_index (0)
286 , _track_number_decimals(1)
287 , default_fade_steepness (0)
288 , default_fade_msecs (0)
289 , _total_free_4k_blocks (0)
290 , _total_free_4k_blocks_uncertain (false)
291 , no_questions_about_missing_files (false)
294 , _bundles (new BundleList)
295 , _bundle_xml_node (0)
299 , click_emphasis_data (0)
301 , click_emphasis_length (0)
302 , _clicks_cleared (0)
303 , _play_range (false)
304 , _range_selection (-1,-1)
305 , _object_selection (-1,-1)
307 , first_file_data_format_reset (true)
308 , first_file_header_format_reset (true)
309 , have_looped (false)
310 , _have_rec_enabled_track (false)
311 , _have_rec_disabled_track (true)
313 , _suspend_timecode_transmission (0)
314 , _speakers (new Speakers)
315 , ignore_route_processor_changes (false)
320 , _vca_manager (new VCAManager (*this))
321 , _midi_regions_use_bbt_beats (false)
325 created_with = string_compose ("%1 %2", PROGRAM_NAME, revision);
327 pthread_mutex_init (&_rt_emit_mutex, 0);
328 pthread_cond_init (&_rt_emit_cond, 0);
330 pthread_mutex_init (&_auto_connect_mutex, 0);
331 pthread_cond_init (&_auto_connect_cond, 0);
333 init_name_id_counter (1); // reset for new sessions, start at 1
334 VCA::set_next_vca_number (1); // reset for new sessions, start at 1
336 pre_engine_init (fullpath);
342 Stateful::loading_state_version = CURRENT_SESSION_FILE_VERSION;
344 #ifdef USE_TRACKS_CODE_FEATURES
345 sr = EngineStateController::instance()->get_current_sample_rate();
347 if (ensure_engine (sr, true)) {
349 throw SessionException (_("Cannot connect to audio/midi engine"));
352 // set samplerate for plugins added early
353 // e.g from templates or MB channelstrip
354 set_block_size (_engine.samples_per_cycle());
355 set_frame_rate (_engine.sample_rate());
357 if (create (mix_template, bus_profile)) {
359 throw SessionException (_("Session initialization failed"));
362 /* if a mix template was provided, then ::create() will
363 * have copied it into the session and we need to load it
364 * so that we have the state ready for ::set_state()
365 * after the engine is started.
367 * Note that we do NOT try to get the sample rate from
368 * the template at this time, though doing so would
369 * be easy if we decided this was an appropriate part
373 if (!mix_template.empty()) {
374 if (load_state (_current_snapshot_name)) {
375 throw SessionException (_("Failed to load template/snapshot state"));
377 store_recent_templates (mix_template);
380 /* load default session properties - if any */
385 if (load_state (_current_snapshot_name)) {
386 throw SessionException (_("Failed to load state"));
389 /* try to get sample rate from XML state so that we
390 * can influence the SR if we set up the audio
395 XMLProperty const * prop;
396 XMLNode const * root (state_tree->root());
397 if ((prop = root->property (X_("sample-rate"))) != 0) {
398 sr = atoi (prop->value());
402 if (ensure_engine (sr, false)) {
404 throw SessionException (_("Cannot connect to audio/midi engine"));
408 if (post_engine_init ()) {
410 throw SessionException (_("Cannot configure audio/midi engine with session parameters"));
413 store_recent_sessions (_name, _path);
415 bool was_dirty = dirty();
417 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
419 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
420 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
423 DirtyChanged (); /* EMIT SIGNAL */
426 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
427 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
429 emit_thread_start ();
430 auto_connect_thread_start ();
432 /* hook us up to the engine since we are now completely constructed */
434 BootMessage (_("Connect to engine"));
436 _engine.set_session (this);
437 _engine.reset_timebase ();
439 #ifdef USE_TRACKS_CODE_FEATURES
441 EngineStateController::instance()->set_session(this);
444 if ( ARDOUR::Profile->get_trx () ) {
446 /* Waves Tracks: fill session with tracks basing on the amount of inputs.
447 * each available input must have corresponding track when session starts.
450 uint32_t how_many (0);
452 std::vector<std::string> inputs;
453 EngineStateController::instance()->get_physical_audio_inputs(inputs);
455 how_many = inputs.size();
457 list<boost::shared_ptr<AudioTrack> > tracks;
459 // Track names after driver
460 if (Config->get_tracks_auto_naming() == NameAfterDriver) {
461 string track_name = "";
462 for (std::vector<string>::size_type i = 0; i < inputs.size(); ++i) {
464 track_name = inputs[i];
465 replace_all (track_name, "system:capture", "");
467 list<boost::shared_ptr<AudioTrack> > single_track = new_audio_track (1, 1, Normal, 0, 1, track_name);
468 tracks.insert(tracks.begin(), single_track.front());
470 } else { // Default track names
471 tracks = new_audio_track (1, 1, Normal, 0, how_many, string());
474 if (tracks.size() != how_many) {
476 throw failed_constructor ();
481 _midi_regions_use_bbt_beats = false;
485 BootMessage (_("Session loading complete"));
497 Session::next_name_id ()
499 return g_atomic_int_add (&_name_id_counter, 1);
503 Session::name_id_counter ()
505 return g_atomic_int_get (&_name_id_counter);
509 Session::init_name_id_counter (guint n)
511 g_atomic_int_set (&_name_id_counter, n);
515 Session::ensure_engine (uint32_t desired_sample_rate, bool isnew)
517 if (_engine.current_backend() == 0) {
518 /* backend is unknown ... */
519 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
520 if (r.get_value_or (-1) != 0) {
523 } else if (!isnew && _engine.running() && _engine.sample_rate () == desired_sample_rate) {
525 } else if (_engine.setup_required()) {
526 /* backend is known, but setup is needed */
527 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
528 if (r.get_value_or (-1) != 0) {
531 } else if (!_engine.running()) {
532 if (_engine.start()) {
537 /* at this point the engine should be running */
539 if (!_engine.running()) {
543 return immediately_post_engine ();
548 Session::immediately_post_engine ()
550 /* Do various initializations that should take place directly after we
551 * know that the engine is running, but before we either create a
552 * session or set state for an existing one.
555 if (how_many_dsp_threads () > 1) {
556 /* For now, only create the graph if we are using >1 DSP threads, as
557 it is a bit slower than the old code with 1 thread.
559 _process_graph.reset (new Graph (*this));
562 /* every time we reconnect, recompute worst case output latencies */
564 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
566 if (synced_to_engine()) {
567 _engine.transport_stop ();
570 if (config.get_jack_time_master()) {
571 _engine.transport_locate (_transport_frame);
576 BootMessage (_("Set up LTC"));
578 BootMessage (_("Set up Click"));
580 BootMessage (_("Set up standard connections"));
584 catch (failed_constructor& err) {
588 /* TODO, connect in different thread. (PortRegisteredOrUnregistered may be in RT context)
590 _engine.PortRegisteredOrUnregistered.connect_same_thread (*this, boost::bind (&Session::setup_bundles, this));
598 vector<void*> debug_pointers;
600 /* if we got to here, leaving pending capture state around
604 remove_pending_capture_state ();
608 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
610 /* stop autoconnecting */
611 auto_connect_thread_terminate ();
613 /* disconnect from any and all signals that we are connected to */
615 Port::PortSignalDrop (); /* EMIT SIGNAL */
618 /* shutdown control surface protocols while we still have ports
619 and the engine to move data to any devices.
622 ControlProtocolManager::instance().drop_protocols ();
624 MIDI::Name::MidiPatchManager::instance().remove_search_path(session_directory().midi_patch_path());
626 _engine.remove_session ();
628 #ifdef USE_TRACKS_CODE_FEATURES
629 EngineStateController::instance()->remove_session();
632 /* deregister all ports - there will be no process or any other
633 * callbacks from the engine any more.
636 Port::PortDrop (); /* EMIT SIGNAL */
640 /* clear history so that no references to objects are held any more */
644 /* clear state tree so that no references to objects are held any more */
649 // unregister all lua functions, drop held references (if any)
651 lua.do_command ("Session = nil");
659 lua.collect_garbage ();
661 /* reset dynamic state version back to default */
662 Stateful::loading_state_version = 0;
664 _butler->drop_references ();
668 delete _all_route_group;
670 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
671 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
675 if (click_data != default_click) {
676 delete [] click_data;
679 if (click_emphasis_data != default_click_emphasis) {
680 delete [] click_emphasis_data;
685 /* need to remove auditioner before monitoring section
686 * otherwise it is re-connected */
689 /* drop references to routes held by the monitoring section
690 * specifically _monitor_out aux/listen references */
691 remove_monitor_section();
693 /* clear out any pending dead wood from RCU managed objects */
698 AudioDiskstream::free_working_buffers();
700 /* tell everyone who is still standing that we're about to die */
703 /* tell everyone to drop references and delete objects as we go */
705 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
706 RegionFactory::delete_all_regions ();
708 /* Do this early so that VCAs no longer hold references to routes */
710 DEBUG_TRACE (DEBUG::Destruction, "delete vcas\n");
713 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
715 /* reset these three references to special routes before we do the usual route delete thing */
717 _master_out.reset ();
718 _monitor_out.reset ();
721 RCUWriter<RouteList> writer (routes);
722 boost::shared_ptr<RouteList> r = writer.get_copy ();
724 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
725 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
726 (*i)->drop_references ();
730 /* writer goes out of scope and updates master */
735 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
736 Glib::Threads::Mutex::Lock lm (source_lock);
737 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
738 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
739 i->second->drop_references ();
745 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
748 emit_thread_terminate ();
750 pthread_cond_destroy (&_rt_emit_cond);
751 pthread_mutex_destroy (&_rt_emit_mutex);
753 pthread_cond_destroy (&_auto_connect_cond);
754 pthread_mutex_destroy (&_auto_connect_mutex);
756 delete _scene_changer; _scene_changer = 0;
757 delete midi_control_ui; midi_control_ui = 0;
759 delete _mmc; _mmc = 0;
760 delete _midi_ports; _midi_ports = 0;
761 delete _locations; _locations = 0;
766 /* clear event queue, the session is gone, nobody is interested in
767 * those anymore, but they do leak memory if not removed
769 while (!immediate_events.empty ()) {
770 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
771 SessionEvent *ev = immediate_events.front ();
772 DEBUG_TRACE (DEBUG::SessionEvents, string_compose ("Drop event: %1\n", enum_2_string (ev->type)));
773 immediate_events.pop_front ();
777 case SessionEvent::AutoLoop:
778 case SessionEvent::AutoLoopDeclick:
779 case SessionEvent::Skip:
780 case SessionEvent::PunchIn:
781 case SessionEvent::PunchOut:
782 case SessionEvent::StopOnce:
783 case SessionEvent::RangeStop:
784 case SessionEvent::RangeLocate:
788 case SessionEvent::RealTimeOperation:
795 del = del && !_remove_event (ev);
802 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
804 BOOST_SHOW_POINTERS ();
808 Session::setup_ltc ()
812 _ltc_input.reset (new IO (*this, X_("LTC In"), IO::Input));
813 _ltc_output.reset (new IO (*this, X_("LTC Out"), IO::Output));
815 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC In"))) != 0) {
816 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
819 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
820 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
822 reconnect_ltc_input ();
825 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC Out"))) != 0) {
826 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
829 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
830 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
832 reconnect_ltc_output ();
835 /* fix up names of LTC ports because we don't want the normal
836 * IO style of NAME/TYPE-{in,out}N
839 _ltc_input->nth (0)->set_name (X_("LTC-in"));
840 _ltc_output->nth (0)->set_name (X_("LTC-out"));
844 Session::setup_click ()
848 boost::shared_ptr<AutomationList> gl (new AutomationList (Evoral::Parameter (GainAutomation)));
849 boost::shared_ptr<GainControl> gain_control = boost::shared_ptr<GainControl> (new GainControl (*this, Evoral::Parameter(GainAutomation), gl));
851 _click_io.reset (new ClickIO (*this, X_("Click")));
852 _click_gain.reset (new Amp (*this, _("Fader"), gain_control, true));
853 _click_gain->activate ();
855 setup_click_state (state_tree->root());
857 setup_click_state (0);
862 Session::setup_click_state (const XMLNode* node)
864 const XMLNode* child = 0;
866 if (node && (child = find_named_node (*node, "Click")) != 0) {
868 /* existing state for Click */
871 if (Stateful::loading_state_version < 3000) {
872 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
874 const XMLNodeList& children (child->children());
875 XMLNodeList::const_iterator i = children.begin();
876 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
878 if (i != children.end()) {
879 c = _click_gain->set_state (**i, Stateful::loading_state_version);
885 _clicking = Config->get_clicking ();
889 error << _("could not setup Click I/O") << endmsg;
896 /* default state for Click: dual-mono to first 2 physical outputs */
899 _engine.get_physical_outputs (DataType::AUDIO, outs);
901 for (uint32_t physport = 0; physport < 2; ++physport) {
902 if (outs.size() > physport) {
903 if (_click_io->add_port (outs[physport], this)) {
904 // relax, even though its an error
909 if (_click_io->n_ports () > ChanCount::ZERO) {
910 _clicking = Config->get_clicking ();
916 Session::setup_bundles ()
920 RCUWriter<BundleList> writer (_bundles);
921 boost::shared_ptr<BundleList> b = writer.get_copy ();
922 for (BundleList::iterator i = b->begin(); i != b->end();) {
923 if (boost::dynamic_pointer_cast<UserBundle>(*i)) {
931 vector<string> inputs[DataType::num_types];
932 vector<string> outputs[DataType::num_types];
933 for (uint32_t i = 0; i < DataType::num_types; ++i) {
934 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
935 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
938 /* Create a set of Bundle objects that map
939 to the physical I/O currently available. We create both
940 mono and stereo bundles, so that the common cases of mono
941 and stereo tracks get bundles to put in their mixer strip
942 in / out menus. There may be a nicer way of achieving that;
943 it doesn't really scale that well to higher channel counts
946 /* mono output bundles */
948 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
950 std::string pn = _engine.get_pretty_name_by_name (outputs[DataType::AUDIO][np]);
952 snprintf (buf, sizeof (buf), _("out %s"), pn.c_str());
954 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
957 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
958 c->add_channel (_("mono"), DataType::AUDIO);
959 c->set_port (0, outputs[DataType::AUDIO][np]);
961 add_bundle (c, false);
964 /* stereo output bundles */
966 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
967 if (np + 1 < outputs[DataType::AUDIO].size()) {
969 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
970 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
971 c->add_channel (_("L"), DataType::AUDIO);
972 c->set_port (0, outputs[DataType::AUDIO][np]);
973 c->add_channel (_("R"), DataType::AUDIO);
974 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
976 add_bundle (c, false);
980 /* mono input bundles */
982 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
984 std::string pn = _engine.get_pretty_name_by_name (inputs[DataType::AUDIO][np]);
986 snprintf (buf, sizeof (buf), _("in %s"), pn.c_str());
988 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
991 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
992 c->add_channel (_("mono"), DataType::AUDIO);
993 c->set_port (0, inputs[DataType::AUDIO][np]);
995 add_bundle (c, false);
998 /* stereo input bundles */
1000 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
1001 if (np + 1 < inputs[DataType::AUDIO].size()) {
1003 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
1005 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
1006 c->add_channel (_("L"), DataType::AUDIO);
1007 c->set_port (0, inputs[DataType::AUDIO][np]);
1008 c->add_channel (_("R"), DataType::AUDIO);
1009 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
1011 add_bundle (c, false);
1015 /* MIDI input bundles */
1017 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
1018 string n = inputs[DataType::MIDI][np];
1019 std::string pn = _engine.get_pretty_name_by_name (n);
1023 boost::erase_first (n, X_("alsa_pcm:"));
1025 boost::shared_ptr<Bundle> c (new Bundle (n, false));
1026 c->add_channel ("", DataType::MIDI);
1027 c->set_port (0, inputs[DataType::MIDI][np]);
1028 add_bundle (c, false);
1031 /* MIDI output bundles */
1033 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
1034 string n = outputs[DataType::MIDI][np];
1035 std::string pn = _engine.get_pretty_name_by_name (n);
1039 boost::erase_first (n, X_("alsa_pcm:"));
1041 boost::shared_ptr<Bundle> c (new Bundle (n, true));
1042 c->add_channel ("", DataType::MIDI);
1043 c->set_port (0, outputs[DataType::MIDI][np]);
1044 add_bundle (c, false);
1047 // we trust the backend to only calls us if there's a change
1048 BundleAddedOrRemoved (); /* EMIT SIGNAL */
1052 Session::auto_connect_master_bus ()
1054 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
1058 // Waves Tracks: Do not connect master bas for Tracks if AutoConnectMaster option is not set
1059 // In this case it means "Multi Out" output mode
1060 if (ARDOUR::Profile->get_trx() && !(Config->get_output_auto_connect() & AutoConnectMaster) ) {
1064 /* if requested auto-connect the outputs to the first N physical ports.
1067 uint32_t limit = _master_out->n_outputs().n_total();
1068 vector<string> outputs[DataType::num_types];
1070 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1071 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1074 for (uint32_t n = 0; n < limit; ++n) {
1075 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
1077 if (outputs[p->type()].size() > n) {
1078 connect_to = outputs[p->type()][n];
1081 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
1082 if (_master_out->output()->connect (p, connect_to, this)) {
1083 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
1092 Session::remove_monitor_section ()
1094 if (!_monitor_out || Profile->get_trx()) {
1098 /* force reversion to Solo-In-Place */
1099 Config->set_solo_control_is_listen_control (false);
1101 /* if we are auditioning, cancel it ... this is a workaround
1102 to a problem (auditioning does not execute the process graph,
1103 which is needed to remove routes when using >1 core for processing)
1108 /* Hold process lock while doing this so that we don't hear bits and
1109 * pieces of audio as we work on each route.
1112 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1114 /* Connect tracks to monitor section. Note that in an
1115 existing session, the internal sends will already exist, but we want the
1116 routes to notice that they connect to the control out specifically.
1120 boost::shared_ptr<RouteList> r = routes.reader ();
1121 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1123 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
1125 if ((*x)->is_monitor()) {
1127 } else if ((*x)->is_master()) {
1130 (*x)->remove_aux_or_listen (_monitor_out);
1135 remove_route (_monitor_out);
1136 if (_state_of_the_state & Deletion) {
1140 auto_connect_master_bus ();
1143 auditioner->connect ();
1146 Config->ParameterChanged ("use-monitor-bus");
1150 Session::add_monitor_section ()
1154 if (_monitor_out || !_master_out || Profile->get_trx()) {
1158 boost::shared_ptr<Route> r (new Route (*this, _("Monitor"), PresentationInfo::MonitorOut, DataType::AUDIO));
1164 BOOST_MARK_ROUTE(r);
1167 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1168 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1169 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1171 error << _("Cannot create monitor section. 'Monitor' Port name is not unique.") << endmsg;
1176 add_routes (rl, false, false, false, 0);
1178 assert (_monitor_out);
1180 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
1181 are undefined, at best.
1184 uint32_t limit = _monitor_out->n_inputs().n_audio();
1188 /* connect the inputs to the master bus outputs. this
1189 * represents a separate data feed from the internal sends from
1190 * each route. as of jan 2011, it allows the monitor section to
1191 * conditionally ignore either the internal sends or the normal
1192 * input feed, but we should really find a better way to do
1196 _master_out->output()->disconnect (this);
1198 for (uint32_t n = 0; n < limit; ++n) {
1199 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1200 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1203 string connect_to = o->name();
1204 if (_monitor_out->input()->connect (p, connect_to, this)) {
1205 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1213 /* if monitor section is not connected, connect it to physical outs
1216 if ((Config->get_auto_connect_standard_busses () || Profile->get_mixbus ()) && !_monitor_out->output()->connected ()) {
1218 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1220 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1223 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1225 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1226 Config->get_monitor_bus_preferred_bundle())
1232 /* Monitor bus is audio only */
1234 vector<string> outputs[DataType::num_types];
1236 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1237 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1240 uint32_t mod = outputs[DataType::AUDIO].size();
1241 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1245 for (uint32_t n = 0; n < limit; ++n) {
1247 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1249 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1250 connect_to = outputs[DataType::AUDIO][n % mod];
1253 if (!connect_to.empty()) {
1254 if (_monitor_out->output()->connect (p, connect_to, this)) {
1255 error << string_compose (
1256 _("cannot connect control output %1 to %2"),
1267 /* Hold process lock while doing this so that we don't hear bits and
1268 * pieces of audio as we work on each route.
1271 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1273 /* Connect tracks to monitor section. Note that in an
1274 existing session, the internal sends will already exist, but we want the
1275 routes to notice that they connect to the control out specifically.
1279 boost::shared_ptr<RouteList> rls = routes.reader ();
1281 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1283 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1285 if ((*x)->is_monitor()) {
1287 } else if ((*x)->is_master()) {
1290 (*x)->enable_monitor_send ();
1295 auditioner->connect ();
1297 Config->ParameterChanged ("use-monitor-bus");
1301 Session::reset_monitor_section ()
1303 /* Process lock should be held by the caller.*/
1305 if (!_monitor_out || Profile->get_trx()) {
1309 uint32_t limit = _master_out->n_outputs().n_audio();
1311 /* connect the inputs to the master bus outputs. this
1312 * represents a separate data feed from the internal sends from
1313 * each route. as of jan 2011, it allows the monitor section to
1314 * conditionally ignore either the internal sends or the normal
1315 * input feed, but we should really find a better way to do
1319 _master_out->output()->disconnect (this);
1320 _monitor_out->output()->disconnect (this);
1322 // monitor section follow master bus - except midi
1323 ChanCount mon_chn (_master_out->output()->n_ports());
1324 mon_chn.set_midi (0);
1326 _monitor_out->input()->ensure_io (mon_chn, false, this);
1327 _monitor_out->output()->ensure_io (mon_chn, false, this);
1329 for (uint32_t n = 0; n < limit; ++n) {
1330 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1331 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1334 string connect_to = o->name();
1335 if (_monitor_out->input()->connect (p, connect_to, this)) {
1336 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1343 /* connect monitor section to physical outs
1346 if (Config->get_auto_connect_standard_busses()) {
1348 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1350 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1353 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1355 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1356 Config->get_monitor_bus_preferred_bundle())
1362 /* Monitor bus is audio only */
1364 vector<string> outputs[DataType::num_types];
1366 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1367 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1370 uint32_t mod = outputs[DataType::AUDIO].size();
1371 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1375 for (uint32_t n = 0; n < limit; ++n) {
1377 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1379 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1380 connect_to = outputs[DataType::AUDIO][n % mod];
1383 if (!connect_to.empty()) {
1384 if (_monitor_out->output()->connect (p, connect_to, this)) {
1385 error << string_compose (
1386 _("cannot connect control output %1 to %2"),
1397 /* Connect tracks to monitor section. Note that in an
1398 existing session, the internal sends will already exist, but we want the
1399 routes to notice that they connect to the control out specifically.
1403 boost::shared_ptr<RouteList> rls = routes.reader ();
1405 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1407 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1409 if ((*x)->is_monitor()) {
1411 } else if ((*x)->is_master()) {
1414 (*x)->enable_monitor_send ();
1420 Session::hookup_io ()
1422 /* stop graph reordering notifications from
1423 causing resorts, etc.
1426 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
1430 /* we delay creating the auditioner till now because
1431 it makes its own connections to ports.
1435 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
1437 throw failed_constructor ();
1439 a->use_new_diskstream ();
1443 catch (failed_constructor& err) {
1444 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
1448 /* load bundles, which we may have postponed earlier on */
1449 if (_bundle_xml_node) {
1450 load_bundles (*_bundle_xml_node);
1451 delete _bundle_xml_node;
1454 /* Tell all IO objects to connect themselves together */
1456 IO::enable_connecting ();
1458 /* Now tell all "floating" ports to connect to whatever
1459 they should be connected to.
1462 AudioEngine::instance()->reconnect_ports ();
1464 /* Anyone who cares about input state, wake up and do something */
1466 IOConnectionsComplete (); /* EMIT SIGNAL */
1468 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
1470 /* now handle the whole enchilada as if it was one
1471 graph reorder event.
1476 /* update the full solo state, which can't be
1477 correctly determined on a per-route basis, but
1478 needs the global overview that only the session
1482 update_route_solo_state ();
1486 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
1488 boost::shared_ptr<Track> track = wp.lock ();
1493 boost::shared_ptr<Playlist> playlist;
1495 if ((playlist = track->playlist()) != 0) {
1496 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
1497 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
1498 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
1503 Session::record_enabling_legal () const
1505 /* this used to be in here, but survey says.... we don't need to restrict it */
1506 // if (record_status() == Recording) {
1510 if (Config->get_all_safe()) {
1517 Session::set_track_monitor_input_status (bool yn)
1519 boost::shared_ptr<RouteList> rl = routes.reader ();
1520 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1521 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1522 if (tr && tr->rec_enable_control()->get_value()) {
1523 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1524 tr->request_input_monitoring (yn);
1530 Session::auto_punch_start_changed (Location* location)
1532 replace_event (SessionEvent::PunchIn, location->start());
1534 if (get_record_enabled() && config.get_punch_in()) {
1535 /* capture start has been changed, so save new pending state */
1536 save_state ("", true);
1541 Session::auto_punch_end_changed (Location* location)
1543 framepos_t when_to_stop = location->end();
1544 // when_to_stop += _worst_output_latency + _worst_input_latency;
1545 replace_event (SessionEvent::PunchOut, when_to_stop);
1549 Session::auto_punch_changed (Location* location)
1551 framepos_t when_to_stop = location->end();
1553 replace_event (SessionEvent::PunchIn, location->start());
1554 //when_to_stop += _worst_output_latency + _worst_input_latency;
1555 replace_event (SessionEvent::PunchOut, when_to_stop);
1558 /** @param loc A loop location.
1559 * @param pos Filled in with the start time of the required fade-out (in session frames).
1560 * @param length Filled in with the length of the required fade-out.
1563 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
1565 pos = max (loc->start(), loc->end() - 64);
1566 length = loc->end() - pos;
1570 Session::auto_loop_changed (Location* location)
1572 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1575 auto_loop_declick_range (location, dcp, dcl);
1577 if (transport_rolling() && play_loop) {
1579 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1581 // if (_transport_frame > location->end()) {
1583 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1584 // relocate to beginning of loop
1585 clear_events (SessionEvent::LocateRoll);
1587 request_locate (location->start(), true);
1590 else if (Config->get_seamless_loop() && !loop_changing) {
1592 // schedule a locate-roll to refill the diskstreams at the
1593 // previous loop end
1594 loop_changing = true;
1596 if (location->end() > last_loopend) {
1597 clear_events (SessionEvent::LocateRoll);
1598 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1604 clear_events (SessionEvent::AutoLoopDeclick);
1605 clear_events (SessionEvent::AutoLoop);
1608 /* possibly move playhead if not rolling; if we are rolling we'll move
1609 to the loop start on stop if that is appropriate.
1614 if (!transport_rolling() && select_playhead_priority_target (pos)) {
1615 if (pos == location->start()) {
1616 request_locate (pos);
1621 last_loopend = location->end();
1626 Session::set_auto_punch_location (Location* location)
1630 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1631 punch_connections.drop_connections();
1632 existing->set_auto_punch (false, this);
1633 remove_event (existing->start(), SessionEvent::PunchIn);
1634 clear_events (SessionEvent::PunchOut);
1635 auto_punch_location_changed (0);
1640 if (location == 0) {
1644 if (location->end() <= location->start()) {
1645 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1649 punch_connections.drop_connections ();
1651 location->StartChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, location));
1652 location->EndChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, location));
1653 location->Changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, location));
1655 location->set_auto_punch (true, this);
1657 auto_punch_changed (location);
1659 auto_punch_location_changed (location);
1663 Session::set_session_extents (framepos_t start, framepos_t end)
1666 if ((existing = _locations->session_range_location()) == 0) {
1667 //if there is no existing session, we need to make a new session location (should never happen)
1668 existing = new Location (*this, 0, 0, _("session"), Location::IsSessionRange);
1672 error << _("Session: you can't use that location for session start/end)") << endmsg;
1676 existing->set( start, end );
1682 Session::set_auto_loop_location (Location* location)
1686 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1687 loop_connections.drop_connections ();
1688 existing->set_auto_loop (false, this);
1689 remove_event (existing->end(), SessionEvent::AutoLoop);
1692 auto_loop_declick_range (existing, dcp, dcl);
1693 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1694 auto_loop_location_changed (0);
1699 if (location == 0) {
1703 if (location->end() <= location->start()) {
1704 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1708 last_loopend = location->end();
1710 loop_connections.drop_connections ();
1712 location->StartChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1713 location->EndChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1714 location->Changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1715 location->FlagsChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1717 location->set_auto_loop (true, this);
1719 if (Config->get_loop_is_mode() && play_loop && Config->get_seamless_loop()) {
1720 // set all tracks to use internal looping
1721 boost::shared_ptr<RouteList> rl = routes.reader ();
1722 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1723 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1724 if (tr && !tr->hidden()) {
1725 tr->set_loop (location);
1730 /* take care of our stuff first */
1732 auto_loop_changed (location);
1734 /* now tell everyone else */
1736 auto_loop_location_changed (location);
1740 Session::update_marks (Location*)
1746 Session::update_skips (Location* loc, bool consolidate)
1748 if (_ignore_skips_updates) {
1752 Locations::LocationList skips;
1755 PBD::Unwinder<bool> uw (_ignore_skips_updates, true);
1756 consolidate_skips (loc);
1759 sync_locations_to_skips ();
1765 Session::consolidate_skips (Location* loc)
1767 Locations::LocationList all_locations = _locations->list ();
1769 for (Locations::LocationList::iterator l = all_locations.begin(); l != all_locations.end(); ) {
1771 if (!(*l)->is_skip ()) {
1776 /* don't test against self */
1783 switch (Evoral::coverage ((*l)->start(), (*l)->end(), loc->start(), loc->end())) {
1784 case Evoral::OverlapInternal:
1785 case Evoral::OverlapExternal:
1786 case Evoral::OverlapStart:
1787 case Evoral::OverlapEnd:
1788 /* adjust new location to cover existing one */
1789 loc->set_start (min (loc->start(), (*l)->start()));
1790 loc->set_end (max (loc->end(), (*l)->end()));
1791 /* we don't need this one any more */
1792 _locations->remove (*l);
1793 /* the location has been deleted, so remove reference to it in our local list */
1794 l = all_locations.erase (l);
1797 case Evoral::OverlapNone:
1805 Session::sync_locations_to_skips ()
1807 /* This happens asynchronously (in the audioengine thread). After the clear is done, we will call
1808 * Session::_sync_locations_to_skips() from the audioengine thread.
1810 clear_events (SessionEvent::Skip, boost::bind (&Session::_sync_locations_to_skips, this));
1814 Session::_sync_locations_to_skips ()
1816 /* called as a callback after existing Skip events have been cleared from a realtime audioengine thread */
1818 Locations::LocationList const & locs (_locations->list());
1820 for (Locations::LocationList::const_iterator i = locs.begin(); i != locs.end(); ++i) {
1822 Location* location = *i;
1824 if (location->is_skip() && location->is_skipping()) {
1825 SessionEvent* ev = new SessionEvent (SessionEvent::Skip, SessionEvent::Add, location->start(), location->end(), 1.0);
1833 Session::location_added (Location *location)
1835 if (location->is_auto_punch()) {
1836 set_auto_punch_location (location);
1839 if (location->is_auto_loop()) {
1840 set_auto_loop_location (location);
1843 if (location->is_session_range()) {
1844 /* no need for any signal handling or event setting with the session range,
1845 because we keep a direct reference to it and use its start/end directly.
1847 _session_range_location = location;
1850 if (location->is_mark()) {
1851 /* listen for per-location signals that require us to do any * global updates for marks */
1853 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1854 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1855 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1856 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1859 if (location->is_skip()) {
1860 /* listen for per-location signals that require us to update skip-locate events */
1862 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1863 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1864 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1865 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, false));
1867 update_skips (location, true);
1874 Session::location_removed (Location *location)
1876 if (location->is_auto_loop()) {
1877 set_auto_loop_location (0);
1878 set_track_loop (false);
1881 if (location->is_auto_punch()) {
1882 set_auto_punch_location (0);
1885 if (location->is_session_range()) {
1886 /* this is never supposed to happen */
1887 error << _("programming error: session range removed!") << endl;
1890 if (location->is_skip()) {
1892 update_skips (location, false);
1899 Session::locations_changed ()
1901 _locations->apply (*this, &Session::_locations_changed);
1905 Session::_locations_changed (const Locations::LocationList& locations)
1907 /* There was some mass-change in the Locations object.
1909 We might be re-adding a location here but it doesn't actually matter
1910 for all the locations that the Session takes an interest in.
1914 PBD::Unwinder<bool> protect_ignore_skip_updates (_ignore_skips_updates, true);
1915 for (Locations::LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
1916 location_added (*i);
1920 update_skips (NULL, false);
1924 Session::enable_record ()
1926 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1927 /* no recording at anything except normal speed */
1932 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1934 if (rs == Recording) {
1938 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1940 _last_record_location = _transport_frame;
1941 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1943 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1944 set_track_monitor_input_status (true);
1947 RecordStateChanged ();
1954 Session::set_all_tracks_record_enabled (bool enable )
1956 boost::shared_ptr<RouteList> rl = routes.reader();
1957 set_controls (route_list_to_control_list (rl, &Stripable::rec_enable_control), enable, Controllable::NoGroup);
1961 Session::disable_record (bool rt_context, bool force)
1965 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1967 if (!Config->get_latched_record_enable () || force) {
1968 g_atomic_int_set (&_record_status, Disabled);
1969 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1971 if (rs == Recording) {
1972 g_atomic_int_set (&_record_status, Enabled);
1976 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1977 set_track_monitor_input_status (false);
1980 RecordStateChanged (); /* emit signal */
1983 remove_pending_capture_state ();
1989 Session::step_back_from_record ()
1991 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1993 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1994 set_track_monitor_input_status (false);
1997 RecordStateChanged (); /* emit signal */
2002 Session::maybe_enable_record ()
2004 if (_step_editors > 0) {
2008 g_atomic_int_set (&_record_status, Enabled);
2010 /* This function is currently called from somewhere other than an RT thread.
2011 This save_state() call therefore doesn't impact anything. Doing it here
2012 means that we save pending state of which sources the next record will use,
2013 which gives us some chance of recovering from a crash during the record.
2016 save_state ("", true);
2018 if (_transport_speed) {
2019 if (!config.get_punch_in()) {
2023 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
2024 RecordStateChanged (); /* EMIT SIGNAL */
2031 Session::audible_frame () const
2035 frameoffset_t offset = worst_playback_latency (); // - _engine.samples_since_cycle_start ();
2036 offset *= transport_speed ();
2038 if (synced_to_engine()) {
2039 /* Note: this is basically just sync-to-JACK */
2040 ret = _engine.transport_frame();
2042 ret = _transport_frame;
2045 if (transport_rolling()) {
2048 /* Check to see if we have passed the first guaranteed
2049 * audible frame past our last start position. if not,
2050 * return that last start point because in terms
2051 * of audible frames, we have not moved yet.
2053 * `Start position' in this context means the time we last
2054 * either started, located, or changed transport direction.
2057 if (_transport_speed > 0.0f) {
2059 if (!play_loop || !have_looped) {
2060 if (ret < _last_roll_or_reversal_location) {
2061 return _last_roll_or_reversal_location;
2065 Location *location = _locations->auto_loop_location();
2066 frameoffset_t lo = location->start() - ret;
2068 ret = location->end () - lo;
2072 } else if (_transport_speed < 0.0f) {
2074 /* XXX wot? no backward looping? */
2076 if (ret > _last_roll_or_reversal_location) {
2077 return _last_roll_or_reversal_location;
2082 return std::max ((framepos_t)0, ret);
2086 Session::set_frame_rate (framecnt_t frames_per_second)
2088 /** \fn void Session::set_frame_size(framecnt_t)
2089 the AudioEngine object that calls this guarantees
2090 that it will not be called while we are also in
2091 ::process(). Its fine to do things that block
2095 if (_base_frame_rate == 0) {
2096 _base_frame_rate = frames_per_second;
2098 else if (_base_frame_rate != frames_per_second && frames_per_second != _nominal_frame_rate) {
2099 NotifyAboutSampleRateMismatch (_base_frame_rate, frames_per_second);
2101 _nominal_frame_rate = frames_per_second;
2106 reset_write_sources (false);
2108 // XXX we need some equivalent to this, somehow
2109 // SndFileSource::setup_standard_crossfades (frames_per_second);
2113 /* XXX need to reset/reinstantiate all LADSPA plugins */
2117 Session::set_block_size (pframes_t nframes)
2119 /* the AudioEngine guarantees
2120 that it will not be called while we are also in
2121 ::process(). It is therefore fine to do things that block
2126 current_block_size = nframes;
2130 boost::shared_ptr<RouteList> r = routes.reader ();
2132 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2133 (*i)->set_block_size (nframes);
2136 boost::shared_ptr<RouteList> rl = routes.reader ();
2137 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2138 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2140 tr->set_block_size (nframes);
2144 set_worst_io_latencies ();
2150 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
2152 boost::shared_ptr<Route> r2;
2154 if (r1->feeds (rbase) && rbase->feeds (r1)) {
2155 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
2159 /* make a copy of the existing list of routes that feed r1 */
2161 Route::FedBy existing (r1->fed_by());
2163 /* for each route that feeds r1, recurse, marking it as feeding
2167 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
2168 if (!(r2 = i->r.lock ())) {
2169 /* (*i) went away, ignore it */
2173 /* r2 is a route that feeds r1 which somehow feeds base. mark
2174 base as being fed by r2
2177 rbase->add_fed_by (r2, i->sends_only);
2181 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
2185 if (r1->feeds (r2) && r2->feeds (r1)) {
2189 /* now recurse, so that we can mark base as being fed by
2190 all routes that feed r2
2193 trace_terminal (r2, rbase);
2200 Session::resort_routes ()
2202 /* don't do anything here with signals emitted
2203 by Routes during initial setup or while we
2204 are being destroyed.
2207 if (_state_of_the_state & (InitialConnecting | Deletion)) {
2211 if (_route_deletion_in_progress) {
2216 RCUWriter<RouteList> writer (routes);
2217 boost::shared_ptr<RouteList> r = writer.get_copy ();
2218 resort_routes_using (r);
2219 /* writer goes out of scope and forces update */
2223 if (DEBUG_ENABLED(DEBUG::Graph)) {
2224 boost::shared_ptr<RouteList> rl = routes.reader ();
2225 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2226 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
2228 const Route::FedBy& fb ((*i)->fed_by());
2230 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
2231 boost::shared_ptr<Route> sf = f->r.lock();
2233 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
2242 /** This is called whenever we need to rebuild the graph of how we will process
2244 * @param r List of routes, in any order.
2248 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
2250 /* We are going to build a directed graph of our routes;
2251 this is where the edges of that graph are put.
2256 /* Go through all routes doing two things:
2258 * 1. Collect the edges of the route graph. Each of these edges
2259 * is a pair of routes, one of which directly feeds the other
2260 * either by a JACK connection or by an internal send.
2262 * 2. Begin the process of making routes aware of which other
2263 * routes directly or indirectly feed them. This information
2264 * is used by the solo code.
2267 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2269 /* Clear out the route's list of direct or indirect feeds */
2270 (*i)->clear_fed_by ();
2272 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
2274 bool via_sends_only;
2276 /* See if this *j feeds *i according to the current state of the JACK
2277 connections and internal sends.
2279 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
2280 /* add the edge to the graph (part #1) */
2281 edges.add (*j, *i, via_sends_only);
2282 /* tell the route (for part #2) */
2283 (*i)->add_fed_by (*j, via_sends_only);
2288 /* Attempt a topological sort of the route graph */
2289 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
2291 if (sorted_routes) {
2292 /* We got a satisfactory topological sort, so there is no feedback;
2295 Note: the process graph rechain does not require a
2296 topologically-sorted list, but hey ho.
2298 if (_process_graph) {
2299 _process_graph->rechain (sorted_routes, edges);
2302 _current_route_graph = edges;
2304 /* Complete the building of the routes' lists of what directly
2305 or indirectly feeds them.
2307 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2308 trace_terminal (*i, *i);
2311 *r = *sorted_routes;
2314 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
2315 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2316 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 presentation order %2\n", (*i)->name(), (*i)->presentation_info().order()));
2320 SuccessfulGraphSort (); /* EMIT SIGNAL */
2323 /* The topological sort failed, so we have a problem. Tell everyone
2324 and stick to the old graph; this will continue to be processed, so
2325 until the feedback is fixed, what is played back will not quite
2326 reflect what is actually connected. Note also that we do not
2327 do trace_terminal here, as it would fail due to an endless recursion,
2328 so the solo code will think that everything is still connected
2332 FeedbackDetected (); /* EMIT SIGNAL */
2337 /** Find a route name starting with \a base, maybe followed by the
2338 * lowest \a id. \a id will always be added if \a definitely_add_number
2339 * is true on entry; otherwise it will only be added if required
2340 * to make the name unique.
2342 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
2343 * The available route name with the lowest ID will be used, and \a id
2344 * will be set to the ID.
2346 * \return false if a route name could not be found, and \a track_name
2347 * and \a id do not reflect a free route name.
2350 Session::find_route_name (string const & base, uint32_t& id, string& name, bool definitely_add_number)
2352 /* the base may conflict with ports that do not belong to existing
2353 routes, but hidden objects like the click track. So check port names
2354 before anything else.
2357 for (vector<string>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
2358 if (base == *reserved) {
2359 /* Check if this reserved name already exists, and if
2360 so, disallow it without a numeric suffix.
2362 if (route_by_name (*reserved)) {
2363 definitely_add_number = true;
2372 if (!definitely_add_number && route_by_name (base) == 0) {
2373 /* juse use the base */
2379 name = string_compose ("%1 %2", base, id);
2381 if (route_by_name (name) == 0) {
2387 } while (id < (UINT_MAX-1));
2392 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
2394 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
2396 in = ChanCount::ZERO;
2397 out = ChanCount::ZERO;
2399 boost::shared_ptr<RouteList> r = routes.reader ();
2401 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2402 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2403 if (tr && !tr->is_auditioner()) {
2404 in += tr->n_inputs();
2405 out += tr->n_outputs();
2411 Session::default_track_name_pattern (DataType t)
2414 case DataType::AUDIO:
2415 if (Profile->get_trx()) {
2422 case DataType::MIDI:
2429 /** Caller must not hold process lock
2430 * @param name_template string to use for the start of the name, or "" to use "MIDI".
2431 * @param instrument plugin info for the instrument to insert pre-fader, if any
2433 list<boost::shared_ptr<MidiTrack> >
2434 Session::new_midi_track (const ChanCount& input, const ChanCount& output,
2435 boost::shared_ptr<PluginInfo> instrument, Plugin::PresetRecord* pset,
2436 RouteGroup* route_group, uint32_t how_many, string name_template, PresentationInfo::order_t order,
2440 uint32_t track_id = 0;
2442 RouteList new_routes;
2443 list<boost::shared_ptr<MidiTrack> > ret;
2445 const string name_pattern = default_track_name_pattern (DataType::MIDI);
2446 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
2449 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, use_number)) {
2450 error << "cannot find name for new midi track" << endmsg;
2454 boost::shared_ptr<MidiTrack> track;
2457 track.reset (new MidiTrack (*this, track_name, mode));
2459 if (track->init ()) {
2463 if (Profile->get_mixbus ()) {
2464 track->set_strict_io (true);
2467 track->use_new_diskstream();
2469 BOOST_MARK_TRACK (track);
2472 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2473 if (track->input()->ensure_io (input, false, this)) {
2474 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
2478 if (track->output()->ensure_io (output, false, this)) {
2479 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
2484 track->non_realtime_input_change();
2487 route_group->add (track);
2490 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2492 new_routes.push_back (track);
2493 ret.push_back (track);
2496 catch (failed_constructor &err) {
2497 error << _("Session: could not create new midi track.") << endmsg;
2501 catch (AudioEngine::PortRegistrationFailure& pfe) {
2503 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;
2511 if (!new_routes.empty()) {
2512 StateProtector sp (this);
2513 if (Profile->get_trx()) {
2514 add_routes (new_routes, false, false, false, order);
2516 add_routes (new_routes, true, true, false, order);
2520 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
2521 PluginPtr plugin = instrument->load (*this);
2523 plugin->load_preset (*pset);
2525 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2526 (*r)->add_processor (p, PreFader);
2536 Session::new_midi_route (RouteGroup* route_group, uint32_t how_many, string name_template, boost::shared_ptr<PluginInfo> instrument, Plugin::PresetRecord* pset,
2537 PresentationInfo::Flag flag, PresentationInfo::order_t order)
2540 uint32_t bus_id = 0;
2544 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Midi Bus");
2547 if (!find_route_name (name_template.empty () ? _("Midi Bus") : name_template, ++bus_id, bus_name, use_number)) {
2548 error << "cannot find name for new midi bus" << endmsg;
2553 boost::shared_ptr<Route> bus (new Route (*this, bus_name, flag, DataType::AUDIO)); // XXX Editor::add_routes is not ready for ARDOUR::DataType::MIDI
2559 if (Profile->get_mixbus ()) {
2560 bus->set_strict_io (true);
2563 BOOST_MARK_ROUTE(bus);
2566 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2568 if (bus->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
2569 error << _("cannot configure new midi bus input") << endmsg;
2574 if (bus->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
2575 error << _("cannot configure new midi bus output") << endmsg;
2581 route_group->add (bus);
2584 bus->add_internal_return ();
2585 ret.push_back (bus);
2588 catch (failed_constructor &err) {
2589 error << _("Session: could not create new audio route.") << endmsg;
2593 catch (AudioEngine::PortRegistrationFailure& pfe) {
2594 error << pfe.what() << endmsg;
2604 StateProtector sp (this);
2605 add_routes (ret, false, false, false, order);
2608 for (RouteList::iterator r = ret.begin(); r != ret.end(); ++r) {
2609 PluginPtr plugin = instrument->load (*this);
2611 plugin->load_preset (*pset);
2613 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2614 (*r)->add_processor (p, PreFader);
2625 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2627 boost::shared_ptr<Route> midi_track (wmt.lock());
2633 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2635 if (change.after.n_audio() <= change.before.n_audio()) {
2639 /* new audio ports: make sure the audio goes somewhere useful,
2640 * unless the user has no-auto-connect selected.
2642 * The existing ChanCounts don't matter for this call as they are only
2643 * to do with matching input and output indices, and we are only changing
2646 auto_connect_route (midi_track, false, ChanCount(), change.before);
2650 #ifdef USE_TRACKS_CODE_FEATURES
2653 compare_routes_by_remote_id (const boost::shared_ptr<Route>& route1, const boost::shared_ptr<Route>& route2)
2655 return route1->remote_control_id() < route2->remote_control_id();
2659 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2661 // it is not allowed to perform connection
2662 if (!IO::connecting_legal) {
2666 // if we are deleting routes we will call this once at the end
2667 if (_route_deletion_in_progress) {
2671 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2677 // We need to disconnect the route's inputs and outputs first
2678 // basing on autoconnect configuration
2679 bool reconnectIputs = !(Config->get_input_auto_connect() & ManualConnect) && reconnect_inputs;
2680 bool reconnectOutputs = !(Config->get_output_auto_connect() & ManualConnect) && reconnect_outputs;
2682 ChanCount existing_inputs;
2683 ChanCount existing_outputs;
2684 count_existing_track_channels (existing_inputs, existing_outputs);
2686 //ChanCount inputs = ChanCount::ZERO;
2687 //ChanCount outputs = ChanCount::ZERO;
2689 RouteList existing_routes = *routes.reader ();
2690 existing_routes.sort (compare_routes_by_remote_id);
2693 PBD::Unwinder<bool> protect_ignore_changes (_reconnecting_routes_in_progress, true);
2695 vector<string> physinputs;
2696 vector<string> physoutputs;
2698 EngineStateController::instance()->get_physical_audio_outputs(physoutputs);
2699 EngineStateController::instance()->get_physical_audio_inputs(physinputs);
2701 uint32_t input_n = 0;
2702 uint32_t output_n = 0;
2703 RouteList::iterator rIter = existing_routes.begin();
2704 const AutoConnectOption current_input_auto_connection (Config->get_input_auto_connect());
2705 const AutoConnectOption current_output_auto_connection (Config->get_output_auto_connect());
2706 for (; rIter != existing_routes.end(); ++rIter) {
2707 if (*rIter == _master_out || *rIter == _monitor_out ) {
2711 if (current_output_auto_connection == AutoConnectPhysical) {
2712 (*rIter)->amp()->deactivate();
2713 } else if (current_output_auto_connection == AutoConnectMaster) {
2714 (*rIter)->amp()->activate();
2717 if (reconnectIputs) {
2718 (*rIter)->input()->disconnect (this); //GZ: check this; could be heavy
2720 for (uint32_t route_input_n = 0; route_input_n < (*rIter)->n_inputs().get(DataType::AUDIO); ++route_input_n) {
2722 if (current_input_auto_connection & AutoConnectPhysical) {
2724 if ( input_n == physinputs.size() ) {
2728 string port = physinputs[input_n];
2730 if (port.empty() ) {
2731 error << "Physical Input number "<< input_n << " is unavailable and cannot be connected" << endmsg;
2734 //GZ: check this; could be heavy
2735 (*rIter)->input()->connect ((*rIter)->input()->ports().port(DataType::AUDIO, route_input_n), port, this);
2741 if (reconnectOutputs) {
2743 //normalize route ouptuts: reduce the amount outputs to be equal to the amount of inputs
2744 if (current_output_auto_connection & AutoConnectPhysical) {
2746 //GZ: check this; could be heavy
2747 (*rIter)->output()->disconnect (this);
2748 size_t route_inputs_count = (*rIter)->n_inputs().get(DataType::AUDIO);
2750 //GZ: check this; could be heavy
2751 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, route_inputs_count), false, this );
2753 } else if (current_output_auto_connection & AutoConnectMaster){
2755 if (!reconnect_master) {
2759 //GZ: check this; could be heavy
2760 (*rIter)->output()->disconnect (this);
2763 uint32_t master_inputs_count = _master_out->n_inputs().get(DataType::AUDIO);
2764 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, master_inputs_count), false, this );
2766 error << error << "Master bus is not available" << endmsg;
2771 for (uint32_t route_output_n = 0; route_output_n < (*rIter)->n_outputs().get(DataType::AUDIO); ++route_output_n) {
2772 if (current_output_auto_connection & AutoConnectPhysical) {
2774 if ( output_n == physoutputs.size() ) {
2778 string port = physoutputs[output_n];
2780 if (port.empty() ) {
2781 error << "Physical Output number "<< output_n << " is unavailable and cannot be connected" << endmsg;
2784 //GZ: check this; could be heavy
2785 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2788 } else if (current_output_auto_connection & AutoConnectMaster) {
2790 if ( route_output_n == _master_out->n_inputs().get(DataType::AUDIO) ) {
2794 // connect to master bus
2795 string port = _master_out->input()->ports().port(DataType::AUDIO, route_output_n)->name();
2797 if (port.empty() ) {
2798 error << "MasterBus Input number "<< route_output_n << " is unavailable and cannot be connected" << endmsg;
2802 //GZ: check this; could be heavy
2803 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2810 _master_out->output()->disconnect (this);
2811 auto_connect_master_bus ();
2816 session_routes_reconnected (); /* EMIT SIGNAL */
2820 Session::reconnect_midi_scene_ports(bool inputs)
2824 boost::shared_ptr<MidiPort> scene_in_ptr = scene_in();
2826 scene_in_ptr->disconnect_all ();
2828 std::vector<EngineStateController::MidiPortState> midi_port_states;
2829 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2831 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2833 for (; state_iter != midi_port_states.end(); ++state_iter) {
2834 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2835 scene_in_ptr->connect (state_iter->name);
2842 boost::shared_ptr<MidiPort> scene_out_ptr = scene_out();
2844 if (scene_out_ptr ) {
2845 scene_out_ptr->disconnect_all ();
2847 std::vector<EngineStateController::MidiPortState> midi_port_states;
2848 EngineStateController::instance()->get_physical_midi_output_states (midi_port_states);
2850 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2852 for (; state_iter != midi_port_states.end(); ++state_iter) {
2853 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2854 scene_out_ptr->connect (state_iter->name);
2862 Session::reconnect_mtc_ports ()
2864 boost::shared_ptr<MidiPort> mtc_in_ptr = _midi_ports->mtc_input_port();
2870 mtc_in_ptr->disconnect_all ();
2872 std::vector<EngineStateController::MidiPortState> midi_port_states;
2873 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2875 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2877 for (; state_iter != midi_port_states.end(); ++state_iter) {
2878 if (state_iter->available && state_iter->mtc_in) {
2879 mtc_in_ptr->connect (state_iter->name);
2883 if (!_midi_ports->mtc_input_port ()->connected () &&
2884 config.get_external_sync () &&
2885 (Config->get_sync_source () == MTC) ) {
2886 config.set_external_sync (false);
2889 if ( ARDOUR::Profile->get_trx () ) {
2890 // Tracks need this signal to update timecode_source_dropdown
2891 MtcOrLtcInputPortChanged (); //emit signal
2896 Session::reconnect_mmc_ports(bool inputs)
2898 if (inputs ) { // get all enabled midi input ports
2900 boost::shared_ptr<MidiPort> mmc_in_ptr = _midi_ports->mmc_in();
2902 mmc_in_ptr->disconnect_all ();
2903 std::vector<std::string> enabled_midi_inputs;
2904 EngineStateController::instance()->get_physical_midi_inputs (enabled_midi_inputs);
2906 std::vector<std::string>::iterator port_iter = enabled_midi_inputs.begin();
2908 for (; port_iter != enabled_midi_inputs.end(); ++port_iter) {
2909 mmc_in_ptr->connect (*port_iter);
2913 } else { // get all enabled midi output ports
2915 boost::shared_ptr<MidiPort> mmc_out_ptr = _midi_ports->mmc_out();
2917 mmc_out_ptr->disconnect_all ();
2918 std::vector<std::string> enabled_midi_outputs;
2919 EngineStateController::instance()->get_physical_midi_outputs (enabled_midi_outputs);
2921 std::vector<std::string>::iterator port_iter = enabled_midi_outputs.begin();
2923 for (; port_iter != enabled_midi_outputs.end(); ++port_iter) {
2924 mmc_out_ptr->connect (*port_iter);
2933 Session::ensure_route_presentation_info_gap (PresentationInfo::order_t first_new_order, uint32_t how_many)
2935 if (first_new_order == PresentationInfo::max_order) {
2936 /* adding at end, no worries */
2940 /* create a gap in the presentation info to accomodate @param how_many
2944 get_stripables (sl);
2946 for (StripableList::iterator si = sl.begin(); si != sl.end(); ++si) {
2947 boost::shared_ptr<Stripable> s (*si);
2949 if (s->is_monitor() || s->is_auditioner()) {
2953 if (s->presentation_info().order () >= first_new_order) {
2954 s->set_presentation_order (s->presentation_info().order () + how_many);
2959 /** Caller must not hold process lock
2960 * @param name_template string to use for the start of the name, or "" to use "Audio".
2962 list< boost::shared_ptr<AudioTrack> >
2963 Session::new_audio_track (int input_channels, int output_channels, RouteGroup* route_group,
2964 uint32_t how_many, string name_template, PresentationInfo::order_t order,
2968 uint32_t track_id = 0;
2970 RouteList new_routes;
2971 list<boost::shared_ptr<AudioTrack> > ret;
2973 const string name_pattern = default_track_name_pattern (DataType::AUDIO);
2974 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
2978 if (!find_route_name (name_template.empty() ? _(name_pattern.c_str()) : name_template, ++track_id, track_name, use_number)) {
2979 error << "cannot find name for new audio track" << endmsg;
2983 boost::shared_ptr<AudioTrack> track;
2986 track.reset (new AudioTrack (*this, track_name, mode));
2988 if (track->init ()) {
2992 if (Profile->get_mixbus ()) {
2993 track->set_strict_io (true);
2996 if (ARDOUR::Profile->get_trx ()) {
2997 // TRACKS considers it's not a USE CASE, it's
2998 // a piece of behavior of the session model:
3000 // Gain for a newly created route depends on
3001 // the current output_auto_connect mode:
3003 // 0 for Stereo Out mode
3005 if (Config->get_output_auto_connect() & AutoConnectMaster) {
3006 track->gain_control()->set_value (dB_to_coefficient (0), Controllable::NoGroup);
3010 track->use_new_diskstream();
3012 BOOST_MARK_TRACK (track);
3015 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3017 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
3018 error << string_compose (
3019 _("cannot configure %1 in/%2 out configuration for new audio track"),
3020 input_channels, output_channels)
3025 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
3026 error << string_compose (
3027 _("cannot configure %1 in/%2 out configuration for new audio track"),
3028 input_channels, output_channels)
3035 route_group->add (track);
3038 track->non_realtime_input_change();
3040 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
3042 new_routes.push_back (track);
3043 ret.push_back (track);
3046 catch (failed_constructor &err) {
3047 error << _("Session: could not create new audio track.") << endmsg;
3051 catch (AudioEngine::PortRegistrationFailure& pfe) {
3053 error << pfe.what() << endmsg;
3061 if (!new_routes.empty()) {
3062 StateProtector sp (this);
3063 if (Profile->get_trx()) {
3064 add_routes (new_routes, false, false, false, order);
3066 add_routes (new_routes, true, true, false, order);
3073 /** Caller must not hold process lock.
3074 * @param name_template string to use for the start of the name, or "" to use "Bus".
3077 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template,
3078 PresentationInfo::Flag flags, PresentationInfo::order_t order)
3081 uint32_t bus_id = 0;
3085 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
3088 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, use_number)) {
3089 error << "cannot find name for new audio bus" << endmsg;
3094 boost::shared_ptr<Route> bus (new Route (*this, bus_name, flags, DataType::AUDIO));
3100 if (Profile->get_mixbus ()) {
3101 bus->set_strict_io (true);
3104 BOOST_MARK_ROUTE(bus);
3107 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3109 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
3110 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
3111 input_channels, output_channels)
3117 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
3118 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
3119 input_channels, output_channels)
3126 route_group->add (bus);
3129 bus->add_internal_return ();
3130 ret.push_back (bus);
3133 catch (failed_constructor &err) {
3134 error << _("Session: could not create new audio route.") << endmsg;
3138 catch (AudioEngine::PortRegistrationFailure& pfe) {
3139 error << pfe.what() << endmsg;
3149 StateProtector sp (this);
3150 if (Profile->get_trx()) {
3151 add_routes (ret, false, false, false, order);
3153 add_routes (ret, false, true, true, order); // autoconnect // outputs only
3162 Session::new_route_from_template (uint32_t how_many, PresentationInfo::order_t insert_at, const std::string& template_path, const std::string& name_base,
3163 PlaylistDisposition pd)
3167 if (!tree.read (template_path.c_str())) {
3171 return new_route_from_template (how_many, insert_at, *tree.root(), name_base, pd);
3175 Session::new_route_from_template (uint32_t how_many, PresentationInfo::order_t insert_at, XMLNode& node, const std::string& name_base, PlaylistDisposition pd)
3178 uint32_t number = 0;
3179 const uint32_t being_added = how_many;
3180 /* This will prevent the use of any existing XML-provided PBD::ID
3183 Stateful::ForceIDRegeneration force_ids;
3184 IO::disable_connecting ();
3188 /* We're going to modify the node contents a bit so take a
3189 * copy. The node may be re-used when duplicating more than once.
3192 XMLNode node_copy (node);
3197 if (!name_base.empty()) {
3199 /* if we're adding more than one routes, force
3200 * all the names of the new routes to be
3201 * numbered, via the final parameter.
3204 if (!find_route_name (name_base.c_str(), ++number, name, (being_added > 1))) {
3205 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3211 string const route_name = node_copy.property(X_("name"))->value ();
3213 /* generate a new name by adding a number to the end of the template name */
3214 if (!find_route_name (route_name.c_str(), ++number, name, true)) {
3215 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3216 abort(); /*NOTREACHED*/
3220 /* set this name in the XML description that we are about to use */
3222 bool rename_playlist;
3225 rename_playlist = true;
3230 rename_playlist = false;
3233 Route::set_name_in_state (node_copy, name, rename_playlist);
3235 /* trim bitslots from listen sends so that new ones are used */
3236 XMLNodeList children = node_copy.children ();
3237 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
3238 if ((*i)->name() == X_("Processor")) {
3239 /* ForceIDRegeneration does not catch the following */
3240 XMLProperty const * role = (*i)->property (X_("role"));
3241 XMLProperty const * type = (*i)->property (X_("type"));
3242 if (role && role->value() == X_("Aux")) {
3243 /* check if the target bus exists.
3244 * we should not save aux-sends in templates.
3246 XMLProperty const * target = (*i)->property (X_("target"));
3248 (*i)->add_property ("type", "dangling-aux-send");
3251 boost::shared_ptr<Route> r = route_by_id (target->value());
3252 if (!r || boost::dynamic_pointer_cast<Track>(r)) {
3253 (*i)->add_property ("type", "dangling-aux-send");
3257 if (role && role->value() == X_("Listen")) {
3258 (*i)->remove_property (X_("bitslot"));
3260 else if (role && (role->value() == X_("Send") || role->value() == X_("Aux"))) {
3262 Delivery::Role xrole;
3263 uint32_t bitslot = 0;
3264 xrole = Delivery::Role (string_2_enum (role->value(), xrole));
3265 std::string name = Send::name_and_id_new_send(*this, xrole, bitslot, false);
3266 snprintf (buf, sizeof (buf), "%" PRIu32, bitslot);
3267 (*i)->remove_property (X_("bitslot"));
3268 (*i)->remove_property (X_("name"));
3269 (*i)->add_property ("bitslot", buf);
3270 (*i)->add_property ("name", name);
3272 else if (type && type->value() == X_("intreturn")) {
3273 (*i)->remove_property (X_("bitslot"));
3274 (*i)->add_property ("ignore-bitslot", "1");
3276 else if (type && type->value() == X_("return")) {
3277 // Return::set_state() generates a new one
3278 (*i)->remove_property (X_("bitslot"));
3280 else if (type && type->value() == X_("port")) {
3281 // PortInsert::set_state() handles the bitslot
3282 (*i)->remove_property (X_("bitslot"));
3283 (*i)->add_property ("ignore-name", "1");
3288 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
3291 error << _("Session: cannot create track/bus from template description") << endmsg;
3295 if (boost::dynamic_pointer_cast<Track>(route)) {
3296 /* force input/output change signals so that the new diskstream
3297 picks up the configuration of the route. During session
3298 loading this normally happens in a different way.
3301 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3303 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
3304 change.after = route->input()->n_ports();
3305 route->input()->changed (change, this);
3306 change.after = route->output()->n_ports();
3307 route->output()->changed (change, this);
3310 boost::shared_ptr<Track> track;
3312 if ((track = boost::dynamic_pointer_cast<Track> (route))) {
3315 track->use_new_playlist ();
3318 track->use_copy_playlist ();
3325 ret.push_back (route);
3328 catch (failed_constructor &err) {
3329 error << _("Session: could not create new route from template") << endmsg;
3333 catch (AudioEngine::PortRegistrationFailure& pfe) {
3334 error << pfe.what() << endmsg;
3343 StateProtector sp (this);
3344 if (Profile->get_trx()) {
3345 add_routes (ret, false, false, false, insert_at);
3347 add_routes (ret, true, true, false, insert_at);
3349 IO::enable_connecting ();
3356 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save, PresentationInfo::order_t order)
3359 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
3360 add_routes_inner (new_routes, input_auto_connect, output_auto_connect, order);
3363 error << _("Adding new tracks/busses failed") << endmsg;
3368 update_latency (true);
3369 update_latency (false);
3374 save_state (_current_snapshot_name);
3377 update_route_record_state ();
3379 RouteAdded (new_routes); /* EMIT SIGNAL */
3383 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, PresentationInfo::order_t order)
3385 ChanCount existing_inputs;
3386 ChanCount existing_outputs;
3390 count_existing_track_channels (existing_inputs, existing_outputs);
3393 RCUWriter<RouteList> writer (routes);
3394 boost::shared_ptr<RouteList> r = writer.get_copy ();
3395 r->insert (r->end(), new_routes.begin(), new_routes.end());
3396 n_routes = r->size();
3398 /* if there is no control out and we're not in the middle of loading,
3399 * resort the graph here. if there is a control out, we will resort
3400 * toward the end of this method. if we are in the middle of loading,
3401 * we will resort when done.
3404 if (!_monitor_out && IO::connecting_legal) {
3405 resort_routes_using (r);
3409 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("ensure order gap starting at %1 for %2\n", order, new_routes.size()));
3410 ensure_route_presentation_info_gap (order, new_routes.size());
3412 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x, ++added) {
3414 boost::weak_ptr<Route> wpr (*x);
3415 boost::shared_ptr<Route> r (*x);
3417 r->solo_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2,wpr));
3418 r->solo_isolate_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, wpr));
3419 r->mute_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this));
3421 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
3422 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
3423 r->processor_latency_changed.connect_same_thread (*this, boost::bind (&Session::queue_latency_recompute, this));
3425 if (r->is_master()) {
3429 if (r->is_monitor()) {
3433 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
3435 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
3436 track_playlist_changed (boost::weak_ptr<Track> (tr));
3437 tr->rec_enable_control()->Changed.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
3439 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
3441 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
3442 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
3446 if (!r->presentation_info().special()) {
3448 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("checking PI state for %1\n", r->name()));
3450 /* presentation info order may already have been set from XML */
3452 if (!r->presentation_info().order_set()) {
3454 if (order == PresentationInfo::max_order) {
3455 /* just add to the end */
3456 r->set_presentation_order (n_routes + added, false);
3457 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order not set, set to NR %1 + %2 = %3\n", n_routes, added, n_routes + added));
3459 r->set_presentation_order (order + added);
3460 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order not set, set to %1 + %2 = %3\n", order, added, order + added));
3463 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order already set to %1\n", r->presentation_info().order()));
3467 #if !defined(__APPLE__) && !defined(__FreeBSD__)
3468 /* clang complains: 'operator<<' should be declared prior to the call site or in an associated namespace of one of its
3469 * arguments std::ostream& operator<<(std::ostream& o, ARDOUR::PresentationInfo const& rid)"
3471 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("added route %1, group order %2 type %3 (summary: %4)\n",
3473 r->presentation_info().order(),
3474 enum_2_string (r->presentation_info().flags()),
3475 r->presentation_info()));
3479 if (input_auto_connect || output_auto_connect) {
3480 auto_connect_route (r, input_auto_connect, ChanCount (), ChanCount (), existing_inputs, existing_outputs);
3481 existing_inputs += r->n_inputs();
3482 existing_outputs += r->n_outputs();
3488 if (_monitor_out && IO::connecting_legal) {
3489 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
3491 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3492 if ((*x)->is_monitor()) {
3494 } else if ((*x)->is_master()) {
3497 (*x)->enable_monitor_send ();
3502 reassign_track_numbers ();
3506 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
3508 boost::shared_ptr<RouteList> r = routes.reader ();
3509 boost::shared_ptr<Send> s;
3511 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3512 if ((s = (*i)->internal_send_for (dest)) != 0) {
3513 s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO, Controllable::NoGroup);
3519 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
3521 boost::shared_ptr<RouteList> r = routes.reader ();
3522 boost::shared_ptr<Send> s;
3524 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3525 if ((s = (*i)->internal_send_for (dest)) != 0) {
3526 s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY, Controllable::NoGroup);
3532 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
3534 boost::shared_ptr<RouteList> r = routes.reader ();
3535 boost::shared_ptr<Send> s;
3537 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3538 if ((s = (*i)->internal_send_for (dest)) != 0) {
3539 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value(), Controllable::NoGroup);
3544 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
3546 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
3548 boost::shared_ptr<RouteList> r = routes.reader ();
3549 boost::shared_ptr<RouteList> t (new RouteList);
3551 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3552 /* no MIDI sends because there are no MIDI busses yet */
3553 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
3558 add_internal_sends (dest, p, t);
3562 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
3564 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
3565 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
3570 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
3572 add_internal_send (dest, sender->before_processor_for_index (index), sender);
3576 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
3578 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
3582 if (!dest->internal_return()) {
3583 dest->add_internal_return ();
3586 sender->add_aux_send (dest, before);
3592 Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
3594 { // RCU Writer scope
3595 PBD::Unwinder<bool> uw_flag (_route_deletion_in_progress, true);
3596 RCUWriter<RouteList> writer (routes);
3597 boost::shared_ptr<RouteList> rs = writer.get_copy ();
3600 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3602 if (*iter == _master_out) {
3606 (*iter)->solo_control()->set_value (0.0, Controllable::NoGroup);
3610 /* deleting the master out seems like a dumb
3611 idea, but its more of a UI policy issue
3615 if (*iter == _master_out) {
3616 _master_out = boost::shared_ptr<Route> ();
3619 if (*iter == _monitor_out) {
3620 _monitor_out.reset ();
3623 // We need to disconnect the route's inputs and outputs
3625 (*iter)->input()->disconnect (0);
3626 (*iter)->output()->disconnect (0);
3628 /* if the route had internal sends sending to it, remove them */
3629 if ((*iter)->internal_return()) {
3631 boost::shared_ptr<RouteList> r = routes.reader ();
3632 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3633 boost::shared_ptr<Send> s = (*i)->internal_send_for (*iter);
3635 (*i)->remove_processor (s);
3640 /* if the monitoring section had a pointer to this route, remove it */
3641 if (_monitor_out && !(*iter)->is_master() && !(*iter)->is_monitor()) {
3642 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3643 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
3644 (*iter)->remove_aux_or_listen (_monitor_out);
3647 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*iter);
3648 if (mt && mt->step_editing()) {
3649 if (_step_editors > 0) {
3655 /* writer goes out of scope, forces route list update */
3657 } // end of RCU Writer scope
3659 update_route_solo_state ();
3660 update_latency_compensation ();
3663 /* Re-sort routes to remove the graph's current references to the one that is
3664 * going away, then flush old references out of the graph.
3665 * Wave Tracks: reconnect routes
3668 #ifdef USE_TRACKS_CODE_FEATURES
3669 reconnect_existing_routes(true, false);
3671 routes.flush (); // maybe unsafe, see below.
3675 if (_process_graph && !(_state_of_the_state & Deletion)) {
3676 _process_graph->clear_other_chain ();
3679 /* get rid of it from the dead wood collection in the route list manager */
3680 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
3684 /* try to cause everyone to drop their references
3685 * and unregister ports from the backend
3688 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3689 (*iter)->drop_references ();
3692 if (_state_of_the_state & Deletion) {
3696 PresentationInfo::Change(); /* EMIT SIGNAL */
3698 /* save the new state of the world */
3700 if (save_state (_current_snapshot_name)) {
3701 save_history (_current_snapshot_name);
3704 update_route_record_state ();
3708 Session::remove_route (boost::shared_ptr<Route> route)
3710 boost::shared_ptr<RouteList> rl (new RouteList);
3711 rl->push_back (route);
3716 Session::route_mute_changed ()
3722 Session::route_listen_changed (Controllable::GroupControlDisposition group_override, boost::weak_ptr<Route> wpr)
3724 boost::shared_ptr<Route> route (wpr.lock());
3730 assert (Config->get_solo_control_is_listen_control());
3732 if (route->solo_control()->soloed_by_self_or_masters()) {
3734 if (Config->get_exclusive_solo()) {
3736 RouteGroup* rg = route->route_group ();
3737 const bool group_already_accounted_for = (group_override == Controllable::ForGroup);
3739 boost::shared_ptr<RouteList> r = routes.reader ();
3741 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3742 if ((*i) == route) {
3743 /* already changed */
3747 if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
3748 /* route does not get solo propagated to it */
3752 if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
3753 /* this route is a part of the same solo group as the route
3754 * that was changed. Changing that route did change or will
3755 * change all group members appropriately, so we can ignore it
3760 (*i)->solo_control()->set_value (0.0, Controllable::NoGroup);
3766 } else if (_listen_cnt > 0) {
3771 update_route_solo_state ();
3775 Session::route_solo_isolated_changed (boost::weak_ptr<Route> wpr)
3777 boost::shared_ptr<Route> route (wpr.lock());
3783 bool send_changed = false;
3785 if (route->solo_isolate_control()->solo_isolated()) {
3786 if (_solo_isolated_cnt == 0) {
3787 send_changed = true;
3789 _solo_isolated_cnt++;
3790 } else if (_solo_isolated_cnt > 0) {
3791 _solo_isolated_cnt--;
3792 if (_solo_isolated_cnt == 0) {
3793 send_changed = true;
3798 IsolatedChanged (); /* EMIT SIGNAL */
3803 Session::route_solo_changed (bool self_solo_changed, Controllable::GroupControlDisposition group_override, boost::weak_ptr<Route> wpr)
3805 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_changed));
3807 boost::shared_ptr<Route> route (wpr.lock());
3813 if (Config->get_solo_control_is_listen_control()) {
3814 route_listen_changed (group_override, wpr);
3818 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()));
3820 if (route->solo_control()->transitioned_into_solo() == 0) {
3821 /* route solo changed by upstream/downstream; not interesting
3824 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()));
3828 if (route->solo_control()->transitioned_into_solo() == 0) {
3829 /* reason for being soloed changed (e.g. master went away, we
3830 * took over the master state), but actual status did
3831 * not. nothing to do.
3833 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: solo change was change in reason, not status\n", route->name()));
3836 boost::shared_ptr<RouteList> r = routes.reader ();
3837 int32_t delta = route->solo_control()->transitioned_into_solo ();
3839 /* the route may be a member of a group that has shared-solo
3840 * semantics. If so, then all members of that group should follow the
3841 * solo of the changed route. But ... this is optional, controlled by a
3842 * Controllable::GroupControlDisposition.
3844 * The first argument to the signal that this method is connected to is the
3845 * GroupControlDisposition value that was used to change solo.
3847 * If the solo change was done with group semantics (either InverseGroup
3848 * (force the entire group to change even if the group shared solo is
3849 * disabled) or UseGroup (use the group, which may or may not have the
3850 * shared solo property enabled)) then as we propagate the change to
3851 * the entire session we should IGNORE THE GROUP that the changed route
3855 RouteGroup* rg = route->route_group ();
3856 const bool group_already_accounted_for = (group_override == Controllable::ForGroup);
3858 if (delta == 1 && Config->get_exclusive_solo()) {
3860 /* new solo: disable all other solos, but not the group if its solo-enabled */
3862 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3864 if ((*i) == route) {
3865 /* already changed */
3869 if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
3870 /* route does not get solo propagated to it */
3874 if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
3875 /* this route is a part of the same solo group as the route
3876 * that was changed. Changing that route did change or will
3877 * change all group members appropriately, so we can ignore it
3883 (*i)->solo_control()->set_value (0.0, group_override);
3887 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3889 RouteList uninvolved;
3891 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
3893 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3894 bool via_sends_only;
3895 bool in_signal_flow;
3897 if ((*i) == route) {
3898 /* already changed */
3902 if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
3903 /* route does not get solo propagated to it */
3904 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(),
3909 if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
3910 /* this route is a part of the same solo group as the route
3911 * that was changed. Changing that route did change or will
3912 * change all group members appropriately, so we can ignore it
3918 in_signal_flow = false;
3920 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3922 if ((*i)->feeds (route, &via_sends_only)) {
3923 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3924 if (!via_sends_only) {
3925 if (!route->soloed_by_others_upstream()) {
3926 (*i)->solo_control()->mod_solo_by_others_downstream (delta);
3928 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others upstream\n");
3931 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3933 in_signal_flow = true;
3935 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3938 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3940 if (route->feeds (*i, &via_sends_only)) {
3941 /* propagate solo upstream only if routing other than
3942 sends is involved, but do consider the other route
3943 (*i) to be part of the signal flow even if only
3946 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3950 route->soloed_by_others_downstream(),
3951 route->soloed_by_others_upstream()));
3952 if (!via_sends_only) {
3953 //NB. Triggers Invert Push, which handles soloed by downstream
3954 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3955 (*i)->solo_control()->mod_solo_by_others_upstream (delta);
3957 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3959 in_signal_flow = true;
3961 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3964 if (!in_signal_flow) {
3965 uninvolved.push_back (*i);
3969 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3971 update_route_solo_state (r);
3973 /* now notify that the mute state of the routes not involved in the signal
3974 pathway of the just-solo-changed route may have altered.
3977 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3978 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
3979 (*i)->act_on_mute ();
3980 (*i)->mute_control()->Changed (false, Controllable::NoGroup);
3983 SoloChanged (); /* EMIT SIGNAL */
3988 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
3990 /* now figure out if anything that matters is soloed (or is "listening")*/
3992 bool something_soloed = false;
3993 bool something_listening = false;
3994 uint32_t listeners = 0;
3995 uint32_t isolated = 0;
3998 r = routes.reader();
4001 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4002 if ((*i)->can_solo()) {
4003 if (Config->get_solo_control_is_listen_control()) {
4004 if ((*i)->self_soloed() || (*i)->solo_control()->get_masters_value()) {
4006 something_listening = true;
4009 (*i)->set_listen (false);
4010 if ((*i)->can_solo() && ((*i)->self_soloed() || (*i)->solo_control()->get_masters_value())) {
4011 something_soloed = true;
4016 if ((*i)->solo_isolate_control()->solo_isolated()) {
4021 if (something_soloed != _non_soloed_outs_muted) {
4022 _non_soloed_outs_muted = something_soloed;
4023 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
4026 if (something_listening != _listening) {
4027 _listening = something_listening;
4028 SoloActive (_listening);
4031 _listen_cnt = listeners;
4033 if (isolated != _solo_isolated_cnt) {
4034 _solo_isolated_cnt = isolated;
4035 IsolatedChanged (); /* EMIT SIGNAL */
4038 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
4039 something_soloed, listeners, isolated));
4043 Session::get_stripables (StripableList& sl) const
4045 boost::shared_ptr<RouteList> r = routes.reader ();
4046 sl.insert (sl.end(), r->begin(), r->end());
4048 VCAList v = _vca_manager->vcas ();
4049 sl.insert (sl.end(), v.begin(), v.end());
4052 boost::shared_ptr<RouteList>
4053 Session::get_routes_with_internal_returns() const
4055 boost::shared_ptr<RouteList> r = routes.reader ();
4056 boost::shared_ptr<RouteList> rl (new RouteList);
4058 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4059 if ((*i)->internal_return ()) {
4067 Session::io_name_is_legal (const std::string& name) const
4069 boost::shared_ptr<RouteList> r = routes.reader ();
4071 for (vector<string>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
4072 if (name == *reserved) {
4073 if (!route_by_name (*reserved)) {
4074 /* first instance of a reserved name is allowed */
4077 /* all other instances of a reserved name are not allowed */
4082 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4083 if ((*i)->name() == name) {
4087 if ((*i)->has_io_processor_named (name)) {
4096 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
4099 vector<string> connections;
4101 /* if we are passed only a single route and we're not told to turn
4102 * others off, then just do the simple thing.
4105 if (flip_others == false && rl->size() == 1) {
4106 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
4108 mt->set_input_active (onoff);
4113 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
4115 PortSet& ps ((*rt)->input()->ports());
4117 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
4118 p->get_connections (connections);
4121 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
4122 routes_using_input_from (*s, rl2);
4125 /* scan all relevant routes to see if others are on or off */
4127 bool others_are_already_on = false;
4129 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
4131 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
4137 if ((*r) != (*rt)) {
4138 if (mt->input_active()) {
4139 others_are_already_on = true;
4142 /* this one needs changing */
4143 mt->set_input_active (onoff);
4149 /* globally reverse other routes */
4151 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
4152 if ((*r) != (*rt)) {
4153 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
4155 mt->set_input_active (!others_are_already_on);
4164 Session::routes_using_input_from (const string& str, RouteList& rl)
4166 boost::shared_ptr<RouteList> r = routes.reader();
4168 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4169 if ((*i)->input()->connected_to (str)) {
4175 boost::shared_ptr<Route>
4176 Session::route_by_name (string name) const
4178 boost::shared_ptr<RouteList> r = routes.reader ();
4180 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4181 if ((*i)->name() == name) {
4186 return boost::shared_ptr<Route> ((Route*) 0);
4189 boost::shared_ptr<Route>
4190 Session::route_by_id (PBD::ID id) const
4192 boost::shared_ptr<RouteList> r = routes.reader ();
4194 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4195 if ((*i)->id() == id) {
4200 return boost::shared_ptr<Route> ((Route*) 0);
4203 boost::shared_ptr<Processor>
4204 Session::processor_by_id (PBD::ID id) const
4206 boost::shared_ptr<RouteList> r = routes.reader ();
4208 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4209 boost::shared_ptr<Processor> p = (*i)->Route::processor_by_id (id);
4215 return boost::shared_ptr<Processor> ();
4218 boost::shared_ptr<Track>
4219 Session::track_by_diskstream_id (PBD::ID id) const
4221 boost::shared_ptr<RouteList> r = routes.reader ();
4223 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4224 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
4225 if (t && t->using_diskstream_id (id)) {
4230 return boost::shared_ptr<Track> ();
4233 boost::shared_ptr<Route>
4234 Session::get_remote_nth_route (PresentationInfo::order_t n) const
4236 return boost::dynamic_pointer_cast<Route> (get_remote_nth_stripable (n, PresentationInfo::Route));
4239 boost::shared_ptr<Stripable>
4240 Session::get_remote_nth_stripable (PresentationInfo::order_t n, PresentationInfo::Flag flags) const
4243 PresentationInfo::order_t match_cnt = 0;
4245 get_stripables (sl);
4246 sl.sort (Stripable::PresentationOrderSorter());
4248 for (StripableList::const_iterator s = sl.begin(); s != sl.end(); ++s) {
4250 if ((*s)->presentation_info().hidden()) {
4251 /* if the caller didn't explicitly ask for hidden
4252 stripables, ignore hidden ones. This matches
4253 the semantics of the pre-PresentationOrder
4254 "get by RID" logic of Ardour 4.x and earlier.
4256 XXX at some point we should likely reverse
4257 the logic of the flags, because asking for "the
4258 hidden stripables" is not going to be common,
4259 whereas asking for visible ones is normal.
4262 if (! (flags & PresentationInfo::Hidden)) {
4267 if ((*s)->presentation_info().flag_match (flags)) {
4268 if (match_cnt++ == n) {
4274 /* there is no nth stripable that matches the given flags */
4275 return boost::shared_ptr<Stripable>();
4278 boost::shared_ptr<Route>
4279 Session::route_by_selected_count (uint32_t id) const
4281 boost::shared_ptr<RouteList> r = routes.reader ();
4283 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4284 /* NOT IMPLEMENTED */
4287 return boost::shared_ptr<Route> ((Route*) 0);
4290 struct PresentationOrderSorter {
4291 bool operator() (boost::shared_ptr<Stripable> a, boost::shared_ptr<Stripable> b) {
4292 if (a->presentation_info().special() && !b->presentation_info().special()) {
4293 /* a is not ordered, b is; b comes before a */
4295 } else if (!b->presentation_info().order_set() && a->presentation_info().order_set()) {
4296 /* b is not ordered, a is; a comes before b */
4299 return a->presentation_info().order() < b->presentation_info().order();
4305 Session::reassign_track_numbers ()
4309 RouteList r (*(routes.reader ()));
4310 PresentationOrderSorter sorter;
4313 StateProtector sp (this);
4315 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4316 if (boost::dynamic_pointer_cast<Track> (*i)) {
4317 (*i)->set_track_number(++tn);
4319 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
4320 (*i)->set_track_number(--bn);
4323 const uint32_t decimals = ceilf (log10f (tn + 1));
4324 const bool decimals_changed = _track_number_decimals != decimals;
4325 _track_number_decimals = decimals;
4327 if (decimals_changed && config.get_track_name_number ()) {
4328 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4329 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
4331 t->resync_track_name();
4334 // trigger GUI re-layout
4335 config.ParameterChanged("track-name-number");
4339 if (DEBUG_ENABLED(DEBUG::OrderKeys)) {
4340 boost::shared_ptr<RouteList> rl = routes.reader ();
4341 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4342 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 numbered %2\n", (*i)->name(), (*i)->track_number()));
4350 Session::playlist_region_added (boost::weak_ptr<Region> w)
4352 boost::shared_ptr<Region> r = w.lock ();
4357 /* These are the operations that are currently in progress... */
4358 list<GQuark> curr = _current_trans_quarks;
4361 /* ...and these are the operations during which we want to update
4362 the session range location markers.
4365 ops.push_back (Operations::capture);
4366 ops.push_back (Operations::paste);
4367 ops.push_back (Operations::duplicate_region);
4368 ops.push_back (Operations::insert_file);
4369 ops.push_back (Operations::insert_region);
4370 ops.push_back (Operations::drag_region_brush);
4371 ops.push_back (Operations::region_drag);
4372 ops.push_back (Operations::selection_grab);
4373 ops.push_back (Operations::region_fill);
4374 ops.push_back (Operations::fill_selection);
4375 ops.push_back (Operations::create_region);
4376 ops.push_back (Operations::region_copy);
4377 ops.push_back (Operations::fixed_time_region_copy);
4380 /* See if any of the current operations match the ones that we want */
4382 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
4384 /* If so, update the session range markers */
4386 maybe_update_session_range (r->position (), r->last_frame ());
4390 /** Update the session range markers if a is before the current start or
4391 * b is after the current end.
4394 Session::maybe_update_session_range (framepos_t a, framepos_t b)
4396 if (_state_of_the_state & Loading) {
4400 framepos_t session_end_marker_shift_samples = session_end_shift * _nominal_frame_rate;
4402 if (_session_range_location == 0) {
4404 set_session_range_location (a, b + session_end_marker_shift_samples);
4408 if (a < _session_range_location->start()) {
4409 _session_range_location->set_start (a);
4412 if (_session_range_end_is_free && (b > _session_range_location->end())) {
4413 _session_range_location->set_end (b);
4419 Session::set_end_is_free (bool yn)
4421 _session_range_end_is_free = yn;
4425 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
4427 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4428 maybe_update_session_range (i->to, i->to + i->length);
4433 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
4435 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4436 maybe_update_session_range (i->from, i->to);
4440 /* Region management */
4442 boost::shared_ptr<Region>
4443 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
4445 const RegionFactory::RegionMap& regions (RegionFactory::regions());
4446 RegionFactory::RegionMap::const_iterator i;
4447 boost::shared_ptr<Region> region;
4449 Glib::Threads::Mutex::Lock lm (region_lock);
4451 for (i = regions.begin(); i != regions.end(); ++i) {
4455 if (region->whole_file()) {
4457 if (child->source_equivalent (region)) {
4463 return boost::shared_ptr<Region> ();
4467 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
4469 set<boost::shared_ptr<Region> > relevant_regions;
4471 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
4472 RegionFactory::get_regions_using_source (*s, relevant_regions);
4475 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
4476 set<boost::shared_ptr<Region> >::iterator tmp;
4481 playlists->destroy_region (*r);
4482 RegionFactory::map_remove (*r);
4484 (*r)->drop_sources ();
4485 (*r)->drop_references ();
4487 relevant_regions.erase (r);
4492 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
4495 Glib::Threads::Mutex::Lock ls (source_lock);
4496 /* remove from the main source list */
4497 sources.erase ((*s)->id());
4500 (*s)->mark_for_remove ();
4501 (*s)->drop_references ();
4510 Session::remove_last_capture ()
4512 list<boost::shared_ptr<Source> > srcs;
4514 boost::shared_ptr<RouteList> rl = routes.reader ();
4515 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4516 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4521 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
4524 srcs.insert (srcs.end(), l.begin(), l.end());
4529 destroy_sources (srcs);
4531 save_state (_current_snapshot_name);
4536 /* Source Management */
4539 Session::add_source (boost::shared_ptr<Source> source)
4541 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
4542 pair<SourceMap::iterator,bool> result;
4544 entry.first = source->id();
4545 entry.second = source;
4548 Glib::Threads::Mutex::Lock lm (source_lock);
4549 result = sources.insert (entry);
4552 if (result.second) {
4554 /* yay, new source */
4556 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
4559 if (!fs->within_session()) {
4560 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
4566 boost::shared_ptr<AudioFileSource> afs;
4568 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
4569 if (Config->get_auto_analyse_audio()) {
4570 Analyser::queue_source_for_analysis (source, false);
4574 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
4579 Session::remove_source (boost::weak_ptr<Source> src)
4581 if (_state_of_the_state & Deletion) {
4585 SourceMap::iterator i;
4586 boost::shared_ptr<Source> source = src.lock();
4593 Glib::Threads::Mutex::Lock lm (source_lock);
4595 if ((i = sources.find (source->id())) != sources.end()) {
4600 if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
4602 /* save state so we don't end up with a session file
4603 referring to non-existent sources.
4606 save_state (_current_snapshot_name);
4610 boost::shared_ptr<Source>
4611 Session::source_by_id (const PBD::ID& id)
4613 Glib::Threads::Mutex::Lock lm (source_lock);
4614 SourceMap::iterator i;
4615 boost::shared_ptr<Source> source;
4617 if ((i = sources.find (id)) != sources.end()) {
4624 boost::shared_ptr<AudioFileSource>
4625 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
4627 /* Restricted to audio files because only audio sources have channel
4631 Glib::Threads::Mutex::Lock lm (source_lock);
4633 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
4634 boost::shared_ptr<AudioFileSource> afs
4635 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
4637 if (afs && afs->path() == path && chn == afs->channel()) {
4642 return boost::shared_ptr<AudioFileSource>();
4645 boost::shared_ptr<MidiSource>
4646 Session::midi_source_by_path (const std::string& path) const
4648 /* Restricted to MIDI files because audio sources require a channel
4649 for unique identification, in addition to a path.
4652 Glib::Threads::Mutex::Lock lm (source_lock);
4654 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
4655 boost::shared_ptr<MidiSource> ms
4656 = boost::dynamic_pointer_cast<MidiSource>(s->second);
4657 boost::shared_ptr<FileSource> fs
4658 = boost::dynamic_pointer_cast<FileSource>(s->second);
4660 if (ms && fs && fs->path() == path) {
4665 return boost::shared_ptr<MidiSource>();
4669 Session::count_sources_by_origin (const string& path)
4672 Glib::Threads::Mutex::Lock lm (source_lock);
4674 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
4675 boost::shared_ptr<FileSource> fs
4676 = boost::dynamic_pointer_cast<FileSource>(i->second);
4678 if (fs && fs->origin() == path) {
4687 peak_file_helper (const string& peak_path, const string& file_path, const string& file_base, bool hash) {
4689 std::string checksum = Glib::Checksum::compute_checksum(Glib::Checksum::CHECKSUM_SHA1, file_path + G_DIR_SEPARATOR + file_base);
4690 return Glib::build_filename (peak_path, checksum + peakfile_suffix);
4692 return Glib::build_filename (peak_path, file_base + peakfile_suffix);
4697 Session::construct_peak_filepath (const string& filepath, const bool in_session, const bool old_peak_name) const
4699 string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
4701 if (Glib::path_is_absolute (filepath)) {
4703 /* rip the session dir from the audiofile source */
4705 string session_path;
4706 bool in_another_session = true;
4708 if (filepath.find (interchange_dir_string) != string::npos) {
4710 session_path = Glib::path_get_dirname (filepath); /* now ends in audiofiles */
4711 session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
4712 session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
4713 session_path = Glib::path_get_dirname (session_path); /* now has session path */
4715 /* see if it is within our session */
4717 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4718 if (i->path == session_path) {
4719 in_another_session = false;
4724 in_another_session = false;
4728 if (in_another_session) {
4729 SessionDirectory sd (session_path);
4730 return peak_file_helper (sd.peak_path(), "", Glib::path_get_basename (filepath), !old_peak_name);
4734 /* 1) if file belongs to this session
4735 * it may be a relative path (interchange/...)
4736 * or just basename (session_state, remove source)
4737 * -> just use the basename
4739 std::string filename = Glib::path_get_basename (filepath);
4742 /* 2) if the file is outside our session dir:
4743 * (imported but not copied) add the path for check-summming */
4745 path = Glib::path_get_dirname (filepath);
4748 return peak_file_helper (_session_dir->peak_path(), path, Glib::path_get_basename (filepath), !old_peak_name);
4752 Session::new_audio_source_path_for_embedded (const std::string& path)
4756 * we know that the filename is already unique because it exists
4757 * out in the filesystem.
4759 * However, when we bring it into the session, we could get a
4762 * Eg. two embedded files:
4767 * When merged into session, these collide.
4769 * There will not be a conflict with in-memory sources
4770 * because when the source was created we already picked
4771 * a unique name for it.
4773 * This collision is not likely to be common, but we have to guard
4774 * against it. So, if there is a collision, take the md5 hash of the
4775 * the path, and use that as the filename instead.
4778 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4779 string base = Glib::path_get_basename (path);
4780 string newpath = Glib::build_filename (sdir.sound_path(), base);
4782 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4786 md5.digestString (path.c_str());
4787 md5.writeToString ();
4788 base = md5.digestChars;
4790 string ext = get_suffix (path);
4797 newpath = Glib::build_filename (sdir.sound_path(), base);
4799 /* if this collides, we're screwed */
4801 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4802 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
4811 /** Return true if there are no audio file sources that use @param name as
4812 * the filename component of their path.
4814 * Return false otherwise.
4816 * This method MUST ONLY be used to check in-session, mono files since it
4817 * hard-codes the channel of the audio file source we are looking for as zero.
4819 * If/when Ardour supports native files in non-mono formats, the logic here
4820 * will need to be revisited.
4823 Session::audio_source_name_is_unique (const string& name)
4825 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
4826 vector<space_and_path>::iterator i;
4827 uint32_t existing = 0;
4829 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4831 /* note that we search *without* the extension so that
4832 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
4833 in the event that this new name is required for
4834 a file format change.
4837 const string spath = *i;
4839 if (matching_unsuffixed_filename_exists_in (spath, name)) {
4844 /* it is possible that we have the path already
4845 * assigned to a source that has not yet been written
4846 * (ie. the write source for a diskstream). we have to
4847 * check this in order to make sure that our candidate
4848 * path isn't used again, because that can lead to
4849 * two Sources point to the same file with different
4850 * notions of their removability.
4854 string possible_path = Glib::build_filename (spath, name);
4856 if (audio_source_by_path_and_channel (possible_path, 0)) {
4862 return (existing == 0);
4866 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)
4869 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4871 if (Profile->get_trx() && destructive) {
4873 sstr << setfill ('0') << setw (4) << cnt;
4874 sstr << legalized_base;
4876 sstr << legalized_base;
4878 if (take_required || related_exists) {
4890 } else if (nchan > 2) {
4895 /* XXX what? more than 26 channels! */
4906 /** Return a unique name based on \a base for a new internal audio source */
4908 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
4911 string possible_name;
4912 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
4914 bool some_related_source_name_exists = false;
4916 legalized = legalize_for_path (base);
4918 // Find a "version" of the base name that doesn't exist in any of the possible directories.
4920 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
4922 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
4924 if (audio_source_name_is_unique (possible_name)) {
4928 some_related_source_name_exists = true;
4931 error << string_compose(
4932 _("There are already %1 recordings for %2, which I consider too many."),
4933 limit, base) << endmsg;
4935 throw failed_constructor();
4939 /* We've established that the new name does not exist in any session
4940 * directory, so now find out which one we should use for this new
4944 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4946 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
4951 /** Return a unique name based on `base` for a new internal MIDI source */
4953 Session::new_midi_source_path (const string& base)
4956 char buf[PATH_MAX+1];
4957 const uint32_t limit = 10000;
4959 string possible_path;
4960 string possible_name;
4963 legalized = legalize_for_path (base);
4965 // Find a "version" of the file name that doesn't exist in any of the possible directories.
4966 std::vector<string> sdirs = source_search_path(DataType::MIDI);
4968 /* - the main session folder is the first in the vector.
4969 * - after checking all locations for file-name uniqueness,
4970 * we keep the one from the last iteration as new file name
4971 * - midi files are small and should just be kept in the main session-folder
4973 * -> reverse the array, check main session folder last and use that as location
4976 std::reverse(sdirs.begin(), sdirs.end());
4978 for (cnt = 1; cnt <= limit; ++cnt) {
4980 vector<space_and_path>::iterator i;
4981 uint32_t existing = 0;
4983 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4985 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
4986 possible_name = buf;
4988 possible_path = Glib::build_filename (*i, possible_name);
4990 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
4994 if (midi_source_by_path (possible_path)) {
4999 if (existing == 0) {
5004 error << string_compose(
5005 _("There are already %1 recordings for %2, which I consider too many."),
5006 limit, base) << endmsg;
5012 /* No need to "find best location" for software/app-based RAID, because
5013 MIDI is so small that we always put it in the same place.
5016 return possible_path;
5020 /** Create a new within-session audio source */
5021 boost::shared_ptr<AudioFileSource>
5022 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
5024 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
5026 if (!path.empty()) {
5027 return boost::dynamic_pointer_cast<AudioFileSource> (
5028 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate(), true, true));
5030 throw failed_constructor ();
5034 /** Create a new within-session MIDI source */
5035 boost::shared_ptr<MidiSource>
5036 Session::create_midi_source_for_session (string const & basic_name)
5038 const string path = new_midi_source_path (basic_name);
5040 if (!path.empty()) {
5041 return boost::dynamic_pointer_cast<SMFSource> (
5042 SourceFactory::createWritable (
5043 DataType::MIDI, *this, path, false, frame_rate()));
5045 throw failed_constructor ();
5049 /** Create a new within-session MIDI source */
5050 boost::shared_ptr<MidiSource>
5051 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
5053 /* the caller passes in the track the source will be used in,
5054 so that we can keep the numbering sane.
5056 Rationale: a track with the name "Foo" that has had N
5057 captures carried out so far will ALREADY have a write source
5058 named "Foo-N+1.mid" waiting to be used for the next capture.
5060 If we call new_midi_source_name() we will get "Foo-N+2". But
5061 there is no region corresponding to "Foo-N+1", so when
5062 "Foo-N+2" appears in the track, the gap presents the user
5063 with odd behaviour - why did it skip past Foo-N+1?
5065 We could explain this to the user in some odd way, but
5066 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
5069 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
5072 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
5074 std::string name = track->steal_write_source_name ();
5077 return boost::shared_ptr<MidiSource>();
5080 /* MIDI files are small, just put them in the first location of the
5081 session source search path.
5084 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
5086 return boost::dynamic_pointer_cast<SMFSource> (
5087 SourceFactory::createWritable (
5088 DataType::MIDI, *this, path, false, frame_rate()));
5093 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
5095 if (playlist->hidden()) {
5099 playlists->add (playlist);
5102 playlist->release();
5109 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
5111 if (_state_of_the_state & Deletion) {
5115 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
5121 playlists->remove (playlist);
5127 Session::set_audition (boost::shared_ptr<Region> r)
5129 pending_audition_region = r;
5130 add_post_transport_work (PostTransportAudition);
5131 _butler->schedule_transport_work ();
5135 Session::audition_playlist ()
5137 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
5138 ev->region.reset ();
5144 Session::register_lua_function (
5145 const std::string& name,
5146 const std::string& script,
5147 const LuaScriptParamList& args
5150 Glib::Threads::Mutex::Lock lm (lua_lock);
5152 lua_State* L = lua.getState();
5154 const std::string& bytecode = LuaScripting::get_factory_bytecode (script);
5155 luabridge::LuaRef tbl_arg (luabridge::newTable(L));
5156 for (LuaScriptParamList::const_iterator i = args.begin(); i != args.end(); ++i) {
5157 if ((*i)->optional && !(*i)->is_set) { continue; }
5158 tbl_arg[(*i)->name] = (*i)->value;
5160 (*_lua_add)(name, bytecode, tbl_arg); // throws luabridge::LuaException
5165 Session::unregister_lua_function (const std::string& name)
5167 Glib::Threads::Mutex::Lock lm (lua_lock);
5168 (*_lua_del)(name); // throws luabridge::LuaException
5169 lua.collect_garbage ();
5173 std::vector<std::string>
5174 Session::registered_lua_functions ()
5176 Glib::Threads::Mutex::Lock lm (lua_lock);
5177 std::vector<std::string> rv;
5180 luabridge::LuaRef list ((*_lua_list)());
5181 for (luabridge::Iterator i (list); !i.isNil (); ++i) {
5182 if (!i.key ().isString ()) { assert(0); continue; }
5183 rv.push_back (i.key ().cast<std::string> ());
5185 } catch (luabridge::LuaException const& e) { }
5190 static void _lua_print (std::string s) {
5191 std::cout << "SessionLua: " << s << "\n";
5196 Session::try_run_lua (pframes_t nframes)
5198 if (_n_lua_scripts == 0) return;
5199 Glib::Threads::Mutex::Lock tm (lua_lock, Glib::Threads::TRY_LOCK);
5201 try { (*_lua_run)(nframes); } catch (luabridge::LuaException const& e) { }
5202 lua.collect_garbage_step ();
5207 Session::setup_lua ()
5210 lua.Print.connect (&_lua_print);
5214 "function ArdourSession ()"
5215 " local self = { scripts = {}, instances = {} }"
5217 " local remove = function (n)"
5218 " self.scripts[n] = nil"
5219 " self.instances[n] = nil"
5220 " Session:scripts_changed()" // call back
5223 " local addinternal = function (n, f, a)"
5224 " assert(type(n) == 'string', 'function-name must be string')"
5225 " assert(type(f) == 'function', 'Given script is a not a function')"
5226 " assert(type(a) == 'table' or type(a) == 'nil', 'Given argument is invalid')"
5227 " assert(self.scripts[n] == nil, 'Callback \"'.. n ..'\" already exists.')"
5228 " self.scripts[n] = { ['f'] = f, ['a'] = a }"
5229 " local env = _ENV; env.f = nil env.io = nil env.os = nil env.loadfile = nil env.require = nil env.dofile = nil env.package = nil env.debug = nil"
5230 " local env = { print = print, tostring = tostring, assert = assert, ipairs = ipairs, error = error, select = select, string = string, type = type, tonumber = tonumber, collectgarbage = collectgarbage, pairs = pairs, math = math, table = table, pcall = pcall, Session = Session, PBD = PBD, Timecode = Timecode, Evoral = Evoral, C = C, ARDOUR = ARDOUR }"
5231 " self.instances[n] = load (string.dump(f, true), nil, nil, env)(a)"
5232 " Session:scripts_changed()" // call back
5235 " local add = function (n, b, a)"
5236 " assert(type(b) == 'string', 'ByteCode must be string')"
5237 " load (b)()" // assigns f
5238 " assert(type(f) == 'string', 'Assigned ByteCode must be string')"
5239 " addinternal (n, load(f), a)"
5242 " local run = function (...)"
5243 " for n, s in pairs (self.instances) do"
5244 " local status, err = pcall (s, ...)"
5245 " if not status then"
5246 " print ('fn \"'.. n .. '\": ', err)"
5253 " local cleanup = function ()"
5254 " self.scripts = nil"
5255 " self.instances = nil"
5258 " local list = function ()"
5260 " for n, _ in pairs (self.scripts) do"
5266 " local function basic_serialize (o)"
5267 " if type(o) == \"number\" then"
5268 " return tostring(o)"
5270 " return string.format(\"%q\", o)"
5274 " local function serialize (name, value)"
5275 " local rv = name .. ' = '"
5277 " if type(value) == \"number\" or type(value) == \"string\" or type(value) == \"nil\" then"
5278 " return rv .. basic_serialize(value) .. ' '"
5279 " elseif type(value) == \"table\" then"
5281 " for k,v in pairs(value) do"
5282 " local fieldname = string.format(\"%s[%s]\", name, basic_serialize(k))"
5283 " rv = rv .. serialize(fieldname, v) .. ' '"
5284 " collectgarbage()" // string concatenation allocates a new string :(
5287 " elseif type(value) == \"function\" then"
5288 " return rv .. string.format(\"%q\", string.dump(value, true))"
5290 " error('cannot save a ' .. type(value))"
5295 " local save = function ()"
5296 " return (serialize('scripts', self.scripts))"
5299 " local restore = function (state)"
5300 " self.scripts = {}"
5302 " for n, s in pairs (scripts) do"
5303 " addinternal (n, load(s['f']), s['a'])"
5307 " return { run = run, add = add, remove = remove,"
5308 " list = list, restore = restore, save = save, cleanup = cleanup}"
5311 " sess = ArdourSession ()"
5312 " ArdourSession = nil"
5314 "function ardour () end"
5317 lua_State* L = lua.getState();
5320 luabridge::LuaRef lua_sess = luabridge::getGlobal (L, "sess");
5321 lua.do_command ("sess = nil"); // hide it.
5322 lua.do_command ("collectgarbage()");
5324 _lua_run = new luabridge::LuaRef(lua_sess["run"]);
5325 _lua_add = new luabridge::LuaRef(lua_sess["add"]);
5326 _lua_del = new luabridge::LuaRef(lua_sess["remove"]);
5327 _lua_list = new luabridge::LuaRef(lua_sess["list"]);
5328 _lua_save = new luabridge::LuaRef(lua_sess["save"]);
5329 _lua_load = new luabridge::LuaRef(lua_sess["restore"]);
5330 _lua_cleanup = new luabridge::LuaRef(lua_sess["cleanup"]);
5331 } catch (luabridge::LuaException const& e) {
5332 fatal << string_compose (_("programming error: %1"),
5333 X_("Failed to setup Lua interpreter"))
5335 abort(); /*NOTREACHED*/
5338 LuaBindings::stddef (L);
5339 LuaBindings::common (L);
5340 LuaBindings::dsp (L);
5341 luabridge::push <Session *> (L, this);
5342 lua_setglobal (L, "Session");
5346 Session::scripts_changed ()
5348 assert (!lua_lock.trylock()); // must hold lua_lock
5351 luabridge::LuaRef list ((*_lua_list)());
5353 for (luabridge::Iterator i (list); !i.isNil (); ++i) {
5354 if (!i.key ().isString ()) { assert(0); continue; }
5357 _n_lua_scripts = cnt;
5358 } catch (luabridge::LuaException const& e) {
5359 fatal << string_compose (_("programming error: %1"),
5360 X_("Indexing Lua Session Scripts failed."))
5362 abort(); /*NOTREACHED*/
5367 Session::non_realtime_set_audition ()
5369 assert (pending_audition_region);
5370 auditioner->audition_region (pending_audition_region);
5371 pending_audition_region.reset ();
5372 AuditionActive (true); /* EMIT SIGNAL */
5376 Session::audition_region (boost::shared_ptr<Region> r)
5378 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
5384 Session::cancel_audition ()
5389 if (auditioner->auditioning()) {
5390 auditioner->cancel_audition ();
5391 AuditionActive (false); /* EMIT SIGNAL */
5396 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
5398 if (a->is_monitor()) {
5401 if (b->is_monitor()) {
5404 return a->presentation_info().order() < b->presentation_info().order();
5408 Session::is_auditioning () const
5410 /* can be called before we have an auditioner object */
5412 return auditioner->auditioning();
5419 Session::graph_reordered ()
5421 /* don't do this stuff if we are setting up connections
5422 from a set_state() call or creating new tracks. Ditto for deletion.
5425 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _reconnecting_routes_in_progress || _route_deletion_in_progress) {
5429 /* every track/bus asked for this to be handled but it was deferred because
5430 we were connecting. do it now.
5433 request_input_change_handling ();
5437 /* force all diskstreams to update their capture offset values to
5438 reflect any changes in latencies within the graph.
5441 boost::shared_ptr<RouteList> rl = routes.reader ();
5442 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5443 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5445 tr->set_capture_offset ();
5450 /** @return Number of frames that there is disk space available to write,
5453 boost::optional<framecnt_t>
5454 Session::available_capture_duration ()
5456 Glib::Threads::Mutex::Lock lm (space_lock);
5458 if (_total_free_4k_blocks_uncertain) {
5459 return boost::optional<framecnt_t> ();
5462 float sample_bytes_on_disk = 4.0; // keep gcc happy
5464 switch (config.get_native_file_data_format()) {
5466 sample_bytes_on_disk = 4.0;
5470 sample_bytes_on_disk = 3.0;
5474 sample_bytes_on_disk = 2.0;
5478 /* impossible, but keep some gcc versions happy */
5479 fatal << string_compose (_("programming error: %1"),
5480 X_("illegal native file data format"))
5482 abort(); /*NOTREACHED*/
5485 double scale = 4096.0 / sample_bytes_on_disk;
5487 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
5488 return max_framecnt;
5491 return (framecnt_t) floor (_total_free_4k_blocks * scale);
5495 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
5498 RCUWriter<BundleList> writer (_bundles);
5499 boost::shared_ptr<BundleList> b = writer.get_copy ();
5500 b->push_back (bundle);
5504 BundleAddedOrRemoved (); /* EMIT SIGNAL */
5511 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
5513 bool removed = false;
5516 RCUWriter<BundleList> writer (_bundles);
5517 boost::shared_ptr<BundleList> b = writer.get_copy ();
5518 BundleList::iterator i = find (b->begin(), b->end(), bundle);
5520 if (i != b->end()) {
5527 BundleAddedOrRemoved (); /* EMIT SIGNAL */
5533 boost::shared_ptr<Bundle>
5534 Session::bundle_by_name (string name) const
5536 boost::shared_ptr<BundleList> b = _bundles.reader ();
5538 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
5539 if ((*i)->name() == name) {
5544 return boost::shared_ptr<Bundle> ();
5548 Session::tempo_map_changed (const PropertyChange&)
5552 playlists->update_after_tempo_map_change ();
5554 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
5560 Session::gui_tempo_map_changed ()
5564 playlists->update_after_tempo_map_change ();
5566 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
5570 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
5572 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
5573 (*i)->recompute_frames_from_bbt ();
5577 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
5578 * the given count with the current block size.
5581 Session::ensure_buffers (ChanCount howmany)
5583 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
5587 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
5589 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5590 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
5595 Session::next_insert_id ()
5597 /* this doesn't really loop forever. just think about it */
5600 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < insert_bitset.size(); ++n) {
5601 if (!insert_bitset[n]) {
5602 insert_bitset[n] = true;
5608 /* none available, so resize and try again */
5610 insert_bitset.resize (insert_bitset.size() + 16, false);
5615 Session::next_send_id ()
5617 /* this doesn't really loop forever. just think about it */
5620 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < send_bitset.size(); ++n) {
5621 if (!send_bitset[n]) {
5622 send_bitset[n] = true;
5628 /* none available, so resize and try again */
5630 send_bitset.resize (send_bitset.size() + 16, false);
5635 Session::next_aux_send_id ()
5637 /* this doesn't really loop forever. just think about it */
5640 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < aux_send_bitset.size(); ++n) {
5641 if (!aux_send_bitset[n]) {
5642 aux_send_bitset[n] = true;
5648 /* none available, so resize and try again */
5650 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
5655 Session::next_return_id ()
5657 /* this doesn't really loop forever. just think about it */
5660 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < return_bitset.size(); ++n) {
5661 if (!return_bitset[n]) {
5662 return_bitset[n] = true;
5668 /* none available, so resize and try again */
5670 return_bitset.resize (return_bitset.size() + 16, false);
5675 Session::mark_send_id (uint32_t id)
5677 if (id >= send_bitset.size()) {
5678 send_bitset.resize (id+16, false);
5680 if (send_bitset[id]) {
5681 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
5683 send_bitset[id] = true;
5687 Session::mark_aux_send_id (uint32_t id)
5689 if (id >= aux_send_bitset.size()) {
5690 aux_send_bitset.resize (id+16, false);
5692 if (aux_send_bitset[id]) {
5693 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
5695 aux_send_bitset[id] = true;
5699 Session::mark_return_id (uint32_t id)
5701 if (id >= return_bitset.size()) {
5702 return_bitset.resize (id+16, false);
5704 if (return_bitset[id]) {
5705 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
5707 return_bitset[id] = true;
5711 Session::mark_insert_id (uint32_t id)
5713 if (id >= insert_bitset.size()) {
5714 insert_bitset.resize (id+16, false);
5716 if (insert_bitset[id]) {
5717 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
5719 insert_bitset[id] = true;
5723 Session::unmark_send_id (uint32_t id)
5725 if (id < send_bitset.size()) {
5726 send_bitset[id] = false;
5731 Session::unmark_aux_send_id (uint32_t id)
5733 if (id < aux_send_bitset.size()) {
5734 aux_send_bitset[id] = false;
5739 Session::unmark_return_id (uint32_t id)
5741 if (_state_of_the_state & Deletion) { return; }
5742 if (id < return_bitset.size()) {
5743 return_bitset[id] = false;
5748 Session::unmark_insert_id (uint32_t id)
5750 if (id < insert_bitset.size()) {
5751 insert_bitset[id] = false;
5756 Session::reset_native_file_format ()
5758 boost::shared_ptr<RouteList> rl = routes.reader ();
5760 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5761 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5763 /* don't save state as we do this, there's no point
5765 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
5766 tr->reset_write_sources (false);
5767 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
5773 Session::route_name_unique (string n) const
5775 boost::shared_ptr<RouteList> r = routes.reader ();
5777 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5778 if ((*i)->name() == n) {
5787 Session::route_name_internal (string n) const
5789 if (auditioner && auditioner->name() == n) {
5793 if (_click_io && _click_io->name() == n) {
5801 Session::freeze_all (InterThreadInfo& itt)
5803 boost::shared_ptr<RouteList> r = routes.reader ();
5805 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5807 boost::shared_ptr<Track> t;
5809 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
5810 /* XXX this is wrong because itt.progress will keep returning to zero at the start
5820 boost::shared_ptr<Region>
5821 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
5822 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
5823 InterThreadInfo& itt,
5824 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
5825 bool for_export, bool for_freeze)
5827 boost::shared_ptr<Region> result;
5828 boost::shared_ptr<Playlist> playlist;
5829 boost::shared_ptr<Source> source;
5830 ChanCount diskstream_channels (track.n_channels());
5831 framepos_t position;
5832 framecnt_t this_chunk;
5834 framepos_t latency_skip;
5836 framepos_t len = end - start;
5837 bool need_block_size_reset = false;
5838 ChanCount const max_proc = track.max_processor_streams ();
5839 string legal_playlist_name;
5840 string possible_path;
5843 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
5844 end, start) << endmsg;
5848 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
5849 include_endpoint, for_export, for_freeze);
5851 if (diskstream_channels.n(track.data_type()) < 1) {
5852 error << _("Cannot write a range with no data.") << endmsg;
5856 // block all process callback handling
5858 block_processing ();
5861 // synchronize with AudioEngine::process_callback()
5862 // make sure processing is not currently running
5863 // and processing_blocked() is honored before
5864 // acquiring thread buffers
5865 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5868 _bounce_processing_active = true;
5870 /* call tree *MUST* hold route_lock */
5872 if ((playlist = track.playlist()) == 0) {
5876 legal_playlist_name = legalize_for_path (playlist->name());
5878 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
5880 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
5881 string path = ((track.data_type() == DataType::AUDIO)
5882 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
5883 : new_midi_source_path (legal_playlist_name));
5890 source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
5893 catch (failed_constructor& err) {
5894 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
5898 srcs.push_back (source);
5901 /* tell redirects that care that we are about to use a much larger
5902 * blocksize. this will flush all plugins too, so that they are ready
5903 * to be used for this process.
5906 need_block_size_reset = true;
5907 track.set_block_size (bounce_chunk_size);
5908 _engine.main_thread()->get_buffers ();
5912 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5914 /* create a set of reasonably-sized buffers */
5915 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5916 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
5918 buffers.set_count (max_proc);
5920 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5921 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5922 boost::shared_ptr<MidiSource> ms;
5924 afs->prepare_for_peakfile_writes ();
5925 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5926 Source::Lock lock(ms->mutex());
5927 ms->mark_streaming_write_started(lock);
5931 while (to_do && !itt.cancel) {
5933 this_chunk = min (to_do, bounce_chunk_size);
5935 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
5939 start += this_chunk;
5940 to_do -= this_chunk;
5941 itt.progress = (float) (1.0 - ((double) to_do / len));
5943 if (latency_skip >= bounce_chunk_size) {
5944 latency_skip -= bounce_chunk_size;
5948 const framecnt_t current_chunk = this_chunk - latency_skip;
5951 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5952 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5953 boost::shared_ptr<MidiSource> ms;
5956 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
5959 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5960 Source::Lock lock(ms->mutex());
5962 const MidiBuffer& buf = buffers.get_midi(0);
5963 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
5964 Evoral::Event<framepos_t> ev = *i;
5965 ev.set_time(ev.time() - position);
5966 ms->append_event_frames(lock, ev, ms->timeline_position());
5973 /* post-roll, pick up delayed processor output */
5974 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5976 while (latency_skip && !itt.cancel) {
5977 this_chunk = min (latency_skip, bounce_chunk_size);
5978 latency_skip -= this_chunk;
5980 buffers.silence (this_chunk, 0);
5981 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
5984 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5985 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5988 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
6000 xnow = localtime (&now);
6002 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
6003 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6004 boost::shared_ptr<MidiSource> ms;
6007 afs->update_header (position, *xnow, now);
6008 afs->flush_header ();
6009 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
6010 Source::Lock lock(ms->mutex());
6011 ms->mark_streaming_write_completed(lock);
6015 /* construct a region to represent the bounced material */
6019 plist.add (Properties::start, 0);
6020 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
6021 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
6023 result = RegionFactory::create (srcs, plist);
6029 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
6030 (*src)->mark_for_remove ();
6031 (*src)->drop_references ();
6035 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
6036 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6039 afs->done_with_peakfile_writes ();
6043 _bounce_processing_active = false;
6045 if (need_block_size_reset) {
6046 _engine.main_thread()->drop_buffers ();
6047 track.set_block_size (get_block_size());
6050 unblock_processing ();
6056 Session::gain_automation_buffer() const
6058 return ProcessThread::gain_automation_buffer ();
6062 Session::trim_automation_buffer() const
6064 return ProcessThread::trim_automation_buffer ();
6068 Session::send_gain_automation_buffer() const
6070 return ProcessThread::send_gain_automation_buffer ();
6074 Session::pan_automation_buffer() const
6076 return ProcessThread::pan_automation_buffer ();
6080 Session::get_silent_buffers (ChanCount count)
6082 return ProcessThread::get_silent_buffers (count);
6086 Session::get_scratch_buffers (ChanCount count, bool silence)
6088 return ProcessThread::get_scratch_buffers (count, silence);
6092 Session::get_noinplace_buffers (ChanCount count)
6094 return ProcessThread::get_noinplace_buffers (count);
6098 Session::get_route_buffers (ChanCount count, bool silence)
6100 return ProcessThread::get_route_buffers (count, silence);
6105 Session::get_mix_buffers (ChanCount count)
6107 return ProcessThread::get_mix_buffers (count);
6111 Session::ntracks () const
6114 boost::shared_ptr<RouteList> r = routes.reader ();
6116 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
6117 if (boost::dynamic_pointer_cast<Track> (*i)) {
6126 Session::nbusses () const
6129 boost::shared_ptr<RouteList> r = routes.reader ();
6131 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
6132 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
6141 Session::add_automation_list(AutomationList *al)
6143 automation_lists[al->id()] = al;
6146 /** @return true if there is at least one record-enabled track, otherwise false */
6148 Session::have_rec_enabled_track () const
6150 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
6154 Session::have_rec_disabled_track () const
6156 return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
6159 /** Update the state of our rec-enabled tracks flag */
6161 Session::update_route_record_state ()
6163 boost::shared_ptr<RouteList> rl = routes.reader ();
6164 RouteList::iterator i = rl->begin();
6165 while (i != rl->end ()) {
6167 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6168 if (tr && tr->rec_enable_control()->get_value()) {
6175 int const old = g_atomic_int_get (&_have_rec_enabled_track);
6177 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
6179 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
6180 RecordStateChanged (); /* EMIT SIGNAL */
6183 for (i = rl->begin(); i != rl->end (); ++i) {
6184 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6185 if (tr && !tr->rec_enable_control()->get_value()) {
6190 g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
6192 bool record_arm_state_changed = (old != g_atomic_int_get (&_have_rec_enabled_track) );
6194 if (record_status() == Recording && record_arm_state_changed ) {
6195 RecordArmStateChanged ();
6201 Session::listen_position_changed ()
6203 boost::shared_ptr<RouteList> r = routes.reader ();
6205 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6206 (*i)->listen_position_changed ();
6211 Session::solo_control_mode_changed ()
6213 if (soloing() || listening()) {
6214 /* We can't use ::clear_all_solo_state() here because during
6215 session loading at program startup, that will queue a call
6216 to rt_clear_all_solo_state() that will not execute until
6217 AFTER solo states have been established (thus throwing away
6218 the session's saved solo state). So just explicitly turn
6221 set_controls (route_list_to_control_list (get_routes(), &Stripable::solo_control), 0.0, Controllable::NoGroup);
6225 /** Called when a property of one of our route groups changes */
6227 Session::route_group_property_changed (RouteGroup* rg)
6229 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
6232 /** Called when a route is added to one of our route groups */
6234 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
6236 RouteAddedToRouteGroup (rg, r);
6239 /** Called when a route is removed from one of our route groups */
6241 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
6243 update_route_record_state ();
6244 RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
6247 boost::shared_ptr<RouteList>
6248 Session::get_tracks () const
6250 boost::shared_ptr<RouteList> rl = routes.reader ();
6251 boost::shared_ptr<RouteList> tl (new RouteList);
6253 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
6254 if (boost::dynamic_pointer_cast<Track> (*r)) {
6255 if (!(*r)->is_auditioner()) {
6263 boost::shared_ptr<RouteList>
6264 Session::get_routes_with_regions_at (framepos_t const p) const
6266 boost::shared_ptr<RouteList> r = routes.reader ();
6267 boost::shared_ptr<RouteList> rl (new RouteList);
6269 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6270 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6275 boost::shared_ptr<Playlist> pl = tr->playlist ();
6280 if (pl->has_region_at (p)) {
6289 Session::goto_end ()
6291 if (_session_range_location) {
6292 request_locate (_session_range_location->end(), false);
6294 request_locate (0, false);
6299 Session::goto_start ()
6301 if (_session_range_location) {
6302 request_locate (_session_range_location->start(), false);
6304 request_locate (0, false);
6309 Session::current_start_frame () const
6311 return _session_range_location ? _session_range_location->start() : 0;
6315 Session::current_end_frame () const
6317 return _session_range_location ? _session_range_location->end() : 0;
6321 Session::set_session_range_location (framepos_t start, framepos_t end)
6323 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
6324 _locations->add (_session_range_location);
6328 Session::step_edit_status_change (bool yn)
6334 send = (_step_editors == 0);
6339 send = (_step_editors == 1);
6342 if (_step_editors > 0) {
6348 StepEditStatusChange (val);
6354 Session::start_time_changed (framepos_t old)
6356 /* Update the auto loop range to match the session range
6357 (unless the auto loop range has been changed by the user)
6360 Location* s = _locations->session_range_location ();
6365 Location* l = _locations->auto_loop_location ();
6367 if (l && l->start() == old) {
6368 l->set_start (s->start(), true);
6374 Session::end_time_changed (framepos_t old)
6376 /* Update the auto loop range to match the session range
6377 (unless the auto loop range has been changed by the user)
6380 Location* s = _locations->session_range_location ();
6385 Location* l = _locations->auto_loop_location ();
6387 if (l && l->end() == old) {
6388 l->set_end (s->end(), true);
6393 std::vector<std::string>
6394 Session::source_search_path (DataType type) const
6398 if (session_dirs.size() == 1) {
6400 case DataType::AUDIO:
6401 sp.push_back (_session_dir->sound_path());
6403 case DataType::MIDI:
6404 sp.push_back (_session_dir->midi_path());
6408 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
6409 SessionDirectory sdir (i->path);
6411 case DataType::AUDIO:
6412 sp.push_back (sdir.sound_path());
6414 case DataType::MIDI:
6415 sp.push_back (sdir.midi_path());
6421 if (type == DataType::AUDIO) {
6422 const string sound_path_2X = _session_dir->sound_path_2X();
6423 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
6424 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
6425 sp.push_back (sound_path_2X);
6430 // now check the explicit (possibly user-specified) search path
6433 case DataType::AUDIO:
6434 sp += Searchpath(config.get_audio_search_path ());
6436 case DataType::MIDI:
6437 sp += Searchpath(config.get_midi_search_path ());
6445 Session::ensure_search_path_includes (const string& path, DataType type)
6454 case DataType::AUDIO:
6455 sp += Searchpath(config.get_audio_search_path ());
6457 case DataType::MIDI:
6458 sp += Searchpath (config.get_midi_search_path ());
6462 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
6463 /* No need to add this new directory if it has the same inode as
6464 an existing one; checking inode rather than name prevents duplicated
6465 directories when we are using symlinks.
6467 On Windows, I think we could just do if (*i == path) here.
6469 if (PBD::equivalent_paths (*i, path)) {
6477 case DataType::AUDIO:
6478 config.set_audio_search_path (sp.to_string());
6480 case DataType::MIDI:
6481 config.set_midi_search_path (sp.to_string());
6487 Session::remove_dir_from_search_path (const string& dir, DataType type)
6492 case DataType::AUDIO:
6493 sp = Searchpath(config.get_audio_search_path ());
6495 case DataType::MIDI:
6496 sp = Searchpath (config.get_midi_search_path ());
6503 case DataType::AUDIO:
6504 config.set_audio_search_path (sp.to_string());
6506 case DataType::MIDI:
6507 config.set_midi_search_path (sp.to_string());
6513 boost::shared_ptr<Speakers>
6514 Session::get_speakers()
6520 Session::unknown_processors () const
6524 boost::shared_ptr<RouteList> r = routes.reader ();
6525 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6526 list<string> t = (*i)->unknown_processors ();
6527 copy (t.begin(), t.end(), back_inserter (p));
6537 Session::update_latency (bool playback)
6540 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
6542 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _route_deletion_in_progress) {
6546 boost::shared_ptr<RouteList> r = routes.reader ();
6547 framecnt_t max_latency = 0;
6550 /* reverse the list so that we work backwards from the last route to run to the first */
6551 RouteList* rl = routes.reader().get();
6552 r.reset (new RouteList (*rl));
6553 reverse (r->begin(), r->end());
6556 /* compute actual latency values for the given direction and store them all in per-port
6557 structures. this will also publish the same values (to JACK) so that computation of latency
6558 for routes can consistently use public latency values.
6561 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6562 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
6565 /* because we latency compensate playback, our published playback latencies should
6566 be the same for all output ports - all material played back by ardour has
6567 the same latency, whether its caused by plugins or by latency compensation. since
6568 these may differ from the values computed above, reset all playback port latencies
6572 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
6574 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6575 (*i)->set_public_port_latencies (max_latency, playback);
6580 post_playback_latency ();
6584 post_capture_latency ();
6587 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
6591 Session::post_playback_latency ()
6593 set_worst_playback_latency ();
6595 boost::shared_ptr<RouteList> r = routes.reader ();
6597 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6598 if (!(*i)->is_auditioner() && ((*i)->active())) {
6599 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
6603 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6604 (*i)->set_latency_compensation (_worst_track_latency);
6609 Session::post_capture_latency ()
6611 set_worst_capture_latency ();
6613 /* reflect any changes in capture latencies into capture offsets
6616 boost::shared_ptr<RouteList> rl = routes.reader();
6617 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
6618 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6620 tr->set_capture_offset ();
6626 Session::initialize_latencies ()
6629 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
6630 update_latency (false);
6631 update_latency (true);
6634 set_worst_io_latencies ();
6638 Session::set_worst_io_latencies ()
6640 set_worst_playback_latency ();
6641 set_worst_capture_latency ();
6645 Session::set_worst_playback_latency ()
6647 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6651 _worst_output_latency = 0;
6653 if (!_engine.connected()) {
6657 boost::shared_ptr<RouteList> r = routes.reader ();
6659 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6660 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
6663 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
6667 Session::set_worst_capture_latency ()
6669 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6673 _worst_input_latency = 0;
6675 if (!_engine.connected()) {
6679 boost::shared_ptr<RouteList> r = routes.reader ();
6681 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6682 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
6685 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
6689 Session::update_latency_compensation (bool force_whole_graph)
6691 bool some_track_latency_changed = false;
6693 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6697 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
6699 _worst_track_latency = 0;
6701 boost::shared_ptr<RouteList> r = routes.reader ();
6703 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6704 if (!(*i)->is_auditioner() && ((*i)->active())) {
6706 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
6707 some_track_latency_changed = true;
6709 _worst_track_latency = max (tl, _worst_track_latency);
6713 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
6714 (some_track_latency_changed ? "yes" : "no")));
6716 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
6718 if (some_track_latency_changed || force_whole_graph) {
6719 _engine.update_latencies ();
6723 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6724 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6728 tr->set_capture_offset ();
6733 Session::session_name_is_legal (const string& path)
6735 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
6737 for (int i = 0; illegal_chars[i]; ++i) {
6738 if (path.find (illegal_chars[i]) != string::npos) {
6739 return illegal_chars[i];
6747 Session::notify_presentation_info_change ()
6749 if (deletion_in_progress()) {
6753 PresentationInfo::Change (); /* EMIT SIGNAL */
6754 reassign_track_numbers();
6756 #ifdef USE_TRACKS_CODE_FEATURES
6757 /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
6758 * if track order has been changed by user
6760 reconnect_existing_routes(true, true);
6766 Session::operation_in_progress (GQuark op) const
6768 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
6771 boost::shared_ptr<Port>
6772 Session::ltc_input_port () const
6774 return _ltc_input->nth (0);
6777 boost::shared_ptr<Port>
6778 Session::ltc_output_port () const
6780 return _ltc_output->nth (0);
6784 Session::reconnect_ltc_input ()
6788 string src = Config->get_ltc_source_port();
6790 _ltc_input->disconnect (this);
6792 if (src != _("None") && !src.empty()) {
6793 _ltc_input->nth (0)->connect (src);
6796 if ( ARDOUR::Profile->get_trx () ) {
6797 // Tracks need this signal to update timecode_source_dropdown
6798 MtcOrLtcInputPortChanged (); //emit signal
6804 Session::reconnect_ltc_output ()
6808 string src = Config->get_ltc_output_port();
6810 _ltc_output->disconnect (this);
6812 if (src != _("None") && !src.empty()) {
6813 _ltc_output->nth (0)->connect (src);
6819 Session::set_range_selection (framepos_t start, framepos_t end)
6821 _range_selection = Evoral::Range<framepos_t> (start, end);
6822 #ifdef USE_TRACKS_CODE_FEATURES
6823 follow_playhead_priority ();
6828 Session::set_object_selection (framepos_t start, framepos_t end)
6830 _object_selection = Evoral::Range<framepos_t> (start, end);
6831 #ifdef USE_TRACKS_CODE_FEATURES
6832 follow_playhead_priority ();
6837 Session::clear_range_selection ()
6839 _range_selection = Evoral::Range<framepos_t> (-1,-1);
6840 #ifdef USE_TRACKS_CODE_FEATURES
6841 follow_playhead_priority ();
6846 Session::clear_object_selection ()
6848 _object_selection = Evoral::Range<framepos_t> (-1,-1);
6849 #ifdef USE_TRACKS_CODE_FEATURES
6850 follow_playhead_priority ();
6855 Session::auto_connect_route (boost::shared_ptr<Route> route, bool connect_inputs,
6856 const ChanCount& input_start,
6857 const ChanCount& output_start,
6858 const ChanCount& input_offset,
6859 const ChanCount& output_offset)
6861 Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
6862 _auto_connect_queue.push (AutoConnectRequest (route, connect_inputs,
6863 input_start, output_start,
6864 input_offset, output_offset));
6866 if (pthread_mutex_trylock (&_auto_connect_mutex) == 0) {
6867 pthread_cond_signal (&_auto_connect_cond);
6868 pthread_mutex_unlock (&_auto_connect_mutex);
6873 Session::queue_latency_recompute ()
6875 g_atomic_int_inc (&_latency_recompute_pending);
6876 if (pthread_mutex_trylock (&_auto_connect_mutex) == 0) {
6877 pthread_cond_signal (&_auto_connect_cond);
6878 pthread_mutex_unlock (&_auto_connect_mutex);
6883 Session::auto_connect (const AutoConnectRequest& ar)
6885 boost::shared_ptr<Route> route = ar.route.lock();
6887 if (!route) { return; }
6889 if (!IO::connecting_legal) {
6893 /* If both inputs and outputs are auto-connected to physical ports,
6894 * use the max of input and output offsets to ensure auto-connected
6895 * port numbers always match up (e.g. the first audio input and the
6896 * first audio output of the route will have the same physical
6897 * port number). Otherwise just use the lowest input or output
6901 const bool in_out_physical =
6902 (Config->get_input_auto_connect() & AutoConnectPhysical)
6903 && (Config->get_output_auto_connect() & AutoConnectPhysical)
6904 && ar.connect_inputs;
6906 const ChanCount in_offset = in_out_physical
6907 ? ChanCount::max(ar.input_offset, ar.output_offset)
6910 const ChanCount out_offset = in_out_physical
6911 ? ChanCount::max(ar.input_offset, ar.output_offset)
6914 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
6915 vector<string> physinputs;
6916 vector<string> physoutputs;
6918 _engine.get_physical_outputs (*t, physoutputs);
6919 _engine.get_physical_inputs (*t, physinputs);
6921 if (!physinputs.empty() && ar.connect_inputs) {
6922 uint32_t nphysical_in = physinputs.size();
6924 for (uint32_t i = ar.input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
6927 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
6928 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
6931 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
6937 if (!physoutputs.empty()) {
6938 uint32_t nphysical_out = physoutputs.size();
6939 for (uint32_t i = ar.output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
6943 * do not create new connections if we reached the limit of physical outputs
6946 if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
6947 ARDOUR::Profile->get_trx () &&
6948 ar.output_offset.get(*t) == nphysical_out ) {
6952 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
6953 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
6954 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
6955 /* master bus is audio only */
6956 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
6957 port = _master_out->input()->ports().port(*t,
6958 i % _master_out->input()->n_ports().get(*t))->name();
6962 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
6971 Session::auto_connect_thread_start ()
6973 if (_ac_thread_active) {
6977 while (!_auto_connect_queue.empty ()) {
6978 _auto_connect_queue.pop ();
6981 _ac_thread_active = true;
6982 if (pthread_create (&_auto_connect_thread, NULL, auto_connect_thread, this)) {
6983 _ac_thread_active = false;
6988 Session::auto_connect_thread_terminate ()
6990 if (!_ac_thread_active) {
6993 _ac_thread_active = false;
6996 Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
6997 while (!_auto_connect_queue.empty ()) {
6998 _auto_connect_queue.pop ();
7002 if (pthread_mutex_lock (&_auto_connect_mutex) == 0) {
7003 pthread_cond_signal (&_auto_connect_cond);
7004 pthread_mutex_unlock (&_auto_connect_mutex);
7008 pthread_join (_auto_connect_thread, &status);
7012 Session::auto_connect_thread (void *arg)
7014 Session *s = static_cast<Session *>(arg);
7015 s->auto_connect_thread_run ();
7021 Session::auto_connect_thread_run ()
7023 pthread_set_name (X_("autoconnect"));
7024 SessionEvent::create_per_thread_pool (X_("autoconnect"), 1024);
7025 PBD::notify_event_loops_about_thread_creation (pthread_self(), X_("autoconnect"), 1024);
7026 pthread_mutex_lock (&_auto_connect_mutex);
7027 while (_ac_thread_active) {
7029 if (!_auto_connect_queue.empty ()) {
7030 // Why would we need the process lock ??
7031 // A: if ports are added while we're connecting, the backend's iterator may be invalidated:
7032 // graph_order_callback() -> resort_routes() -> direct_feeds_according_to_reality () -> backend::connected_to()
7033 // All ardour-internal backends use a std::vector xxxAudioBackend::find_port()
7034 // We have control over those, but what does jack do?
7035 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
7037 Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
7038 while (!_auto_connect_queue.empty ()) {
7039 const AutoConnectRequest ar (_auto_connect_queue.front());
7040 _auto_connect_queue.pop ();
7047 if (!actively_recording ()) { // might not be needed,
7048 /* this is only used for updating plugin latencies, the
7049 * graph does not change. so it's safe in general.
7051 * .. update_latency_compensation () entails set_capture_offset()
7052 * which calls Diskstream::set_capture_offset () which
7053 * modifies the capture offset... which can be a proplem
7054 * in "prepare_to_stop"
7056 while (g_atomic_int_and (&_latency_recompute_pending, 0)) {
7057 update_latency_compensation ();
7061 pthread_cond_wait (&_auto_connect_cond, &_auto_connect_mutex);
7063 pthread_mutex_unlock (&_auto_connect_mutex);
7067 Session::cancel_all_solo ()
7071 get_stripables (sl);
7073 set_controls (stripable_list_to_control_list (sl, &Stripable::solo_control), 0.0, Controllable::NoGroup);
7074 clear_all_solo_state (routes.reader());