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.
27 #include <cstdio> /* sprintf(3) ... grrr */
33 #include <glibmm/threads.h>
34 #include <glibmm/miscutils.h>
35 #include <glibmm/fileutils.h>
37 #include <boost/algorithm/string/erase.hpp>
39 #include "pbd/basename.h"
40 #include "pbd/boost_debug.h"
41 #include "pbd/convert.h"
42 #include "pbd/convert.h"
43 #include "pbd/error.h"
44 #include "pbd/file_utils.h"
46 #include "pbd/search_path.h"
47 #include "pbd/stacktrace.h"
48 #include "pbd/stl_delete.h"
49 #include "pbd/replace_all.h"
50 #include "pbd/unwind.h"
52 #include "ardour/amp.h"
53 #include "ardour/analyser.h"
54 #include "ardour/async_midi_port.h"
55 #include "ardour/audio_buffer.h"
56 #include "ardour/audio_diskstream.h"
57 #include "ardour/audio_port.h"
58 #include "ardour/audio_track.h"
59 #include "ardour/audioengine.h"
60 #include "ardour/audiofilesource.h"
61 #include "ardour/auditioner.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/graph.h"
76 #include "ardour/midiport_manager.h"
77 #include "ardour/scene_changer.h"
78 #include "ardour/midi_track.h"
79 #include "ardour/midi_ui.h"
80 #include "ardour/operations.h"
81 #include "ardour/playlist.h"
82 #include "ardour/plugin.h"
83 #include "ardour/plugin_insert.h"
84 #include "ardour/process_thread.h"
85 #include "ardour/profile.h"
86 #include "ardour/rc_configuration.h"
87 #include "ardour/recent_sessions.h"
88 #include "ardour/region.h"
89 #include "ardour/region_factory.h"
90 #include "ardour/route_graph.h"
91 #include "ardour/route_group.h"
92 #include "ardour/route_sorters.h"
93 #include "ardour/send.h"
94 #include "ardour/session.h"
95 #include "ardour/session_directory.h"
96 #include "ardour/session_playlists.h"
97 #include "ardour/smf_source.h"
98 #include "ardour/source_factory.h"
99 #include "ardour/speakers.h"
100 #include "ardour/tempo.h"
101 #include "ardour/track.h"
102 #include "ardour/user_bundle.h"
103 #include "ardour/utils.h"
105 #include "midi++/port.h"
106 #include "midi++/mmc.h"
110 #include <glibmm/checksum.h>
119 using namespace ARDOUR;
122 bool Session::_disable_all_loaded_plugins = false;
123 bool Session::_bypass_all_loaded_plugins = false;
125 PBD::Signal1<int,uint32_t> Session::AudioEngineSetupRequired;
126 PBD::Signal1<void,std::string> Session::Dialog;
127 PBD::Signal0<int> Session::AskAboutPendingState;
128 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
129 PBD::Signal0<void> Session::SendFeedback;
130 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
132 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
133 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
134 PBD::Signal2<void,std::string, std::string> Session::Exported;
135 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
136 PBD::Signal0<void> Session::Quit;
137 PBD::Signal0<void> Session::FeedbackDetected;
138 PBD::Signal0<void> Session::SuccessfulGraphSort;
139 PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
141 const framecnt_t Session::bounce_chunk_size = 8192;
142 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
143 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
145 // seconds should be added after the region exceeds end marker
146 #ifdef USE_TRACKS_CODE_FEATURES
147 const uint32_t Session::session_end_shift = 5;
149 const uint32_t Session::session_end_shift = 0;
152 /** @param snapshot_name Snapshot name, without .ardour suffix */
153 Session::Session (AudioEngine &eng,
154 const string& fullpath,
155 const string& snapshot_name,
156 BusProfile* bus_profile,
158 : playlists (new SessionPlaylists)
160 , process_function (&Session::process_with_events)
161 , _bounce_processing_active (false)
162 , waiting_for_sync_offset (false)
163 , _base_frame_rate (0)
164 , _current_frame_rate (0)
165 , _nominal_frame_rate (0)
166 , transport_sub_state (0)
167 , _record_status (Disabled)
168 , _transport_frame (0)
169 , _session_range_location (0)
172 , _transport_speed (0)
173 , _default_transport_speed (1.0)
174 , _last_transport_speed (0)
175 , _target_transport_speed (0.0)
176 , auto_play_legal (false)
177 , _last_slave_transport_frame (0)
178 , maximum_output_latency (0)
179 , _requested_return_frame (-1)
180 , current_block_size (0)
181 , _worst_output_latency (0)
182 , _worst_input_latency (0)
183 , _worst_track_latency (0)
184 , _have_captured (false)
185 , _non_soloed_outs_muted (false)
187 , _solo_isolated_cnt (0)
189 , _was_seamless (Config->get_seamless_loop ())
190 , _under_nsm_control (false)
192 , delta_accumulator_cnt (0)
193 , average_slave_delta (1800) // !!! why 1800 ???
195 , have_first_delta_accumulator (false)
196 , _slave_state (Stopped)
197 , _mtc_active (false)
198 , _ltc_active (false)
199 , post_export_sync (false)
200 , post_export_position (0)
202 , _export_started (false)
203 , _export_rolling (false)
204 , _pre_export_mmc_enabled (false)
205 , _name (snapshot_name)
207 , _send_qf_mtc (false)
208 , _pframes_since_last_mtc (0)
209 , session_midi_feedback (0)
211 , loop_changing (false)
213 , _session_dir (new SessionDirectory (fullpath))
214 , _current_snapshot_name (snapshot_name)
216 , state_was_pending (false)
217 , _state_of_the_state (StateOfTheState(CannotSave|InitialConnecting|Loading))
219 , _save_queued (false)
220 , _last_roll_location (0)
221 , _last_roll_or_reversal_location (0)
222 , _last_record_location (0)
223 , pending_locate_roll (false)
224 , pending_locate_frame (0)
225 , pending_locate_flush (false)
226 , pending_abort (false)
227 , pending_auto_loop (false)
228 , _butler (new Butler (*this))
229 , _post_transport_work (0)
230 , cumulative_rf_motion (0)
232 , _locations (new Locations (*this))
233 , _ignore_skips_updates (false)
234 , _rt_thread_active (false)
235 , _rt_emit_pending (false)
237 , outbound_mtc_timecode_frame (0)
238 , next_quarter_frame_to_send (-1)
239 , _frames_per_timecode_frame (0)
240 , _frames_per_hour (0)
241 , _timecode_frames_per_hour (0)
242 , last_timecode_valid (false)
243 , last_timecode_when (0)
244 , _send_timecode_update (false)
256 , ltc_timecode_offset (0)
257 , ltc_timecode_negative_offset (false)
258 , midi_control_ui (0)
260 , _all_route_group (new RouteGroup (*this, "all"))
261 , routes (new RouteList)
262 , _adding_routes_in_progress (false)
263 , _reconnecting_routes_in_progress (false)
264 , _route_deletion_in_progress (false)
265 , destructive_index (0)
266 , _track_number_decimals(1)
267 , solo_update_disabled (false)
268 , default_fade_steepness (0)
269 , default_fade_msecs (0)
270 , _total_free_4k_blocks (0)
271 , _total_free_4k_blocks_uncertain (false)
272 , no_questions_about_missing_files (false)
275 , _bundles (new BundleList)
276 , _bundle_xml_node (0)
280 , click_emphasis_data (0)
282 , click_emphasis_length (0)
283 , _clicks_cleared (0)
284 , _play_range (false)
285 , _range_selection (-1,-1)
286 , _object_selection (-1,-1)
288 , first_file_data_format_reset (true)
289 , first_file_header_format_reset (true)
290 , have_looped (false)
291 , _have_rec_enabled_track (false)
292 , _have_rec_disabled_track (true)
294 , _suspend_timecode_transmission (0)
295 , _speakers (new Speakers)
297 , ignore_route_processor_changes (false)
304 pthread_mutex_init (&_rt_emit_mutex, 0);
305 pthread_cond_init (&_rt_emit_cond, 0);
307 pre_engine_init (fullpath);
311 Stateful::loading_state_version = CURRENT_SESSION_FILE_VERSION;
313 #ifdef USE_TRACKS_CODE_FEATURES
314 sr = EngineStateController::instance()->get_current_sample_rate();
316 if (ensure_engine (sr)) {
318 throw SessionException (_("Cannot connect to audio/midi engine"));
321 if (create (mix_template, bus_profile)) {
323 throw SessionException (_("Session initialization failed"));
326 /* if a mix template was provided, then ::create() will
327 * have copied it into the session and we need to load it
328 * so that we have the state ready for ::set_state()
329 * after the engine is started.
331 * Note that we do NOT try to get the sample rate from
332 * the template at this time, though doing so would
333 * be easy if we decided this was an appropriate part
337 if (!mix_template.empty()) {
338 if (load_state (_current_snapshot_name)) {
339 throw SessionException (_("Failed to load template/snapshot state"));
341 store_recent_templates (mix_template);
344 /* load default session properties - if any */
349 if (load_state (_current_snapshot_name)) {
350 throw SessionException (_("Failed to load state"));
353 /* try to get sample rate from XML state so that we
354 * can influence the SR if we set up the audio
359 const XMLProperty* prop;
360 if ((prop = state_tree->root()->property (X_("sample-rate"))) != 0) {
361 sr = atoi (prop->value());
365 if (ensure_engine (sr)) {
367 throw SessionException (_("Cannot connect to audio/midi engine"));
371 if (post_engine_init ()) {
373 throw SessionException (_("Cannot configure audio/midi engine with session parameters"));
376 store_recent_sessions (_name, _path);
378 bool was_dirty = dirty();
380 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
382 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
383 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
386 DirtyChanged (); /* EMIT SIGNAL */
389 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
390 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
392 emit_thread_start ();
394 /* hook us up to the engine since we are now completely constructed */
396 BootMessage (_("Connect to engine"));
398 _engine.set_session (this);
399 _engine.reset_timebase ();
401 #ifdef USE_TRACKS_CODE_FEATURES
403 EngineStateController::instance()->set_session(this);
406 if ( ARDOUR::Profile->get_trx () ) {
408 /* Waves Tracks: fill session with tracks basing on the amount of inputs.
409 * each available input must have corresponding track when session starts.
412 uint32_t how_many (0);
414 std::vector<std::string> inputs;
415 EngineStateController::instance()->get_physical_audio_inputs(inputs);
417 how_many = inputs.size();
419 list<boost::shared_ptr<AudioTrack> > tracks;
421 // Track names after driver
422 if (Config->get_tracks_auto_naming() == NameAfterDriver) {
423 string track_name = "";
424 for (std::vector<string>::size_type i = 0; i < inputs.size(); ++i) {
426 track_name = inputs[i];
427 replace_all (track_name, "system:capture", "");
429 list<boost::shared_ptr<AudioTrack> > single_track = new_audio_track (1, 1, Normal, 0, 1, track_name);
430 tracks.insert(tracks.begin(), single_track.front());
432 } else { // Default track names
433 tracks = new_audio_track (1, 1, Normal, 0, how_many, string());
436 if (tracks.size() != how_many) {
438 throw failed_constructor ();
447 BootMessage (_("Session loading complete"));
459 Session::ensure_engine (uint32_t desired_sample_rate)
461 if (_engine.current_backend() == 0) {
462 /* backend is unknown ... */
463 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
464 if (r.get_value_or (-1) != 0) {
467 } else if (_engine.setup_required()) {
468 /* backend is known, but setup is needed */
469 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
470 if (r.get_value_or (-1) != 0) {
473 } else if (!_engine.running()) {
474 if (_engine.start()) {
479 /* at this point the engine should be running
482 if (!_engine.running()) {
486 return immediately_post_engine ();
491 Session::immediately_post_engine ()
493 /* Do various initializations that should take place directly after we
494 * know that the engine is running, but before we either create a
495 * session or set state for an existing one.
498 if (how_many_dsp_threads () > 1) {
499 /* For now, only create the graph if we are using >1 DSP threads, as
500 it is a bit slower than the old code with 1 thread.
502 _process_graph.reset (new Graph (*this));
505 /* every time we reconnect, recompute worst case output latencies */
507 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
509 if (synced_to_engine()) {
510 _engine.transport_stop ();
513 if (config.get_jack_time_master()) {
514 _engine.transport_locate (_transport_frame);
518 BootMessage (_("Set up LTC"));
520 BootMessage (_("Set up Click"));
522 BootMessage (_("Set up standard connections"));
526 catch (failed_constructor& err) {
530 /* TODO, connect in different thread. (PortRegisteredOrUnregistered may be in RT context)
532 _engine.PortRegisteredOrUnregistered.connect_same_thread (*this, boost::bind (&Session::setup_bundles, this));
540 vector<void*> debug_pointers;
542 /* if we got to here, leaving pending capture state around
546 remove_pending_capture_state ();
548 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
550 /* disconnect from any and all signals that we are connected to */
554 _engine.remove_session ();
556 #ifdef USE_TRACKS_CODE_FEATURES
557 EngineStateController::instance()->remove_session();
560 /* deregister all ports - there will be no process or any other
561 * callbacks from the engine any more.
564 Port::PortDrop (); /* EMIT SIGNAL */
568 /* clear history so that no references to objects are held any more */
572 /* clear state tree so that no references to objects are held any more */
577 /* reset dynamic state version back to default */
579 Stateful::loading_state_version = 0;
581 _butler->drop_references ();
585 delete _all_route_group;
587 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
588 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
592 if (click_data != default_click) {
593 delete [] click_data;
596 if (click_emphasis_data != default_click_emphasis) {
597 delete [] click_emphasis_data;
602 /* need to remove auditioner before monitoring section
603 * otherwise it is re-connected */
606 /* drop references to routes held by the monitoring section
607 * specifically _monitor_out aux/listen references */
608 remove_monitor_section();
610 /* clear out any pending dead wood from RCU managed objects */
615 AudioDiskstream::free_working_buffers();
617 /* tell everyone who is still standing that we're about to die */
620 /* tell everyone to drop references and delete objects as we go */
622 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
623 RegionFactory::delete_all_regions ();
625 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
627 /* reset these three references to special routes before we do the usual route delete thing */
629 _master_out.reset ();
630 _monitor_out.reset ();
633 RCUWriter<RouteList> writer (routes);
634 boost::shared_ptr<RouteList> r = writer.get_copy ();
636 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
637 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
638 (*i)->drop_references ();
642 /* writer goes out of scope and updates master */
647 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
648 Glib::Threads::Mutex::Lock lm (source_lock);
649 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
650 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
651 i->second->drop_references ();
657 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
660 emit_thread_terminate ();
662 pthread_cond_destroy (&_rt_emit_cond);
663 pthread_mutex_destroy (&_rt_emit_mutex);
665 delete _scene_changer; _scene_changer = 0;
666 delete midi_control_ui; midi_control_ui = 0;
668 delete _mmc; _mmc = 0;
669 delete _midi_ports; _midi_ports = 0;
670 delete _locations; _locations = 0;
674 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
676 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
677 boost_debug_list_ptrs ();
682 Session::setup_ltc ()
686 _ltc_input.reset (new IO (*this, X_("LTC In"), IO::Input));
687 _ltc_output.reset (new IO (*this, X_("LTC Out"), IO::Output));
689 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC In"))) != 0) {
690 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
693 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
694 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
696 reconnect_ltc_input ();
699 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC Out"))) != 0) {
700 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
703 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
704 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
706 reconnect_ltc_output ();
709 /* fix up names of LTC ports because we don't want the normal
710 * IO style of NAME/TYPE-{in,out}N
713 _ltc_input->nth (0)->set_name (X_("LTC-in"));
714 _ltc_output->nth (0)->set_name (X_("LTC-out"));
718 Session::setup_click ()
721 _click_io.reset (new ClickIO (*this, X_("Click")));
722 _click_gain.reset (new Amp (*this));
723 _click_gain->activate ();
725 setup_click_state (state_tree->root());
727 setup_click_state (0);
732 Session::setup_click_state (const XMLNode* node)
734 const XMLNode* child = 0;
736 if (node && (child = find_named_node (*node, "Click")) != 0) {
738 /* existing state for Click */
741 if (Stateful::loading_state_version < 3000) {
742 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
744 const XMLNodeList& children (child->children());
745 XMLNodeList::const_iterator i = children.begin();
746 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
748 if (i != children.end()) {
749 c = _click_gain->set_state (**i, Stateful::loading_state_version);
755 _clicking = Config->get_clicking ();
759 error << _("could not setup Click I/O") << endmsg;
766 /* default state for Click: dual-mono to first 2 physical outputs */
769 _engine.get_physical_outputs (DataType::AUDIO, outs);
771 for (uint32_t physport = 0; physport < 2; ++physport) {
772 if (outs.size() > physport) {
773 if (_click_io->add_port (outs[physport], this)) {
774 // relax, even though its an error
779 if (_click_io->n_ports () > ChanCount::ZERO) {
780 _clicking = Config->get_clicking ();
786 Session::setup_bundles ()
790 RCUWriter<BundleList> writer (_bundles);
791 boost::shared_ptr<BundleList> b = writer.get_copy ();
792 for (BundleList::iterator i = b->begin(); i != b->end();) {
793 if (boost::dynamic_pointer_cast<UserBundle>(*i)) {
801 vector<string> inputs[DataType::num_types];
802 vector<string> outputs[DataType::num_types];
803 for (uint32_t i = 0; i < DataType::num_types; ++i) {
804 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
805 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
808 /* Create a set of Bundle objects that map
809 to the physical I/O currently available. We create both
810 mono and stereo bundles, so that the common cases of mono
811 and stereo tracks get bundles to put in their mixer strip
812 in / out menus. There may be a nicer way of achieving that;
813 it doesn't really scale that well to higher channel counts
816 /* mono output bundles */
818 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
820 std::string pn = _engine.get_pretty_name_by_name (outputs[DataType::AUDIO][np]);
822 snprintf (buf, sizeof (buf), _("out %s"), pn.c_str());
824 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
827 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
828 c->add_channel (_("mono"), DataType::AUDIO);
829 c->set_port (0, outputs[DataType::AUDIO][np]);
831 add_bundle (c, false);
834 /* stereo output bundles */
836 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
837 if (np + 1 < outputs[DataType::AUDIO].size()) {
839 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
840 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
841 c->add_channel (_("L"), DataType::AUDIO);
842 c->set_port (0, outputs[DataType::AUDIO][np]);
843 c->add_channel (_("R"), DataType::AUDIO);
844 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
846 add_bundle (c, false);
850 /* mono input bundles */
852 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
854 std::string pn = _engine.get_pretty_name_by_name (inputs[DataType::AUDIO][np]);
856 snprintf (buf, sizeof (buf), _("in %s"), pn.c_str());
858 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
861 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
862 c->add_channel (_("mono"), DataType::AUDIO);
863 c->set_port (0, inputs[DataType::AUDIO][np]);
865 add_bundle (c, false);
868 /* stereo input bundles */
870 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
871 if (np + 1 < inputs[DataType::AUDIO].size()) {
873 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
875 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
876 c->add_channel (_("L"), DataType::AUDIO);
877 c->set_port (0, inputs[DataType::AUDIO][np]);
878 c->add_channel (_("R"), DataType::AUDIO);
879 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
881 add_bundle (c, false);
885 /* MIDI input bundles */
887 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
888 string n = inputs[DataType::MIDI][np];
889 std::string pn = _engine.get_pretty_name_by_name (n);
893 boost::erase_first (n, X_("alsa_pcm:"));
895 boost::shared_ptr<Bundle> c (new Bundle (n, false));
896 c->add_channel ("", DataType::MIDI);
897 c->set_port (0, inputs[DataType::MIDI][np]);
898 add_bundle (c, false);
901 /* MIDI output bundles */
903 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
904 string n = outputs[DataType::MIDI][np];
905 std::string pn = _engine.get_pretty_name_by_name (n);
909 boost::erase_first (n, X_("alsa_pcm:"));
911 boost::shared_ptr<Bundle> c (new Bundle (n, true));
912 c->add_channel ("", DataType::MIDI);
913 c->set_port (0, outputs[DataType::MIDI][np]);
914 add_bundle (c, false);
917 // we trust the backend to only calls us if there's a change
918 BundleAddedOrRemoved (); /* EMIT SIGNAL */
922 Session::auto_connect_master_bus ()
924 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
928 // Waves Tracks: Do not connect master bas for Tracks if AutoConnectMaster option is not set
929 // In this case it means "Multi Out" output mode
930 if (ARDOUR::Profile->get_trx() && !(Config->get_output_auto_connect() & AutoConnectMaster) ) {
934 /* if requested auto-connect the outputs to the first N physical ports.
937 uint32_t limit = _master_out->n_outputs().n_total();
938 vector<string> outputs[DataType::num_types];
940 for (uint32_t i = 0; i < DataType::num_types; ++i) {
941 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
944 for (uint32_t n = 0; n < limit; ++n) {
945 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
947 if (outputs[p->type()].size() > n) {
948 connect_to = outputs[p->type()][n];
951 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
952 if (_master_out->output()->connect (p, connect_to, this)) {
953 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
962 Session::remove_monitor_section ()
964 if (!_monitor_out || Profile->get_trx()) {
968 /* force reversion to Solo-In-Place */
969 Config->set_solo_control_is_listen_control (false);
971 /* if we are auditioning, cancel it ... this is a workaround
972 to a problem (auditioning does not execute the process graph,
973 which is needed to remove routes when using >1 core for processing)
978 /* Hold process lock while doing this so that we don't hear bits and
979 * pieces of audio as we work on each route.
982 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
984 /* Connect tracks to monitor section. Note that in an
985 existing session, the internal sends will already exist, but we want the
986 routes to notice that they connect to the control out specifically.
990 boost::shared_ptr<RouteList> r = routes.reader ();
991 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
993 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
995 if ((*x)->is_monitor()) {
997 } else if ((*x)->is_master()) {
1000 (*x)->remove_aux_or_listen (_monitor_out);
1005 remove_route (_monitor_out);
1006 auto_connect_master_bus ();
1009 auditioner->connect ();
1014 Session::add_monitor_section ()
1018 if (_monitor_out || !_master_out || Profile->get_trx()) {
1022 boost::shared_ptr<Route> r (new Route (*this, _("Monitor"), Route::MonitorOut, DataType::AUDIO));
1028 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1029 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
1032 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1033 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1034 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1036 error << _("Cannot create monitor section. 'Monitor' Port name is not unique.") << endmsg;
1041 add_routes (rl, false, false, false);
1043 assert (_monitor_out);
1045 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
1046 are undefined, at best.
1049 uint32_t limit = _monitor_out->n_inputs().n_audio();
1053 /* connect the inputs to the master bus outputs. this
1054 * represents a separate data feed from the internal sends from
1055 * each route. as of jan 2011, it allows the monitor section to
1056 * conditionally ignore either the internal sends or the normal
1057 * input feed, but we should really find a better way to do
1061 _master_out->output()->disconnect (this);
1063 for (uint32_t n = 0; n < limit; ++n) {
1064 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1065 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1068 string connect_to = o->name();
1069 if (_monitor_out->input()->connect (p, connect_to, this)) {
1070 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1078 /* if monitor section is not connected, connect it to physical outs
1081 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
1083 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1085 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1088 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1090 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1091 Config->get_monitor_bus_preferred_bundle())
1097 /* Monitor bus is audio only */
1099 vector<string> outputs[DataType::num_types];
1101 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1102 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1105 uint32_t mod = outputs[DataType::AUDIO].size();
1106 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1110 for (uint32_t n = 0; n < limit; ++n) {
1112 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1114 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1115 connect_to = outputs[DataType::AUDIO][n % mod];
1118 if (!connect_to.empty()) {
1119 if (_monitor_out->output()->connect (p, connect_to, this)) {
1120 error << string_compose (
1121 _("cannot connect control output %1 to %2"),
1132 /* Hold process lock while doing this so that we don't hear bits and
1133 * pieces of audio as we work on each route.
1136 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1138 /* Connect tracks to monitor section. Note that in an
1139 existing session, the internal sends will already exist, but we want the
1140 routes to notice that they connect to the control out specifically.
1144 boost::shared_ptr<RouteList> rls = routes.reader ();
1146 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1148 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1150 if ((*x)->is_monitor()) {
1152 } else if ((*x)->is_master()) {
1155 (*x)->enable_monitor_send ();
1160 auditioner->connect ();
1165 Session::reset_monitor_section ()
1167 /* Process lock should be held by the caller.*/
1169 if (!_monitor_out || Profile->get_trx()) {
1173 uint32_t limit = _master_out->n_outputs().n_audio();
1175 /* connect the inputs to the master bus outputs. this
1176 * represents a separate data feed from the internal sends from
1177 * each route. as of jan 2011, it allows the monitor section to
1178 * conditionally ignore either the internal sends or the normal
1179 * input feed, but we should really find a better way to do
1183 _master_out->output()->disconnect (this);
1184 _monitor_out->output()->disconnect (this);
1186 _monitor_out->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1187 _monitor_out->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1189 for (uint32_t n = 0; n < limit; ++n) {
1190 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1191 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1194 string connect_to = o->name();
1195 if (_monitor_out->input()->connect (p, connect_to, this)) {
1196 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1203 /* connect monitor section to physical outs
1206 if (Config->get_auto_connect_standard_busses()) {
1208 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1210 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1213 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1215 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1216 Config->get_monitor_bus_preferred_bundle())
1222 /* Monitor bus is audio only */
1224 vector<string> outputs[DataType::num_types];
1226 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1227 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1230 uint32_t mod = outputs[DataType::AUDIO].size();
1231 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1235 for (uint32_t n = 0; n < limit; ++n) {
1237 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1239 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1240 connect_to = outputs[DataType::AUDIO][n % mod];
1243 if (!connect_to.empty()) {
1244 if (_monitor_out->output()->connect (p, connect_to, this)) {
1245 error << string_compose (
1246 _("cannot connect control output %1 to %2"),
1257 /* Connect tracks to monitor section. Note that in an
1258 existing session, the internal sends will already exist, but we want the
1259 routes to notice that they connect to the control out specifically.
1263 boost::shared_ptr<RouteList> rls = routes.reader ();
1265 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1267 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1269 if ((*x)->is_monitor()) {
1271 } else if ((*x)->is_master()) {
1274 (*x)->enable_monitor_send ();
1280 Session::hookup_io ()
1282 /* stop graph reordering notifications from
1283 causing resorts, etc.
1286 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
1290 /* we delay creating the auditioner till now because
1291 it makes its own connections to ports.
1295 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
1297 throw failed_constructor ();
1299 a->use_new_diskstream ();
1303 catch (failed_constructor& err) {
1304 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
1308 /* load bundles, which we may have postponed earlier on */
1309 if (_bundle_xml_node) {
1310 load_bundles (*_bundle_xml_node);
1311 delete _bundle_xml_node;
1314 /* Tell all IO objects to connect themselves together */
1316 IO::enable_connecting ();
1318 /* Now tell all "floating" ports to connect to whatever
1319 they should be connected to.
1322 AudioEngine::instance()->reconnect_ports ();
1324 /* Anyone who cares about input state, wake up and do something */
1326 IOConnectionsComplete (); /* EMIT SIGNAL */
1328 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
1330 /* now handle the whole enchilada as if it was one
1331 graph reorder event.
1336 /* update the full solo state, which can't be
1337 correctly determined on a per-route basis, but
1338 needs the global overview that only the session
1342 update_route_solo_state ();
1346 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
1348 boost::shared_ptr<Track> track = wp.lock ();
1353 boost::shared_ptr<Playlist> playlist;
1355 if ((playlist = track->playlist()) != 0) {
1356 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
1357 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
1358 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
1363 Session::record_enabling_legal () const
1365 /* this used to be in here, but survey says.... we don't need to restrict it */
1366 // if (record_status() == Recording) {
1370 if (Config->get_all_safe()) {
1377 Session::set_track_monitor_input_status (bool yn)
1379 boost::shared_ptr<RouteList> rl = routes.reader ();
1380 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1381 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1382 if (tr && tr->record_enabled ()) {
1383 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1384 tr->request_input_monitoring (yn);
1390 Session::auto_punch_start_changed (Location* location)
1392 replace_event (SessionEvent::PunchIn, location->start());
1394 if (get_record_enabled() && config.get_punch_in()) {
1395 /* capture start has been changed, so save new pending state */
1396 save_state ("", true);
1401 Session::auto_punch_end_changed (Location* location)
1403 framepos_t when_to_stop = location->end();
1404 // when_to_stop += _worst_output_latency + _worst_input_latency;
1405 replace_event (SessionEvent::PunchOut, when_to_stop);
1409 Session::auto_punch_changed (Location* location)
1411 framepos_t when_to_stop = location->end();
1413 replace_event (SessionEvent::PunchIn, location->start());
1414 //when_to_stop += _worst_output_latency + _worst_input_latency;
1415 replace_event (SessionEvent::PunchOut, when_to_stop);
1418 /** @param loc A loop location.
1419 * @param pos Filled in with the start time of the required fade-out (in session frames).
1420 * @param length Filled in with the length of the required fade-out.
1423 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
1425 pos = max (loc->start(), loc->end() - 64);
1426 length = loc->end() - pos;
1430 Session::auto_loop_changed (Location* location)
1432 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1435 auto_loop_declick_range (location, dcp, dcl);
1437 if (transport_rolling() && play_loop) {
1439 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1441 // if (_transport_frame > location->end()) {
1443 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1444 // relocate to beginning of loop
1445 clear_events (SessionEvent::LocateRoll);
1447 request_locate (location->start(), true);
1450 else if (Config->get_seamless_loop() && !loop_changing) {
1452 // schedule a locate-roll to refill the diskstreams at the
1453 // previous loop end
1454 loop_changing = true;
1456 if (location->end() > last_loopend) {
1457 clear_events (SessionEvent::LocateRoll);
1458 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1464 clear_events (SessionEvent::AutoLoopDeclick);
1465 clear_events (SessionEvent::AutoLoop);
1468 /* possibly move playhead if not rolling; if we are rolling we'll move
1469 to the loop start on stop if that is appropriate.
1474 if (!transport_rolling() && select_playhead_priority_target (pos)) {
1475 if (pos == location->start()) {
1476 request_locate (pos);
1481 last_loopend = location->end();
1486 Session::set_auto_punch_location (Location* location)
1490 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1491 punch_connections.drop_connections();
1492 existing->set_auto_punch (false, this);
1493 remove_event (existing->start(), SessionEvent::PunchIn);
1494 clear_events (SessionEvent::PunchOut);
1495 auto_punch_location_changed (0);
1500 if (location == 0) {
1504 if (location->end() <= location->start()) {
1505 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1509 punch_connections.drop_connections ();
1511 location->StartChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, location));
1512 location->EndChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, location));
1513 location->Changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, location));
1515 location->set_auto_punch (true, this);
1517 auto_punch_changed (location);
1519 auto_punch_location_changed (location);
1523 Session::set_session_extents (framepos_t start, framepos_t end)
1526 if ((existing = _locations->session_range_location()) == 0) {
1527 //if there is no existing session, we need to make a new session location (should never happen)
1528 existing = new Location (*this, 0, 0, _("session"), Location::IsSessionRange);
1532 error << _("Session: you can't use that location for session start/end)") << endmsg;
1536 existing->set( start, end );
1542 Session::set_auto_loop_location (Location* location)
1546 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1547 loop_connections.drop_connections ();
1548 existing->set_auto_loop (false, this);
1549 remove_event (existing->end(), SessionEvent::AutoLoop);
1552 auto_loop_declick_range (existing, dcp, dcl);
1553 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1554 auto_loop_location_changed (0);
1559 if (location == 0) {
1563 if (location->end() <= location->start()) {
1564 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1568 last_loopend = location->end();
1570 loop_connections.drop_connections ();
1572 location->StartChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1573 location->EndChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1574 location->Changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1575 location->FlagsChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1577 location->set_auto_loop (true, this);
1579 if (Config->get_loop_is_mode() && play_loop && Config->get_seamless_loop()) {
1580 // set all tracks to use internal looping
1581 boost::shared_ptr<RouteList> rl = routes.reader ();
1582 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1583 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1584 if (tr && !tr->hidden()) {
1585 tr->set_loop (location);
1590 /* take care of our stuff first */
1592 auto_loop_changed (location);
1594 /* now tell everyone else */
1596 auto_loop_location_changed (location);
1600 Session::update_marks (Location*)
1606 Session::update_skips (Location* loc, bool consolidate)
1608 if (_ignore_skips_updates) {
1612 Locations::LocationList skips;
1615 PBD::Unwinder<bool> uw (_ignore_skips_updates, true);
1616 consolidate_skips (loc);
1619 sync_locations_to_skips ();
1625 Session::consolidate_skips (Location* loc)
1627 Locations::LocationList all_locations = _locations->list ();
1629 for (Locations::LocationList::iterator l = all_locations.begin(); l != all_locations.end(); ) {
1631 if (!(*l)->is_skip ()) {
1636 /* don't test against self */
1643 switch (Evoral::coverage ((*l)->start(), (*l)->end(), loc->start(), loc->end())) {
1644 case Evoral::OverlapInternal:
1645 case Evoral::OverlapExternal:
1646 case Evoral::OverlapStart:
1647 case Evoral::OverlapEnd:
1648 /* adjust new location to cover existing one */
1649 loc->set_start (min (loc->start(), (*l)->start()));
1650 loc->set_end (max (loc->end(), (*l)->end()));
1651 /* we don't need this one any more */
1652 _locations->remove (*l);
1653 /* the location has been deleted, so remove reference to it in our local list */
1654 l = all_locations.erase (l);
1657 case Evoral::OverlapNone:
1665 Session::sync_locations_to_skips ()
1667 /* This happens asynchronously (in the audioengine thread). After the clear is done, we will call
1668 * Session::_sync_locations_to_skips() from the audioengine thread.
1670 clear_events (SessionEvent::Skip, boost::bind (&Session::_sync_locations_to_skips, this));
1674 Session::_sync_locations_to_skips ()
1676 /* called as a callback after existing Skip events have been cleared from a realtime audioengine thread */
1678 Locations::LocationList const & locs (_locations->list());
1680 for (Locations::LocationList::const_iterator i = locs.begin(); i != locs.end(); ++i) {
1682 Location* location = *i;
1684 if (location->is_skip() && location->is_skipping()) {
1685 SessionEvent* ev = new SessionEvent (SessionEvent::Skip, SessionEvent::Add, location->start(), location->end(), 1.0);
1693 Session::location_added (Location *location)
1695 if (location->is_auto_punch()) {
1696 set_auto_punch_location (location);
1699 if (location->is_auto_loop()) {
1700 set_auto_loop_location (location);
1703 if (location->is_session_range()) {
1704 /* no need for any signal handling or event setting with the session range,
1705 because we keep a direct reference to it and use its start/end directly.
1707 _session_range_location = location;
1710 if (location->is_mark()) {
1711 /* listen for per-location signals that require us to do any * global updates for marks */
1713 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1714 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1715 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1716 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1719 if (location->is_skip()) {
1720 /* listen for per-location signals that require us to update skip-locate events */
1722 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1723 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1724 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1725 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, false));
1727 update_skips (location, true);
1734 Session::location_removed (Location *location)
1736 if (location->is_auto_loop()) {
1737 set_auto_loop_location (0);
1738 set_track_loop (false);
1741 if (location->is_auto_punch()) {
1742 set_auto_punch_location (0);
1745 if (location->is_session_range()) {
1746 /* this is never supposed to happen */
1747 error << _("programming error: session range removed!") << endl;
1750 if (location->is_skip()) {
1752 update_skips (location, false);
1759 Session::locations_changed ()
1761 _locations->apply (*this, &Session::_locations_changed);
1765 Session::_locations_changed (const Locations::LocationList& locations)
1767 /* There was some mass-change in the Locations object.
1769 We might be re-adding a location here but it doesn't actually matter
1770 for all the locations that the Session takes an interest in.
1774 PBD::Unwinder<bool> protect_ignore_skip_updates (_ignore_skips_updates, true);
1775 for (Locations::LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
1776 location_added (*i);
1780 update_skips (NULL, false);
1784 Session::enable_record ()
1786 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1787 /* no recording at anything except normal speed */
1792 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1794 if (rs == Recording) {
1798 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1800 _last_record_location = _transport_frame;
1801 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1803 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1804 set_track_monitor_input_status (true);
1807 RecordStateChanged ();
1814 Session::disable_record (bool rt_context, bool force)
1818 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1820 if (!Config->get_latched_record_enable () || force) {
1821 g_atomic_int_set (&_record_status, Disabled);
1822 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1824 if (rs == Recording) {
1825 g_atomic_int_set (&_record_status, Enabled);
1829 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1830 set_track_monitor_input_status (false);
1833 RecordStateChanged (); /* emit signal */
1836 remove_pending_capture_state ();
1842 Session::step_back_from_record ()
1844 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1846 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1847 set_track_monitor_input_status (false);
1850 RecordStateChanged (); /* emit signal */
1855 Session::maybe_enable_record ()
1857 if (_step_editors > 0) {
1861 g_atomic_int_set (&_record_status, Enabled);
1863 /* This function is currently called from somewhere other than an RT thread.
1864 This save_state() call therefore doesn't impact anything. Doing it here
1865 means that we save pending state of which sources the next record will use,
1866 which gives us some chance of recovering from a crash during the record.
1869 save_state ("", true);
1871 if (_transport_speed) {
1872 if (!config.get_punch_in()) {
1876 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1877 RecordStateChanged (); /* EMIT SIGNAL */
1884 Session::audible_frame () const
1890 offset = worst_playback_latency ();
1892 if (synced_to_engine()) {
1893 /* Note: this is basically just sync-to-JACK */
1894 tf = _engine.transport_frame();
1896 tf = _transport_frame;
1901 if (!non_realtime_work_pending()) {
1905 /* Check to see if we have passed the first guaranteed
1906 audible frame past our last start position. if not,
1907 return that last start point because in terms
1908 of audible frames, we have not moved yet.
1910 `Start position' in this context means the time we last
1911 either started, located, or changed transport direction.
1914 if (_transport_speed > 0.0f) {
1916 if (!play_loop || !have_looped) {
1917 if (tf < _last_roll_or_reversal_location + offset) {
1918 return _last_roll_or_reversal_location;
1926 } else if (_transport_speed < 0.0f) {
1928 /* XXX wot? no backward looping? */
1930 if (tf > _last_roll_or_reversal_location - offset) {
1931 return _last_roll_or_reversal_location;
1943 Session::set_frame_rate (framecnt_t frames_per_second)
1945 /** \fn void Session::set_frame_size(framecnt_t)
1946 the AudioEngine object that calls this guarantees
1947 that it will not be called while we are also in
1948 ::process(). Its fine to do things that block
1952 _base_frame_rate = frames_per_second;
1953 _nominal_frame_rate = frames_per_second;
1958 reset_write_sources (false);
1960 // XXX we need some equivalent to this, somehow
1961 // SndFileSource::setup_standard_crossfades (frames_per_second);
1965 /* XXX need to reset/reinstantiate all LADSPA plugins */
1969 Session::set_block_size (pframes_t nframes)
1971 /* the AudioEngine guarantees
1972 that it will not be called while we are also in
1973 ::process(). It is therefore fine to do things that block
1978 current_block_size = nframes;
1982 boost::shared_ptr<RouteList> r = routes.reader ();
1984 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1985 (*i)->set_block_size (nframes);
1988 boost::shared_ptr<RouteList> rl = routes.reader ();
1989 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1990 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1992 tr->set_block_size (nframes);
1996 set_worst_io_latencies ();
2002 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
2004 boost::shared_ptr<Route> r2;
2006 if (r1->feeds (rbase) && rbase->feeds (r1)) {
2007 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
2011 /* make a copy of the existing list of routes that feed r1 */
2013 Route::FedBy existing (r1->fed_by());
2015 /* for each route that feeds r1, recurse, marking it as feeding
2019 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
2020 if (!(r2 = i->r.lock ())) {
2021 /* (*i) went away, ignore it */
2025 /* r2 is a route that feeds r1 which somehow feeds base. mark
2026 base as being fed by r2
2029 rbase->add_fed_by (r2, i->sends_only);
2033 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
2037 if (r1->feeds (r2) && r2->feeds (r1)) {
2041 /* now recurse, so that we can mark base as being fed by
2042 all routes that feed r2
2045 trace_terminal (r2, rbase);
2052 Session::resort_routes ()
2054 /* don't do anything here with signals emitted
2055 by Routes during initial setup or while we
2056 are being destroyed.
2059 if (_state_of_the_state & (InitialConnecting | Deletion)) {
2064 RCUWriter<RouteList> writer (routes);
2065 boost::shared_ptr<RouteList> r = writer.get_copy ();
2066 resort_routes_using (r);
2067 /* writer goes out of scope and forces update */
2071 boost::shared_ptr<RouteList> rl = routes.reader ();
2072 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2073 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
2075 const Route::FedBy& fb ((*i)->fed_by());
2077 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
2078 boost::shared_ptr<Route> sf = f->r.lock();
2080 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
2088 /** This is called whenever we need to rebuild the graph of how we will process
2090 * @param r List of routes, in any order.
2094 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
2096 /* We are going to build a directed graph of our routes;
2097 this is where the edges of that graph are put.
2102 /* Go through all routes doing two things:
2104 * 1. Collect the edges of the route graph. Each of these edges
2105 * is a pair of routes, one of which directly feeds the other
2106 * either by a JACK connection or by an internal send.
2108 * 2. Begin the process of making routes aware of which other
2109 * routes directly or indirectly feed them. This information
2110 * is used by the solo code.
2113 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2115 /* Clear out the route's list of direct or indirect feeds */
2116 (*i)->clear_fed_by ();
2118 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
2120 bool via_sends_only;
2122 /* See if this *j feeds *i according to the current state of the JACK
2123 connections and internal sends.
2125 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
2126 /* add the edge to the graph (part #1) */
2127 edges.add (*j, *i, via_sends_only);
2128 /* tell the route (for part #2) */
2129 (*i)->add_fed_by (*j, via_sends_only);
2134 /* Attempt a topological sort of the route graph */
2135 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
2137 if (sorted_routes) {
2138 /* We got a satisfactory topological sort, so there is no feedback;
2141 Note: the process graph rechain does not require a
2142 topologically-sorted list, but hey ho.
2144 if (_process_graph) {
2145 _process_graph->rechain (sorted_routes, edges);
2148 _current_route_graph = edges;
2150 /* Complete the building of the routes' lists of what directly
2151 or indirectly feeds them.
2153 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2154 trace_terminal (*i, *i);
2157 *r = *sorted_routes;
2160 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
2161 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2162 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
2163 (*i)->name(), (*i)->order_key ()));
2167 SuccessfulGraphSort (); /* EMIT SIGNAL */
2170 /* The topological sort failed, so we have a problem. Tell everyone
2171 and stick to the old graph; this will continue to be processed, so
2172 until the feedback is fixed, what is played back will not quite
2173 reflect what is actually connected. Note also that we do not
2174 do trace_terminal here, as it would fail due to an endless recursion,
2175 so the solo code will think that everything is still connected
2179 FeedbackDetected (); /* EMIT SIGNAL */
2184 /** Find a route name starting with \a base, maybe followed by the
2185 * lowest \a id. \a id will always be added if \a definitely_add_number
2186 * is true on entry; otherwise it will only be added if required
2187 * to make the name unique.
2189 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
2190 * The available route name with the lowest ID will be used, and \a id
2191 * will be set to the ID.
2193 * \return false if a route name could not be found, and \a track_name
2194 * and \a id do not reflect a free route name.
2197 Session::find_route_name (string const & base, uint32_t& id, string& name, bool definitely_add_number)
2199 /* the base may conflict with ports that do not belong to existing
2200 routes, but hidden objects like the click track. So check port names
2201 before anything else.
2204 for (vector<string>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
2205 if (base == *reserved) {
2206 definitely_add_number = true;
2214 if (!definitely_add_number && route_by_name (base) == 0) {
2215 /* juse use the base */
2221 name = string_compose ("%1 %2", base, id);
2223 if (route_by_name (name) == 0) {
2229 } while (id < (UINT_MAX-1));
2234 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
2236 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
2238 in = ChanCount::ZERO;
2239 out = ChanCount::ZERO;
2241 boost::shared_ptr<RouteList> r = routes.reader ();
2243 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2244 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2245 if (tr && !tr->is_auditioner()) {
2246 in += tr->n_inputs();
2247 out += tr->n_outputs();
2253 Session::default_track_name_pattern (DataType t)
2256 case DataType::AUDIO:
2257 if (Profile->get_trx()) {
2264 case DataType::MIDI:
2271 /** Caller must not hold process lock
2272 * @param name_template string to use for the start of the name, or "" to use "MIDI".
2273 * @param instrument plugin info for the instrument to insert pre-fader, if any
2275 list<boost::shared_ptr<MidiTrack> >
2276 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
2277 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
2280 uint32_t track_id = 0;
2282 RouteList new_routes;
2283 list<boost::shared_ptr<MidiTrack> > ret;
2285 const string name_pattern = default_track_name_pattern (DataType::MIDI);
2286 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
2289 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, use_number)) {
2290 error << "cannot find name for new midi track" << endmsg;
2294 boost::shared_ptr<MidiTrack> track;
2297 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
2299 if (track->init ()) {
2303 track->use_new_diskstream();
2305 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2306 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2309 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2310 if (track->input()->ensure_io (input, false, this)) {
2311 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
2315 if (track->output()->ensure_io (output, false, this)) {
2316 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
2321 track->non_realtime_input_change();
2324 route_group->add (track);
2327 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2329 if (Config->get_remote_model() == UserOrdered) {
2330 track->set_remote_control_id (next_control_id());
2333 new_routes.push_back (track);
2334 ret.push_back (track);
2336 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2339 catch (failed_constructor &err) {
2340 error << _("Session: could not create new midi track.") << endmsg;
2344 catch (AudioEngine::PortRegistrationFailure& pfe) {
2346 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;
2354 if (!new_routes.empty()) {
2355 StateProtector sp (this);
2356 if (Profile->get_trx()) {
2357 add_routes (new_routes, false, false, false);
2359 add_routes (new_routes, true, true, false);
2363 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
2364 PluginPtr plugin = instrument->load (*this);
2365 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2366 (*r)->add_processor (p, PreFader);
2376 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2378 boost::shared_ptr<Route> midi_track (wmt.lock());
2384 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2386 if (change.after.n_audio() <= change.before.n_audio()) {
2390 /* new audio ports: make sure the audio goes somewhere useful,
2391 unless the user has no-auto-connect selected.
2393 The existing ChanCounts don't matter for this call as they are only
2394 to do with matching input and output indices, and we are only changing
2400 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
2404 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
2405 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
2406 * @param output_start As \a input_start, but for outputs.
2409 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
2410 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
2412 if (!IO::connecting_legal) {
2416 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2422 /* If both inputs and outputs are auto-connected to physical ports,
2423 use the max of input and output offsets to ensure auto-connected
2424 port numbers always match up (e.g. the first audio input and the
2425 first audio output of the route will have the same physical
2426 port number). Otherwise just use the lowest input or output
2430 DEBUG_TRACE (DEBUG::Graph,
2431 string_compose("Auto-connect: existing in = %1 out = %2\n",
2432 existing_inputs, existing_outputs));
2434 const bool in_out_physical =
2435 (Config->get_input_auto_connect() & AutoConnectPhysical)
2436 && (Config->get_output_auto_connect() & AutoConnectPhysical)
2439 const ChanCount in_offset = in_out_physical
2440 ? ChanCount::max(existing_inputs, existing_outputs)
2443 const ChanCount out_offset = in_out_physical
2444 ? ChanCount::max(existing_inputs, existing_outputs)
2447 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2448 vector<string> physinputs;
2449 vector<string> physoutputs;
2451 _engine.get_physical_outputs (*t, physoutputs);
2452 _engine.get_physical_inputs (*t, physinputs);
2454 if (!physinputs.empty() && connect_inputs) {
2455 uint32_t nphysical_in = physinputs.size();
2457 DEBUG_TRACE (DEBUG::Graph,
2458 string_compose("There are %1 physical inputs of type %2\n",
2461 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
2464 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
2465 DEBUG_TRACE (DEBUG::Graph,
2466 string_compose("Get index %1 + %2 % %3 = %4\n",
2467 in_offset.get(*t), i, nphysical_in,
2468 (in_offset.get(*t) + i) % nphysical_in));
2469 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
2472 DEBUG_TRACE (DEBUG::Graph,
2473 string_compose("Connect route %1 IN to %2\n",
2474 route->name(), port));
2476 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
2480 ChanCount one_added (*t, 1);
2481 existing_inputs += one_added;
2485 if (!physoutputs.empty()) {
2486 uint32_t nphysical_out = physoutputs.size();
2487 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
2491 * do not create new connections if we reached the limit of physical outputs
2495 if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
2496 ARDOUR::Profile->get_trx () &&
2497 existing_outputs.get(*t) == nphysical_out ) {
2501 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
2502 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
2503 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
2504 /* master bus is audio only */
2505 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
2506 port = _master_out->input()->ports().port(*t,
2507 i % _master_out->input()->n_ports().get(*t))->name();
2511 DEBUG_TRACE (DEBUG::Graph,
2512 string_compose("Connect route %1 OUT to %2\n",
2513 route->name(), port));
2515 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
2519 ChanCount one_added (*t, 1);
2520 existing_outputs += one_added;
2526 #ifdef USE_TRACKS_CODE_FEATURES
2529 compare_routes_by_remote_id (const boost::shared_ptr<Route>& route1, const boost::shared_ptr<Route>& route2)
2531 return route1->remote_control_id() < route2->remote_control_id();
2535 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2537 // it is not allowed to perform connection
2538 if (!IO::connecting_legal) {
2542 // if we are deleting routes we will call this once at the end
2543 if (_route_deletion_in_progress) {
2547 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2553 // We need to disconnect the route's inputs and outputs first
2554 // basing on autoconnect configuration
2555 bool reconnectIputs = !(Config->get_input_auto_connect() & ManualConnect) && reconnect_inputs;
2556 bool reconnectOutputs = !(Config->get_output_auto_connect() & ManualConnect) && reconnect_outputs;
2558 ChanCount existing_inputs;
2559 ChanCount existing_outputs;
2560 count_existing_track_channels (existing_inputs, existing_outputs);
2562 //ChanCount inputs = ChanCount::ZERO;
2563 //ChanCount outputs = ChanCount::ZERO;
2565 RouteList existing_routes = *routes.reader ();
2566 existing_routes.sort (compare_routes_by_remote_id);
2569 PBD::Unwinder<bool> protect_ignore_changes (_reconnecting_routes_in_progress, true);
2571 vector<string> physinputs;
2572 vector<string> physoutputs;
2574 EngineStateController::instance()->get_physical_audio_outputs(physoutputs);
2575 EngineStateController::instance()->get_physical_audio_inputs(physinputs);
2577 uint32_t input_n = 0;
2578 uint32_t output_n = 0;
2579 RouteList::iterator rIter = existing_routes.begin();
2580 const AutoConnectOption current_input_auto_connection (Config->get_input_auto_connect());
2581 const AutoConnectOption current_output_auto_connection (Config->get_output_auto_connect());
2582 for (; rIter != existing_routes.end(); ++rIter) {
2583 if (*rIter == _master_out || *rIter == _monitor_out ) {
2587 if (current_output_auto_connection == AutoConnectPhysical) {
2588 (*rIter)->amp()->deactivate();
2589 } else if (current_output_auto_connection == AutoConnectMaster) {
2590 (*rIter)->amp()->activate();
2593 if (reconnectIputs) {
2594 (*rIter)->input()->disconnect (this); //GZ: check this; could be heavy
2596 for (uint32_t route_input_n = 0; route_input_n < (*rIter)->n_inputs().get(DataType::AUDIO); ++route_input_n) {
2598 if (current_input_auto_connection & AutoConnectPhysical) {
2600 if ( input_n == physinputs.size() ) {
2604 string port = physinputs[input_n];
2606 if (port.empty() ) {
2607 error << "Physical Input number "<< input_n << " is unavailable and cannot be connected" << endmsg;
2610 //GZ: check this; could be heavy
2611 (*rIter)->input()->connect ((*rIter)->input()->ports().port(DataType::AUDIO, route_input_n), port, this);
2617 if (reconnectOutputs) {
2619 //normalize route ouptuts: reduce the amount outputs to be equal to the amount of inputs
2620 if (current_output_auto_connection & AutoConnectPhysical) {
2622 //GZ: check this; could be heavy
2623 (*rIter)->output()->disconnect (this);
2624 size_t route_inputs_count = (*rIter)->n_inputs().get(DataType::AUDIO);
2626 //GZ: check this; could be heavy
2627 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, route_inputs_count), false, this );
2629 } else if (current_output_auto_connection & AutoConnectMaster){
2631 if (!reconnect_master) {
2635 //GZ: check this; could be heavy
2636 (*rIter)->output()->disconnect (this);
2639 uint32_t master_inputs_count = _master_out->n_inputs().get(DataType::AUDIO);
2640 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, master_inputs_count), false, this );
2642 error << error << "Master bus is not available" << endmsg;
2647 for (uint32_t route_output_n = 0; route_output_n < (*rIter)->n_outputs().get(DataType::AUDIO); ++route_output_n) {
2648 if (current_output_auto_connection & AutoConnectPhysical) {
2650 if ( output_n == physoutputs.size() ) {
2654 string port = physoutputs[output_n];
2656 if (port.empty() ) {
2657 error << "Physical Output number "<< output_n << " is unavailable and cannot be connected" << endmsg;
2660 //GZ: check this; could be heavy
2661 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2664 } else if (current_output_auto_connection & AutoConnectMaster) {
2666 if ( route_output_n == _master_out->n_inputs().get(DataType::AUDIO) ) {
2670 // connect to master bus
2671 string port = _master_out->input()->ports().port(DataType::AUDIO, route_output_n)->name();
2673 if (port.empty() ) {
2674 error << "MasterBus Input number "<< route_output_n << " is unavailable and cannot be connected" << endmsg;
2678 //GZ: check this; could be heavy
2679 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2685 //auto_connect_route (*rIter, inputs, outputs, false, reconnectIputs);
2688 _master_out->output()->disconnect (this);
2689 auto_connect_master_bus ();
2694 session_routes_reconnected (); /* EMIT SIGNAL */
2698 Session::reconnect_midi_scene_ports(bool inputs)
2702 boost::shared_ptr<MidiPort> scene_in_ptr = scene_in();
2704 scene_in_ptr->disconnect_all ();
2706 std::vector<EngineStateController::MidiPortState> midi_port_states;
2707 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2709 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2711 for (; state_iter != midi_port_states.end(); ++state_iter) {
2712 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2713 scene_in_ptr->connect (state_iter->name);
2720 boost::shared_ptr<MidiPort> scene_out_ptr = scene_out();
2722 if (scene_out_ptr ) {
2723 scene_out_ptr->disconnect_all ();
2725 std::vector<EngineStateController::MidiPortState> midi_port_states;
2726 EngineStateController::instance()->get_physical_midi_output_states (midi_port_states);
2728 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2730 for (; state_iter != midi_port_states.end(); ++state_iter) {
2731 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2732 scene_out_ptr->connect (state_iter->name);
2740 Session::reconnect_mtc_ports ()
2742 boost::shared_ptr<MidiPort> mtc_in_ptr = _midi_ports->mtc_input_port();
2748 mtc_in_ptr->disconnect_all ();
2750 std::vector<EngineStateController::MidiPortState> midi_port_states;
2751 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2753 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2755 for (; state_iter != midi_port_states.end(); ++state_iter) {
2756 if (state_iter->available && state_iter->mtc_in) {
2757 mtc_in_ptr->connect (state_iter->name);
2761 if (!_midi_ports->mtc_input_port ()->connected () &&
2762 config.get_external_sync () &&
2763 (Config->get_sync_source () == MTC) ) {
2764 config.set_external_sync (false);
2767 if ( ARDOUR::Profile->get_trx () ) {
2768 // Tracks need this signal to update timecode_source_dropdown
2769 MtcOrLtcInputPortChanged (); //emit signal
2774 Session::reconnect_mmc_ports(bool inputs)
2776 if (inputs ) { // get all enabled midi input ports
2778 boost::shared_ptr<MidiPort> mmc_in_ptr = _midi_ports->mmc_in();
2780 mmc_in_ptr->disconnect_all ();
2781 std::vector<std::string> enabled_midi_inputs;
2782 EngineStateController::instance()->get_physical_midi_inputs (enabled_midi_inputs);
2784 std::vector<std::string>::iterator port_iter = enabled_midi_inputs.begin();
2786 for (; port_iter != enabled_midi_inputs.end(); ++port_iter) {
2787 mmc_in_ptr->connect (*port_iter);
2791 } else { // get all enabled midi output ports
2793 boost::shared_ptr<MidiPort> mmc_out_ptr = _midi_ports->mmc_out();
2795 mmc_out_ptr->disconnect_all ();
2796 std::vector<std::string> enabled_midi_outputs;
2797 EngineStateController::instance()->get_physical_midi_outputs (enabled_midi_outputs);
2799 std::vector<std::string>::iterator port_iter = enabled_midi_outputs.begin();
2801 for (; port_iter != enabled_midi_outputs.end(); ++port_iter) {
2802 mmc_out_ptr->connect (*port_iter);
2810 /** Caller must not hold process lock
2811 * @param name_template string to use for the start of the name, or "" to use "Audio".
2813 list< boost::shared_ptr<AudioTrack> >
2814 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
2815 uint32_t how_many, string name_template)
2818 uint32_t track_id = 0;
2820 RouteList new_routes;
2821 list<boost::shared_ptr<AudioTrack> > ret;
2823 const string name_pattern = default_track_name_pattern (DataType::AUDIO);
2824 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
2828 if (!find_route_name (name_template.empty() ? _(name_pattern.c_str()) : name_template, ++track_id, track_name, use_number)) {
2829 error << "cannot find name for new audio track" << endmsg;
2833 boost::shared_ptr<AudioTrack> track;
2836 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
2838 if (track->init ()) {
2842 if (ARDOUR::Profile->get_trx ()) {
2843 // TRACKS considers it's not a USE CASE, it's
2844 // a piece of behavior of the session model:
2846 // Gain for a newly created route depends on
2847 // the current output_auto_connect mode:
2849 // 0 for Stereo Out mode
2851 if (Config->get_output_auto_connect() & AutoConnectMaster) {
2852 track->set_gain (dB_to_coefficient (0), 0);
2856 track->use_new_diskstream();
2858 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2859 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2862 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2864 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2865 error << string_compose (
2866 _("cannot configure %1 in/%2 out configuration for new audio track"),
2867 input_channels, output_channels)
2872 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2873 error << string_compose (
2874 _("cannot configure %1 in/%2 out configuration for new audio track"),
2875 input_channels, output_channels)
2882 route_group->add (track);
2885 track->non_realtime_input_change();
2887 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2888 if (Config->get_remote_model() == UserOrdered) {
2889 track->set_remote_control_id (next_control_id());
2892 new_routes.push_back (track);
2893 ret.push_back (track);
2895 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2898 catch (failed_constructor &err) {
2899 error << _("Session: could not create new audio track.") << endmsg;
2903 catch (AudioEngine::PortRegistrationFailure& pfe) {
2905 error << pfe.what() << endmsg;
2913 if (!new_routes.empty()) {
2914 StateProtector sp (this);
2915 if (Profile->get_trx()) {
2916 add_routes (new_routes, false, false, false);
2918 add_routes (new_routes, true, true, false);
2925 /** Caller must not hold process lock.
2926 * @param name_template string to use for the start of the name, or "" to use "Bus".
2929 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
2932 uint32_t bus_id = 0;
2936 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
2939 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, use_number)) {
2940 error << "cannot find name for new audio bus" << endmsg;
2945 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
2951 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2952 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
2955 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2957 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2958 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2959 input_channels, output_channels)
2965 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2966 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2967 input_channels, output_channels)
2974 route_group->add (bus);
2976 if (Config->get_remote_model() == UserOrdered) {
2977 bus->set_remote_control_id (next_control_id());
2980 bus->add_internal_return ();
2982 ret.push_back (bus);
2984 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2990 catch (failed_constructor &err) {
2991 error << _("Session: could not create new audio route.") << endmsg;
2995 catch (AudioEngine::PortRegistrationFailure& pfe) {
2996 error << pfe.what() << endmsg;
3006 StateProtector sp (this);
3007 if (Profile->get_trx()) {
3008 add_routes (ret, false, false, false);
3010 add_routes (ret, false, true, true); // autoconnect // outputs only
3019 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base)
3022 uint32_t control_id;
3024 uint32_t number = 0;
3025 const uint32_t being_added = how_many;
3027 if (!tree.read (template_path.c_str())) {
3031 XMLNode* node = tree.root();
3033 IO::disable_connecting ();
3035 control_id = next_control_id ();
3039 XMLNode node_copy (*node);
3041 /* Remove IDs of everything so that new ones are used */
3042 node_copy.remove_property_recursively (X_("id"));
3047 if (!name_base.empty()) {
3049 /* if we're adding more than one routes, force
3050 * all the names of the new routes to be
3051 * numbered, via the final parameter.
3054 if (!find_route_name (name_base.c_str(), ++number, name, (being_added > 1))) {
3055 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3061 string const route_name = node_copy.property(X_("name"))->value ();
3063 /* generate a new name by adding a number to the end of the template name */
3064 if (!find_route_name (route_name.c_str(), ++number, name, true)) {
3065 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3066 abort(); /*NOTREACHED*/
3070 /* set this name in the XML description that we are about to use */
3071 Route::set_name_in_state (node_copy, name);
3073 /* trim bitslots from listen sends so that new ones are used */
3074 XMLNodeList children = node_copy.children ();
3075 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
3076 if ((*i)->name() == X_("Processor")) {
3077 XMLProperty* role = (*i)->property (X_("role"));
3078 if (role && role->value() == X_("Listen")) {
3079 (*i)->remove_property (X_("bitslot"));
3084 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
3087 error << _("Session: cannot create track/bus from template description") << endmsg;
3091 if (boost::dynamic_pointer_cast<Track>(route)) {
3092 /* force input/output change signals so that the new diskstream
3093 picks up the configuration of the route. During session
3094 loading this normally happens in a different way.
3097 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3099 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
3100 change.after = route->input()->n_ports();
3101 route->input()->changed (change, this);
3102 change.after = route->output()->n_ports();
3103 route->output()->changed (change, this);
3106 route->set_remote_control_id (control_id);
3109 ret.push_back (route);
3111 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
3114 catch (failed_constructor &err) {
3115 error << _("Session: could not create new route from template") << endmsg;
3119 catch (AudioEngine::PortRegistrationFailure& pfe) {
3120 error << pfe.what() << endmsg;
3129 StateProtector sp (this);
3130 if (Profile->get_trx()) {
3131 add_routes (ret, false, false, false);
3133 add_routes (ret, true, true, false);
3135 IO::enable_connecting ();
3142 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
3145 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
3146 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
3149 error << _("Adding new tracks/busses failed") << endmsg;
3154 update_latency (true);
3155 update_latency (false);
3160 save_state (_current_snapshot_name);
3163 reassign_track_numbers();
3165 update_route_record_state ();
3167 RouteAdded (new_routes); /* EMIT SIGNAL */
3171 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
3173 ChanCount existing_inputs;
3174 ChanCount existing_outputs;
3175 uint32_t order = next_control_id();
3177 if (_order_hint > -1) {
3178 order = _order_hint;
3182 count_existing_track_channels (existing_inputs, existing_outputs);
3185 RCUWriter<RouteList> writer (routes);
3186 boost::shared_ptr<RouteList> r = writer.get_copy ();
3187 r->insert (r->end(), new_routes.begin(), new_routes.end());
3189 /* if there is no control out and we're not in the middle of loading,
3190 resort the graph here. if there is a control out, we will resort
3191 toward the end of this method. if we are in the middle of loading,
3192 we will resort when done.
3195 if (!_monitor_out && IO::connecting_legal) {
3196 resort_routes_using (r);
3200 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3202 boost::weak_ptr<Route> wpr (*x);
3203 boost::shared_ptr<Route> r (*x);
3205 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
3206 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
3207 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
3208 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
3209 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
3210 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
3212 if (r->is_master()) {
3216 if (r->is_monitor()) {
3220 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
3222 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
3223 track_playlist_changed (boost::weak_ptr<Track> (tr));
3224 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
3226 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
3228 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
3229 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
3234 if (input_auto_connect || output_auto_connect) {
3235 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
3238 /* order keys are a GUI responsibility but we need to set up
3239 reasonable defaults because they also affect the remote control
3240 ID in most situations.
3243 if (!r->has_order_key ()) {
3244 if (r->is_auditioner()) {
3245 /* use an arbitrarily high value */
3246 r->set_order_key (UINT_MAX);
3248 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
3249 r->set_order_key (order);
3257 if (_monitor_out && IO::connecting_legal) {
3258 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
3260 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3261 if ((*x)->is_monitor()) {
3263 } else if ((*x)->is_master()) {
3266 (*x)->enable_monitor_send ();
3273 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
3275 boost::shared_ptr<RouteList> r = routes.reader ();
3276 boost::shared_ptr<Send> s;
3278 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3279 if ((s = (*i)->internal_send_for (dest)) != 0) {
3280 s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO);
3286 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
3288 boost::shared_ptr<RouteList> r = routes.reader ();
3289 boost::shared_ptr<Send> s;
3291 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3292 if ((s = (*i)->internal_send_for (dest)) != 0) {
3293 s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY);
3299 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
3301 boost::shared_ptr<RouteList> r = routes.reader ();
3302 boost::shared_ptr<Send> s;
3304 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3305 if ((s = (*i)->internal_send_for (dest)) != 0) {
3306 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
3311 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
3313 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
3315 boost::shared_ptr<RouteList> r = routes.reader ();
3316 boost::shared_ptr<RouteList> t (new RouteList);
3318 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3319 /* no MIDI sends because there are no MIDI busses yet */
3320 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
3325 add_internal_sends (dest, p, t);
3329 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
3331 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
3332 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
3337 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
3339 add_internal_send (dest, sender->before_processor_for_index (index), sender);
3343 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
3345 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
3349 if (!dest->internal_return()) {
3350 dest->add_internal_return ();
3353 sender->add_aux_send (dest, before);
3360 Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
3362 PBD::Unwinder<bool> uw_flag (_route_deletion_in_progress, true);
3364 { // RCU Writer scope
3365 RCUWriter<RouteList> writer (routes);
3366 boost::shared_ptr<RouteList> rs = writer.get_copy ();
3369 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3371 if (*iter == _master_out) {
3375 (*iter)->set_solo (false, this);
3379 /* deleting the master out seems like a dumb
3380 idea, but its more of a UI policy issue
3384 if (*iter == _master_out) {
3385 _master_out = boost::shared_ptr<Route> ();
3388 if (*iter == _monitor_out) {
3389 _monitor_out.reset ();
3392 // We need to disconnect the route's inputs and outputs
3394 (*iter)->input()->disconnect (0);
3395 (*iter)->output()->disconnect (0);
3397 /* if the route had internal sends sending to it, remove them */
3398 if ((*iter)->internal_return()) {
3400 boost::shared_ptr<RouteList> r = routes.reader ();
3401 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3402 boost::shared_ptr<Send> s = (*i)->internal_send_for (*iter);
3404 (*i)->remove_processor (s);
3409 /* if the monitoring section had a pointer to this route, remove it */
3410 if (_monitor_out && !(*iter)->is_master() && !(*iter)->is_monitor()) {
3411 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3412 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
3413 (*iter)->remove_aux_or_listen (_monitor_out);
3416 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*iter);
3417 if (mt && mt->step_editing()) {
3418 if (_step_editors > 0) {
3424 /* writer goes out of scope, forces route list update */
3426 } // end of RCU Writer scope
3428 update_route_solo_state ();
3429 RouteAddedOrRemoved (false); /* EMIT SIGNAL */
3430 update_latency_compensation ();
3433 /* Re-sort routes to remove the graph's current references to the one that is
3434 * going away, then flush old references out of the graph.
3435 * Wave Tracks: reconnect routes
3438 #ifdef USE_TRACKS_CODE_FEATURES
3439 reconnect_existing_routes(true, false);
3441 routes.flush (); // maybe unsafe, see below.
3445 if (_process_graph) {
3446 _process_graph->clear_other_chain ();
3449 /* get rid of it from the dead wood collection in the route list manager */
3450 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
3454 /* try to cause everyone to drop their references
3455 * and unregister ports from the backend
3458 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3459 (*iter)->drop_references ();
3462 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
3464 /* save the new state of the world */
3466 if (save_state (_current_snapshot_name)) {
3467 save_history (_current_snapshot_name);
3470 reassign_track_numbers();
3471 update_route_record_state ();
3475 Session::remove_route (boost::shared_ptr<Route> route)
3477 boost::shared_ptr<RouteList> rl (new RouteList);
3478 rl->push_back (route);
3483 Session::route_mute_changed (void* /*src*/)
3489 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3491 boost::shared_ptr<Route> route = wpr.lock();
3493 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
3497 if (route->listening_via_monitor ()) {
3499 if (Config->get_exclusive_solo()) {
3500 /* new listen: disable all other listen */
3501 boost::shared_ptr<RouteList> r = routes.reader ();
3502 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3503 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3506 (*i)->set_listen (false, this);
3512 } else if (_listen_cnt > 0) {
3517 update_route_solo_state ();
3520 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3522 boost::shared_ptr<Route> route = wpr.lock ();
3525 /* should not happen */
3526 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
3530 bool send_changed = false;
3532 if (route->solo_isolated()) {
3533 if (_solo_isolated_cnt == 0) {
3534 send_changed = true;
3536 _solo_isolated_cnt++;
3537 } else if (_solo_isolated_cnt > 0) {
3538 _solo_isolated_cnt--;
3539 if (_solo_isolated_cnt == 0) {
3540 send_changed = true;
3545 IsolatedChanged (); /* EMIT SIGNAL */
3550 Session::routes_solo_changed (boost::shared_ptr<RouteList> solo_change_routes)
3552 if (solo_update_disabled) {
3554 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
3558 if (solo_change_routes->empty() ) {
3562 boost::shared_ptr<RouteList> non_solo_change_routes (new RouteList);
3563 boost::shared_ptr<RouteList> r = routes.reader ();
3566 std::set_difference (r->begin(), r->end(),
3567 solo_change_routes->begin(), solo_change_routes->end(),
3568 std::back_inserter(*non_solo_change_routes) );
3570 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3572 solo_update_disabled = true;
3573 RouteList uninvolved;
3575 for (RouteList::iterator route = solo_change_routes->begin(); route != solo_change_routes->end(); ++route) {
3577 if ((*route)->self_soloed() ) {
3583 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", (*route)->name()));
3585 for (RouteList::iterator i = non_solo_change_routes->begin(); i != non_solo_change_routes->end(); ++i) {
3586 bool via_sends_only;
3587 bool in_signal_flow;
3589 if ((*i) == *route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ) {
3593 in_signal_flow = false;
3595 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3597 if ((*i)->feeds (*route, &via_sends_only)) {
3598 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3599 if (!via_sends_only) {
3600 if (!(*route)->soloed_by_others_upstream()) {
3601 (*i)->mod_solo_by_others_downstream (delta);
3604 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3606 in_signal_flow = true;
3608 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3611 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3613 if ((*route)->feeds (*i, &via_sends_only)) {
3614 /* propagate solo upstream only if routing other than
3615 sends is involved, but do consider the other route
3616 (*i) to be part of the signal flow even if only
3619 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3623 (*route)->soloed_by_others_downstream(),
3624 (*route)->soloed_by_others_upstream()));
3625 if (!via_sends_only) {
3626 if (!(*route)->soloed_by_others_downstream()) {
3627 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3628 (*i)->mod_solo_by_others_upstream (delta);
3630 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
3633 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3635 in_signal_flow = true;
3637 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3640 if (!in_signal_flow) {
3641 uninvolved.push_back (*i);
3645 solo_update_disabled = false;
3646 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3648 update_route_solo_state ();
3650 /* now notify that the mute state of the routes not involved in the signal
3651 pathway of the just-solo-changed route may have altered.
3654 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3655 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1\n", (*i)->name() ));
3656 (*i)->mute_changed (this);
3659 SoloChanged (); /* EMIT SIGNAL */
3664 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
3666 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
3668 if (!self_solo_change) {
3669 // session doesn't care about changes to soloed-by-others
3673 if (solo_update_disabled) {
3675 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
3679 boost::shared_ptr<Route> route = wpr.lock ();
3682 boost::shared_ptr<RouteList> r = routes.reader ();
3685 if (route->self_soloed()) {
3691 RouteGroup* rg = route->route_group ();
3692 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
3694 if (delta == 1 && Config->get_exclusive_solo()) {
3696 /* new solo: disable all other solos, but not the group if its solo-enabled */
3698 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3699 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3700 (leave_group_alone && ((*i)->route_group() == rg))) {
3703 (*i)->set_solo (false, this);
3707 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3709 solo_update_disabled = true;
3711 RouteList uninvolved;
3713 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
3715 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3716 bool via_sends_only;
3717 bool in_signal_flow;
3719 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3720 (leave_group_alone && ((*i)->route_group() == rg))) {
3724 in_signal_flow = false;
3726 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3728 if ((*i)->feeds (route, &via_sends_only)) {
3729 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3730 if (!via_sends_only) {
3731 if (!route->soloed_by_others_upstream()) {
3732 (*i)->mod_solo_by_others_downstream (delta);
3735 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3737 in_signal_flow = true;
3739 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3742 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3744 if (route->feeds (*i, &via_sends_only)) {
3745 /* propagate solo upstream only if routing other than
3746 sends is involved, but do consider the other route
3747 (*i) to be part of the signal flow even if only
3750 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3754 route->soloed_by_others_downstream(),
3755 route->soloed_by_others_upstream()));
3756 if (!via_sends_only) {
3757 if (!route->soloed_by_others_downstream()) {
3758 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3759 (*i)->mod_solo_by_others_upstream (delta);
3761 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
3764 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3766 in_signal_flow = true;
3768 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3771 if (!in_signal_flow) {
3772 uninvolved.push_back (*i);
3776 solo_update_disabled = false;
3777 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3779 update_route_solo_state (r);
3781 /* now notify that the mute state of the routes not involved in the signal
3782 pathway of the just-solo-changed route may have altered.
3785 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3786 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
3787 (*i)->act_on_mute ();
3788 (*i)->mute_changed (this);
3791 SoloChanged (); /* EMIT SIGNAL */
3796 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
3798 /* now figure out if anything that matters is soloed (or is "listening")*/
3800 bool something_soloed = false;
3801 uint32_t listeners = 0;
3802 uint32_t isolated = 0;
3805 r = routes.reader();
3808 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3809 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
3810 something_soloed = true;
3813 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
3814 if (Config->get_solo_control_is_listen_control()) {
3817 (*i)->set_listen (false, this);
3821 if ((*i)->solo_isolated()) {
3826 if (something_soloed != _non_soloed_outs_muted) {
3827 _non_soloed_outs_muted = something_soloed;
3828 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
3831 _listen_cnt = listeners;
3833 if (isolated != _solo_isolated_cnt) {
3834 _solo_isolated_cnt = isolated;
3835 IsolatedChanged (); /* EMIT SIGNAL */
3838 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
3839 something_soloed, listeners, isolated));
3842 boost::shared_ptr<RouteList>
3843 Session::get_routes_with_internal_returns() const
3845 boost::shared_ptr<RouteList> r = routes.reader ();
3846 boost::shared_ptr<RouteList> rl (new RouteList);
3848 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3849 if ((*i)->internal_return ()) {
3857 Session::io_name_is_legal (const std::string& name)
3859 boost::shared_ptr<RouteList> r = routes.reader ();
3861 for (vector<string>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
3862 if (name == *reserved) {
3867 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3868 if ((*i)->name() == name) {
3872 if ((*i)->has_io_processor_named (name)) {
3881 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
3884 vector<string> connections;
3886 /* if we are passed only a single route and we're not told to turn
3887 * others off, then just do the simple thing.
3890 if (flip_others == false && rl->size() == 1) {
3891 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
3893 mt->set_input_active (onoff);
3898 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
3900 PortSet& ps ((*rt)->input()->ports());
3902 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
3903 p->get_connections (connections);
3906 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
3907 routes_using_input_from (*s, rl2);
3910 /* scan all relevant routes to see if others are on or off */
3912 bool others_are_already_on = false;
3914 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3916 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3922 if ((*r) != (*rt)) {
3923 if (mt->input_active()) {
3924 others_are_already_on = true;
3927 /* this one needs changing */
3928 mt->set_input_active (onoff);
3934 /* globally reverse other routes */
3936 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3937 if ((*r) != (*rt)) {
3938 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3940 mt->set_input_active (!others_are_already_on);
3949 Session::routes_using_input_from (const string& str, RouteList& rl)
3951 boost::shared_ptr<RouteList> r = routes.reader();
3953 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3954 if ((*i)->input()->connected_to (str)) {
3960 boost::shared_ptr<Route>
3961 Session::route_by_name (string name)
3963 boost::shared_ptr<RouteList> r = routes.reader ();
3965 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3966 if ((*i)->name() == name) {
3971 return boost::shared_ptr<Route> ((Route*) 0);
3974 boost::shared_ptr<Route>
3975 Session::route_by_id (PBD::ID id)
3977 boost::shared_ptr<RouteList> r = routes.reader ();
3979 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3980 if ((*i)->id() == id) {
3985 return boost::shared_ptr<Route> ((Route*) 0);
3988 boost::shared_ptr<Track>
3989 Session::track_by_diskstream_id (PBD::ID id)
3991 boost::shared_ptr<RouteList> r = routes.reader ();
3993 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3994 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3995 if (t && t->using_diskstream_id (id)) {
4000 return boost::shared_ptr<Track> ();
4003 boost::shared_ptr<Route>
4004 Session::route_by_remote_id (uint32_t id)
4006 boost::shared_ptr<RouteList> r = routes.reader ();
4008 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4009 if ((*i)->remote_control_id() == id) {
4014 return boost::shared_ptr<Route> ((Route*) 0);
4019 Session::reassign_track_numbers ()
4023 RouteList r (*(routes.reader ()));
4024 SignalOrderRouteSorter sorter;
4027 StateProtector sp (this);
4029 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4030 if (boost::dynamic_pointer_cast<Track> (*i)) {
4031 (*i)->set_track_number(++tn);
4033 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
4034 (*i)->set_track_number(--bn);
4037 const uint32_t decimals = ceilf (log10f (tn + 1));
4038 const bool decimals_changed = _track_number_decimals != decimals;
4039 _track_number_decimals = decimals;
4041 if (decimals_changed && config.get_track_name_number ()) {
4042 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4043 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
4045 t->resync_track_name();
4048 // trigger GUI re-layout
4049 config.ParameterChanged("track-name-number");
4054 Session::playlist_region_added (boost::weak_ptr<Region> w)
4056 boost::shared_ptr<Region> r = w.lock ();
4061 /* These are the operations that are currently in progress... */
4062 list<GQuark> curr = _current_trans_quarks;
4065 /* ...and these are the operations during which we want to update
4066 the session range location markers.
4069 ops.push_back (Operations::capture);
4070 ops.push_back (Operations::paste);
4071 ops.push_back (Operations::duplicate_region);
4072 ops.push_back (Operations::insert_file);
4073 ops.push_back (Operations::insert_region);
4074 ops.push_back (Operations::drag_region_brush);
4075 ops.push_back (Operations::region_drag);
4076 ops.push_back (Operations::selection_grab);
4077 ops.push_back (Operations::region_fill);
4078 ops.push_back (Operations::fill_selection);
4079 ops.push_back (Operations::create_region);
4080 ops.push_back (Operations::region_copy);
4081 ops.push_back (Operations::fixed_time_region_copy);
4084 /* See if any of the current operations match the ones that we want */
4086 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
4088 /* If so, update the session range markers */
4090 maybe_update_session_range (r->position (), r->last_frame ());
4094 /** Update the session range markers if a is before the current start or
4095 * b is after the current end.
4098 Session::maybe_update_session_range (framepos_t a, framepos_t b)
4100 if (_state_of_the_state & Loading) {
4104 framepos_t session_end_marker_shift_samples = session_end_shift * _nominal_frame_rate;
4106 if (_session_range_location == 0) {
4108 set_session_range_location (a, b + session_end_marker_shift_samples);
4112 if (a < _session_range_location->start()) {
4113 _session_range_location->set_start (a);
4116 if (b > _session_range_location->end()) {
4117 _session_range_location->set_end (b);
4123 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
4125 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4126 maybe_update_session_range (i->to, i->to + i->length);
4131 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
4133 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4134 maybe_update_session_range (i->from, i->to);
4138 /* Region management */
4140 boost::shared_ptr<Region>
4141 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
4143 const RegionFactory::RegionMap& regions (RegionFactory::regions());
4144 RegionFactory::RegionMap::const_iterator i;
4145 boost::shared_ptr<Region> region;
4147 Glib::Threads::Mutex::Lock lm (region_lock);
4149 for (i = regions.begin(); i != regions.end(); ++i) {
4153 if (region->whole_file()) {
4155 if (child->source_equivalent (region)) {
4161 return boost::shared_ptr<Region> ();
4165 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
4167 set<boost::shared_ptr<Region> > relevant_regions;
4169 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
4170 RegionFactory::get_regions_using_source (*s, relevant_regions);
4173 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
4174 set<boost::shared_ptr<Region> >::iterator tmp;
4179 playlists->destroy_region (*r);
4180 RegionFactory::map_remove (*r);
4182 (*r)->drop_sources ();
4183 (*r)->drop_references ();
4185 relevant_regions.erase (r);
4190 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
4193 Glib::Threads::Mutex::Lock ls (source_lock);
4194 /* remove from the main source list */
4195 sources.erase ((*s)->id());
4198 (*s)->mark_for_remove ();
4199 (*s)->drop_references ();
4208 Session::remove_last_capture ()
4210 list<boost::shared_ptr<Source> > srcs;
4212 boost::shared_ptr<RouteList> rl = routes.reader ();
4213 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4214 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4219 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
4222 srcs.insert (srcs.end(), l.begin(), l.end());
4227 destroy_sources (srcs);
4229 save_state (_current_snapshot_name);
4234 /* Source Management */
4237 Session::add_source (boost::shared_ptr<Source> source)
4239 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
4240 pair<SourceMap::iterator,bool> result;
4242 entry.first = source->id();
4243 entry.second = source;
4246 Glib::Threads::Mutex::Lock lm (source_lock);
4247 result = sources.insert (entry);
4250 if (result.second) {
4252 /* yay, new source */
4254 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
4257 if (!fs->within_session()) {
4258 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
4264 boost::shared_ptr<AudioFileSource> afs;
4266 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
4267 if (Config->get_auto_analyse_audio()) {
4268 Analyser::queue_source_for_analysis (source, false);
4272 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
4277 Session::remove_source (boost::weak_ptr<Source> src)
4279 if (_state_of_the_state & Deletion) {
4283 SourceMap::iterator i;
4284 boost::shared_ptr<Source> source = src.lock();
4291 Glib::Threads::Mutex::Lock lm (source_lock);
4293 if ((i = sources.find (source->id())) != sources.end()) {
4298 if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
4300 /* save state so we don't end up with a session file
4301 referring to non-existent sources.
4304 save_state (_current_snapshot_name);
4308 boost::shared_ptr<Source>
4309 Session::source_by_id (const PBD::ID& id)
4311 Glib::Threads::Mutex::Lock lm (source_lock);
4312 SourceMap::iterator i;
4313 boost::shared_ptr<Source> source;
4315 if ((i = sources.find (id)) != sources.end()) {
4322 boost::shared_ptr<AudioFileSource>
4323 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
4325 /* Restricted to audio files because only audio sources have channel
4329 Glib::Threads::Mutex::Lock lm (source_lock);
4331 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
4332 boost::shared_ptr<AudioFileSource> afs
4333 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
4335 if (afs && afs->path() == path && chn == afs->channel()) {
4340 return boost::shared_ptr<AudioFileSource>();
4343 boost::shared_ptr<MidiSource>
4344 Session::midi_source_by_path (const std::string& path) const
4346 /* Restricted to MIDI files because audio sources require a channel
4347 for unique identification, in addition to a path.
4350 Glib::Threads::Mutex::Lock lm (source_lock);
4352 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
4353 boost::shared_ptr<MidiSource> ms
4354 = boost::dynamic_pointer_cast<MidiSource>(s->second);
4355 boost::shared_ptr<FileSource> fs
4356 = boost::dynamic_pointer_cast<FileSource>(s->second);
4358 if (ms && fs && fs->path() == path) {
4363 return boost::shared_ptr<MidiSource>();
4367 Session::count_sources_by_origin (const string& path)
4370 Glib::Threads::Mutex::Lock lm (source_lock);
4372 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
4373 boost::shared_ptr<FileSource> fs
4374 = boost::dynamic_pointer_cast<FileSource>(i->second);
4376 if (fs && fs->origin() == path) {
4385 peak_file_helper (const string& peak_path, const string& file_path, const string& file_base, bool hash) {
4387 std::string checksum = Glib::Checksum::compute_checksum(Glib::Checksum::CHECKSUM_SHA1, file_path + G_DIR_SEPARATOR + file_base);
4388 return Glib::build_filename (peak_path, checksum + peakfile_suffix);
4390 return Glib::build_filename (peak_path, file_base + peakfile_suffix);
4395 Session::construct_peak_filepath (const string& filepath, const bool in_session, const bool old_peak_name) const
4397 string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
4399 if (Glib::path_is_absolute (filepath)) {
4401 /* rip the session dir from the audiofile source */
4403 string session_path;
4404 bool in_another_session = true;
4406 if (filepath.find (interchange_dir_string) != string::npos) {
4408 session_path = Glib::path_get_dirname (filepath); /* now ends in audiofiles */
4409 session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
4410 session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
4411 session_path = Glib::path_get_dirname (session_path); /* now has session path */
4413 /* see if it is within our session */
4415 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4416 if (i->path == session_path) {
4417 in_another_session = false;
4422 in_another_session = false;
4426 if (in_another_session) {
4427 SessionDirectory sd (session_path);
4428 return peak_file_helper (sd.peak_path(), "", Glib::path_get_basename (filepath), !old_peak_name);
4432 /* 1) if file belongs to this session
4433 * it may be a relative path (interchange/...)
4434 * or just basename (session_state, remove source)
4435 * -> just use the basename
4437 std::string filename = Glib::path_get_basename (filepath);
4440 /* 2) if the file is outside our session dir:
4441 * (imported but not copied) add the path for check-summming */
4443 path = Glib::path_get_dirname (filepath);
4446 return peak_file_helper (_session_dir->peak_path(), path, Glib::path_get_basename (filepath), !old_peak_name);
4450 Session::new_audio_source_path_for_embedded (const std::string& path)
4454 * we know that the filename is already unique because it exists
4455 * out in the filesystem.
4457 * However, when we bring it into the session, we could get a
4460 * Eg. two embedded files:
4465 * When merged into session, these collide.
4467 * There will not be a conflict with in-memory sources
4468 * because when the source was created we already picked
4469 * a unique name for it.
4471 * This collision is not likely to be common, but we have to guard
4472 * against it. So, if there is a collision, take the md5 hash of the
4473 * the path, and use that as the filename instead.
4476 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4477 string base = Glib::path_get_basename (path);
4478 string newpath = Glib::build_filename (sdir.sound_path(), base);
4480 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4484 md5.digestString (path.c_str());
4485 md5.writeToString ();
4486 base = md5.digestChars;
4488 string ext = get_suffix (path);
4495 newpath = Glib::build_filename (sdir.sound_path(), base);
4497 /* if this collides, we're screwed */
4499 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4500 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
4509 /** Return true if there are no audio file sources that use @param name as
4510 * the filename component of their path.
4512 * Return false otherwise.
4514 * This method MUST ONLY be used to check in-session, mono files since it
4515 * hard-codes the channel of the audio file source we are looking for as zero.
4517 * If/when Ardour supports native files in non-mono formats, the logic here
4518 * will need to be revisited.
4521 Session::audio_source_name_is_unique (const string& name)
4523 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
4524 vector<space_and_path>::iterator i;
4525 uint32_t existing = 0;
4527 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4529 /* note that we search *without* the extension so that
4530 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
4531 in the event that this new name is required for
4532 a file format change.
4535 const string spath = *i;
4537 if (matching_unsuffixed_filename_exists_in (spath, name)) {
4542 /* it is possible that we have the path already
4543 * assigned to a source that has not yet been written
4544 * (ie. the write source for a diskstream). we have to
4545 * check this in order to make sure that our candidate
4546 * path isn't used again, because that can lead to
4547 * two Sources point to the same file with different
4548 * notions of their removability.
4552 string possible_path = Glib::build_filename (spath, name);
4554 if (audio_source_by_path_and_channel (possible_path, 0)) {
4560 return (existing == 0);
4564 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)
4567 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4569 if (Profile->get_trx() && destructive) {
4571 sstr << setfill ('0') << setw (4) << cnt;
4572 sstr << legalized_base;
4574 sstr << legalized_base;
4576 if (take_required || related_exists) {
4588 } else if (nchan > 2) {
4593 /* XXX what? more than 26 channels! */
4604 /** Return a unique name based on \a base for a new internal audio source */
4606 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
4609 string possible_name;
4610 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
4612 bool some_related_source_name_exists = false;
4614 legalized = legalize_for_path (base);
4616 // Find a "version" of the base name that doesn't exist in any of the possible directories.
4618 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
4620 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
4622 if (audio_source_name_is_unique (possible_name)) {
4626 some_related_source_name_exists = true;
4629 error << string_compose(
4630 _("There are already %1 recordings for %2, which I consider too many."),
4631 limit, base) << endmsg;
4633 throw failed_constructor();
4637 /* We've established that the new name does not exist in any session
4638 * directory, so now find out which one we should use for this new
4642 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4644 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
4649 /** Return a unique name based on `base` for a new internal MIDI source */
4651 Session::new_midi_source_path (const string& base)
4654 char buf[PATH_MAX+1];
4655 const uint32_t limit = 10000;
4657 string possible_path;
4658 string possible_name;
4661 legalized = legalize_for_path (base);
4663 // Find a "version" of the file name that doesn't exist in any of the possible directories.
4664 std::vector<string> sdirs = source_search_path(DataType::MIDI);
4666 /* - the main session folder is the first in the vector.
4667 * - after checking all locations for file-name uniqueness,
4668 * we keep the one from the last iteration as new file name
4669 * - midi files are small and should just be kept in the main session-folder
4671 * -> reverse the array, check main session folder last and use that as location
4674 std::reverse(sdirs.begin(), sdirs.end());
4676 for (cnt = 1; cnt <= limit; ++cnt) {
4678 vector<space_and_path>::iterator i;
4679 uint32_t existing = 0;
4681 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4683 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
4684 possible_name = buf;
4686 possible_path = Glib::build_filename (*i, possible_name);
4688 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
4692 if (midi_source_by_path (possible_path)) {
4697 if (existing == 0) {
4702 error << string_compose(
4703 _("There are already %1 recordings for %2, which I consider too many."),
4704 limit, base) << endmsg;
4710 /* No need to "find best location" for software/app-based RAID, because
4711 MIDI is so small that we always put it in the same place.
4714 return possible_path;
4718 /** Create a new within-session audio source */
4719 boost::shared_ptr<AudioFileSource>
4720 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
4722 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
4724 if (!path.empty()) {
4725 return boost::dynamic_pointer_cast<AudioFileSource> (
4726 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate(), true, true));
4728 throw failed_constructor ();
4732 /** Create a new within-session MIDI source */
4733 boost::shared_ptr<MidiSource>
4734 Session::create_midi_source_for_session (string const & basic_name)
4736 const string path = new_midi_source_path (basic_name);
4738 if (!path.empty()) {
4739 return boost::dynamic_pointer_cast<SMFSource> (
4740 SourceFactory::createWritable (
4741 DataType::MIDI, *this, path, false, frame_rate()));
4743 throw failed_constructor ();
4747 /** Create a new within-session MIDI source */
4748 boost::shared_ptr<MidiSource>
4749 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
4751 /* the caller passes in the track the source will be used in,
4752 so that we can keep the numbering sane.
4754 Rationale: a track with the name "Foo" that has had N
4755 captures carried out so far will ALREADY have a write source
4756 named "Foo-N+1.mid" waiting to be used for the next capture.
4758 If we call new_midi_source_name() we will get "Foo-N+2". But
4759 there is no region corresponding to "Foo-N+1", so when
4760 "Foo-N+2" appears in the track, the gap presents the user
4761 with odd behaviour - why did it skip past Foo-N+1?
4763 We could explain this to the user in some odd way, but
4764 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
4767 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
4770 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
4772 std::string name = track->steal_write_source_name ();
4775 return boost::shared_ptr<MidiSource>();
4778 /* MIDI files are small, just put them in the first location of the
4779 session source search path.
4782 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
4784 return boost::dynamic_pointer_cast<SMFSource> (
4785 SourceFactory::createWritable (
4786 DataType::MIDI, *this, path, false, frame_rate()));
4791 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
4793 if (playlist->hidden()) {
4797 playlists->add (playlist);
4800 playlist->release();
4807 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
4809 if (_state_of_the_state & Deletion) {
4813 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
4819 playlists->remove (playlist);
4825 Session::set_audition (boost::shared_ptr<Region> r)
4827 pending_audition_region = r;
4828 add_post_transport_work (PostTransportAudition);
4829 _butler->schedule_transport_work ();
4833 Session::audition_playlist ()
4835 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4836 ev->region.reset ();
4841 Session::non_realtime_set_audition ()
4843 assert (pending_audition_region);
4844 auditioner->audition_region (pending_audition_region);
4845 pending_audition_region.reset ();
4846 AuditionActive (true); /* EMIT SIGNAL */
4850 Session::audition_region (boost::shared_ptr<Region> r)
4852 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4858 Session::cancel_audition ()
4863 if (auditioner->auditioning()) {
4864 auditioner->cancel_audition ();
4865 AuditionActive (false); /* EMIT SIGNAL */
4870 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
4872 if (a->is_monitor()) {
4875 if (b->is_monitor()) {
4878 return a->order_key () < b->order_key ();
4882 Session::is_auditioning () const
4884 /* can be called before we have an auditioner object */
4886 return auditioner->auditioning();
4893 Session::graph_reordered ()
4895 /* don't do this stuff if we are setting up connections
4896 from a set_state() call or creating new tracks. Ditto for deletion.
4899 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _reconnecting_routes_in_progress || _route_deletion_in_progress) {
4903 /* every track/bus asked for this to be handled but it was deferred because
4904 we were connecting. do it now.
4907 request_input_change_handling ();
4911 /* force all diskstreams to update their capture offset values to
4912 reflect any changes in latencies within the graph.
4915 boost::shared_ptr<RouteList> rl = routes.reader ();
4916 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4917 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4919 tr->set_capture_offset ();
4924 /** @return Number of frames that there is disk space available to write,
4927 boost::optional<framecnt_t>
4928 Session::available_capture_duration ()
4930 Glib::Threads::Mutex::Lock lm (space_lock);
4932 if (_total_free_4k_blocks_uncertain) {
4933 return boost::optional<framecnt_t> ();
4936 float sample_bytes_on_disk = 4.0; // keep gcc happy
4938 switch (config.get_native_file_data_format()) {
4940 sample_bytes_on_disk = 4.0;
4944 sample_bytes_on_disk = 3.0;
4948 sample_bytes_on_disk = 2.0;
4952 /* impossible, but keep some gcc versions happy */
4953 fatal << string_compose (_("programming error: %1"),
4954 X_("illegal native file data format"))
4956 abort(); /*NOTREACHED*/
4959 double scale = 4096.0 / sample_bytes_on_disk;
4961 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
4962 return max_framecnt;
4965 return (framecnt_t) floor (_total_free_4k_blocks * scale);
4969 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
4972 RCUWriter<BundleList> writer (_bundles);
4973 boost::shared_ptr<BundleList> b = writer.get_copy ();
4974 b->push_back (bundle);
4978 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4985 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
4987 bool removed = false;
4990 RCUWriter<BundleList> writer (_bundles);
4991 boost::shared_ptr<BundleList> b = writer.get_copy ();
4992 BundleList::iterator i = find (b->begin(), b->end(), bundle);
4994 if (i != b->end()) {
5001 BundleAddedOrRemoved (); /* EMIT SIGNAL */
5007 boost::shared_ptr<Bundle>
5008 Session::bundle_by_name (string name) const
5010 boost::shared_ptr<BundleList> b = _bundles.reader ();
5012 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
5013 if ((*i)->name() == name) {
5018 return boost::shared_ptr<Bundle> ();
5022 Session::tempo_map_changed (const PropertyChange&)
5026 playlists->update_after_tempo_map_change ();
5028 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
5034 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
5036 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
5037 (*i)->recompute_frames_from_bbt ();
5041 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
5042 * the given count with the current block size.
5045 Session::ensure_buffers (ChanCount howmany)
5047 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
5051 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
5053 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5054 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
5059 Session::next_insert_id ()
5061 /* this doesn't really loop forever. just think about it */
5064 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
5065 if (!insert_bitset[n]) {
5066 insert_bitset[n] = true;
5072 /* none available, so resize and try again */
5074 insert_bitset.resize (insert_bitset.size() + 16, false);
5079 Session::next_send_id ()
5081 /* this doesn't really loop forever. just think about it */
5084 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
5085 if (!send_bitset[n]) {
5086 send_bitset[n] = true;
5092 /* none available, so resize and try again */
5094 send_bitset.resize (send_bitset.size() + 16, false);
5099 Session::next_aux_send_id ()
5101 /* this doesn't really loop forever. just think about it */
5104 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
5105 if (!aux_send_bitset[n]) {
5106 aux_send_bitset[n] = true;
5112 /* none available, so resize and try again */
5114 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
5119 Session::next_return_id ()
5121 /* this doesn't really loop forever. just think about it */
5124 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
5125 if (!return_bitset[n]) {
5126 return_bitset[n] = true;
5132 /* none available, so resize and try again */
5134 return_bitset.resize (return_bitset.size() + 16, false);
5139 Session::mark_send_id (uint32_t id)
5141 if (id >= send_bitset.size()) {
5142 send_bitset.resize (id+16, false);
5144 if (send_bitset[id]) {
5145 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
5147 send_bitset[id] = true;
5151 Session::mark_aux_send_id (uint32_t id)
5153 if (id >= aux_send_bitset.size()) {
5154 aux_send_bitset.resize (id+16, false);
5156 if (aux_send_bitset[id]) {
5157 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
5159 aux_send_bitset[id] = true;
5163 Session::mark_return_id (uint32_t id)
5165 if (id >= return_bitset.size()) {
5166 return_bitset.resize (id+16, false);
5168 if (return_bitset[id]) {
5169 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
5171 return_bitset[id] = true;
5175 Session::mark_insert_id (uint32_t id)
5177 if (id >= insert_bitset.size()) {
5178 insert_bitset.resize (id+16, false);
5180 if (insert_bitset[id]) {
5181 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
5183 insert_bitset[id] = true;
5187 Session::unmark_send_id (uint32_t id)
5189 if (id < send_bitset.size()) {
5190 send_bitset[id] = false;
5195 Session::unmark_aux_send_id (uint32_t id)
5197 if (id < aux_send_bitset.size()) {
5198 aux_send_bitset[id] = false;
5203 Session::unmark_return_id (uint32_t id)
5205 if (id < return_bitset.size()) {
5206 return_bitset[id] = false;
5211 Session::unmark_insert_id (uint32_t id)
5213 if (id < insert_bitset.size()) {
5214 insert_bitset[id] = false;
5219 Session::reset_native_file_format ()
5221 boost::shared_ptr<RouteList> rl = routes.reader ();
5223 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5224 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5226 /* don't save state as we do this, there's no point
5228 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
5229 tr->reset_write_sources (false);
5230 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
5236 Session::route_name_unique (string n) const
5238 boost::shared_ptr<RouteList> r = routes.reader ();
5240 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5241 if ((*i)->name() == n) {
5250 Session::route_name_internal (string n) const
5252 if (auditioner && auditioner->name() == n) {
5256 if (_click_io && _click_io->name() == n) {
5264 Session::freeze_all (InterThreadInfo& itt)
5266 boost::shared_ptr<RouteList> r = routes.reader ();
5268 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5270 boost::shared_ptr<Track> t;
5272 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
5273 /* XXX this is wrong because itt.progress will keep returning to zero at the start
5283 boost::shared_ptr<Region>
5284 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
5285 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
5286 InterThreadInfo& itt,
5287 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
5288 bool for_export, bool for_freeze)
5290 boost::shared_ptr<Region> result;
5291 boost::shared_ptr<Playlist> playlist;
5292 boost::shared_ptr<Source> source;
5293 ChanCount diskstream_channels (track.n_channels());
5294 framepos_t position;
5295 framecnt_t this_chunk;
5297 framepos_t latency_skip;
5299 framepos_t len = end - start;
5300 bool need_block_size_reset = false;
5301 ChanCount const max_proc = track.max_processor_streams ();
5302 string legal_playlist_name;
5303 string possible_path;
5306 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
5307 end, start) << endmsg;
5311 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
5312 include_endpoint, for_export, for_freeze);
5314 if (diskstream_channels.n(track.data_type()) < 1) {
5315 error << _("Cannot write a range with no data.") << endmsg;
5319 // block all process callback handling
5321 block_processing ();
5324 // synchronize with AudioEngine::process_callback()
5325 // make sure processing is not currently running
5326 // and processing_blocked() is honored before
5327 // acquiring thread buffers
5328 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5331 _bounce_processing_active = true;
5333 /* call tree *MUST* hold route_lock */
5335 if ((playlist = track.playlist()) == 0) {
5339 legal_playlist_name = legalize_for_path (playlist->name());
5341 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
5343 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
5344 string path = ((track.data_type() == DataType::AUDIO)
5345 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
5346 : new_midi_source_path (legal_playlist_name));
5353 source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
5356 catch (failed_constructor& err) {
5357 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
5361 srcs.push_back (source);
5364 /* tell redirects that care that we are about to use a much larger
5365 * blocksize. this will flush all plugins too, so that they are ready
5366 * to be used for this process.
5369 need_block_size_reset = true;
5370 track.set_block_size (bounce_chunk_size);
5371 _engine.main_thread()->get_buffers ();
5375 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5377 /* create a set of reasonably-sized buffers */
5378 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5379 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
5381 buffers.set_count (max_proc);
5383 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5384 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5385 boost::shared_ptr<MidiSource> ms;
5387 afs->prepare_for_peakfile_writes ();
5388 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5389 Source::Lock lock(ms->mutex());
5390 ms->mark_streaming_write_started(lock);
5394 while (to_do && !itt.cancel) {
5396 this_chunk = min (to_do, bounce_chunk_size);
5398 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
5402 start += this_chunk;
5403 to_do -= this_chunk;
5404 itt.progress = (float) (1.0 - ((double) to_do / len));
5406 if (latency_skip >= bounce_chunk_size) {
5407 latency_skip -= bounce_chunk_size;
5411 const framecnt_t current_chunk = this_chunk - latency_skip;
5414 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5415 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5416 boost::shared_ptr<MidiSource> ms;
5419 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
5422 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5423 Source::Lock lock(ms->mutex());
5425 const MidiBuffer& buf = buffers.get_midi(0);
5426 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
5427 Evoral::Event<framepos_t> ev = *i;
5428 ev.set_time(ev.time() - position);
5429 ms->append_event_frames(lock, ev, ms->timeline_position());
5436 /* post-roll, pick up delayed processor output */
5437 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5439 while (latency_skip && !itt.cancel) {
5440 this_chunk = min (latency_skip, bounce_chunk_size);
5441 latency_skip -= this_chunk;
5443 buffers.silence (this_chunk, 0);
5444 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
5447 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5448 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5451 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
5463 xnow = localtime (&now);
5465 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
5466 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5467 boost::shared_ptr<MidiSource> ms;
5470 afs->update_header (position, *xnow, now);
5471 afs->flush_header ();
5472 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5473 Source::Lock lock(ms->mutex());
5474 ms->mark_streaming_write_completed(lock);
5478 /* construct a region to represent the bounced material */
5482 plist.add (Properties::start, 0);
5483 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
5484 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
5486 result = RegionFactory::create (srcs, plist);
5492 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5493 (*src)->mark_for_remove ();
5494 (*src)->drop_references ();
5498 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5499 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5502 afs->done_with_peakfile_writes ();
5506 _bounce_processing_active = false;
5508 if (need_block_size_reset) {
5509 _engine.main_thread()->drop_buffers ();
5510 track.set_block_size (get_block_size());
5513 unblock_processing ();
5519 Session::gain_automation_buffer() const
5521 return ProcessThread::gain_automation_buffer ();
5525 Session::trim_automation_buffer() const
5527 return ProcessThread::trim_automation_buffer ();
5531 Session::send_gain_automation_buffer() const
5533 return ProcessThread::send_gain_automation_buffer ();
5537 Session::pan_automation_buffer() const
5539 return ProcessThread::pan_automation_buffer ();
5543 Session::get_silent_buffers (ChanCount count)
5545 return ProcessThread::get_silent_buffers (count);
5549 Session::get_scratch_buffers (ChanCount count, bool silence)
5551 return ProcessThread::get_scratch_buffers (count, silence);
5555 Session::get_route_buffers (ChanCount count, bool silence)
5557 return ProcessThread::get_route_buffers (count, silence);
5562 Session::get_mix_buffers (ChanCount count)
5564 return ProcessThread::get_mix_buffers (count);
5568 Session::ntracks () const
5571 boost::shared_ptr<RouteList> r = routes.reader ();
5573 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5574 if (boost::dynamic_pointer_cast<Track> (*i)) {
5583 Session::nbusses () const
5586 boost::shared_ptr<RouteList> r = routes.reader ();
5588 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5589 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
5598 Session::add_automation_list(AutomationList *al)
5600 automation_lists[al->id()] = al;
5603 /** @return true if there is at least one record-enabled track, otherwise false */
5605 Session::have_rec_enabled_track () const
5607 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
5611 Session::have_rec_disabled_track () const
5613 return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
5616 /** Update the state of our rec-enabled tracks flag */
5618 Session::update_route_record_state ()
5620 boost::shared_ptr<RouteList> rl = routes.reader ();
5621 RouteList::iterator i = rl->begin();
5622 while (i != rl->end ()) {
5624 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5625 if (tr && tr->record_enabled ()) {
5632 int const old = g_atomic_int_get (&_have_rec_enabled_track);
5634 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
5636 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
5637 RecordStateChanged (); /* EMIT SIGNAL */
5640 for (i = rl->begin(); i != rl->end (); ++i) {
5641 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5642 if (tr && !tr->record_enabled ()) {
5647 g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
5649 bool record_arm_state_changed = (old != g_atomic_int_get (&_have_rec_enabled_track) );
5651 if (record_status() == Recording && record_arm_state_changed ) {
5652 RecordArmStateChanged ();
5658 Session::listen_position_changed ()
5660 boost::shared_ptr<RouteList> r = routes.reader ();
5662 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5663 (*i)->listen_position_changed ();
5668 Session::solo_control_mode_changed ()
5670 /* cancel all solo or all listen when solo control mode changes */
5673 set_solo (get_routes(), false);
5674 } else if (listening()) {
5675 set_listen (get_routes(), false);
5679 /** Called when a property of one of our route groups changes */
5681 Session::route_group_property_changed (RouteGroup* rg)
5683 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
5686 /** Called when a route is added to one of our route groups */
5688 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5690 RouteAddedToRouteGroup (rg, r);
5693 /** Called when a route is removed from one of our route groups */
5695 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5697 update_route_record_state ();
5698 RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
5701 boost::shared_ptr<RouteList>
5702 Session::get_tracks () const
5704 boost::shared_ptr<RouteList> rl = routes.reader ();
5705 boost::shared_ptr<RouteList> tl (new RouteList);
5707 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
5708 if (boost::dynamic_pointer_cast<Track> (*r)) {
5709 if (!(*r)->is_auditioner()) {
5717 boost::shared_ptr<RouteList>
5718 Session::get_routes_with_regions_at (framepos_t const p) const
5720 boost::shared_ptr<RouteList> r = routes.reader ();
5721 boost::shared_ptr<RouteList> rl (new RouteList);
5723 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5724 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5729 boost::shared_ptr<Playlist> pl = tr->playlist ();
5734 if (pl->has_region_at (p)) {
5743 Session::goto_end ()
5745 if (_session_range_location) {
5746 request_locate (_session_range_location->end(), false);
5748 request_locate (0, false);
5753 Session::goto_start ()
5755 if (_session_range_location) {
5756 request_locate (_session_range_location->start(), false);
5758 request_locate (0, false);
5763 Session::current_start_frame () const
5765 return _session_range_location ? _session_range_location->start() : 0;
5769 Session::current_end_frame () const
5771 return _session_range_location ? _session_range_location->end() : 0;
5775 Session::set_session_range_location (framepos_t start, framepos_t end)
5777 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
5778 _locations->add (_session_range_location);
5782 Session::step_edit_status_change (bool yn)
5788 send = (_step_editors == 0);
5793 send = (_step_editors == 1);
5796 if (_step_editors > 0) {
5802 StepEditStatusChange (val);
5808 Session::start_time_changed (framepos_t old)
5810 /* Update the auto loop range to match the session range
5811 (unless the auto loop range has been changed by the user)
5814 Location* s = _locations->session_range_location ();
5819 Location* l = _locations->auto_loop_location ();
5821 if (l && l->start() == old) {
5822 l->set_start (s->start(), true);
5827 Session::end_time_changed (framepos_t old)
5829 /* Update the auto loop range to match the session range
5830 (unless the auto loop range has been changed by the user)
5833 Location* s = _locations->session_range_location ();
5838 Location* l = _locations->auto_loop_location ();
5840 if (l && l->end() == old) {
5841 l->set_end (s->end(), true);
5845 std::vector<std::string>
5846 Session::source_search_path (DataType type) const
5850 if (session_dirs.size() == 1) {
5852 case DataType::AUDIO:
5853 sp.push_back (_session_dir->sound_path());
5855 case DataType::MIDI:
5856 sp.push_back (_session_dir->midi_path());
5860 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
5861 SessionDirectory sdir (i->path);
5863 case DataType::AUDIO:
5864 sp.push_back (sdir.sound_path());
5866 case DataType::MIDI:
5867 sp.push_back (sdir.midi_path());
5873 if (type == DataType::AUDIO) {
5874 const string sound_path_2X = _session_dir->sound_path_2X();
5875 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
5876 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
5877 sp.push_back (sound_path_2X);
5882 // now check the explicit (possibly user-specified) search path
5885 case DataType::AUDIO:
5886 sp += Searchpath(config.get_audio_search_path ());
5888 case DataType::MIDI:
5889 sp += Searchpath(config.get_midi_search_path ());
5897 Session::ensure_search_path_includes (const string& path, DataType type)
5906 case DataType::AUDIO:
5907 sp += Searchpath(config.get_audio_search_path ());
5909 case DataType::MIDI:
5910 sp += Searchpath (config.get_midi_search_path ());
5914 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
5915 /* No need to add this new directory if it has the same inode as
5916 an existing one; checking inode rather than name prevents duplicated
5917 directories when we are using symlinks.
5919 On Windows, I think we could just do if (*i == path) here.
5921 if (PBD::equivalent_paths (*i, path)) {
5929 case DataType::AUDIO:
5930 config.set_audio_search_path (sp.to_string());
5932 case DataType::MIDI:
5933 config.set_midi_search_path (sp.to_string());
5939 Session::remove_dir_from_search_path (const string& dir, DataType type)
5944 case DataType::AUDIO:
5945 sp = Searchpath(config.get_audio_search_path ());
5947 case DataType::MIDI:
5948 sp = Searchpath (config.get_midi_search_path ());
5955 case DataType::AUDIO:
5956 config.set_audio_search_path (sp.to_string());
5958 case DataType::MIDI:
5959 config.set_midi_search_path (sp.to_string());
5965 boost::shared_ptr<Speakers>
5966 Session::get_speakers()
5972 Session::unknown_processors () const
5976 boost::shared_ptr<RouteList> r = routes.reader ();
5977 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5978 list<string> t = (*i)->unknown_processors ();
5979 copy (t.begin(), t.end(), back_inserter (p));
5989 Session::update_latency (bool playback)
5991 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
5993 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
5997 boost::shared_ptr<RouteList> r = routes.reader ();
5998 framecnt_t max_latency = 0;
6001 /* reverse the list so that we work backwards from the last route to run to the first */
6002 RouteList* rl = routes.reader().get();
6003 r.reset (new RouteList (*rl));
6004 reverse (r->begin(), r->end());
6007 /* compute actual latency values for the given direction and store them all in per-port
6008 structures. this will also publish the same values (to JACK) so that computation of latency
6009 for routes can consistently use public latency values.
6012 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6013 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
6016 /* because we latency compensate playback, our published playback latencies should
6017 be the same for all output ports - all material played back by ardour has
6018 the same latency, whether its caused by plugins or by latency compensation. since
6019 these may differ from the values computed above, reset all playback port latencies
6023 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
6025 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6026 (*i)->set_public_port_latencies (max_latency, playback);
6031 post_playback_latency ();
6035 post_capture_latency ();
6038 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
6042 Session::post_playback_latency ()
6044 set_worst_playback_latency ();
6046 boost::shared_ptr<RouteList> r = routes.reader ();
6048 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6049 if (!(*i)->is_auditioner() && ((*i)->active())) {
6050 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
6054 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6055 (*i)->set_latency_compensation (_worst_track_latency);
6060 Session::post_capture_latency ()
6062 set_worst_capture_latency ();
6064 /* reflect any changes in capture latencies into capture offsets
6067 boost::shared_ptr<RouteList> rl = routes.reader();
6068 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
6069 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6071 tr->set_capture_offset ();
6077 Session::initialize_latencies ()
6080 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
6081 update_latency (false);
6082 update_latency (true);
6085 set_worst_io_latencies ();
6089 Session::set_worst_io_latencies ()
6091 set_worst_playback_latency ();
6092 set_worst_capture_latency ();
6096 Session::set_worst_playback_latency ()
6098 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6102 _worst_output_latency = 0;
6104 if (!_engine.connected()) {
6108 boost::shared_ptr<RouteList> r = routes.reader ();
6110 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6111 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
6114 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
6118 Session::set_worst_capture_latency ()
6120 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6124 _worst_input_latency = 0;
6126 if (!_engine.connected()) {
6130 boost::shared_ptr<RouteList> r = routes.reader ();
6132 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6133 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
6136 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
6140 Session::update_latency_compensation (bool force_whole_graph)
6142 bool some_track_latency_changed = false;
6144 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6148 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
6150 _worst_track_latency = 0;
6152 boost::shared_ptr<RouteList> r = routes.reader ();
6154 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6155 if (!(*i)->is_auditioner() && ((*i)->active())) {
6157 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
6158 some_track_latency_changed = true;
6160 _worst_track_latency = max (tl, _worst_track_latency);
6164 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
6165 (some_track_latency_changed ? "yes" : "no")));
6167 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
6169 if (some_track_latency_changed || force_whole_graph) {
6170 _engine.update_latencies ();
6174 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6175 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6179 tr->set_capture_offset ();
6184 Session::session_name_is_legal (const string& path)
6186 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
6188 for (int i = 0; illegal_chars[i]; ++i) {
6189 if (path.find (illegal_chars[i]) != string::npos) {
6190 return illegal_chars[i];
6198 Session::next_control_id () const
6202 /* the monitor bus remote ID is in a different
6203 * "namespace" than regular routes. its existence doesn't
6204 * affect normal (low) numbered routes.
6211 /* the same about masterbus in Waves Tracks */
6213 if (Profile->get_trx() && _master_out) {
6217 return nroutes() - subtract;
6221 Session::notify_remote_id_change ()
6223 if (deletion_in_progress()) {
6227 switch (Config->get_remote_model()) {
6229 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
6235 #ifdef USE_TRACKS_CODE_FEATURES
6236 /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
6237 * if track order has been changed by user
6239 reconnect_existing_routes(true, true);
6245 Session::sync_order_keys ()
6247 if (deletion_in_progress()) {
6251 /* tell everyone that something has happened to the sort keys
6252 and let them sync up with the change(s)
6253 this will give objects that manage the sort order keys the
6254 opportunity to keep them in sync if they wish to.
6257 DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
6259 reassign_track_numbers();
6261 Route::SyncOrderKeys (); /* EMIT SIGNAL */
6263 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
6267 Session::operation_in_progress (GQuark op) const
6269 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
6272 boost::shared_ptr<Port>
6273 Session::ltc_input_port () const
6275 return _ltc_input->nth (0);
6278 boost::shared_ptr<Port>
6279 Session::ltc_output_port () const
6281 return _ltc_output->nth (0);
6285 Session::reconnect_ltc_input ()
6289 string src = Config->get_ltc_source_port();
6291 _ltc_input->disconnect (this);
6293 if (src != _("None") && !src.empty()) {
6294 _ltc_input->nth (0)->connect (src);
6297 if ( ARDOUR::Profile->get_trx () ) {
6298 // Tracks need this signal to update timecode_source_dropdown
6299 MtcOrLtcInputPortChanged (); //emit signal
6305 Session::reconnect_ltc_output ()
6309 string src = Config->get_ltc_output_port();
6311 _ltc_output->disconnect (this);
6313 if (src != _("None") && !src.empty()) {
6314 _ltc_output->nth (0)->connect (src);
6320 Session::set_range_selection (framepos_t start, framepos_t end)
6322 _range_selection = Evoral::Range<framepos_t> (start, end);
6323 #ifdef USE_TRACKS_CODE_FEATURES
6324 follow_playhead_priority ();
6329 Session::set_object_selection (framepos_t start, framepos_t end)
6331 _object_selection = Evoral::Range<framepos_t> (start, end);
6332 #ifdef USE_TRACKS_CODE_FEATURES
6333 follow_playhead_priority ();
6338 Session::clear_range_selection ()
6340 _range_selection = Evoral::Range<framepos_t> (-1,-1);
6341 #ifdef USE_TRACKS_CODE_FEATURES
6342 follow_playhead_priority ();
6347 Session::clear_object_selection ()
6349 _object_selection = Evoral::Range<framepos_t> (-1,-1);
6350 #ifdef USE_TRACKS_CODE_FEATURES
6351 follow_playhead_priority ();