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 /* it is unfortunate that we need to include reserved names here that
2200 refer to control surfaces. But there's no way to ensure a complete
2201 lack of collisions without doing this, since the control surface
2202 support may not even be active. Without adding an API to control
2203 surface support that would list their port names, we do have to
2207 char const * const reserved[] = {
2216 /* the base may conflict with ports that do not belong to existing
2217 routes, but hidden objects like the click track. So check port names
2218 before anything else.
2221 for (int n = 0; reserved[n]; ++n) {
2222 if (base == reserved[n]) {
2223 definitely_add_number = true;
2231 if (!definitely_add_number && route_by_name (base) == 0) {
2232 /* juse use the base */
2238 name = string_compose ("%1 %2", base, id);
2240 if (route_by_name (name) == 0) {
2246 } while (id < (UINT_MAX-1));
2251 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
2253 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
2255 in = ChanCount::ZERO;
2256 out = ChanCount::ZERO;
2258 boost::shared_ptr<RouteList> r = routes.reader ();
2260 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2261 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2262 if (tr && !tr->is_auditioner()) {
2263 in += tr->n_inputs();
2264 out += tr->n_outputs();
2270 Session::default_track_name_pattern (DataType t)
2273 case DataType::AUDIO:
2274 if (Profile->get_trx()) {
2281 case DataType::MIDI:
2288 /** Caller must not hold process lock
2289 * @param name_template string to use for the start of the name, or "" to use "MIDI".
2290 * @param instrument plugin info for the instrument to insert pre-fader, if any
2292 list<boost::shared_ptr<MidiTrack> >
2293 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
2294 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
2297 uint32_t track_id = 0;
2299 RouteList new_routes;
2300 list<boost::shared_ptr<MidiTrack> > ret;
2302 const string name_pattern = default_track_name_pattern (DataType::MIDI);
2303 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
2306 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, use_number)) {
2307 error << "cannot find name for new midi track" << endmsg;
2311 boost::shared_ptr<MidiTrack> track;
2314 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
2316 if (track->init ()) {
2320 track->use_new_diskstream();
2322 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2323 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2326 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2327 if (track->input()->ensure_io (input, false, this)) {
2328 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
2332 if (track->output()->ensure_io (output, false, this)) {
2333 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
2338 track->non_realtime_input_change();
2341 route_group->add (track);
2344 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2346 if (Config->get_remote_model() == UserOrdered) {
2347 track->set_remote_control_id (next_control_id());
2350 new_routes.push_back (track);
2351 ret.push_back (track);
2353 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2356 catch (failed_constructor &err) {
2357 error << _("Session: could not create new midi track.") << endmsg;
2361 catch (AudioEngine::PortRegistrationFailure& pfe) {
2363 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;
2371 if (!new_routes.empty()) {
2372 StateProtector sp (this);
2373 if (Profile->get_trx()) {
2374 add_routes (new_routes, false, false, false);
2376 add_routes (new_routes, true, true, false);
2380 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
2381 PluginPtr plugin = instrument->load (*this);
2382 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2383 (*r)->add_processor (p, PreFader);
2393 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2395 boost::shared_ptr<Route> midi_track (wmt.lock());
2401 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2403 if (change.after.n_audio() <= change.before.n_audio()) {
2407 /* new audio ports: make sure the audio goes somewhere useful,
2408 unless the user has no-auto-connect selected.
2410 The existing ChanCounts don't matter for this call as they are only
2411 to do with matching input and output indices, and we are only changing
2417 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
2421 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
2422 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
2423 * @param output_start As \a input_start, but for outputs.
2426 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
2427 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
2429 if (!IO::connecting_legal) {
2433 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2439 /* If both inputs and outputs are auto-connected to physical ports,
2440 use the max of input and output offsets to ensure auto-connected
2441 port numbers always match up (e.g. the first audio input and the
2442 first audio output of the route will have the same physical
2443 port number). Otherwise just use the lowest input or output
2447 DEBUG_TRACE (DEBUG::Graph,
2448 string_compose("Auto-connect: existing in = %1 out = %2\n",
2449 existing_inputs, existing_outputs));
2451 const bool in_out_physical =
2452 (Config->get_input_auto_connect() & AutoConnectPhysical)
2453 && (Config->get_output_auto_connect() & AutoConnectPhysical)
2456 const ChanCount in_offset = in_out_physical
2457 ? ChanCount::max(existing_inputs, existing_outputs)
2460 const ChanCount out_offset = in_out_physical
2461 ? ChanCount::max(existing_inputs, existing_outputs)
2464 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2465 vector<string> physinputs;
2466 vector<string> physoutputs;
2468 _engine.get_physical_outputs (*t, physoutputs);
2469 _engine.get_physical_inputs (*t, physinputs);
2471 if (!physinputs.empty() && connect_inputs) {
2472 uint32_t nphysical_in = physinputs.size();
2474 DEBUG_TRACE (DEBUG::Graph,
2475 string_compose("There are %1 physical inputs of type %2\n",
2478 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
2481 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
2482 DEBUG_TRACE (DEBUG::Graph,
2483 string_compose("Get index %1 + %2 % %3 = %4\n",
2484 in_offset.get(*t), i, nphysical_in,
2485 (in_offset.get(*t) + i) % nphysical_in));
2486 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
2489 DEBUG_TRACE (DEBUG::Graph,
2490 string_compose("Connect route %1 IN to %2\n",
2491 route->name(), port));
2493 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
2497 ChanCount one_added (*t, 1);
2498 existing_inputs += one_added;
2502 if (!physoutputs.empty()) {
2503 uint32_t nphysical_out = physoutputs.size();
2504 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
2508 * do not create new connections if we reached the limit of physical outputs
2512 if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
2513 ARDOUR::Profile->get_trx () &&
2514 existing_outputs.get(*t) == nphysical_out ) {
2518 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
2519 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
2520 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
2521 /* master bus is audio only */
2522 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
2523 port = _master_out->input()->ports().port(*t,
2524 i % _master_out->input()->n_ports().get(*t))->name();
2528 DEBUG_TRACE (DEBUG::Graph,
2529 string_compose("Connect route %1 OUT to %2\n",
2530 route->name(), port));
2532 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
2536 ChanCount one_added (*t, 1);
2537 existing_outputs += one_added;
2543 #ifdef USE_TRACKS_CODE_FEATURES
2546 compare_routes_by_remote_id (const boost::shared_ptr<Route>& route1, const boost::shared_ptr<Route>& route2)
2548 return route1->remote_control_id() < route2->remote_control_id();
2552 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2554 // it is not allowed to perform connection
2555 if (!IO::connecting_legal) {
2559 // if we are deleting routes we will call this once at the end
2560 if (_route_deletion_in_progress) {
2564 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2570 // We need to disconnect the route's inputs and outputs first
2571 // basing on autoconnect configuration
2572 bool reconnectIputs = !(Config->get_input_auto_connect() & ManualConnect) && reconnect_inputs;
2573 bool reconnectOutputs = !(Config->get_output_auto_connect() & ManualConnect) && reconnect_outputs;
2575 ChanCount existing_inputs;
2576 ChanCount existing_outputs;
2577 count_existing_track_channels (existing_inputs, existing_outputs);
2579 //ChanCount inputs = ChanCount::ZERO;
2580 //ChanCount outputs = ChanCount::ZERO;
2582 RouteList existing_routes = *routes.reader ();
2583 existing_routes.sort (compare_routes_by_remote_id);
2586 PBD::Unwinder<bool> protect_ignore_changes (_reconnecting_routes_in_progress, true);
2588 vector<string> physinputs;
2589 vector<string> physoutputs;
2591 EngineStateController::instance()->get_physical_audio_outputs(physoutputs);
2592 EngineStateController::instance()->get_physical_audio_inputs(physinputs);
2594 uint32_t input_n = 0;
2595 uint32_t output_n = 0;
2596 RouteList::iterator rIter = existing_routes.begin();
2597 const AutoConnectOption current_input_auto_connection (Config->get_input_auto_connect());
2598 const AutoConnectOption current_output_auto_connection (Config->get_output_auto_connect());
2599 for (; rIter != existing_routes.end(); ++rIter) {
2600 if (*rIter == _master_out || *rIter == _monitor_out ) {
2604 if (current_output_auto_connection == AutoConnectPhysical) {
2605 (*rIter)->amp()->deactivate();
2606 } else if (current_output_auto_connection == AutoConnectMaster) {
2607 (*rIter)->amp()->activate();
2610 if (reconnectIputs) {
2611 (*rIter)->input()->disconnect (this); //GZ: check this; could be heavy
2613 for (uint32_t route_input_n = 0; route_input_n < (*rIter)->n_inputs().get(DataType::AUDIO); ++route_input_n) {
2615 if (current_input_auto_connection & AutoConnectPhysical) {
2617 if ( input_n == physinputs.size() ) {
2621 string port = physinputs[input_n];
2623 if (port.empty() ) {
2624 error << "Physical Input number "<< input_n << " is unavailable and cannot be connected" << endmsg;
2627 //GZ: check this; could be heavy
2628 (*rIter)->input()->connect ((*rIter)->input()->ports().port(DataType::AUDIO, route_input_n), port, this);
2634 if (reconnectOutputs) {
2636 //normalize route ouptuts: reduce the amount outputs to be equal to the amount of inputs
2637 if (current_output_auto_connection & AutoConnectPhysical) {
2639 //GZ: check this; could be heavy
2640 (*rIter)->output()->disconnect (this);
2641 size_t route_inputs_count = (*rIter)->n_inputs().get(DataType::AUDIO);
2643 //GZ: check this; could be heavy
2644 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, route_inputs_count), false, this );
2646 } else if (current_output_auto_connection & AutoConnectMaster){
2648 if (!reconnect_master) {
2652 //GZ: check this; could be heavy
2653 (*rIter)->output()->disconnect (this);
2656 uint32_t master_inputs_count = _master_out->n_inputs().get(DataType::AUDIO);
2657 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, master_inputs_count), false, this );
2659 error << error << "Master bus is not available" << endmsg;
2664 for (uint32_t route_output_n = 0; route_output_n < (*rIter)->n_outputs().get(DataType::AUDIO); ++route_output_n) {
2665 if (current_output_auto_connection & AutoConnectPhysical) {
2667 if ( output_n == physoutputs.size() ) {
2671 string port = physoutputs[output_n];
2673 if (port.empty() ) {
2674 error << "Physical Output number "<< output_n << " is unavailable and cannot be connected" << endmsg;
2677 //GZ: check this; could be heavy
2678 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2681 } else if (current_output_auto_connection & AutoConnectMaster) {
2683 if ( route_output_n == _master_out->n_inputs().get(DataType::AUDIO) ) {
2687 // connect to master bus
2688 string port = _master_out->input()->ports().port(DataType::AUDIO, route_output_n)->name();
2690 if (port.empty() ) {
2691 error << "MasterBus Input number "<< route_output_n << " is unavailable and cannot be connected" << endmsg;
2695 //GZ: check this; could be heavy
2696 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2702 //auto_connect_route (*rIter, inputs, outputs, false, reconnectIputs);
2705 _master_out->output()->disconnect (this);
2706 auto_connect_master_bus ();
2711 session_routes_reconnected (); /* EMIT SIGNAL */
2715 Session::reconnect_midi_scene_ports(bool inputs)
2719 boost::shared_ptr<MidiPort> scene_in_ptr = scene_in();
2721 scene_in_ptr->disconnect_all ();
2723 std::vector<EngineStateController::MidiPortState> midi_port_states;
2724 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2726 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2728 for (; state_iter != midi_port_states.end(); ++state_iter) {
2729 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2730 scene_in_ptr->connect (state_iter->name);
2737 boost::shared_ptr<MidiPort> scene_out_ptr = scene_out();
2739 if (scene_out_ptr ) {
2740 scene_out_ptr->disconnect_all ();
2742 std::vector<EngineStateController::MidiPortState> midi_port_states;
2743 EngineStateController::instance()->get_physical_midi_output_states (midi_port_states);
2745 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2747 for (; state_iter != midi_port_states.end(); ++state_iter) {
2748 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2749 scene_out_ptr->connect (state_iter->name);
2757 Session::reconnect_mtc_ports ()
2759 boost::shared_ptr<MidiPort> mtc_in_ptr = _midi_ports->mtc_input_port();
2765 mtc_in_ptr->disconnect_all ();
2767 std::vector<EngineStateController::MidiPortState> midi_port_states;
2768 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2770 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2772 for (; state_iter != midi_port_states.end(); ++state_iter) {
2773 if (state_iter->available && state_iter->mtc_in) {
2774 mtc_in_ptr->connect (state_iter->name);
2778 if (!_midi_ports->mtc_input_port ()->connected () &&
2779 config.get_external_sync () &&
2780 (Config->get_sync_source () == MTC) ) {
2781 config.set_external_sync (false);
2784 if ( ARDOUR::Profile->get_trx () ) {
2785 // Tracks need this signal to update timecode_source_dropdown
2786 MtcOrLtcInputPortChanged (); //emit signal
2791 Session::reconnect_mmc_ports(bool inputs)
2793 if (inputs ) { // get all enabled midi input ports
2795 boost::shared_ptr<MidiPort> mmc_in_ptr = _midi_ports->mmc_in();
2797 mmc_in_ptr->disconnect_all ();
2798 std::vector<std::string> enabled_midi_inputs;
2799 EngineStateController::instance()->get_physical_midi_inputs (enabled_midi_inputs);
2801 std::vector<std::string>::iterator port_iter = enabled_midi_inputs.begin();
2803 for (; port_iter != enabled_midi_inputs.end(); ++port_iter) {
2804 mmc_in_ptr->connect (*port_iter);
2808 } else { // get all enabled midi output ports
2810 boost::shared_ptr<MidiPort> mmc_out_ptr = _midi_ports->mmc_out();
2812 mmc_out_ptr->disconnect_all ();
2813 std::vector<std::string> enabled_midi_outputs;
2814 EngineStateController::instance()->get_physical_midi_outputs (enabled_midi_outputs);
2816 std::vector<std::string>::iterator port_iter = enabled_midi_outputs.begin();
2818 for (; port_iter != enabled_midi_outputs.end(); ++port_iter) {
2819 mmc_out_ptr->connect (*port_iter);
2827 /** Caller must not hold process lock
2828 * @param name_template string to use for the start of the name, or "" to use "Audio".
2830 list< boost::shared_ptr<AudioTrack> >
2831 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
2832 uint32_t how_many, string name_template)
2835 uint32_t track_id = 0;
2837 RouteList new_routes;
2838 list<boost::shared_ptr<AudioTrack> > ret;
2840 const string name_pattern = default_track_name_pattern (DataType::AUDIO);
2841 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
2845 if (!find_route_name (name_template.empty() ? _(name_pattern.c_str()) : name_template, ++track_id, track_name, use_number)) {
2846 error << "cannot find name for new audio track" << endmsg;
2850 boost::shared_ptr<AudioTrack> track;
2853 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
2855 if (track->init ()) {
2859 if (ARDOUR::Profile->get_trx ()) {
2860 // TRACKS considers it's not a USE CASE, it's
2861 // a piece of behavior of the session model:
2863 // Gain for a newly created route depends on
2864 // the current output_auto_connect mode:
2866 // 0 for Stereo Out mode
2868 if (Config->get_output_auto_connect() & AutoConnectMaster) {
2869 track->set_gain (dB_to_coefficient (0), 0);
2873 track->use_new_diskstream();
2875 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2876 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2879 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2881 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2882 error << string_compose (
2883 _("cannot configure %1 in/%2 out configuration for new audio track"),
2884 input_channels, output_channels)
2889 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2890 error << string_compose (
2891 _("cannot configure %1 in/%2 out configuration for new audio track"),
2892 input_channels, output_channels)
2899 route_group->add (track);
2902 track->non_realtime_input_change();
2904 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2905 if (Config->get_remote_model() == UserOrdered) {
2906 track->set_remote_control_id (next_control_id());
2909 new_routes.push_back (track);
2910 ret.push_back (track);
2912 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2915 catch (failed_constructor &err) {
2916 error << _("Session: could not create new audio track.") << endmsg;
2920 catch (AudioEngine::PortRegistrationFailure& pfe) {
2922 error << pfe.what() << endmsg;
2930 if (!new_routes.empty()) {
2931 StateProtector sp (this);
2932 if (Profile->get_trx()) {
2933 add_routes (new_routes, false, false, false);
2935 add_routes (new_routes, true, true, false);
2942 /** Caller must not hold process lock.
2943 * @param name_template string to use for the start of the name, or "" to use "Bus".
2946 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
2949 uint32_t bus_id = 0;
2953 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
2956 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, use_number)) {
2957 error << "cannot find name for new audio bus" << endmsg;
2962 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
2968 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2969 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
2972 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2974 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2975 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2976 input_channels, output_channels)
2982 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2983 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2984 input_channels, output_channels)
2991 route_group->add (bus);
2993 if (Config->get_remote_model() == UserOrdered) {
2994 bus->set_remote_control_id (next_control_id());
2997 bus->add_internal_return ();
2999 ret.push_back (bus);
3001 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
3007 catch (failed_constructor &err) {
3008 error << _("Session: could not create new audio route.") << endmsg;
3012 catch (AudioEngine::PortRegistrationFailure& pfe) {
3013 error << pfe.what() << endmsg;
3023 StateProtector sp (this);
3024 if (Profile->get_trx()) {
3025 add_routes (ret, false, false, false);
3027 add_routes (ret, false, true, true); // autoconnect // outputs only
3036 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base)
3039 uint32_t control_id;
3041 uint32_t number = 0;
3042 const uint32_t being_added = how_many;
3044 if (!tree.read (template_path.c_str())) {
3048 XMLNode* node = tree.root();
3050 IO::disable_connecting ();
3052 control_id = next_control_id ();
3056 XMLNode node_copy (*node);
3058 /* Remove IDs of everything so that new ones are used */
3059 node_copy.remove_property_recursively (X_("id"));
3064 if (!name_base.empty()) {
3066 /* if we're adding more than one routes, force
3067 * all the names of the new routes to be
3068 * numbered, via the final parameter.
3071 if (!find_route_name (name_base.c_str(), ++number, name, (being_added > 1))) {
3072 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3078 string const route_name = node_copy.property(X_("name"))->value ();
3080 /* generate a new name by adding a number to the end of the template name */
3081 if (!find_route_name (route_name.c_str(), ++number, name, true)) {
3082 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3083 abort(); /*NOTREACHED*/
3087 /* set this name in the XML description that we are about to use */
3088 Route::set_name_in_state (node_copy, name);
3090 /* trim bitslots from listen sends so that new ones are used */
3091 XMLNodeList children = node_copy.children ();
3092 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
3093 if ((*i)->name() == X_("Processor")) {
3094 XMLProperty* role = (*i)->property (X_("role"));
3095 if (role && role->value() == X_("Listen")) {
3096 (*i)->remove_property (X_("bitslot"));
3101 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
3104 error << _("Session: cannot create track/bus from template description") << endmsg;
3108 if (boost::dynamic_pointer_cast<Track>(route)) {
3109 /* force input/output change signals so that the new diskstream
3110 picks up the configuration of the route. During session
3111 loading this normally happens in a different way.
3114 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3116 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
3117 change.after = route->input()->n_ports();
3118 route->input()->changed (change, this);
3119 change.after = route->output()->n_ports();
3120 route->output()->changed (change, this);
3123 route->set_remote_control_id (control_id);
3126 ret.push_back (route);
3128 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
3131 catch (failed_constructor &err) {
3132 error << _("Session: could not create new route from template") << endmsg;
3136 catch (AudioEngine::PortRegistrationFailure& pfe) {
3137 error << pfe.what() << endmsg;
3146 StateProtector sp (this);
3147 if (Profile->get_trx()) {
3148 add_routes (ret, false, false, false);
3150 add_routes (ret, true, true, false);
3152 IO::enable_connecting ();
3159 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
3162 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
3163 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
3166 error << _("Adding new tracks/busses failed") << endmsg;
3171 update_latency (true);
3172 update_latency (false);
3177 save_state (_current_snapshot_name);
3180 reassign_track_numbers();
3182 update_route_record_state ();
3184 RouteAdded (new_routes); /* EMIT SIGNAL */
3188 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
3190 ChanCount existing_inputs;
3191 ChanCount existing_outputs;
3192 uint32_t order = next_control_id();
3194 if (_order_hint > -1) {
3195 order = _order_hint;
3199 count_existing_track_channels (existing_inputs, existing_outputs);
3202 RCUWriter<RouteList> writer (routes);
3203 boost::shared_ptr<RouteList> r = writer.get_copy ();
3204 r->insert (r->end(), new_routes.begin(), new_routes.end());
3206 /* if there is no control out and we're not in the middle of loading,
3207 resort the graph here. if there is a control out, we will resort
3208 toward the end of this method. if we are in the middle of loading,
3209 we will resort when done.
3212 if (!_monitor_out && IO::connecting_legal) {
3213 resort_routes_using (r);
3217 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3219 boost::weak_ptr<Route> wpr (*x);
3220 boost::shared_ptr<Route> r (*x);
3222 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
3223 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
3224 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
3225 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
3226 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
3227 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
3229 if (r->is_master()) {
3233 if (r->is_monitor()) {
3237 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
3239 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
3240 track_playlist_changed (boost::weak_ptr<Track> (tr));
3241 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
3243 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
3245 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
3246 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
3251 if (input_auto_connect || output_auto_connect) {
3252 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
3255 /* order keys are a GUI responsibility but we need to set up
3256 reasonable defaults because they also affect the remote control
3257 ID in most situations.
3260 if (!r->has_order_key ()) {
3261 if (r->is_auditioner()) {
3262 /* use an arbitrarily high value */
3263 r->set_order_key (UINT_MAX);
3265 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
3266 r->set_order_key (order);
3274 if (_monitor_out && IO::connecting_legal) {
3275 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
3277 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3278 if ((*x)->is_monitor()) {
3280 } else if ((*x)->is_master()) {
3283 (*x)->enable_monitor_send ();
3290 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
3292 boost::shared_ptr<RouteList> r = routes.reader ();
3293 boost::shared_ptr<Send> s;
3295 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3296 if ((s = (*i)->internal_send_for (dest)) != 0) {
3297 s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO);
3303 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
3305 boost::shared_ptr<RouteList> r = routes.reader ();
3306 boost::shared_ptr<Send> s;
3308 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3309 if ((s = (*i)->internal_send_for (dest)) != 0) {
3310 s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY);
3316 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
3318 boost::shared_ptr<RouteList> r = routes.reader ();
3319 boost::shared_ptr<Send> s;
3321 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3322 if ((s = (*i)->internal_send_for (dest)) != 0) {
3323 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
3328 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
3330 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
3332 boost::shared_ptr<RouteList> r = routes.reader ();
3333 boost::shared_ptr<RouteList> t (new RouteList);
3335 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3336 /* no MIDI sends because there are no MIDI busses yet */
3337 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
3342 add_internal_sends (dest, p, t);
3346 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
3348 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
3349 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
3354 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
3356 add_internal_send (dest, sender->before_processor_for_index (index), sender);
3360 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
3362 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
3366 if (!dest->internal_return()) {
3367 dest->add_internal_return ();
3370 sender->add_aux_send (dest, before);
3377 Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
3379 PBD::Unwinder<bool> uw_flag (_route_deletion_in_progress, true);
3381 { // RCU Writer scope
3382 RCUWriter<RouteList> writer (routes);
3383 boost::shared_ptr<RouteList> rs = writer.get_copy ();
3386 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3388 if (*iter == _master_out) {
3392 (*iter)->set_solo (false, this);
3396 /* deleting the master out seems like a dumb
3397 idea, but its more of a UI policy issue
3401 if (*iter == _master_out) {
3402 _master_out = boost::shared_ptr<Route> ();
3405 if (*iter == _monitor_out) {
3406 _monitor_out.reset ();
3409 // We need to disconnect the route's inputs and outputs
3411 (*iter)->input()->disconnect (0);
3412 (*iter)->output()->disconnect (0);
3414 /* if the route had internal sends sending to it, remove them */
3415 if ((*iter)->internal_return()) {
3417 boost::shared_ptr<RouteList> r = routes.reader ();
3418 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3419 boost::shared_ptr<Send> s = (*i)->internal_send_for (*iter);
3421 (*i)->remove_processor (s);
3426 /* if the monitoring section had a pointer to this route, remove it */
3427 if (_monitor_out && !(*iter)->is_master() && !(*iter)->is_monitor()) {
3428 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3429 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
3430 (*iter)->remove_aux_or_listen (_monitor_out);
3433 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*iter);
3434 if (mt && mt->step_editing()) {
3435 if (_step_editors > 0) {
3441 /* writer goes out of scope, forces route list update */
3443 } // end of RCU Writer scope
3445 update_route_solo_state ();
3446 RouteAddedOrRemoved (false); /* EMIT SIGNAL */
3447 update_latency_compensation ();
3450 /* Re-sort routes to remove the graph's current references to the one that is
3451 * going away, then flush old references out of the graph.
3452 * Wave Tracks: reconnect routes
3455 #ifdef USE_TRACKS_CODE_FEATURES
3456 reconnect_existing_routes(true, false);
3458 routes.flush (); // maybe unsafe, see below.
3462 if (_process_graph) {
3463 _process_graph->clear_other_chain ();
3466 /* get rid of it from the dead wood collection in the route list manager */
3467 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
3471 /* try to cause everyone to drop their references
3472 * and unregister ports from the backend
3475 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3476 (*iter)->drop_references ();
3479 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
3481 /* save the new state of the world */
3483 if (save_state (_current_snapshot_name)) {
3484 save_history (_current_snapshot_name);
3487 reassign_track_numbers();
3488 update_route_record_state ();
3492 Session::remove_route (boost::shared_ptr<Route> route)
3494 boost::shared_ptr<RouteList> rl (new RouteList);
3495 rl->push_back (route);
3500 Session::route_mute_changed (void* /*src*/)
3506 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3508 boost::shared_ptr<Route> route = wpr.lock();
3510 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
3514 if (route->listening_via_monitor ()) {
3516 if (Config->get_exclusive_solo()) {
3517 /* new listen: disable all other listen */
3518 boost::shared_ptr<RouteList> r = routes.reader ();
3519 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3520 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3523 (*i)->set_listen (false, this);
3529 } else if (_listen_cnt > 0) {
3534 update_route_solo_state ();
3537 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3539 boost::shared_ptr<Route> route = wpr.lock ();
3542 /* should not happen */
3543 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
3547 bool send_changed = false;
3549 if (route->solo_isolated()) {
3550 if (_solo_isolated_cnt == 0) {
3551 send_changed = true;
3553 _solo_isolated_cnt++;
3554 } else if (_solo_isolated_cnt > 0) {
3555 _solo_isolated_cnt--;
3556 if (_solo_isolated_cnt == 0) {
3557 send_changed = true;
3562 IsolatedChanged (); /* EMIT SIGNAL */
3567 Session::routes_solo_changed (boost::shared_ptr<RouteList> solo_change_routes)
3569 if (solo_update_disabled) {
3571 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
3575 if (solo_change_routes->empty() ) {
3579 boost::shared_ptr<RouteList> non_solo_change_routes (new RouteList);
3580 boost::shared_ptr<RouteList> r = routes.reader ();
3583 std::set_difference (r->begin(), r->end(),
3584 solo_change_routes->begin(), solo_change_routes->end(),
3585 std::back_inserter(*non_solo_change_routes) );
3587 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3589 solo_update_disabled = true;
3590 RouteList uninvolved;
3592 for (RouteList::iterator route = solo_change_routes->begin(); route != solo_change_routes->end(); ++route) {
3594 if ((*route)->self_soloed() ) {
3600 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", (*route)->name()));
3602 for (RouteList::iterator i = non_solo_change_routes->begin(); i != non_solo_change_routes->end(); ++i) {
3603 bool via_sends_only;
3604 bool in_signal_flow;
3606 if ((*i) == *route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ) {
3610 in_signal_flow = false;
3612 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3614 if ((*i)->feeds (*route, &via_sends_only)) {
3615 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3616 if (!via_sends_only) {
3617 if (!(*route)->soloed_by_others_upstream()) {
3618 (*i)->mod_solo_by_others_downstream (delta);
3621 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3623 in_signal_flow = true;
3625 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3628 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3630 if ((*route)->feeds (*i, &via_sends_only)) {
3631 /* propagate solo upstream only if routing other than
3632 sends is involved, but do consider the other route
3633 (*i) to be part of the signal flow even if only
3636 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3640 (*route)->soloed_by_others_downstream(),
3641 (*route)->soloed_by_others_upstream()));
3642 if (!via_sends_only) {
3643 if (!(*route)->soloed_by_others_downstream()) {
3644 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3645 (*i)->mod_solo_by_others_upstream (delta);
3647 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
3650 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3652 in_signal_flow = true;
3654 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3657 if (!in_signal_flow) {
3658 uninvolved.push_back (*i);
3662 solo_update_disabled = false;
3663 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3665 update_route_solo_state ();
3667 /* now notify that the mute state of the routes not involved in the signal
3668 pathway of the just-solo-changed route may have altered.
3671 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3672 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1\n", (*i)->name() ));
3673 (*i)->mute_changed (this);
3676 SoloChanged (); /* EMIT SIGNAL */
3681 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
3683 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
3685 if (!self_solo_change) {
3686 // session doesn't care about changes to soloed-by-others
3690 if (solo_update_disabled) {
3692 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
3696 boost::shared_ptr<Route> route = wpr.lock ();
3699 boost::shared_ptr<RouteList> r = routes.reader ();
3702 if (route->self_soloed()) {
3708 RouteGroup* rg = route->route_group ();
3709 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
3711 if (delta == 1 && Config->get_exclusive_solo()) {
3713 /* new solo: disable all other solos, but not the group if its solo-enabled */
3715 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3716 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3717 (leave_group_alone && ((*i)->route_group() == rg))) {
3720 (*i)->set_solo (false, this);
3724 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3726 solo_update_disabled = true;
3728 RouteList uninvolved;
3730 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
3732 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3733 bool via_sends_only;
3734 bool in_signal_flow;
3736 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3737 (leave_group_alone && ((*i)->route_group() == rg))) {
3741 in_signal_flow = false;
3743 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3745 if ((*i)->feeds (route, &via_sends_only)) {
3746 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3747 if (!via_sends_only) {
3748 if (!route->soloed_by_others_upstream()) {
3749 (*i)->mod_solo_by_others_downstream (delta);
3752 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3754 in_signal_flow = true;
3756 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3759 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3761 if (route->feeds (*i, &via_sends_only)) {
3762 /* propagate solo upstream only if routing other than
3763 sends is involved, but do consider the other route
3764 (*i) to be part of the signal flow even if only
3767 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3771 route->soloed_by_others_downstream(),
3772 route->soloed_by_others_upstream()));
3773 if (!via_sends_only) {
3774 if (!route->soloed_by_others_downstream()) {
3775 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3776 (*i)->mod_solo_by_others_upstream (delta);
3778 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
3781 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3783 in_signal_flow = true;
3785 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3788 if (!in_signal_flow) {
3789 uninvolved.push_back (*i);
3793 solo_update_disabled = false;
3794 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3796 update_route_solo_state (r);
3798 /* now notify that the mute state of the routes not involved in the signal
3799 pathway of the just-solo-changed route may have altered.
3802 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3803 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
3804 (*i)->act_on_mute ();
3805 (*i)->mute_changed (this);
3808 SoloChanged (); /* EMIT SIGNAL */
3813 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
3815 /* now figure out if anything that matters is soloed (or is "listening")*/
3817 bool something_soloed = false;
3818 uint32_t listeners = 0;
3819 uint32_t isolated = 0;
3822 r = routes.reader();
3825 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3826 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
3827 something_soloed = true;
3830 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
3831 if (Config->get_solo_control_is_listen_control()) {
3834 (*i)->set_listen (false, this);
3838 if ((*i)->solo_isolated()) {
3843 if (something_soloed != _non_soloed_outs_muted) {
3844 _non_soloed_outs_muted = something_soloed;
3845 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
3848 _listen_cnt = listeners;
3850 if (isolated != _solo_isolated_cnt) {
3851 _solo_isolated_cnt = isolated;
3852 IsolatedChanged (); /* EMIT SIGNAL */
3855 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
3856 something_soloed, listeners, isolated));
3859 boost::shared_ptr<RouteList>
3860 Session::get_routes_with_internal_returns() const
3862 boost::shared_ptr<RouteList> r = routes.reader ();
3863 boost::shared_ptr<RouteList> rl (new RouteList);
3865 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3866 if ((*i)->internal_return ()) {
3874 Session::io_name_is_legal (const std::string& name)
3876 boost::shared_ptr<RouteList> r = routes.reader ();
3878 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3879 if ((*i)->name() == name) {
3883 if ((*i)->has_io_processor_named (name)) {
3892 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
3895 vector<string> connections;
3897 /* if we are passed only a single route and we're not told to turn
3898 * others off, then just do the simple thing.
3901 if (flip_others == false && rl->size() == 1) {
3902 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
3904 mt->set_input_active (onoff);
3909 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
3911 PortSet& ps ((*rt)->input()->ports());
3913 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
3914 p->get_connections (connections);
3917 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
3918 routes_using_input_from (*s, rl2);
3921 /* scan all relevant routes to see if others are on or off */
3923 bool others_are_already_on = false;
3925 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3927 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3933 if ((*r) != (*rt)) {
3934 if (mt->input_active()) {
3935 others_are_already_on = true;
3938 /* this one needs changing */
3939 mt->set_input_active (onoff);
3945 /* globally reverse other routes */
3947 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3948 if ((*r) != (*rt)) {
3949 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3951 mt->set_input_active (!others_are_already_on);
3960 Session::routes_using_input_from (const string& str, RouteList& rl)
3962 boost::shared_ptr<RouteList> r = routes.reader();
3964 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3965 if ((*i)->input()->connected_to (str)) {
3971 boost::shared_ptr<Route>
3972 Session::route_by_name (string name)
3974 boost::shared_ptr<RouteList> r = routes.reader ();
3976 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3977 if ((*i)->name() == name) {
3982 return boost::shared_ptr<Route> ((Route*) 0);
3985 boost::shared_ptr<Route>
3986 Session::route_by_id (PBD::ID id)
3988 boost::shared_ptr<RouteList> r = routes.reader ();
3990 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3991 if ((*i)->id() == id) {
3996 return boost::shared_ptr<Route> ((Route*) 0);
3999 boost::shared_ptr<Track>
4000 Session::track_by_diskstream_id (PBD::ID id)
4002 boost::shared_ptr<RouteList> r = routes.reader ();
4004 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4005 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
4006 if (t && t->using_diskstream_id (id)) {
4011 return boost::shared_ptr<Track> ();
4014 boost::shared_ptr<Route>
4015 Session::route_by_remote_id (uint32_t id)
4017 boost::shared_ptr<RouteList> r = routes.reader ();
4019 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4020 if ((*i)->remote_control_id() == id) {
4025 return boost::shared_ptr<Route> ((Route*) 0);
4030 Session::reassign_track_numbers ()
4034 RouteList r (*(routes.reader ()));
4035 SignalOrderRouteSorter sorter;
4038 StateProtector sp (this);
4040 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4041 if (boost::dynamic_pointer_cast<Track> (*i)) {
4042 (*i)->set_track_number(++tn);
4044 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
4045 (*i)->set_track_number(--bn);
4048 const uint32_t decimals = ceilf (log10f (tn + 1));
4049 const bool decimals_changed = _track_number_decimals != decimals;
4050 _track_number_decimals = decimals;
4052 if (decimals_changed && config.get_track_name_number ()) {
4053 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4054 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
4056 t->resync_track_name();
4059 // trigger GUI re-layout
4060 config.ParameterChanged("track-name-number");
4065 Session::playlist_region_added (boost::weak_ptr<Region> w)
4067 boost::shared_ptr<Region> r = w.lock ();
4072 /* These are the operations that are currently in progress... */
4073 list<GQuark> curr = _current_trans_quarks;
4076 /* ...and these are the operations during which we want to update
4077 the session range location markers.
4080 ops.push_back (Operations::capture);
4081 ops.push_back (Operations::paste);
4082 ops.push_back (Operations::duplicate_region);
4083 ops.push_back (Operations::insert_file);
4084 ops.push_back (Operations::insert_region);
4085 ops.push_back (Operations::drag_region_brush);
4086 ops.push_back (Operations::region_drag);
4087 ops.push_back (Operations::selection_grab);
4088 ops.push_back (Operations::region_fill);
4089 ops.push_back (Operations::fill_selection);
4090 ops.push_back (Operations::create_region);
4091 ops.push_back (Operations::region_copy);
4092 ops.push_back (Operations::fixed_time_region_copy);
4095 /* See if any of the current operations match the ones that we want */
4097 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
4099 /* If so, update the session range markers */
4101 maybe_update_session_range (r->position (), r->last_frame ());
4105 /** Update the session range markers if a is before the current start or
4106 * b is after the current end.
4109 Session::maybe_update_session_range (framepos_t a, framepos_t b)
4111 if (_state_of_the_state & Loading) {
4115 framepos_t session_end_marker_shift_samples = session_end_shift * _nominal_frame_rate;
4117 if (_session_range_location == 0) {
4119 set_session_range_location (a, b + session_end_marker_shift_samples);
4123 if (a < _session_range_location->start()) {
4124 _session_range_location->set_start (a);
4127 if (b > _session_range_location->end()) {
4128 _session_range_location->set_end (b);
4134 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
4136 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4137 maybe_update_session_range (i->to, i->to + i->length);
4142 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
4144 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4145 maybe_update_session_range (i->from, i->to);
4149 /* Region management */
4151 boost::shared_ptr<Region>
4152 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
4154 const RegionFactory::RegionMap& regions (RegionFactory::regions());
4155 RegionFactory::RegionMap::const_iterator i;
4156 boost::shared_ptr<Region> region;
4158 Glib::Threads::Mutex::Lock lm (region_lock);
4160 for (i = regions.begin(); i != regions.end(); ++i) {
4164 if (region->whole_file()) {
4166 if (child->source_equivalent (region)) {
4172 return boost::shared_ptr<Region> ();
4176 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
4178 set<boost::shared_ptr<Region> > relevant_regions;
4180 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
4181 RegionFactory::get_regions_using_source (*s, relevant_regions);
4184 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
4185 set<boost::shared_ptr<Region> >::iterator tmp;
4190 playlists->destroy_region (*r);
4191 RegionFactory::map_remove (*r);
4193 (*r)->drop_sources ();
4194 (*r)->drop_references ();
4196 relevant_regions.erase (r);
4201 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
4204 Glib::Threads::Mutex::Lock ls (source_lock);
4205 /* remove from the main source list */
4206 sources.erase ((*s)->id());
4209 (*s)->mark_for_remove ();
4210 (*s)->drop_references ();
4219 Session::remove_last_capture ()
4221 list<boost::shared_ptr<Source> > srcs;
4223 boost::shared_ptr<RouteList> rl = routes.reader ();
4224 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4225 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4230 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
4233 srcs.insert (srcs.end(), l.begin(), l.end());
4238 destroy_sources (srcs);
4240 save_state (_current_snapshot_name);
4245 /* Source Management */
4248 Session::add_source (boost::shared_ptr<Source> source)
4250 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
4251 pair<SourceMap::iterator,bool> result;
4253 entry.first = source->id();
4254 entry.second = source;
4257 Glib::Threads::Mutex::Lock lm (source_lock);
4258 result = sources.insert (entry);
4261 if (result.second) {
4263 /* yay, new source */
4265 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
4268 if (!fs->within_session()) {
4269 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
4275 boost::shared_ptr<AudioFileSource> afs;
4277 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
4278 if (Config->get_auto_analyse_audio()) {
4279 Analyser::queue_source_for_analysis (source, false);
4283 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
4288 Session::remove_source (boost::weak_ptr<Source> src)
4290 if (_state_of_the_state & Deletion) {
4294 SourceMap::iterator i;
4295 boost::shared_ptr<Source> source = src.lock();
4302 Glib::Threads::Mutex::Lock lm (source_lock);
4304 if ((i = sources.find (source->id())) != sources.end()) {
4309 if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
4311 /* save state so we don't end up with a session file
4312 referring to non-existent sources.
4315 save_state (_current_snapshot_name);
4319 boost::shared_ptr<Source>
4320 Session::source_by_id (const PBD::ID& id)
4322 Glib::Threads::Mutex::Lock lm (source_lock);
4323 SourceMap::iterator i;
4324 boost::shared_ptr<Source> source;
4326 if ((i = sources.find (id)) != sources.end()) {
4333 boost::shared_ptr<AudioFileSource>
4334 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
4336 /* Restricted to audio files because only audio sources have channel
4340 Glib::Threads::Mutex::Lock lm (source_lock);
4342 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
4343 boost::shared_ptr<AudioFileSource> afs
4344 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
4346 if (afs && afs->path() == path && chn == afs->channel()) {
4351 return boost::shared_ptr<AudioFileSource>();
4354 boost::shared_ptr<MidiSource>
4355 Session::midi_source_by_path (const std::string& path) const
4357 /* Restricted to MIDI files because audio sources require a channel
4358 for unique identification, in addition to a path.
4361 Glib::Threads::Mutex::Lock lm (source_lock);
4363 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
4364 boost::shared_ptr<MidiSource> ms
4365 = boost::dynamic_pointer_cast<MidiSource>(s->second);
4366 boost::shared_ptr<FileSource> fs
4367 = boost::dynamic_pointer_cast<FileSource>(s->second);
4369 if (ms && fs && fs->path() == path) {
4374 return boost::shared_ptr<MidiSource>();
4378 Session::count_sources_by_origin (const string& path)
4381 Glib::Threads::Mutex::Lock lm (source_lock);
4383 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
4384 boost::shared_ptr<FileSource> fs
4385 = boost::dynamic_pointer_cast<FileSource>(i->second);
4387 if (fs && fs->origin() == path) {
4396 peak_file_helper (const string& peak_path, const string& file_path, const string& file_base, bool hash) {
4398 std::string checksum = Glib::Checksum::compute_checksum(Glib::Checksum::CHECKSUM_SHA1, file_path + G_DIR_SEPARATOR + file_base);
4399 return Glib::build_filename (peak_path, checksum + peakfile_suffix);
4401 return Glib::build_filename (peak_path, file_base + peakfile_suffix);
4406 Session::construct_peak_filepath (const string& filepath, const bool in_session, const bool old_peak_name) const
4408 string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
4410 if (Glib::path_is_absolute (filepath)) {
4412 /* rip the session dir from the audiofile source */
4414 string session_path;
4415 bool in_another_session = true;
4417 if (filepath.find (interchange_dir_string) != string::npos) {
4419 session_path = Glib::path_get_dirname (filepath); /* now ends in audiofiles */
4420 session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
4421 session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
4422 session_path = Glib::path_get_dirname (session_path); /* now has session path */
4424 /* see if it is within our session */
4426 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4427 if (i->path == session_path) {
4428 in_another_session = false;
4433 in_another_session = false;
4437 if (in_another_session) {
4438 SessionDirectory sd (session_path);
4439 return peak_file_helper (sd.peak_path(), "", Glib::path_get_basename (filepath), !old_peak_name);
4443 /* 1) if file belongs to this session
4444 * it may be a relative path (interchange/...)
4445 * or just basename (session_state, remove source)
4446 * -> just use the basename
4448 std::string filename = Glib::path_get_basename (filepath);
4451 /* 2) if the file is outside our session dir:
4452 * (imported but not copied) add the path for check-summming */
4454 path = Glib::path_get_dirname (filepath);
4457 return peak_file_helper (_session_dir->peak_path(), path, Glib::path_get_basename (filepath), !old_peak_name);
4461 Session::new_audio_source_path_for_embedded (const std::string& path)
4465 * we know that the filename is already unique because it exists
4466 * out in the filesystem.
4468 * However, when we bring it into the session, we could get a
4471 * Eg. two embedded files:
4476 * When merged into session, these collide.
4478 * There will not be a conflict with in-memory sources
4479 * because when the source was created we already picked
4480 * a unique name for it.
4482 * This collision is not likely to be common, but we have to guard
4483 * against it. So, if there is a collision, take the md5 hash of the
4484 * the path, and use that as the filename instead.
4487 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4488 string base = Glib::path_get_basename (path);
4489 string newpath = Glib::build_filename (sdir.sound_path(), base);
4491 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4495 md5.digestString (path.c_str());
4496 md5.writeToString ();
4497 base = md5.digestChars;
4499 string ext = get_suffix (path);
4506 newpath = Glib::build_filename (sdir.sound_path(), base);
4508 /* if this collides, we're screwed */
4510 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4511 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
4520 /** Return true if there are no audio file sources that use @param name as
4521 * the filename component of their path.
4523 * Return false otherwise.
4525 * This method MUST ONLY be used to check in-session, mono files since it
4526 * hard-codes the channel of the audio file source we are looking for as zero.
4528 * If/when Ardour supports native files in non-mono formats, the logic here
4529 * will need to be revisited.
4532 Session::audio_source_name_is_unique (const string& name)
4534 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
4535 vector<space_and_path>::iterator i;
4536 uint32_t existing = 0;
4538 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4540 /* note that we search *without* the extension so that
4541 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
4542 in the event that this new name is required for
4543 a file format change.
4546 const string spath = *i;
4548 if (matching_unsuffixed_filename_exists_in (spath, name)) {
4553 /* it is possible that we have the path already
4554 * assigned to a source that has not yet been written
4555 * (ie. the write source for a diskstream). we have to
4556 * check this in order to make sure that our candidate
4557 * path isn't used again, because that can lead to
4558 * two Sources point to the same file with different
4559 * notions of their removability.
4563 string possible_path = Glib::build_filename (spath, name);
4565 if (audio_source_by_path_and_channel (possible_path, 0)) {
4571 return (existing == 0);
4575 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)
4578 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4580 if (Profile->get_trx() && destructive) {
4582 sstr << setfill ('0') << setw (4) << cnt;
4583 sstr << legalized_base;
4585 sstr << legalized_base;
4587 if (take_required || related_exists) {
4599 } else if (nchan > 2) {
4604 /* XXX what? more than 26 channels! */
4615 /** Return a unique name based on \a base for a new internal audio source */
4617 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
4620 string possible_name;
4621 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
4623 bool some_related_source_name_exists = false;
4625 legalized = legalize_for_path (base);
4627 // Find a "version" of the base name that doesn't exist in any of the possible directories.
4629 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
4631 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
4633 if (audio_source_name_is_unique (possible_name)) {
4637 some_related_source_name_exists = true;
4640 error << string_compose(
4641 _("There are already %1 recordings for %2, which I consider too many."),
4642 limit, base) << endmsg;
4644 throw failed_constructor();
4648 /* We've established that the new name does not exist in any session
4649 * directory, so now find out which one we should use for this new
4653 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4655 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
4660 /** Return a unique name based on `base` for a new internal MIDI source */
4662 Session::new_midi_source_path (const string& base)
4665 char buf[PATH_MAX+1];
4666 const uint32_t limit = 10000;
4668 string possible_path;
4669 string possible_name;
4672 legalized = legalize_for_path (base);
4674 // Find a "version" of the file name that doesn't exist in any of the possible directories.
4675 std::vector<string> sdirs = source_search_path(DataType::MIDI);
4677 /* - the main session folder is the first in the vector.
4678 * - after checking all locations for file-name uniqueness,
4679 * we keep the one from the last iteration as new file name
4680 * - midi files are small and should just be kept in the main session-folder
4682 * -> reverse the array, check main session folder last and use that as location
4685 std::reverse(sdirs.begin(), sdirs.end());
4687 for (cnt = 1; cnt <= limit; ++cnt) {
4689 vector<space_and_path>::iterator i;
4690 uint32_t existing = 0;
4692 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4694 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
4695 possible_name = buf;
4697 possible_path = Glib::build_filename (*i, possible_name);
4699 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
4703 if (midi_source_by_path (possible_path)) {
4708 if (existing == 0) {
4713 error << string_compose(
4714 _("There are already %1 recordings for %2, which I consider too many."),
4715 limit, base) << endmsg;
4721 /* No need to "find best location" for software/app-based RAID, because
4722 MIDI is so small that we always put it in the same place.
4725 return possible_path;
4729 /** Create a new within-session audio source */
4730 boost::shared_ptr<AudioFileSource>
4731 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
4733 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
4735 if (!path.empty()) {
4736 return boost::dynamic_pointer_cast<AudioFileSource> (
4737 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate(), true, true));
4739 throw failed_constructor ();
4743 /** Create a new within-session MIDI source */
4744 boost::shared_ptr<MidiSource>
4745 Session::create_midi_source_for_session (string const & basic_name)
4747 const string path = new_midi_source_path (basic_name);
4749 if (!path.empty()) {
4750 return boost::dynamic_pointer_cast<SMFSource> (
4751 SourceFactory::createWritable (
4752 DataType::MIDI, *this, path, false, frame_rate()));
4754 throw failed_constructor ();
4758 /** Create a new within-session MIDI source */
4759 boost::shared_ptr<MidiSource>
4760 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
4762 /* the caller passes in the track the source will be used in,
4763 so that we can keep the numbering sane.
4765 Rationale: a track with the name "Foo" that has had N
4766 captures carried out so far will ALREADY have a write source
4767 named "Foo-N+1.mid" waiting to be used for the next capture.
4769 If we call new_midi_source_name() we will get "Foo-N+2". But
4770 there is no region corresponding to "Foo-N+1", so when
4771 "Foo-N+2" appears in the track, the gap presents the user
4772 with odd behaviour - why did it skip past Foo-N+1?
4774 We could explain this to the user in some odd way, but
4775 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
4778 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
4781 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
4783 std::string name = track->steal_write_source_name ();
4786 return boost::shared_ptr<MidiSource>();
4789 /* MIDI files are small, just put them in the first location of the
4790 session source search path.
4793 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
4795 return boost::dynamic_pointer_cast<SMFSource> (
4796 SourceFactory::createWritable (
4797 DataType::MIDI, *this, path, false, frame_rate()));
4802 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
4804 if (playlist->hidden()) {
4808 playlists->add (playlist);
4811 playlist->release();
4818 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
4820 if (_state_of_the_state & Deletion) {
4824 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
4830 playlists->remove (playlist);
4836 Session::set_audition (boost::shared_ptr<Region> r)
4838 pending_audition_region = r;
4839 add_post_transport_work (PostTransportAudition);
4840 _butler->schedule_transport_work ();
4844 Session::audition_playlist ()
4846 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4847 ev->region.reset ();
4852 Session::non_realtime_set_audition ()
4854 assert (pending_audition_region);
4855 auditioner->audition_region (pending_audition_region);
4856 pending_audition_region.reset ();
4857 AuditionActive (true); /* EMIT SIGNAL */
4861 Session::audition_region (boost::shared_ptr<Region> r)
4863 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4869 Session::cancel_audition ()
4874 if (auditioner->auditioning()) {
4875 auditioner->cancel_audition ();
4876 AuditionActive (false); /* EMIT SIGNAL */
4881 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
4883 if (a->is_monitor()) {
4886 if (b->is_monitor()) {
4889 return a->order_key () < b->order_key ();
4893 Session::is_auditioning () const
4895 /* can be called before we have an auditioner object */
4897 return auditioner->auditioning();
4904 Session::graph_reordered ()
4906 /* don't do this stuff if we are setting up connections
4907 from a set_state() call or creating new tracks. Ditto for deletion.
4910 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _reconnecting_routes_in_progress || _route_deletion_in_progress) {
4914 /* every track/bus asked for this to be handled but it was deferred because
4915 we were connecting. do it now.
4918 request_input_change_handling ();
4922 /* force all diskstreams to update their capture offset values to
4923 reflect any changes in latencies within the graph.
4926 boost::shared_ptr<RouteList> rl = routes.reader ();
4927 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4928 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4930 tr->set_capture_offset ();
4935 /** @return Number of frames that there is disk space available to write,
4938 boost::optional<framecnt_t>
4939 Session::available_capture_duration ()
4941 Glib::Threads::Mutex::Lock lm (space_lock);
4943 if (_total_free_4k_blocks_uncertain) {
4944 return boost::optional<framecnt_t> ();
4947 float sample_bytes_on_disk = 4.0; // keep gcc happy
4949 switch (config.get_native_file_data_format()) {
4951 sample_bytes_on_disk = 4.0;
4955 sample_bytes_on_disk = 3.0;
4959 sample_bytes_on_disk = 2.0;
4963 /* impossible, but keep some gcc versions happy */
4964 fatal << string_compose (_("programming error: %1"),
4965 X_("illegal native file data format"))
4967 abort(); /*NOTREACHED*/
4970 double scale = 4096.0 / sample_bytes_on_disk;
4972 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
4973 return max_framecnt;
4976 return (framecnt_t) floor (_total_free_4k_blocks * scale);
4980 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
4983 RCUWriter<BundleList> writer (_bundles);
4984 boost::shared_ptr<BundleList> b = writer.get_copy ();
4985 b->push_back (bundle);
4989 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4996 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
4998 bool removed = false;
5001 RCUWriter<BundleList> writer (_bundles);
5002 boost::shared_ptr<BundleList> b = writer.get_copy ();
5003 BundleList::iterator i = find (b->begin(), b->end(), bundle);
5005 if (i != b->end()) {
5012 BundleAddedOrRemoved (); /* EMIT SIGNAL */
5018 boost::shared_ptr<Bundle>
5019 Session::bundle_by_name (string name) const
5021 boost::shared_ptr<BundleList> b = _bundles.reader ();
5023 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
5024 if ((*i)->name() == name) {
5029 return boost::shared_ptr<Bundle> ();
5033 Session::tempo_map_changed (const PropertyChange&)
5037 playlists->update_after_tempo_map_change ();
5039 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
5045 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
5047 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
5048 (*i)->recompute_frames_from_bbt ();
5052 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
5053 * the given count with the current block size.
5056 Session::ensure_buffers (ChanCount howmany)
5058 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
5062 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
5064 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5065 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
5070 Session::next_insert_id ()
5072 /* this doesn't really loop forever. just think about it */
5075 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
5076 if (!insert_bitset[n]) {
5077 insert_bitset[n] = true;
5083 /* none available, so resize and try again */
5085 insert_bitset.resize (insert_bitset.size() + 16, false);
5090 Session::next_send_id ()
5092 /* this doesn't really loop forever. just think about it */
5095 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
5096 if (!send_bitset[n]) {
5097 send_bitset[n] = true;
5103 /* none available, so resize and try again */
5105 send_bitset.resize (send_bitset.size() + 16, false);
5110 Session::next_aux_send_id ()
5112 /* this doesn't really loop forever. just think about it */
5115 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
5116 if (!aux_send_bitset[n]) {
5117 aux_send_bitset[n] = true;
5123 /* none available, so resize and try again */
5125 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
5130 Session::next_return_id ()
5132 /* this doesn't really loop forever. just think about it */
5135 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
5136 if (!return_bitset[n]) {
5137 return_bitset[n] = true;
5143 /* none available, so resize and try again */
5145 return_bitset.resize (return_bitset.size() + 16, false);
5150 Session::mark_send_id (uint32_t id)
5152 if (id >= send_bitset.size()) {
5153 send_bitset.resize (id+16, false);
5155 if (send_bitset[id]) {
5156 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
5158 send_bitset[id] = true;
5162 Session::mark_aux_send_id (uint32_t id)
5164 if (id >= aux_send_bitset.size()) {
5165 aux_send_bitset.resize (id+16, false);
5167 if (aux_send_bitset[id]) {
5168 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
5170 aux_send_bitset[id] = true;
5174 Session::mark_return_id (uint32_t id)
5176 if (id >= return_bitset.size()) {
5177 return_bitset.resize (id+16, false);
5179 if (return_bitset[id]) {
5180 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
5182 return_bitset[id] = true;
5186 Session::mark_insert_id (uint32_t id)
5188 if (id >= insert_bitset.size()) {
5189 insert_bitset.resize (id+16, false);
5191 if (insert_bitset[id]) {
5192 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
5194 insert_bitset[id] = true;
5198 Session::unmark_send_id (uint32_t id)
5200 if (id < send_bitset.size()) {
5201 send_bitset[id] = false;
5206 Session::unmark_aux_send_id (uint32_t id)
5208 if (id < aux_send_bitset.size()) {
5209 aux_send_bitset[id] = false;
5214 Session::unmark_return_id (uint32_t id)
5216 if (id < return_bitset.size()) {
5217 return_bitset[id] = false;
5222 Session::unmark_insert_id (uint32_t id)
5224 if (id < insert_bitset.size()) {
5225 insert_bitset[id] = false;
5230 Session::reset_native_file_format ()
5232 boost::shared_ptr<RouteList> rl = routes.reader ();
5234 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5235 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5237 /* don't save state as we do this, there's no point
5239 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
5240 tr->reset_write_sources (false);
5241 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
5247 Session::route_name_unique (string n) const
5249 boost::shared_ptr<RouteList> r = routes.reader ();
5251 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5252 if ((*i)->name() == n) {
5261 Session::route_name_internal (string n) const
5263 if (auditioner && auditioner->name() == n) {
5267 if (_click_io && _click_io->name() == n) {
5275 Session::freeze_all (InterThreadInfo& itt)
5277 boost::shared_ptr<RouteList> r = routes.reader ();
5279 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5281 boost::shared_ptr<Track> t;
5283 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
5284 /* XXX this is wrong because itt.progress will keep returning to zero at the start
5294 boost::shared_ptr<Region>
5295 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
5296 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
5297 InterThreadInfo& itt,
5298 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
5299 bool for_export, bool for_freeze)
5301 boost::shared_ptr<Region> result;
5302 boost::shared_ptr<Playlist> playlist;
5303 boost::shared_ptr<Source> source;
5304 ChanCount diskstream_channels (track.n_channels());
5305 framepos_t position;
5306 framecnt_t this_chunk;
5308 framepos_t latency_skip;
5310 framepos_t len = end - start;
5311 bool need_block_size_reset = false;
5312 ChanCount const max_proc = track.max_processor_streams ();
5313 string legal_playlist_name;
5314 string possible_path;
5317 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
5318 end, start) << endmsg;
5322 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
5323 include_endpoint, for_export, for_freeze);
5325 if (diskstream_channels.n(track.data_type()) < 1) {
5326 error << _("Cannot write a range with no data.") << endmsg;
5330 // block all process callback handling
5332 block_processing ();
5335 // synchronize with AudioEngine::process_callback()
5336 // make sure processing is not currently running
5337 // and processing_blocked() is honored before
5338 // acquiring thread buffers
5339 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5342 _bounce_processing_active = true;
5344 /* call tree *MUST* hold route_lock */
5346 if ((playlist = track.playlist()) == 0) {
5350 legal_playlist_name = legalize_for_path (playlist->name());
5352 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
5354 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
5355 string path = ((track.data_type() == DataType::AUDIO)
5356 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
5357 : new_midi_source_path (legal_playlist_name));
5364 source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
5367 catch (failed_constructor& err) {
5368 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
5372 srcs.push_back (source);
5375 /* tell redirects that care that we are about to use a much larger
5376 * blocksize. this will flush all plugins too, so that they are ready
5377 * to be used for this process.
5380 need_block_size_reset = true;
5381 track.set_block_size (bounce_chunk_size);
5382 _engine.main_thread()->get_buffers ();
5386 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5388 /* create a set of reasonably-sized buffers */
5389 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5390 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
5392 buffers.set_count (max_proc);
5394 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5395 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5396 boost::shared_ptr<MidiSource> ms;
5398 afs->prepare_for_peakfile_writes ();
5399 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5400 Source::Lock lock(ms->mutex());
5401 ms->mark_streaming_write_started(lock);
5405 while (to_do && !itt.cancel) {
5407 this_chunk = min (to_do, bounce_chunk_size);
5409 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
5413 start += this_chunk;
5414 to_do -= this_chunk;
5415 itt.progress = (float) (1.0 - ((double) to_do / len));
5417 if (latency_skip >= bounce_chunk_size) {
5418 latency_skip -= bounce_chunk_size;
5422 const framecnt_t current_chunk = this_chunk - latency_skip;
5425 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5426 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5427 boost::shared_ptr<MidiSource> ms;
5430 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
5433 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5434 Source::Lock lock(ms->mutex());
5436 const MidiBuffer& buf = buffers.get_midi(0);
5437 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
5438 Evoral::Event<framepos_t> ev = *i;
5439 ev.set_time(ev.time() - position);
5440 ms->append_event_frames(lock, ev, ms->timeline_position());
5447 /* post-roll, pick up delayed processor output */
5448 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5450 while (latency_skip && !itt.cancel) {
5451 this_chunk = min (latency_skip, bounce_chunk_size);
5452 latency_skip -= this_chunk;
5454 buffers.silence (this_chunk, 0);
5455 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
5458 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5459 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5462 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
5474 xnow = localtime (&now);
5476 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
5477 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5478 boost::shared_ptr<MidiSource> ms;
5481 afs->update_header (position, *xnow, now);
5482 afs->flush_header ();
5483 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5484 Source::Lock lock(ms->mutex());
5485 ms->mark_streaming_write_completed(lock);
5489 /* construct a region to represent the bounced material */
5493 plist.add (Properties::start, 0);
5494 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
5495 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
5497 result = RegionFactory::create (srcs, plist);
5503 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5504 (*src)->mark_for_remove ();
5505 (*src)->drop_references ();
5509 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5510 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5513 afs->done_with_peakfile_writes ();
5517 _bounce_processing_active = false;
5519 if (need_block_size_reset) {
5520 _engine.main_thread()->drop_buffers ();
5521 track.set_block_size (get_block_size());
5524 unblock_processing ();
5530 Session::gain_automation_buffer() const
5532 return ProcessThread::gain_automation_buffer ();
5536 Session::trim_automation_buffer() const
5538 return ProcessThread::trim_automation_buffer ();
5542 Session::send_gain_automation_buffer() const
5544 return ProcessThread::send_gain_automation_buffer ();
5548 Session::pan_automation_buffer() const
5550 return ProcessThread::pan_automation_buffer ();
5554 Session::get_silent_buffers (ChanCount count)
5556 return ProcessThread::get_silent_buffers (count);
5560 Session::get_scratch_buffers (ChanCount count, bool silence)
5562 return ProcessThread::get_scratch_buffers (count, silence);
5566 Session::get_route_buffers (ChanCount count, bool silence)
5568 return ProcessThread::get_route_buffers (count, silence);
5573 Session::get_mix_buffers (ChanCount count)
5575 return ProcessThread::get_mix_buffers (count);
5579 Session::ntracks () const
5582 boost::shared_ptr<RouteList> r = routes.reader ();
5584 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5585 if (boost::dynamic_pointer_cast<Track> (*i)) {
5594 Session::nbusses () const
5597 boost::shared_ptr<RouteList> r = routes.reader ();
5599 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5600 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
5609 Session::add_automation_list(AutomationList *al)
5611 automation_lists[al->id()] = al;
5614 /** @return true if there is at least one record-enabled track, otherwise false */
5616 Session::have_rec_enabled_track () const
5618 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
5622 Session::have_rec_disabled_track () const
5624 return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
5627 /** Update the state of our rec-enabled tracks flag */
5629 Session::update_route_record_state ()
5631 boost::shared_ptr<RouteList> rl = routes.reader ();
5632 RouteList::iterator i = rl->begin();
5633 while (i != rl->end ()) {
5635 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5636 if (tr && tr->record_enabled ()) {
5643 int const old = g_atomic_int_get (&_have_rec_enabled_track);
5645 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
5647 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
5648 RecordStateChanged (); /* EMIT SIGNAL */
5651 for (i = rl->begin(); i != rl->end (); ++i) {
5652 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5653 if (tr && !tr->record_enabled ()) {
5658 g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
5660 bool record_arm_state_changed = (old != g_atomic_int_get (&_have_rec_enabled_track) );
5662 if (record_status() == Recording && record_arm_state_changed ) {
5663 RecordArmStateChanged ();
5669 Session::listen_position_changed ()
5671 boost::shared_ptr<RouteList> r = routes.reader ();
5673 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5674 (*i)->listen_position_changed ();
5679 Session::solo_control_mode_changed ()
5681 /* cancel all solo or all listen when solo control mode changes */
5684 set_solo (get_routes(), false);
5685 } else if (listening()) {
5686 set_listen (get_routes(), false);
5690 /** Called when a property of one of our route groups changes */
5692 Session::route_group_property_changed (RouteGroup* rg)
5694 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
5697 /** Called when a route is added to one of our route groups */
5699 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5701 RouteAddedToRouteGroup (rg, r);
5704 /** Called when a route is removed from one of our route groups */
5706 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5708 update_route_record_state ();
5709 RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
5712 boost::shared_ptr<RouteList>
5713 Session::get_tracks () const
5715 boost::shared_ptr<RouteList> rl = routes.reader ();
5716 boost::shared_ptr<RouteList> tl (new RouteList);
5718 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
5719 if (boost::dynamic_pointer_cast<Track> (*r)) {
5720 if (!(*r)->is_auditioner()) {
5728 boost::shared_ptr<RouteList>
5729 Session::get_routes_with_regions_at (framepos_t const p) const
5731 boost::shared_ptr<RouteList> r = routes.reader ();
5732 boost::shared_ptr<RouteList> rl (new RouteList);
5734 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5735 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5740 boost::shared_ptr<Playlist> pl = tr->playlist ();
5745 if (pl->has_region_at (p)) {
5754 Session::goto_end ()
5756 if (_session_range_location) {
5757 request_locate (_session_range_location->end(), false);
5759 request_locate (0, false);
5764 Session::goto_start ()
5766 if (_session_range_location) {
5767 request_locate (_session_range_location->start(), false);
5769 request_locate (0, false);
5774 Session::current_start_frame () const
5776 return _session_range_location ? _session_range_location->start() : 0;
5780 Session::current_end_frame () const
5782 return _session_range_location ? _session_range_location->end() : 0;
5786 Session::set_session_range_location (framepos_t start, framepos_t end)
5788 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
5789 _locations->add (_session_range_location);
5793 Session::step_edit_status_change (bool yn)
5799 send = (_step_editors == 0);
5804 send = (_step_editors == 1);
5807 if (_step_editors > 0) {
5813 StepEditStatusChange (val);
5819 Session::start_time_changed (framepos_t old)
5821 /* Update the auto loop range to match the session range
5822 (unless the auto loop range has been changed by the user)
5825 Location* s = _locations->session_range_location ();
5830 Location* l = _locations->auto_loop_location ();
5832 if (l && l->start() == old) {
5833 l->set_start (s->start(), true);
5838 Session::end_time_changed (framepos_t old)
5840 /* Update the auto loop range to match the session range
5841 (unless the auto loop range has been changed by the user)
5844 Location* s = _locations->session_range_location ();
5849 Location* l = _locations->auto_loop_location ();
5851 if (l && l->end() == old) {
5852 l->set_end (s->end(), true);
5856 std::vector<std::string>
5857 Session::source_search_path (DataType type) const
5861 if (session_dirs.size() == 1) {
5863 case DataType::AUDIO:
5864 sp.push_back (_session_dir->sound_path());
5866 case DataType::MIDI:
5867 sp.push_back (_session_dir->midi_path());
5871 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
5872 SessionDirectory sdir (i->path);
5874 case DataType::AUDIO:
5875 sp.push_back (sdir.sound_path());
5877 case DataType::MIDI:
5878 sp.push_back (sdir.midi_path());
5884 if (type == DataType::AUDIO) {
5885 const string sound_path_2X = _session_dir->sound_path_2X();
5886 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
5887 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
5888 sp.push_back (sound_path_2X);
5893 // now check the explicit (possibly user-specified) search path
5896 case DataType::AUDIO:
5897 sp += Searchpath(config.get_audio_search_path ());
5899 case DataType::MIDI:
5900 sp += Searchpath(config.get_midi_search_path ());
5908 Session::ensure_search_path_includes (const string& path, DataType type)
5917 case DataType::AUDIO:
5918 sp += Searchpath(config.get_audio_search_path ());
5920 case DataType::MIDI:
5921 sp += Searchpath (config.get_midi_search_path ());
5925 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
5926 /* No need to add this new directory if it has the same inode as
5927 an existing one; checking inode rather than name prevents duplicated
5928 directories when we are using symlinks.
5930 On Windows, I think we could just do if (*i == path) here.
5932 if (PBD::equivalent_paths (*i, path)) {
5940 case DataType::AUDIO:
5941 config.set_audio_search_path (sp.to_string());
5943 case DataType::MIDI:
5944 config.set_midi_search_path (sp.to_string());
5950 Session::remove_dir_from_search_path (const string& dir, DataType type)
5955 case DataType::AUDIO:
5956 sp = Searchpath(config.get_audio_search_path ());
5958 case DataType::MIDI:
5959 sp = Searchpath (config.get_midi_search_path ());
5966 case DataType::AUDIO:
5967 config.set_audio_search_path (sp.to_string());
5969 case DataType::MIDI:
5970 config.set_midi_search_path (sp.to_string());
5976 boost::shared_ptr<Speakers>
5977 Session::get_speakers()
5983 Session::unknown_processors () const
5987 boost::shared_ptr<RouteList> r = routes.reader ();
5988 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5989 list<string> t = (*i)->unknown_processors ();
5990 copy (t.begin(), t.end(), back_inserter (p));
6000 Session::update_latency (bool playback)
6002 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
6004 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
6008 boost::shared_ptr<RouteList> r = routes.reader ();
6009 framecnt_t max_latency = 0;
6012 /* reverse the list so that we work backwards from the last route to run to the first */
6013 RouteList* rl = routes.reader().get();
6014 r.reset (new RouteList (*rl));
6015 reverse (r->begin(), r->end());
6018 /* compute actual latency values for the given direction and store them all in per-port
6019 structures. this will also publish the same values (to JACK) so that computation of latency
6020 for routes can consistently use public latency values.
6023 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6024 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
6027 /* because we latency compensate playback, our published playback latencies should
6028 be the same for all output ports - all material played back by ardour has
6029 the same latency, whether its caused by plugins or by latency compensation. since
6030 these may differ from the values computed above, reset all playback port latencies
6034 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
6036 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6037 (*i)->set_public_port_latencies (max_latency, playback);
6042 post_playback_latency ();
6046 post_capture_latency ();
6049 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
6053 Session::post_playback_latency ()
6055 set_worst_playback_latency ();
6057 boost::shared_ptr<RouteList> r = routes.reader ();
6059 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6060 if (!(*i)->is_auditioner() && ((*i)->active())) {
6061 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
6065 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6066 (*i)->set_latency_compensation (_worst_track_latency);
6071 Session::post_capture_latency ()
6073 set_worst_capture_latency ();
6075 /* reflect any changes in capture latencies into capture offsets
6078 boost::shared_ptr<RouteList> rl = routes.reader();
6079 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
6080 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6082 tr->set_capture_offset ();
6088 Session::initialize_latencies ()
6091 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
6092 update_latency (false);
6093 update_latency (true);
6096 set_worst_io_latencies ();
6100 Session::set_worst_io_latencies ()
6102 set_worst_playback_latency ();
6103 set_worst_capture_latency ();
6107 Session::set_worst_playback_latency ()
6109 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6113 _worst_output_latency = 0;
6115 if (!_engine.connected()) {
6119 boost::shared_ptr<RouteList> r = routes.reader ();
6121 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6122 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
6125 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
6129 Session::set_worst_capture_latency ()
6131 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6135 _worst_input_latency = 0;
6137 if (!_engine.connected()) {
6141 boost::shared_ptr<RouteList> r = routes.reader ();
6143 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6144 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
6147 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
6151 Session::update_latency_compensation (bool force_whole_graph)
6153 bool some_track_latency_changed = false;
6155 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6159 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
6161 _worst_track_latency = 0;
6163 boost::shared_ptr<RouteList> r = routes.reader ();
6165 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6166 if (!(*i)->is_auditioner() && ((*i)->active())) {
6168 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
6169 some_track_latency_changed = true;
6171 _worst_track_latency = max (tl, _worst_track_latency);
6175 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
6176 (some_track_latency_changed ? "yes" : "no")));
6178 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
6180 if (some_track_latency_changed || force_whole_graph) {
6181 _engine.update_latencies ();
6185 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6186 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6190 tr->set_capture_offset ();
6195 Session::session_name_is_legal (const string& path)
6197 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
6199 for (int i = 0; illegal_chars[i]; ++i) {
6200 if (path.find (illegal_chars[i]) != string::npos) {
6201 return illegal_chars[i];
6209 Session::next_control_id () const
6213 /* the monitor bus remote ID is in a different
6214 * "namespace" than regular routes. its existence doesn't
6215 * affect normal (low) numbered routes.
6222 /* the same about masterbus in Waves Tracks */
6224 if (Profile->get_trx() && _master_out) {
6228 return nroutes() - subtract;
6232 Session::notify_remote_id_change ()
6234 if (deletion_in_progress()) {
6238 switch (Config->get_remote_model()) {
6240 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
6246 #ifdef USE_TRACKS_CODE_FEATURES
6247 /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
6248 * if track order has been changed by user
6250 reconnect_existing_routes(true, true);
6256 Session::sync_order_keys ()
6258 if (deletion_in_progress()) {
6262 /* tell everyone that something has happened to the sort keys
6263 and let them sync up with the change(s)
6264 this will give objects that manage the sort order keys the
6265 opportunity to keep them in sync if they wish to.
6268 DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
6270 reassign_track_numbers();
6272 Route::SyncOrderKeys (); /* EMIT SIGNAL */
6274 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
6278 Session::operation_in_progress (GQuark op) const
6280 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
6283 boost::shared_ptr<Port>
6284 Session::ltc_input_port () const
6286 return _ltc_input->nth (0);
6289 boost::shared_ptr<Port>
6290 Session::ltc_output_port () const
6292 return _ltc_output->nth (0);
6296 Session::reconnect_ltc_input ()
6300 string src = Config->get_ltc_source_port();
6302 _ltc_input->disconnect (this);
6304 if (src != _("None") && !src.empty()) {
6305 _ltc_input->nth (0)->connect (src);
6308 if ( ARDOUR::Profile->get_trx () ) {
6309 // Tracks need this signal to update timecode_source_dropdown
6310 MtcOrLtcInputPortChanged (); //emit signal
6316 Session::reconnect_ltc_output ()
6320 string src = Config->get_ltc_output_port();
6322 _ltc_output->disconnect (this);
6324 if (src != _("None") && !src.empty()) {
6325 _ltc_output->nth (0)->connect (src);
6331 Session::set_range_selection (framepos_t start, framepos_t end)
6333 _range_selection = Evoral::Range<framepos_t> (start, end);
6334 #ifdef USE_TRACKS_CODE_FEATURES
6335 follow_playhead_priority ();
6340 Session::set_object_selection (framepos_t start, framepos_t end)
6342 _object_selection = Evoral::Range<framepos_t> (start, end);
6343 #ifdef USE_TRACKS_CODE_FEATURES
6344 follow_playhead_priority ();
6349 Session::clear_range_selection ()
6351 _range_selection = Evoral::Range<framepos_t> (-1,-1);
6352 #ifdef USE_TRACKS_CODE_FEATURES
6353 follow_playhead_priority ();
6358 Session::clear_object_selection ()
6360 _object_selection = Evoral::Range<framepos_t> (-1,-1);
6361 #ifdef USE_TRACKS_CODE_FEATURES
6362 follow_playhead_priority ();