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 (Config->get_loop_is_mode()) {
1872 /* makes no sense to use loop play as mode when recording */
1873 request_play_loop (false);
1876 if (_transport_speed) {
1877 if (!config.get_punch_in()) {
1881 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1882 RecordStateChanged (); /* EMIT SIGNAL */
1889 Session::audible_frame () const
1895 offset = worst_playback_latency ();
1897 if (synced_to_engine()) {
1898 /* Note: this is basically just sync-to-JACK */
1899 tf = _engine.transport_frame();
1901 tf = _transport_frame;
1906 if (!non_realtime_work_pending()) {
1910 /* Check to see if we have passed the first guaranteed
1911 audible frame past our last start position. if not,
1912 return that last start point because in terms
1913 of audible frames, we have not moved yet.
1915 `Start position' in this context means the time we last
1916 either started, located, or changed transport direction.
1919 if (_transport_speed > 0.0f) {
1921 if (!play_loop || !have_looped) {
1922 if (tf < _last_roll_or_reversal_location + offset) {
1923 return _last_roll_or_reversal_location;
1931 } else if (_transport_speed < 0.0f) {
1933 /* XXX wot? no backward looping? */
1935 if (tf > _last_roll_or_reversal_location - offset) {
1936 return _last_roll_or_reversal_location;
1948 Session::set_frame_rate (framecnt_t frames_per_second)
1950 /** \fn void Session::set_frame_size(framecnt_t)
1951 the AudioEngine object that calls this guarantees
1952 that it will not be called while we are also in
1953 ::process(). Its fine to do things that block
1957 _base_frame_rate = frames_per_second;
1958 _nominal_frame_rate = frames_per_second;
1963 reset_write_sources (false);
1965 // XXX we need some equivalent to this, somehow
1966 // SndFileSource::setup_standard_crossfades (frames_per_second);
1970 /* XXX need to reset/reinstantiate all LADSPA plugins */
1974 Session::set_block_size (pframes_t nframes)
1976 /* the AudioEngine guarantees
1977 that it will not be called while we are also in
1978 ::process(). It is therefore fine to do things that block
1983 current_block_size = nframes;
1987 boost::shared_ptr<RouteList> r = routes.reader ();
1989 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1990 (*i)->set_block_size (nframes);
1993 boost::shared_ptr<RouteList> rl = routes.reader ();
1994 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1995 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1997 tr->set_block_size (nframes);
2001 set_worst_io_latencies ();
2007 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
2009 boost::shared_ptr<Route> r2;
2011 if (r1->feeds (rbase) && rbase->feeds (r1)) {
2012 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
2016 /* make a copy of the existing list of routes that feed r1 */
2018 Route::FedBy existing (r1->fed_by());
2020 /* for each route that feeds r1, recurse, marking it as feeding
2024 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
2025 if (!(r2 = i->r.lock ())) {
2026 /* (*i) went away, ignore it */
2030 /* r2 is a route that feeds r1 which somehow feeds base. mark
2031 base as being fed by r2
2034 rbase->add_fed_by (r2, i->sends_only);
2038 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
2042 if (r1->feeds (r2) && r2->feeds (r1)) {
2046 /* now recurse, so that we can mark base as being fed by
2047 all routes that feed r2
2050 trace_terminal (r2, rbase);
2057 Session::resort_routes ()
2059 /* don't do anything here with signals emitted
2060 by Routes during initial setup or while we
2061 are being destroyed.
2064 if (_state_of_the_state & (InitialConnecting | Deletion)) {
2069 RCUWriter<RouteList> writer (routes);
2070 boost::shared_ptr<RouteList> r = writer.get_copy ();
2071 resort_routes_using (r);
2072 /* writer goes out of scope and forces update */
2076 boost::shared_ptr<RouteList> rl = routes.reader ();
2077 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2078 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
2080 const Route::FedBy& fb ((*i)->fed_by());
2082 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
2083 boost::shared_ptr<Route> sf = f->r.lock();
2085 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
2093 /** This is called whenever we need to rebuild the graph of how we will process
2095 * @param r List of routes, in any order.
2099 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
2101 /* We are going to build a directed graph of our routes;
2102 this is where the edges of that graph are put.
2107 /* Go through all routes doing two things:
2109 * 1. Collect the edges of the route graph. Each of these edges
2110 * is a pair of routes, one of which directly feeds the other
2111 * either by a JACK connection or by an internal send.
2113 * 2. Begin the process of making routes aware of which other
2114 * routes directly or indirectly feed them. This information
2115 * is used by the solo code.
2118 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2120 /* Clear out the route's list of direct or indirect feeds */
2121 (*i)->clear_fed_by ();
2123 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
2125 bool via_sends_only;
2127 /* See if this *j feeds *i according to the current state of the JACK
2128 connections and internal sends.
2130 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
2131 /* add the edge to the graph (part #1) */
2132 edges.add (*j, *i, via_sends_only);
2133 /* tell the route (for part #2) */
2134 (*i)->add_fed_by (*j, via_sends_only);
2139 /* Attempt a topological sort of the route graph */
2140 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
2142 if (sorted_routes) {
2143 /* We got a satisfactory topological sort, so there is no feedback;
2146 Note: the process graph rechain does not require a
2147 topologically-sorted list, but hey ho.
2149 if (_process_graph) {
2150 _process_graph->rechain (sorted_routes, edges);
2153 _current_route_graph = edges;
2155 /* Complete the building of the routes' lists of what directly
2156 or indirectly feeds them.
2158 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2159 trace_terminal (*i, *i);
2162 *r = *sorted_routes;
2165 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
2166 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2167 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
2168 (*i)->name(), (*i)->order_key ()));
2172 SuccessfulGraphSort (); /* EMIT SIGNAL */
2175 /* The topological sort failed, so we have a problem. Tell everyone
2176 and stick to the old graph; this will continue to be processed, so
2177 until the feedback is fixed, what is played back will not quite
2178 reflect what is actually connected. Note also that we do not
2179 do trace_terminal here, as it would fail due to an endless recursion,
2180 so the solo code will think that everything is still connected
2184 FeedbackDetected (); /* EMIT SIGNAL */
2189 /** Find a route name starting with \a base, maybe followed by the
2190 * lowest \a id. \a id will always be added if \a definitely_add_number
2191 * is true on entry; otherwise it will only be added if required
2192 * to make the name unique.
2194 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
2195 * The available route name with the lowest ID will be used, and \a id
2196 * will be set to the ID.
2198 * \return false if a route name could not be found, and \a track_name
2199 * and \a id do not reflect a free route name.
2202 Session::find_route_name (string const & base, uint32_t& id, string& name, bool definitely_add_number)
2204 /* it is unfortunate that we need to include reserved names here that
2205 refer to control surfaces. But there's no way to ensure a complete
2206 lack of collisions without doing this, since the control surface
2207 support may not even be active. Without adding an API to control
2208 surface support that would list their port names, we do have to
2212 char const * const reserved[] = {
2221 /* the base may conflict with ports that do not belong to existing
2222 routes, but hidden objects like the click track. So check port names
2223 before anything else.
2226 for (int n = 0; reserved[n]; ++n) {
2227 if (base == reserved[n]) {
2228 definitely_add_number = true;
2236 if (!definitely_add_number && route_by_name (base) == 0) {
2237 /* juse use the base */
2243 name = string_compose ("%1 %2", base, id);
2245 if (route_by_name (name) == 0) {
2251 } while (id < (UINT_MAX-1));
2256 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
2258 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
2260 in = ChanCount::ZERO;
2261 out = ChanCount::ZERO;
2263 boost::shared_ptr<RouteList> r = routes.reader ();
2265 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2266 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2267 if (tr && !tr->is_auditioner()) {
2268 in += tr->n_inputs();
2269 out += tr->n_outputs();
2275 Session::default_track_name_pattern (DataType t)
2278 case DataType::AUDIO:
2279 if (Profile->get_trx()) {
2286 case DataType::MIDI:
2293 /** Caller must not hold process lock
2294 * @param name_template string to use for the start of the name, or "" to use "MIDI".
2295 * @param instrument plugin info for the instrument to insert pre-fader, if any
2297 list<boost::shared_ptr<MidiTrack> >
2298 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
2299 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
2302 uint32_t track_id = 0;
2304 RouteList new_routes;
2305 list<boost::shared_ptr<MidiTrack> > ret;
2307 const string name_pattern = default_track_name_pattern (DataType::MIDI);
2308 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
2311 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, use_number)) {
2312 error << "cannot find name for new midi track" << endmsg;
2316 boost::shared_ptr<MidiTrack> track;
2319 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
2321 if (track->init ()) {
2325 track->use_new_diskstream();
2327 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2328 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2331 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2332 if (track->input()->ensure_io (input, false, this)) {
2333 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
2337 if (track->output()->ensure_io (output, false, this)) {
2338 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
2343 track->non_realtime_input_change();
2346 route_group->add (track);
2349 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2351 if (Config->get_remote_model() == UserOrdered) {
2352 track->set_remote_control_id (next_control_id());
2355 new_routes.push_back (track);
2356 ret.push_back (track);
2358 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2361 catch (failed_constructor &err) {
2362 error << _("Session: could not create new midi track.") << endmsg;
2366 catch (AudioEngine::PortRegistrationFailure& pfe) {
2368 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;
2376 if (!new_routes.empty()) {
2377 StateProtector sp (this);
2378 if (Profile->get_trx()) {
2379 add_routes (new_routes, false, false, false);
2381 add_routes (new_routes, true, true, false);
2385 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
2386 PluginPtr plugin = instrument->load (*this);
2387 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2388 (*r)->add_processor (p, PreFader);
2398 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2400 boost::shared_ptr<Route> midi_track (wmt.lock());
2406 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2408 if (change.after.n_audio() <= change.before.n_audio()) {
2412 /* new audio ports: make sure the audio goes somewhere useful,
2413 unless the user has no-auto-connect selected.
2415 The existing ChanCounts don't matter for this call as they are only
2416 to do with matching input and output indices, and we are only changing
2422 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
2426 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
2427 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
2428 * @param output_start As \a input_start, but for outputs.
2431 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
2432 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
2434 if (!IO::connecting_legal) {
2438 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2444 /* If both inputs and outputs are auto-connected to physical ports,
2445 use the max of input and output offsets to ensure auto-connected
2446 port numbers always match up (e.g. the first audio input and the
2447 first audio output of the route will have the same physical
2448 port number). Otherwise just use the lowest input or output
2452 DEBUG_TRACE (DEBUG::Graph,
2453 string_compose("Auto-connect: existing in = %1 out = %2\n",
2454 existing_inputs, existing_outputs));
2456 const bool in_out_physical =
2457 (Config->get_input_auto_connect() & AutoConnectPhysical)
2458 && (Config->get_output_auto_connect() & AutoConnectPhysical)
2461 const ChanCount in_offset = in_out_physical
2462 ? ChanCount::max(existing_inputs, existing_outputs)
2465 const ChanCount out_offset = in_out_physical
2466 ? ChanCount::max(existing_inputs, existing_outputs)
2469 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2470 vector<string> physinputs;
2471 vector<string> physoutputs;
2473 _engine.get_physical_outputs (*t, physoutputs);
2474 _engine.get_physical_inputs (*t, physinputs);
2476 if (!physinputs.empty() && connect_inputs) {
2477 uint32_t nphysical_in = physinputs.size();
2479 DEBUG_TRACE (DEBUG::Graph,
2480 string_compose("There are %1 physical inputs of type %2\n",
2483 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
2486 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
2487 DEBUG_TRACE (DEBUG::Graph,
2488 string_compose("Get index %1 + %2 % %3 = %4\n",
2489 in_offset.get(*t), i, nphysical_in,
2490 (in_offset.get(*t) + i) % nphysical_in));
2491 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
2494 DEBUG_TRACE (DEBUG::Graph,
2495 string_compose("Connect route %1 IN to %2\n",
2496 route->name(), port));
2498 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
2502 ChanCount one_added (*t, 1);
2503 existing_inputs += one_added;
2507 if (!physoutputs.empty()) {
2508 uint32_t nphysical_out = physoutputs.size();
2509 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
2513 * do not create new connections if we reached the limit of physical outputs
2517 if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
2518 ARDOUR::Profile->get_trx () &&
2519 existing_outputs.get(*t) == nphysical_out ) {
2523 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
2524 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
2525 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
2526 /* master bus is audio only */
2527 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
2528 port = _master_out->input()->ports().port(*t,
2529 i % _master_out->input()->n_ports().get(*t))->name();
2533 DEBUG_TRACE (DEBUG::Graph,
2534 string_compose("Connect route %1 OUT to %2\n",
2535 route->name(), port));
2537 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
2541 ChanCount one_added (*t, 1);
2542 existing_outputs += one_added;
2548 #ifdef USE_TRACKS_CODE_FEATURES
2551 compare_routes_by_remote_id (const boost::shared_ptr<Route>& route1, const boost::shared_ptr<Route>& route2)
2553 return route1->remote_control_id() < route2->remote_control_id();
2557 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2559 // it is not allowed to perform connection
2560 if (!IO::connecting_legal) {
2564 // if we are deleting routes we will call this once at the end
2565 if (_route_deletion_in_progress) {
2569 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2575 // We need to disconnect the route's inputs and outputs first
2576 // basing on autoconnect configuration
2577 bool reconnectIputs = !(Config->get_input_auto_connect() & ManualConnect) && reconnect_inputs;
2578 bool reconnectOutputs = !(Config->get_output_auto_connect() & ManualConnect) && reconnect_outputs;
2580 ChanCount existing_inputs;
2581 ChanCount existing_outputs;
2582 count_existing_track_channels (existing_inputs, existing_outputs);
2584 //ChanCount inputs = ChanCount::ZERO;
2585 //ChanCount outputs = ChanCount::ZERO;
2587 RouteList existing_routes = *routes.reader ();
2588 existing_routes.sort (compare_routes_by_remote_id);
2591 PBD::Unwinder<bool> protect_ignore_changes (_reconnecting_routes_in_progress, true);
2593 vector<string> physinputs;
2594 vector<string> physoutputs;
2596 EngineStateController::instance()->get_physical_audio_outputs(physoutputs);
2597 EngineStateController::instance()->get_physical_audio_inputs(physinputs);
2599 uint32_t input_n = 0;
2600 uint32_t output_n = 0;
2601 RouteList::iterator rIter = existing_routes.begin();
2602 const AutoConnectOption current_input_auto_connection (Config->get_input_auto_connect());
2603 const AutoConnectOption current_output_auto_connection (Config->get_output_auto_connect());
2604 for (; rIter != existing_routes.end(); ++rIter) {
2605 if (*rIter == _master_out || *rIter == _monitor_out ) {
2609 if (current_output_auto_connection == AutoConnectPhysical) {
2610 (*rIter)->amp()->deactivate();
2611 } else if (current_output_auto_connection == AutoConnectMaster) {
2612 (*rIter)->amp()->activate();
2615 if (reconnectIputs) {
2616 (*rIter)->input()->disconnect (this); //GZ: check this; could be heavy
2618 for (uint32_t route_input_n = 0; route_input_n < (*rIter)->n_inputs().get(DataType::AUDIO); ++route_input_n) {
2620 if (current_input_auto_connection & AutoConnectPhysical) {
2622 if ( input_n == physinputs.size() ) {
2626 string port = physinputs[input_n];
2628 if (port.empty() ) {
2629 error << "Physical Input number "<< input_n << " is unavailable and cannot be connected" << endmsg;
2632 //GZ: check this; could be heavy
2633 (*rIter)->input()->connect ((*rIter)->input()->ports().port(DataType::AUDIO, route_input_n), port, this);
2639 if (reconnectOutputs) {
2641 //normalize route ouptuts: reduce the amount outputs to be equal to the amount of inputs
2642 if (current_output_auto_connection & AutoConnectPhysical) {
2644 //GZ: check this; could be heavy
2645 (*rIter)->output()->disconnect (this);
2646 size_t route_inputs_count = (*rIter)->n_inputs().get(DataType::AUDIO);
2648 //GZ: check this; could be heavy
2649 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, route_inputs_count), false, this );
2651 } else if (current_output_auto_connection & AutoConnectMaster){
2653 if (!reconnect_master) {
2657 //GZ: check this; could be heavy
2658 (*rIter)->output()->disconnect (this);
2661 uint32_t master_inputs_count = _master_out->n_inputs().get(DataType::AUDIO);
2662 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, master_inputs_count), false, this );
2664 error << error << "Master bus is not available" << endmsg;
2669 for (uint32_t route_output_n = 0; route_output_n < (*rIter)->n_outputs().get(DataType::AUDIO); ++route_output_n) {
2670 if (current_output_auto_connection & AutoConnectPhysical) {
2672 if ( output_n == physoutputs.size() ) {
2676 string port = physoutputs[output_n];
2678 if (port.empty() ) {
2679 error << "Physical Output number "<< output_n << " is unavailable and cannot be connected" << endmsg;
2682 //GZ: check this; could be heavy
2683 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2686 } else if (current_output_auto_connection & AutoConnectMaster) {
2688 if ( route_output_n == _master_out->n_inputs().get(DataType::AUDIO) ) {
2692 // connect to master bus
2693 string port = _master_out->input()->ports().port(DataType::AUDIO, route_output_n)->name();
2695 if (port.empty() ) {
2696 error << "MasterBus Input number "<< route_output_n << " is unavailable and cannot be connected" << endmsg;
2700 //GZ: check this; could be heavy
2701 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2707 //auto_connect_route (*rIter, inputs, outputs, false, reconnectIputs);
2710 _master_out->output()->disconnect (this);
2711 auto_connect_master_bus ();
2716 session_routes_reconnected (); /* EMIT SIGNAL */
2720 Session::reconnect_midi_scene_ports(bool inputs)
2724 boost::shared_ptr<MidiPort> scene_in_ptr = scene_in();
2726 scene_in_ptr->disconnect_all ();
2728 std::vector<EngineStateController::MidiPortState> midi_port_states;
2729 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2731 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2733 for (; state_iter != midi_port_states.end(); ++state_iter) {
2734 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2735 scene_in_ptr->connect (state_iter->name);
2742 boost::shared_ptr<MidiPort> scene_out_ptr = scene_out();
2744 if (scene_out_ptr ) {
2745 scene_out_ptr->disconnect_all ();
2747 std::vector<EngineStateController::MidiPortState> midi_port_states;
2748 EngineStateController::instance()->get_physical_midi_output_states (midi_port_states);
2750 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2752 for (; state_iter != midi_port_states.end(); ++state_iter) {
2753 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2754 scene_out_ptr->connect (state_iter->name);
2762 Session::reconnect_mtc_ports ()
2764 boost::shared_ptr<MidiPort> mtc_in_ptr = _midi_ports->mtc_input_port();
2770 mtc_in_ptr->disconnect_all ();
2772 std::vector<EngineStateController::MidiPortState> midi_port_states;
2773 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2775 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2777 for (; state_iter != midi_port_states.end(); ++state_iter) {
2778 if (state_iter->available && state_iter->mtc_in) {
2779 mtc_in_ptr->connect (state_iter->name);
2783 if (!_midi_ports->mtc_input_port ()->connected () &&
2784 config.get_external_sync () &&
2785 (Config->get_sync_source () == MTC) ) {
2786 config.set_external_sync (false);
2789 if ( ARDOUR::Profile->get_trx () ) {
2790 // Tracks need this signal to update timecode_source_dropdown
2791 MtcOrLtcInputPortChanged (); //emit signal
2796 Session::reconnect_mmc_ports(bool inputs)
2798 if (inputs ) { // get all enabled midi input ports
2800 boost::shared_ptr<MidiPort> mmc_in_ptr = _midi_ports->mmc_in();
2802 mmc_in_ptr->disconnect_all ();
2803 std::vector<std::string> enabled_midi_inputs;
2804 EngineStateController::instance()->get_physical_midi_inputs (enabled_midi_inputs);
2806 std::vector<std::string>::iterator port_iter = enabled_midi_inputs.begin();
2808 for (; port_iter != enabled_midi_inputs.end(); ++port_iter) {
2809 mmc_in_ptr->connect (*port_iter);
2813 } else { // get all enabled midi output ports
2815 boost::shared_ptr<MidiPort> mmc_out_ptr = _midi_ports->mmc_out();
2817 mmc_out_ptr->disconnect_all ();
2818 std::vector<std::string> enabled_midi_outputs;
2819 EngineStateController::instance()->get_physical_midi_outputs (enabled_midi_outputs);
2821 std::vector<std::string>::iterator port_iter = enabled_midi_outputs.begin();
2823 for (; port_iter != enabled_midi_outputs.end(); ++port_iter) {
2824 mmc_out_ptr->connect (*port_iter);
2832 /** Caller must not hold process lock
2833 * @param name_template string to use for the start of the name, or "" to use "Audio".
2835 list< boost::shared_ptr<AudioTrack> >
2836 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
2837 uint32_t how_many, string name_template)
2840 uint32_t track_id = 0;
2842 RouteList new_routes;
2843 list<boost::shared_ptr<AudioTrack> > ret;
2845 const string name_pattern = default_track_name_pattern (DataType::AUDIO);
2846 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
2850 if (!find_route_name (name_template.empty() ? _(name_pattern.c_str()) : name_template, ++track_id, track_name, use_number)) {
2851 error << "cannot find name for new audio track" << endmsg;
2855 boost::shared_ptr<AudioTrack> track;
2858 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
2860 if (track->init ()) {
2864 if (ARDOUR::Profile->get_trx ()) {
2865 // TRACKS considers it's not a USE CASE, it's
2866 // a piece of behavior of the session model:
2868 // Gain for a newly created route depends on
2869 // the current output_auto_connect mode:
2871 // 0 for Stereo Out mode
2873 if (Config->get_output_auto_connect() & AutoConnectMaster) {
2874 track->set_gain (dB_to_coefficient (0), 0);
2878 track->use_new_diskstream();
2880 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2881 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2884 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2886 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2887 error << string_compose (
2888 _("cannot configure %1 in/%2 out configuration for new audio track"),
2889 input_channels, output_channels)
2894 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2895 error << string_compose (
2896 _("cannot configure %1 in/%2 out configuration for new audio track"),
2897 input_channels, output_channels)
2904 route_group->add (track);
2907 track->non_realtime_input_change();
2909 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2910 if (Config->get_remote_model() == UserOrdered) {
2911 track->set_remote_control_id (next_control_id());
2914 new_routes.push_back (track);
2915 ret.push_back (track);
2917 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2920 catch (failed_constructor &err) {
2921 error << _("Session: could not create new audio track.") << endmsg;
2925 catch (AudioEngine::PortRegistrationFailure& pfe) {
2927 error << pfe.what() << endmsg;
2935 if (!new_routes.empty()) {
2936 StateProtector sp (this);
2937 if (Profile->get_trx()) {
2938 add_routes (new_routes, false, false, false);
2940 add_routes (new_routes, true, true, false);
2947 /** Caller must not hold process lock.
2948 * @param name_template string to use for the start of the name, or "" to use "Bus".
2951 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
2954 uint32_t bus_id = 0;
2958 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
2961 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, use_number)) {
2962 error << "cannot find name for new audio bus" << endmsg;
2967 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
2973 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2974 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
2977 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2979 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2980 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2981 input_channels, output_channels)
2987 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2988 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2989 input_channels, output_channels)
2996 route_group->add (bus);
2998 if (Config->get_remote_model() == UserOrdered) {
2999 bus->set_remote_control_id (next_control_id());
3002 bus->add_internal_return ();
3004 ret.push_back (bus);
3006 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
3012 catch (failed_constructor &err) {
3013 error << _("Session: could not create new audio route.") << endmsg;
3017 catch (AudioEngine::PortRegistrationFailure& pfe) {
3018 error << pfe.what() << endmsg;
3028 StateProtector sp (this);
3029 if (Profile->get_trx()) {
3030 add_routes (ret, false, false, false);
3032 add_routes (ret, false, true, true); // autoconnect // outputs only
3041 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base)
3044 uint32_t control_id;
3046 uint32_t number = 0;
3047 const uint32_t being_added = how_many;
3049 if (!tree.read (template_path.c_str())) {
3053 XMLNode* node = tree.root();
3055 IO::disable_connecting ();
3057 control_id = next_control_id ();
3061 XMLNode node_copy (*node);
3063 /* Remove IDs of everything so that new ones are used */
3064 node_copy.remove_property_recursively (X_("id"));
3069 if (!name_base.empty()) {
3071 /* if we're adding more than one routes, force
3072 * all the names of the new routes to be
3073 * numbered, via the final parameter.
3076 if (!find_route_name (name_base.c_str(), ++number, name, (being_added > 1))) {
3077 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3083 string const route_name = node_copy.property(X_("name"))->value ();
3085 /* generate a new name by adding a number to the end of the template name */
3086 if (!find_route_name (route_name.c_str(), ++number, name, true)) {
3087 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3088 abort(); /*NOTREACHED*/
3092 /* set this name in the XML description that we are about to use */
3093 Route::set_name_in_state (node_copy, name);
3095 /* trim bitslots from listen sends so that new ones are used */
3096 XMLNodeList children = node_copy.children ();
3097 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
3098 if ((*i)->name() == X_("Processor")) {
3099 XMLProperty* role = (*i)->property (X_("role"));
3100 if (role && role->value() == X_("Listen")) {
3101 (*i)->remove_property (X_("bitslot"));
3106 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
3109 error << _("Session: cannot create track/bus from template description") << endmsg;
3113 if (boost::dynamic_pointer_cast<Track>(route)) {
3114 /* force input/output change signals so that the new diskstream
3115 picks up the configuration of the route. During session
3116 loading this normally happens in a different way.
3119 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3121 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
3122 change.after = route->input()->n_ports();
3123 route->input()->changed (change, this);
3124 change.after = route->output()->n_ports();
3125 route->output()->changed (change, this);
3128 route->set_remote_control_id (control_id);
3131 ret.push_back (route);
3133 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
3136 catch (failed_constructor &err) {
3137 error << _("Session: could not create new route from template") << endmsg;
3141 catch (AudioEngine::PortRegistrationFailure& pfe) {
3142 error << pfe.what() << endmsg;
3151 StateProtector sp (this);
3152 if (Profile->get_trx()) {
3153 add_routes (ret, false, false, false);
3155 add_routes (ret, true, true, false);
3157 IO::enable_connecting ();
3164 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
3167 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
3168 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
3171 error << _("Adding new tracks/busses failed") << endmsg;
3176 update_latency (true);
3177 update_latency (false);
3182 save_state (_current_snapshot_name);
3185 reassign_track_numbers();
3187 update_route_record_state ();
3189 RouteAdded (new_routes); /* EMIT SIGNAL */
3193 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
3195 ChanCount existing_inputs;
3196 ChanCount existing_outputs;
3197 uint32_t order = next_control_id();
3199 if (_order_hint > -1) {
3200 order = _order_hint;
3204 count_existing_track_channels (existing_inputs, existing_outputs);
3207 RCUWriter<RouteList> writer (routes);
3208 boost::shared_ptr<RouteList> r = writer.get_copy ();
3209 r->insert (r->end(), new_routes.begin(), new_routes.end());
3211 /* if there is no control out and we're not in the middle of loading,
3212 resort the graph here. if there is a control out, we will resort
3213 toward the end of this method. if we are in the middle of loading,
3214 we will resort when done.
3217 if (!_monitor_out && IO::connecting_legal) {
3218 resort_routes_using (r);
3222 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3224 boost::weak_ptr<Route> wpr (*x);
3225 boost::shared_ptr<Route> r (*x);
3227 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
3228 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
3229 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
3230 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
3231 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
3232 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
3234 if (r->is_master()) {
3238 if (r->is_monitor()) {
3242 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
3244 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
3245 track_playlist_changed (boost::weak_ptr<Track> (tr));
3246 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
3248 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
3250 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
3251 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
3256 if (input_auto_connect || output_auto_connect) {
3257 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
3260 /* order keys are a GUI responsibility but we need to set up
3261 reasonable defaults because they also affect the remote control
3262 ID in most situations.
3265 if (!r->has_order_key ()) {
3266 if (r->is_auditioner()) {
3267 /* use an arbitrarily high value */
3268 r->set_order_key (UINT_MAX);
3270 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
3271 r->set_order_key (order);
3279 if (_monitor_out && IO::connecting_legal) {
3280 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
3282 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3283 if ((*x)->is_monitor()) {
3285 } else if ((*x)->is_master()) {
3288 (*x)->enable_monitor_send ();
3295 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
3297 boost::shared_ptr<RouteList> r = routes.reader ();
3298 boost::shared_ptr<Send> s;
3300 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3301 if ((s = (*i)->internal_send_for (dest)) != 0) {
3302 s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO);
3308 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
3310 boost::shared_ptr<RouteList> r = routes.reader ();
3311 boost::shared_ptr<Send> s;
3313 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3314 if ((s = (*i)->internal_send_for (dest)) != 0) {
3315 s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY);
3321 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
3323 boost::shared_ptr<RouteList> r = routes.reader ();
3324 boost::shared_ptr<Send> s;
3326 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3327 if ((s = (*i)->internal_send_for (dest)) != 0) {
3328 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
3333 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
3335 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
3337 boost::shared_ptr<RouteList> r = routes.reader ();
3338 boost::shared_ptr<RouteList> t (new RouteList);
3340 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3341 /* no MIDI sends because there are no MIDI busses yet */
3342 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
3347 add_internal_sends (dest, p, t);
3351 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
3353 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
3354 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
3359 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
3361 add_internal_send (dest, sender->before_processor_for_index (index), sender);
3365 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
3367 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
3371 if (!dest->internal_return()) {
3372 dest->add_internal_return ();
3375 sender->add_aux_send (dest, before);
3382 Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
3384 PBD::Unwinder<bool> uw_flag (_route_deletion_in_progress, true);
3386 { // RCU Writer scope
3387 RCUWriter<RouteList> writer (routes);
3388 boost::shared_ptr<RouteList> rs = writer.get_copy ();
3391 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3393 if (*iter == _master_out) {
3397 (*iter)->set_solo (false, this);
3401 /* deleting the master out seems like a dumb
3402 idea, but its more of a UI policy issue
3406 if (*iter == _master_out) {
3407 _master_out = boost::shared_ptr<Route> ();
3410 if (*iter == _monitor_out) {
3411 _monitor_out.reset ();
3414 // We need to disconnect the route's inputs and outputs
3416 (*iter)->input()->disconnect (0);
3417 (*iter)->output()->disconnect (0);
3419 /* if the route had internal sends sending to it, remove them */
3420 if ((*iter)->internal_return()) {
3422 boost::shared_ptr<RouteList> r = routes.reader ();
3423 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3424 boost::shared_ptr<Send> s = (*i)->internal_send_for (*iter);
3426 (*i)->remove_processor (s);
3431 /* if the monitoring section had a pointer to this route, remove it */
3432 if (_monitor_out && !(*iter)->is_master() && !(*iter)->is_monitor()) {
3433 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3434 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
3435 (*iter)->remove_aux_or_listen (_monitor_out);
3438 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*iter);
3439 if (mt && mt->step_editing()) {
3440 if (_step_editors > 0) {
3446 /* writer goes out of scope, forces route list update */
3448 } // end of RCU Writer scope
3450 update_route_solo_state ();
3451 RouteAddedOrRemoved (false); /* EMIT SIGNAL */
3452 update_latency_compensation ();
3455 /* Re-sort routes to remove the graph's current references to the one that is
3456 * going away, then flush old references out of the graph.
3457 * Wave Tracks: reconnect routes
3460 #ifdef USE_TRACKS_CODE_FEATURES
3461 reconnect_existing_routes(true, false);
3463 routes.flush (); // maybe unsafe, see below.
3467 if (_process_graph) {
3468 _process_graph->clear_other_chain ();
3471 /* get rid of it from the dead wood collection in the route list manager */
3472 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
3476 /* try to cause everyone to drop their references
3477 * and unregister ports from the backend
3480 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3481 (*iter)->drop_references ();
3484 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
3486 /* save the new state of the world */
3488 if (save_state (_current_snapshot_name)) {
3489 save_history (_current_snapshot_name);
3492 reassign_track_numbers();
3493 update_route_record_state ();
3497 Session::remove_route (boost::shared_ptr<Route> route)
3499 boost::shared_ptr<RouteList> rl (new RouteList);
3500 rl->push_back (route);
3505 Session::route_mute_changed (void* /*src*/)
3511 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3513 boost::shared_ptr<Route> route = wpr.lock();
3515 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
3519 if (route->listening_via_monitor ()) {
3521 if (Config->get_exclusive_solo()) {
3522 /* new listen: disable all other listen */
3523 boost::shared_ptr<RouteList> r = routes.reader ();
3524 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3525 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3528 (*i)->set_listen (false, this);
3534 } else if (_listen_cnt > 0) {
3539 update_route_solo_state ();
3542 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3544 boost::shared_ptr<Route> route = wpr.lock ();
3547 /* should not happen */
3548 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
3552 bool send_changed = false;
3554 if (route->solo_isolated()) {
3555 if (_solo_isolated_cnt == 0) {
3556 send_changed = true;
3558 _solo_isolated_cnt++;
3559 } else if (_solo_isolated_cnt > 0) {
3560 _solo_isolated_cnt--;
3561 if (_solo_isolated_cnt == 0) {
3562 send_changed = true;
3567 IsolatedChanged (); /* EMIT SIGNAL */
3572 Session::routes_solo_changed (boost::shared_ptr<RouteList> solo_change_routes)
3574 if (solo_update_disabled) {
3576 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
3580 if (solo_change_routes->empty() ) {
3584 boost::shared_ptr<RouteList> non_solo_change_routes (new RouteList);
3585 boost::shared_ptr<RouteList> r = routes.reader ();
3588 std::set_difference (r->begin(), r->end(),
3589 solo_change_routes->begin(), solo_change_routes->end(),
3590 std::back_inserter(*non_solo_change_routes) );
3592 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3594 solo_update_disabled = true;
3595 RouteList uninvolved;
3597 for (RouteList::iterator route = solo_change_routes->begin(); route != solo_change_routes->end(); ++route) {
3599 if ((*route)->self_soloed() ) {
3605 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", (*route)->name()));
3607 for (RouteList::iterator i = non_solo_change_routes->begin(); i != non_solo_change_routes->end(); ++i) {
3608 bool via_sends_only;
3609 bool in_signal_flow;
3611 if ((*i) == *route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ) {
3615 in_signal_flow = false;
3617 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3619 if ((*i)->feeds (*route, &via_sends_only)) {
3620 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3621 if (!via_sends_only) {
3622 if (!(*route)->soloed_by_others_upstream()) {
3623 (*i)->mod_solo_by_others_downstream (delta);
3626 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3628 in_signal_flow = true;
3630 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3633 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3635 if ((*route)->feeds (*i, &via_sends_only)) {
3636 /* propagate solo upstream only if routing other than
3637 sends is involved, but do consider the other route
3638 (*i) to be part of the signal flow even if only
3641 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3645 (*route)->soloed_by_others_downstream(),
3646 (*route)->soloed_by_others_upstream()));
3647 if (!via_sends_only) {
3648 if (!(*route)->soloed_by_others_downstream()) {
3649 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3650 (*i)->mod_solo_by_others_upstream (delta);
3652 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
3655 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3657 in_signal_flow = true;
3659 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3662 if (!in_signal_flow) {
3663 uninvolved.push_back (*i);
3667 solo_update_disabled = false;
3668 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3670 update_route_solo_state ();
3672 /* now notify that the mute state of the routes not involved in the signal
3673 pathway of the just-solo-changed route may have altered.
3676 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3677 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1\n", (*i)->name() ));
3678 (*i)->mute_changed (this);
3681 SoloChanged (); /* EMIT SIGNAL */
3686 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
3688 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
3690 if (!self_solo_change) {
3691 // session doesn't care about changes to soloed-by-others
3695 if (solo_update_disabled) {
3697 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
3701 boost::shared_ptr<Route> route = wpr.lock ();
3704 boost::shared_ptr<RouteList> r = routes.reader ();
3707 if (route->self_soloed()) {
3713 RouteGroup* rg = route->route_group ();
3714 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
3716 if (delta == 1 && Config->get_exclusive_solo()) {
3718 /* new solo: disable all other solos, but not the group if its solo-enabled */
3720 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3721 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3722 (leave_group_alone && ((*i)->route_group() == rg))) {
3725 (*i)->set_solo (false, this);
3729 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3731 solo_update_disabled = true;
3733 RouteList uninvolved;
3735 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
3737 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3738 bool via_sends_only;
3739 bool in_signal_flow;
3741 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3742 (leave_group_alone && ((*i)->route_group() == rg))) {
3746 in_signal_flow = false;
3748 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3750 if ((*i)->feeds (route, &via_sends_only)) {
3751 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3752 if (!via_sends_only) {
3753 if (!route->soloed_by_others_upstream()) {
3754 (*i)->mod_solo_by_others_downstream (delta);
3757 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3759 in_signal_flow = true;
3761 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3764 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3766 if (route->feeds (*i, &via_sends_only)) {
3767 /* propagate solo upstream only if routing other than
3768 sends is involved, but do consider the other route
3769 (*i) to be part of the signal flow even if only
3772 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3776 route->soloed_by_others_downstream(),
3777 route->soloed_by_others_upstream()));
3778 if (!via_sends_only) {
3779 if (!route->soloed_by_others_downstream()) {
3780 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3781 (*i)->mod_solo_by_others_upstream (delta);
3783 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
3786 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3788 in_signal_flow = true;
3790 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3793 if (!in_signal_flow) {
3794 uninvolved.push_back (*i);
3798 solo_update_disabled = false;
3799 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3801 update_route_solo_state (r);
3803 /* now notify that the mute state of the routes not involved in the signal
3804 pathway of the just-solo-changed route may have altered.
3807 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3808 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
3809 (*i)->act_on_mute ();
3810 (*i)->mute_changed (this);
3813 SoloChanged (); /* EMIT SIGNAL */
3818 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
3820 /* now figure out if anything that matters is soloed (or is "listening")*/
3822 bool something_soloed = false;
3823 uint32_t listeners = 0;
3824 uint32_t isolated = 0;
3827 r = routes.reader();
3830 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3831 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
3832 something_soloed = true;
3835 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
3836 if (Config->get_solo_control_is_listen_control()) {
3839 (*i)->set_listen (false, this);
3843 if ((*i)->solo_isolated()) {
3848 if (something_soloed != _non_soloed_outs_muted) {
3849 _non_soloed_outs_muted = something_soloed;
3850 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
3853 _listen_cnt = listeners;
3855 if (isolated != _solo_isolated_cnt) {
3856 _solo_isolated_cnt = isolated;
3857 IsolatedChanged (); /* EMIT SIGNAL */
3860 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
3861 something_soloed, listeners, isolated));
3864 boost::shared_ptr<RouteList>
3865 Session::get_routes_with_internal_returns() const
3867 boost::shared_ptr<RouteList> r = routes.reader ();
3868 boost::shared_ptr<RouteList> rl (new RouteList);
3870 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3871 if ((*i)->internal_return ()) {
3879 Session::io_name_is_legal (const std::string& name)
3881 boost::shared_ptr<RouteList> r = routes.reader ();
3883 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3884 if ((*i)->name() == name) {
3888 if ((*i)->has_io_processor_named (name)) {
3897 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
3900 vector<string> connections;
3902 /* if we are passed only a single route and we're not told to turn
3903 * others off, then just do the simple thing.
3906 if (flip_others == false && rl->size() == 1) {
3907 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
3909 mt->set_input_active (onoff);
3914 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
3916 PortSet& ps ((*rt)->input()->ports());
3918 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
3919 p->get_connections (connections);
3922 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
3923 routes_using_input_from (*s, rl2);
3926 /* scan all relevant routes to see if others are on or off */
3928 bool others_are_already_on = false;
3930 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3932 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3938 if ((*r) != (*rt)) {
3939 if (mt->input_active()) {
3940 others_are_already_on = true;
3943 /* this one needs changing */
3944 mt->set_input_active (onoff);
3950 /* globally reverse other routes */
3952 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3953 if ((*r) != (*rt)) {
3954 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3956 mt->set_input_active (!others_are_already_on);
3965 Session::routes_using_input_from (const string& str, RouteList& rl)
3967 boost::shared_ptr<RouteList> r = routes.reader();
3969 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3970 if ((*i)->input()->connected_to (str)) {
3976 boost::shared_ptr<Route>
3977 Session::route_by_name (string name)
3979 boost::shared_ptr<RouteList> r = routes.reader ();
3981 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3982 if ((*i)->name() == name) {
3987 return boost::shared_ptr<Route> ((Route*) 0);
3990 boost::shared_ptr<Route>
3991 Session::route_by_id (PBD::ID id)
3993 boost::shared_ptr<RouteList> r = routes.reader ();
3995 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3996 if ((*i)->id() == id) {
4001 return boost::shared_ptr<Route> ((Route*) 0);
4004 boost::shared_ptr<Track>
4005 Session::track_by_diskstream_id (PBD::ID id)
4007 boost::shared_ptr<RouteList> r = routes.reader ();
4009 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4010 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
4011 if (t && t->using_diskstream_id (id)) {
4016 return boost::shared_ptr<Track> ();
4019 boost::shared_ptr<Route>
4020 Session::route_by_remote_id (uint32_t id)
4022 boost::shared_ptr<RouteList> r = routes.reader ();
4024 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4025 if ((*i)->remote_control_id() == id) {
4030 return boost::shared_ptr<Route> ((Route*) 0);
4035 Session::reassign_track_numbers ()
4039 RouteList r (*(routes.reader ()));
4040 SignalOrderRouteSorter sorter;
4043 StateProtector sp (this);
4045 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4046 if (boost::dynamic_pointer_cast<Track> (*i)) {
4047 (*i)->set_track_number(++tn);
4049 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
4050 (*i)->set_track_number(--bn);
4053 const uint32_t decimals = ceilf (log10f (tn + 1));
4054 const bool decimals_changed = _track_number_decimals != decimals;
4055 _track_number_decimals = decimals;
4057 if (decimals_changed && config.get_track_name_number ()) {
4058 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4059 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
4061 t->resync_track_name();
4064 // trigger GUI re-layout
4065 config.ParameterChanged("track-name-number");
4070 Session::playlist_region_added (boost::weak_ptr<Region> w)
4072 boost::shared_ptr<Region> r = w.lock ();
4077 /* These are the operations that are currently in progress... */
4078 list<GQuark> curr = _current_trans_quarks;
4081 /* ...and these are the operations during which we want to update
4082 the session range location markers.
4085 ops.push_back (Operations::capture);
4086 ops.push_back (Operations::paste);
4087 ops.push_back (Operations::duplicate_region);
4088 ops.push_back (Operations::insert_file);
4089 ops.push_back (Operations::insert_region);
4090 ops.push_back (Operations::drag_region_brush);
4091 ops.push_back (Operations::region_drag);
4092 ops.push_back (Operations::selection_grab);
4093 ops.push_back (Operations::region_fill);
4094 ops.push_back (Operations::fill_selection);
4095 ops.push_back (Operations::create_region);
4096 ops.push_back (Operations::region_copy);
4097 ops.push_back (Operations::fixed_time_region_copy);
4100 /* See if any of the current operations match the ones that we want */
4102 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
4104 /* If so, update the session range markers */
4106 maybe_update_session_range (r->position (), r->last_frame ());
4110 /** Update the session range markers if a is before the current start or
4111 * b is after the current end.
4114 Session::maybe_update_session_range (framepos_t a, framepos_t b)
4116 if (_state_of_the_state & Loading) {
4120 framepos_t session_end_marker_shift_samples = session_end_shift * _nominal_frame_rate;
4122 if (_session_range_location == 0) {
4124 set_session_range_location (a, b + session_end_marker_shift_samples);
4128 if (a < _session_range_location->start()) {
4129 _session_range_location->set_start (a);
4132 if (b > _session_range_location->end()) {
4133 _session_range_location->set_end (b);
4139 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
4141 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4142 maybe_update_session_range (i->to, i->to + i->length);
4147 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
4149 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4150 maybe_update_session_range (i->from, i->to);
4154 /* Region management */
4156 boost::shared_ptr<Region>
4157 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
4159 const RegionFactory::RegionMap& regions (RegionFactory::regions());
4160 RegionFactory::RegionMap::const_iterator i;
4161 boost::shared_ptr<Region> region;
4163 Glib::Threads::Mutex::Lock lm (region_lock);
4165 for (i = regions.begin(); i != regions.end(); ++i) {
4169 if (region->whole_file()) {
4171 if (child->source_equivalent (region)) {
4177 return boost::shared_ptr<Region> ();
4181 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
4183 set<boost::shared_ptr<Region> > relevant_regions;
4185 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
4186 RegionFactory::get_regions_using_source (*s, relevant_regions);
4189 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
4190 set<boost::shared_ptr<Region> >::iterator tmp;
4195 playlists->destroy_region (*r);
4196 RegionFactory::map_remove (*r);
4198 (*r)->drop_sources ();
4199 (*r)->drop_references ();
4201 relevant_regions.erase (r);
4206 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
4209 Glib::Threads::Mutex::Lock ls (source_lock);
4210 /* remove from the main source list */
4211 sources.erase ((*s)->id());
4214 (*s)->mark_for_remove ();
4215 (*s)->drop_references ();
4224 Session::remove_last_capture ()
4226 list<boost::shared_ptr<Source> > srcs;
4228 boost::shared_ptr<RouteList> rl = routes.reader ();
4229 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4230 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4235 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
4238 srcs.insert (srcs.end(), l.begin(), l.end());
4243 destroy_sources (srcs);
4245 save_state (_current_snapshot_name);
4250 /* Source Management */
4253 Session::add_source (boost::shared_ptr<Source> source)
4255 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
4256 pair<SourceMap::iterator,bool> result;
4258 entry.first = source->id();
4259 entry.second = source;
4262 Glib::Threads::Mutex::Lock lm (source_lock);
4263 result = sources.insert (entry);
4266 if (result.second) {
4268 /* yay, new source */
4270 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
4273 if (!fs->within_session()) {
4274 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
4280 boost::shared_ptr<AudioFileSource> afs;
4282 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
4283 if (Config->get_auto_analyse_audio()) {
4284 Analyser::queue_source_for_analysis (source, false);
4288 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
4293 Session::remove_source (boost::weak_ptr<Source> src)
4295 if (_state_of_the_state & Deletion) {
4299 SourceMap::iterator i;
4300 boost::shared_ptr<Source> source = src.lock();
4307 Glib::Threads::Mutex::Lock lm (source_lock);
4309 if ((i = sources.find (source->id())) != sources.end()) {
4314 if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
4316 /* save state so we don't end up with a session file
4317 referring to non-existent sources.
4320 save_state (_current_snapshot_name);
4324 boost::shared_ptr<Source>
4325 Session::source_by_id (const PBD::ID& id)
4327 Glib::Threads::Mutex::Lock lm (source_lock);
4328 SourceMap::iterator i;
4329 boost::shared_ptr<Source> source;
4331 if ((i = sources.find (id)) != sources.end()) {
4338 boost::shared_ptr<AudioFileSource>
4339 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
4341 /* Restricted to audio files because only audio sources have channel
4345 Glib::Threads::Mutex::Lock lm (source_lock);
4347 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
4348 boost::shared_ptr<AudioFileSource> afs
4349 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
4351 if (afs && afs->path() == path && chn == afs->channel()) {
4356 return boost::shared_ptr<AudioFileSource>();
4359 boost::shared_ptr<MidiSource>
4360 Session::midi_source_by_path (const std::string& path) const
4362 /* Restricted to MIDI files because audio sources require a channel
4363 for unique identification, in addition to a path.
4366 Glib::Threads::Mutex::Lock lm (source_lock);
4368 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
4369 boost::shared_ptr<MidiSource> ms
4370 = boost::dynamic_pointer_cast<MidiSource>(s->second);
4371 boost::shared_ptr<FileSource> fs
4372 = boost::dynamic_pointer_cast<FileSource>(s->second);
4374 if (ms && fs && fs->path() == path) {
4379 return boost::shared_ptr<MidiSource>();
4383 Session::count_sources_by_origin (const string& path)
4386 Glib::Threads::Mutex::Lock lm (source_lock);
4388 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
4389 boost::shared_ptr<FileSource> fs
4390 = boost::dynamic_pointer_cast<FileSource>(i->second);
4392 if (fs && fs->origin() == path) {
4401 peak_file_helper (const string& peak_path, const string& file_path, const string& file_base, bool hash) {
4403 std::string checksum = Glib::Checksum::compute_checksum(Glib::Checksum::CHECKSUM_SHA1, file_path + G_DIR_SEPARATOR + file_base);
4404 return Glib::build_filename (peak_path, checksum + peakfile_suffix);
4406 return Glib::build_filename (peak_path, file_base + peakfile_suffix);
4411 Session::construct_peak_filepath (const string& filepath, const bool in_session, const bool old_peak_name) const
4413 string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
4415 if (Glib::path_is_absolute (filepath)) {
4417 /* rip the session dir from the audiofile source */
4419 string session_path;
4420 bool in_another_session = true;
4422 if (filepath.find (interchange_dir_string) != string::npos) {
4424 session_path = Glib::path_get_dirname (filepath); /* now ends in audiofiles */
4425 session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
4426 session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
4427 session_path = Glib::path_get_dirname (session_path); /* now has session path */
4429 /* see if it is within our session */
4431 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4432 if (i->path == session_path) {
4433 in_another_session = false;
4438 in_another_session = false;
4442 if (in_another_session) {
4443 SessionDirectory sd (session_path);
4444 return peak_file_helper (sd.peak_path(), "", Glib::path_get_basename (filepath), !old_peak_name);
4448 /* 1) if file belongs to this session
4449 * it may be a relative path (interchange/...)
4450 * or just basename (session_state, remove source)
4451 * -> just use the basename
4453 std::string filename = Glib::path_get_basename (filepath);
4456 /* 2) if the file is outside our session dir:
4457 * (imported but not copied) add the path for check-summming */
4459 path = Glib::path_get_dirname (filepath);
4462 return peak_file_helper (_session_dir->peak_path(), path, Glib::path_get_basename (filepath), !old_peak_name);
4466 Session::new_audio_source_path_for_embedded (const std::string& path)
4470 * we know that the filename is already unique because it exists
4471 * out in the filesystem.
4473 * However, when we bring it into the session, we could get a
4476 * Eg. two embedded files:
4481 * When merged into session, these collide.
4483 * There will not be a conflict with in-memory sources
4484 * because when the source was created we already picked
4485 * a unique name for it.
4487 * This collision is not likely to be common, but we have to guard
4488 * against it. So, if there is a collision, take the md5 hash of the
4489 * the path, and use that as the filename instead.
4492 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4493 string base = Glib::path_get_basename (path);
4494 string newpath = Glib::build_filename (sdir.sound_path(), base);
4496 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4500 md5.digestString (path.c_str());
4501 md5.writeToString ();
4502 base = md5.digestChars;
4504 string ext = get_suffix (path);
4511 newpath = Glib::build_filename (sdir.sound_path(), base);
4513 /* if this collides, we're screwed */
4515 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4516 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
4525 /** Return true if there are no audio file sources that use @param name as
4526 * the filename component of their path.
4528 * Return false otherwise.
4530 * This method MUST ONLY be used to check in-session, mono files since it
4531 * hard-codes the channel of the audio file source we are looking for as zero.
4533 * If/when Ardour supports native files in non-mono formats, the logic here
4534 * will need to be revisited.
4537 Session::audio_source_name_is_unique (const string& name)
4539 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
4540 vector<space_and_path>::iterator i;
4541 uint32_t existing = 0;
4543 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4545 /* note that we search *without* the extension so that
4546 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
4547 in the event that this new name is required for
4548 a file format change.
4551 const string spath = *i;
4553 if (matching_unsuffixed_filename_exists_in (spath, name)) {
4558 /* it is possible that we have the path already
4559 * assigned to a source that has not yet been written
4560 * (ie. the write source for a diskstream). we have to
4561 * check this in order to make sure that our candidate
4562 * path isn't used again, because that can lead to
4563 * two Sources point to the same file with different
4564 * notions of their removability.
4568 string possible_path = Glib::build_filename (spath, name);
4570 if (audio_source_by_path_and_channel (possible_path, 0)) {
4576 return (existing == 0);
4580 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)
4583 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4585 if (Profile->get_trx() && destructive) {
4587 sstr << setfill ('0') << setw (4) << cnt;
4588 sstr << legalized_base;
4590 sstr << legalized_base;
4592 if (take_required || related_exists) {
4604 } else if (nchan > 2) {
4609 /* XXX what? more than 26 channels! */
4620 /** Return a unique name based on \a base for a new internal audio source */
4622 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
4625 string possible_name;
4626 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
4628 bool some_related_source_name_exists = false;
4630 legalized = legalize_for_path (base);
4632 // Find a "version" of the base name that doesn't exist in any of the possible directories.
4634 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
4636 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
4638 if (audio_source_name_is_unique (possible_name)) {
4642 some_related_source_name_exists = true;
4645 error << string_compose(
4646 _("There are already %1 recordings for %2, which I consider too many."),
4647 limit, base) << endmsg;
4649 throw failed_constructor();
4653 /* We've established that the new name does not exist in any session
4654 * directory, so now find out which one we should use for this new
4658 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4660 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
4665 /** Return a unique name based on `base` for a new internal MIDI source */
4667 Session::new_midi_source_path (const string& base)
4670 char buf[PATH_MAX+1];
4671 const uint32_t limit = 10000;
4673 string possible_path;
4674 string possible_name;
4677 legalized = legalize_for_path (base);
4679 // Find a "version" of the file name that doesn't exist in any of the possible directories.
4680 std::vector<string> sdirs = source_search_path(DataType::MIDI);
4682 /* - the main session folder is the first in the vector.
4683 * - after checking all locations for file-name uniqueness,
4684 * we keep the one from the last iteration as new file name
4685 * - midi files are small and should just be kept in the main session-folder
4687 * -> reverse the array, check main session folder last and use that as location
4690 std::reverse(sdirs.begin(), sdirs.end());
4692 for (cnt = 1; cnt <= limit; ++cnt) {
4694 vector<space_and_path>::iterator i;
4695 uint32_t existing = 0;
4697 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4699 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
4700 possible_name = buf;
4702 possible_path = Glib::build_filename (*i, possible_name);
4704 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
4708 if (midi_source_by_path (possible_path)) {
4713 if (existing == 0) {
4718 error << string_compose(
4719 _("There are already %1 recordings for %2, which I consider too many."),
4720 limit, base) << endmsg;
4726 /* No need to "find best location" for software/app-based RAID, because
4727 MIDI is so small that we always put it in the same place.
4730 return possible_path;
4734 /** Create a new within-session audio source */
4735 boost::shared_ptr<AudioFileSource>
4736 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
4738 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
4740 if (!path.empty()) {
4741 return boost::dynamic_pointer_cast<AudioFileSource> (
4742 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate(), true, true));
4744 throw failed_constructor ();
4748 /** Create a new within-session MIDI source */
4749 boost::shared_ptr<MidiSource>
4750 Session::create_midi_source_for_session (string const & basic_name)
4752 const string path = new_midi_source_path (basic_name);
4754 if (!path.empty()) {
4755 return boost::dynamic_pointer_cast<SMFSource> (
4756 SourceFactory::createWritable (
4757 DataType::MIDI, *this, path, false, frame_rate()));
4759 throw failed_constructor ();
4763 /** Create a new within-session MIDI source */
4764 boost::shared_ptr<MidiSource>
4765 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
4767 /* the caller passes in the track the source will be used in,
4768 so that we can keep the numbering sane.
4770 Rationale: a track with the name "Foo" that has had N
4771 captures carried out so far will ALREADY have a write source
4772 named "Foo-N+1.mid" waiting to be used for the next capture.
4774 If we call new_midi_source_name() we will get "Foo-N+2". But
4775 there is no region corresponding to "Foo-N+1", so when
4776 "Foo-N+2" appears in the track, the gap presents the user
4777 with odd behaviour - why did it skip past Foo-N+1?
4779 We could explain this to the user in some odd way, but
4780 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
4783 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
4786 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
4788 std::string name = track->steal_write_source_name ();
4791 return boost::shared_ptr<MidiSource>();
4794 /* MIDI files are small, just put them in the first location of the
4795 session source search path.
4798 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
4800 return boost::dynamic_pointer_cast<SMFSource> (
4801 SourceFactory::createWritable (
4802 DataType::MIDI, *this, path, false, frame_rate()));
4807 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
4809 if (playlist->hidden()) {
4813 playlists->add (playlist);
4816 playlist->release();
4823 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
4825 if (_state_of_the_state & Deletion) {
4829 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
4835 playlists->remove (playlist);
4841 Session::set_audition (boost::shared_ptr<Region> r)
4843 pending_audition_region = r;
4844 add_post_transport_work (PostTransportAudition);
4845 _butler->schedule_transport_work ();
4849 Session::audition_playlist ()
4851 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4852 ev->region.reset ();
4857 Session::non_realtime_set_audition ()
4859 assert (pending_audition_region);
4860 auditioner->audition_region (pending_audition_region);
4861 pending_audition_region.reset ();
4862 AuditionActive (true); /* EMIT SIGNAL */
4866 Session::audition_region (boost::shared_ptr<Region> r)
4868 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4874 Session::cancel_audition ()
4879 if (auditioner->auditioning()) {
4880 auditioner->cancel_audition ();
4881 AuditionActive (false); /* EMIT SIGNAL */
4886 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
4888 if (a->is_monitor()) {
4891 if (b->is_monitor()) {
4894 return a->order_key () < b->order_key ();
4898 Session::is_auditioning () const
4900 /* can be called before we have an auditioner object */
4902 return auditioner->auditioning();
4909 Session::graph_reordered ()
4911 /* don't do this stuff if we are setting up connections
4912 from a set_state() call or creating new tracks. Ditto for deletion.
4915 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _reconnecting_routes_in_progress || _route_deletion_in_progress) {
4919 /* every track/bus asked for this to be handled but it was deferred because
4920 we were connecting. do it now.
4923 request_input_change_handling ();
4927 /* force all diskstreams to update their capture offset values to
4928 reflect any changes in latencies within the graph.
4931 boost::shared_ptr<RouteList> rl = routes.reader ();
4932 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4933 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4935 tr->set_capture_offset ();
4940 /** @return Number of frames that there is disk space available to write,
4943 boost::optional<framecnt_t>
4944 Session::available_capture_duration ()
4946 Glib::Threads::Mutex::Lock lm (space_lock);
4948 if (_total_free_4k_blocks_uncertain) {
4949 return boost::optional<framecnt_t> ();
4952 float sample_bytes_on_disk = 4.0; // keep gcc happy
4954 switch (config.get_native_file_data_format()) {
4956 sample_bytes_on_disk = 4.0;
4960 sample_bytes_on_disk = 3.0;
4964 sample_bytes_on_disk = 2.0;
4968 /* impossible, but keep some gcc versions happy */
4969 fatal << string_compose (_("programming error: %1"),
4970 X_("illegal native file data format"))
4972 abort(); /*NOTREACHED*/
4975 double scale = 4096.0 / sample_bytes_on_disk;
4977 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
4978 return max_framecnt;
4981 return (framecnt_t) floor (_total_free_4k_blocks * scale);
4985 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
4988 RCUWriter<BundleList> writer (_bundles);
4989 boost::shared_ptr<BundleList> b = writer.get_copy ();
4990 b->push_back (bundle);
4994 BundleAddedOrRemoved (); /* EMIT SIGNAL */
5001 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
5003 bool removed = false;
5006 RCUWriter<BundleList> writer (_bundles);
5007 boost::shared_ptr<BundleList> b = writer.get_copy ();
5008 BundleList::iterator i = find (b->begin(), b->end(), bundle);
5010 if (i != b->end()) {
5017 BundleAddedOrRemoved (); /* EMIT SIGNAL */
5023 boost::shared_ptr<Bundle>
5024 Session::bundle_by_name (string name) const
5026 boost::shared_ptr<BundleList> b = _bundles.reader ();
5028 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
5029 if ((*i)->name() == name) {
5034 return boost::shared_ptr<Bundle> ();
5038 Session::tempo_map_changed (const PropertyChange&)
5042 playlists->update_after_tempo_map_change ();
5044 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
5050 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
5052 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
5053 (*i)->recompute_frames_from_bbt ();
5057 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
5058 * the given count with the current block size.
5061 Session::ensure_buffers (ChanCount howmany)
5063 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
5067 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
5069 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5070 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
5075 Session::next_insert_id ()
5077 /* this doesn't really loop forever. just think about it */
5080 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
5081 if (!insert_bitset[n]) {
5082 insert_bitset[n] = true;
5088 /* none available, so resize and try again */
5090 insert_bitset.resize (insert_bitset.size() + 16, false);
5095 Session::next_send_id ()
5097 /* this doesn't really loop forever. just think about it */
5100 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
5101 if (!send_bitset[n]) {
5102 send_bitset[n] = true;
5108 /* none available, so resize and try again */
5110 send_bitset.resize (send_bitset.size() + 16, false);
5115 Session::next_aux_send_id ()
5117 /* this doesn't really loop forever. just think about it */
5120 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
5121 if (!aux_send_bitset[n]) {
5122 aux_send_bitset[n] = true;
5128 /* none available, so resize and try again */
5130 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
5135 Session::next_return_id ()
5137 /* this doesn't really loop forever. just think about it */
5140 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
5141 if (!return_bitset[n]) {
5142 return_bitset[n] = true;
5148 /* none available, so resize and try again */
5150 return_bitset.resize (return_bitset.size() + 16, false);
5155 Session::mark_send_id (uint32_t id)
5157 if (id >= send_bitset.size()) {
5158 send_bitset.resize (id+16, false);
5160 if (send_bitset[id]) {
5161 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
5163 send_bitset[id] = true;
5167 Session::mark_aux_send_id (uint32_t id)
5169 if (id >= aux_send_bitset.size()) {
5170 aux_send_bitset.resize (id+16, false);
5172 if (aux_send_bitset[id]) {
5173 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
5175 aux_send_bitset[id] = true;
5179 Session::mark_return_id (uint32_t id)
5181 if (id >= return_bitset.size()) {
5182 return_bitset.resize (id+16, false);
5184 if (return_bitset[id]) {
5185 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
5187 return_bitset[id] = true;
5191 Session::mark_insert_id (uint32_t id)
5193 if (id >= insert_bitset.size()) {
5194 insert_bitset.resize (id+16, false);
5196 if (insert_bitset[id]) {
5197 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
5199 insert_bitset[id] = true;
5203 Session::unmark_send_id (uint32_t id)
5205 if (id < send_bitset.size()) {
5206 send_bitset[id] = false;
5211 Session::unmark_aux_send_id (uint32_t id)
5213 if (id < aux_send_bitset.size()) {
5214 aux_send_bitset[id] = false;
5219 Session::unmark_return_id (uint32_t id)
5221 if (id < return_bitset.size()) {
5222 return_bitset[id] = false;
5227 Session::unmark_insert_id (uint32_t id)
5229 if (id < insert_bitset.size()) {
5230 insert_bitset[id] = false;
5235 Session::reset_native_file_format ()
5237 boost::shared_ptr<RouteList> rl = routes.reader ();
5239 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5240 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5242 /* don't save state as we do this, there's no point
5244 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
5245 tr->reset_write_sources (false);
5246 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
5252 Session::route_name_unique (string n) const
5254 boost::shared_ptr<RouteList> r = routes.reader ();
5256 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5257 if ((*i)->name() == n) {
5266 Session::route_name_internal (string n) const
5268 if (auditioner && auditioner->name() == n) {
5272 if (_click_io && _click_io->name() == n) {
5280 Session::freeze_all (InterThreadInfo& itt)
5282 boost::shared_ptr<RouteList> r = routes.reader ();
5284 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5286 boost::shared_ptr<Track> t;
5288 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
5289 /* XXX this is wrong because itt.progress will keep returning to zero at the start
5299 boost::shared_ptr<Region>
5300 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
5301 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
5302 InterThreadInfo& itt,
5303 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
5304 bool for_export, bool for_freeze)
5306 boost::shared_ptr<Region> result;
5307 boost::shared_ptr<Playlist> playlist;
5308 boost::shared_ptr<Source> source;
5309 ChanCount diskstream_channels (track.n_channels());
5310 framepos_t position;
5311 framecnt_t this_chunk;
5313 framepos_t latency_skip;
5315 framepos_t len = end - start;
5316 bool need_block_size_reset = false;
5317 ChanCount const max_proc = track.max_processor_streams ();
5318 string legal_playlist_name;
5319 string possible_path;
5322 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
5323 end, start) << endmsg;
5327 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
5328 include_endpoint, for_export, for_freeze);
5330 if (diskstream_channels.n(track.data_type()) < 1) {
5331 error << _("Cannot write a range with no data.") << endmsg;
5335 // block all process callback handling
5337 block_processing ();
5340 // synchronize with AudioEngine::process_callback()
5341 // make sure processing is not currently running
5342 // and processing_blocked() is honored before
5343 // acquiring thread buffers
5344 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5347 _bounce_processing_active = true;
5349 /* call tree *MUST* hold route_lock */
5351 if ((playlist = track.playlist()) == 0) {
5355 legal_playlist_name = legalize_for_path (playlist->name());
5357 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
5359 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
5360 string path = ((track.data_type() == DataType::AUDIO)
5361 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
5362 : new_midi_source_path (legal_playlist_name));
5369 source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
5372 catch (failed_constructor& err) {
5373 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
5377 srcs.push_back (source);
5380 /* tell redirects that care that we are about to use a much larger
5381 * blocksize. this will flush all plugins too, so that they are ready
5382 * to be used for this process.
5385 need_block_size_reset = true;
5386 track.set_block_size (bounce_chunk_size);
5387 _engine.main_thread()->get_buffers ();
5391 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5393 /* create a set of reasonably-sized buffers */
5394 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5395 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
5397 buffers.set_count (max_proc);
5399 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5400 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5401 boost::shared_ptr<MidiSource> ms;
5403 afs->prepare_for_peakfile_writes ();
5404 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5405 Source::Lock lock(ms->mutex());
5406 ms->mark_streaming_write_started(lock);
5410 while (to_do && !itt.cancel) {
5412 this_chunk = min (to_do, bounce_chunk_size);
5414 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
5418 start += this_chunk;
5419 to_do -= this_chunk;
5420 itt.progress = (float) (1.0 - ((double) to_do / len));
5422 if (latency_skip >= bounce_chunk_size) {
5423 latency_skip -= bounce_chunk_size;
5427 const framecnt_t current_chunk = this_chunk - latency_skip;
5430 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5431 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5432 boost::shared_ptr<MidiSource> ms;
5435 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
5438 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5439 Source::Lock lock(ms->mutex());
5441 const MidiBuffer& buf = buffers.get_midi(0);
5442 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
5443 Evoral::Event<framepos_t> ev = *i;
5444 ev.set_time(ev.time() - position);
5445 ms->append_event_frames(lock, ev, ms->timeline_position());
5452 /* post-roll, pick up delayed processor output */
5453 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5455 while (latency_skip && !itt.cancel) {
5456 this_chunk = min (latency_skip, bounce_chunk_size);
5457 latency_skip -= this_chunk;
5459 buffers.silence (this_chunk, 0);
5460 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
5463 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5464 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5467 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
5479 xnow = localtime (&now);
5481 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
5482 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5483 boost::shared_ptr<MidiSource> ms;
5486 afs->update_header (position, *xnow, now);
5487 afs->flush_header ();
5488 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5489 Source::Lock lock(ms->mutex());
5490 ms->mark_streaming_write_completed(lock);
5494 /* construct a region to represent the bounced material */
5498 plist.add (Properties::start, 0);
5499 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
5500 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
5502 result = RegionFactory::create (srcs, plist);
5508 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5509 (*src)->mark_for_remove ();
5510 (*src)->drop_references ();
5514 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5515 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5518 afs->done_with_peakfile_writes ();
5522 _bounce_processing_active = false;
5524 if (need_block_size_reset) {
5525 _engine.main_thread()->drop_buffers ();
5526 track.set_block_size (get_block_size());
5529 unblock_processing ();
5535 Session::gain_automation_buffer() const
5537 return ProcessThread::gain_automation_buffer ();
5541 Session::trim_automation_buffer() const
5543 return ProcessThread::trim_automation_buffer ();
5547 Session::send_gain_automation_buffer() const
5549 return ProcessThread::send_gain_automation_buffer ();
5553 Session::pan_automation_buffer() const
5555 return ProcessThread::pan_automation_buffer ();
5559 Session::get_silent_buffers (ChanCount count)
5561 return ProcessThread::get_silent_buffers (count);
5565 Session::get_scratch_buffers (ChanCount count, bool silence)
5567 return ProcessThread::get_scratch_buffers (count, silence);
5571 Session::get_route_buffers (ChanCount count, bool silence)
5573 return ProcessThread::get_route_buffers (count, silence);
5578 Session::get_mix_buffers (ChanCount count)
5580 return ProcessThread::get_mix_buffers (count);
5584 Session::ntracks () const
5587 boost::shared_ptr<RouteList> r = routes.reader ();
5589 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5590 if (boost::dynamic_pointer_cast<Track> (*i)) {
5599 Session::nbusses () const
5602 boost::shared_ptr<RouteList> r = routes.reader ();
5604 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5605 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
5614 Session::add_automation_list(AutomationList *al)
5616 automation_lists[al->id()] = al;
5619 /** @return true if there is at least one record-enabled track, otherwise false */
5621 Session::have_rec_enabled_track () const
5623 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
5627 Session::have_rec_disabled_track () const
5629 return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
5632 /** Update the state of our rec-enabled tracks flag */
5634 Session::update_route_record_state ()
5636 boost::shared_ptr<RouteList> rl = routes.reader ();
5637 RouteList::iterator i = rl->begin();
5638 while (i != rl->end ()) {
5640 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5641 if (tr && tr->record_enabled ()) {
5648 int const old = g_atomic_int_get (&_have_rec_enabled_track);
5650 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
5652 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
5653 RecordStateChanged (); /* EMIT SIGNAL */
5656 for (i = rl->begin(); i != rl->end (); ++i) {
5657 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5658 if (tr && !tr->record_enabled ()) {
5663 g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
5665 bool record_arm_state_changed = (old != g_atomic_int_get (&_have_rec_enabled_track) );
5667 if (record_status() == Recording && record_arm_state_changed ) {
5668 RecordArmStateChanged ();
5674 Session::listen_position_changed ()
5676 boost::shared_ptr<RouteList> r = routes.reader ();
5678 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5679 (*i)->listen_position_changed ();
5684 Session::solo_control_mode_changed ()
5686 /* cancel all solo or all listen when solo control mode changes */
5689 set_solo (get_routes(), false);
5690 } else if (listening()) {
5691 set_listen (get_routes(), false);
5695 /** Called when a property of one of our route groups changes */
5697 Session::route_group_property_changed (RouteGroup* rg)
5699 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
5702 /** Called when a route is added to one of our route groups */
5704 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5706 RouteAddedToRouteGroup (rg, r);
5709 /** Called when a route is removed from one of our route groups */
5711 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5713 update_route_record_state ();
5714 RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
5717 boost::shared_ptr<RouteList>
5718 Session::get_tracks () const
5720 boost::shared_ptr<RouteList> rl = routes.reader ();
5721 boost::shared_ptr<RouteList> tl (new RouteList);
5723 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
5724 if (boost::dynamic_pointer_cast<Track> (*r)) {
5725 if (!(*r)->is_auditioner()) {
5733 boost::shared_ptr<RouteList>
5734 Session::get_routes_with_regions_at (framepos_t const p) const
5736 boost::shared_ptr<RouteList> r = routes.reader ();
5737 boost::shared_ptr<RouteList> rl (new RouteList);
5739 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5740 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5745 boost::shared_ptr<Playlist> pl = tr->playlist ();
5750 if (pl->has_region_at (p)) {
5759 Session::goto_end ()
5761 if (_session_range_location) {
5762 request_locate (_session_range_location->end(), false);
5764 request_locate (0, false);
5769 Session::goto_start ()
5771 if (_session_range_location) {
5772 request_locate (_session_range_location->start(), false);
5774 request_locate (0, false);
5779 Session::current_start_frame () const
5781 return _session_range_location ? _session_range_location->start() : 0;
5785 Session::current_end_frame () const
5787 return _session_range_location ? _session_range_location->end() : 0;
5791 Session::set_session_range_location (framepos_t start, framepos_t end)
5793 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
5794 _locations->add (_session_range_location);
5798 Session::step_edit_status_change (bool yn)
5804 send = (_step_editors == 0);
5809 send = (_step_editors == 1);
5812 if (_step_editors > 0) {
5818 StepEditStatusChange (val);
5824 Session::start_time_changed (framepos_t old)
5826 /* Update the auto loop range to match the session range
5827 (unless the auto loop range has been changed by the user)
5830 Location* s = _locations->session_range_location ();
5835 Location* l = _locations->auto_loop_location ();
5837 if (l && l->start() == old) {
5838 l->set_start (s->start(), true);
5843 Session::end_time_changed (framepos_t old)
5845 /* Update the auto loop range to match the session range
5846 (unless the auto loop range has been changed by the user)
5849 Location* s = _locations->session_range_location ();
5854 Location* l = _locations->auto_loop_location ();
5856 if (l && l->end() == old) {
5857 l->set_end (s->end(), true);
5861 std::vector<std::string>
5862 Session::source_search_path (DataType type) const
5866 if (session_dirs.size() == 1) {
5868 case DataType::AUDIO:
5869 sp.push_back (_session_dir->sound_path());
5871 case DataType::MIDI:
5872 sp.push_back (_session_dir->midi_path());
5876 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
5877 SessionDirectory sdir (i->path);
5879 case DataType::AUDIO:
5880 sp.push_back (sdir.sound_path());
5882 case DataType::MIDI:
5883 sp.push_back (sdir.midi_path());
5889 if (type == DataType::AUDIO) {
5890 const string sound_path_2X = _session_dir->sound_path_2X();
5891 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
5892 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
5893 sp.push_back (sound_path_2X);
5898 // now check the explicit (possibly user-specified) search path
5901 case DataType::AUDIO:
5902 sp += Searchpath(config.get_audio_search_path ());
5904 case DataType::MIDI:
5905 sp += Searchpath(config.get_midi_search_path ());
5913 Session::ensure_search_path_includes (const string& path, DataType type)
5922 case DataType::AUDIO:
5923 sp += Searchpath(config.get_audio_search_path ());
5925 case DataType::MIDI:
5926 sp += Searchpath (config.get_midi_search_path ());
5930 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
5931 /* No need to add this new directory if it has the same inode as
5932 an existing one; checking inode rather than name prevents duplicated
5933 directories when we are using symlinks.
5935 On Windows, I think we could just do if (*i == path) here.
5937 if (PBD::equivalent_paths (*i, path)) {
5945 case DataType::AUDIO:
5946 config.set_audio_search_path (sp.to_string());
5948 case DataType::MIDI:
5949 config.set_midi_search_path (sp.to_string());
5955 Session::remove_dir_from_search_path (const string& dir, DataType type)
5960 case DataType::AUDIO:
5961 sp = Searchpath(config.get_audio_search_path ());
5963 case DataType::MIDI:
5964 sp = Searchpath (config.get_midi_search_path ());
5971 case DataType::AUDIO:
5972 config.set_audio_search_path (sp.to_string());
5974 case DataType::MIDI:
5975 config.set_midi_search_path (sp.to_string());
5981 boost::shared_ptr<Speakers>
5982 Session::get_speakers()
5988 Session::unknown_processors () const
5992 boost::shared_ptr<RouteList> r = routes.reader ();
5993 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5994 list<string> t = (*i)->unknown_processors ();
5995 copy (t.begin(), t.end(), back_inserter (p));
6005 Session::update_latency (bool playback)
6007 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
6009 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
6013 boost::shared_ptr<RouteList> r = routes.reader ();
6014 framecnt_t max_latency = 0;
6017 /* reverse the list so that we work backwards from the last route to run to the first */
6018 RouteList* rl = routes.reader().get();
6019 r.reset (new RouteList (*rl));
6020 reverse (r->begin(), r->end());
6023 /* compute actual latency values for the given direction and store them all in per-port
6024 structures. this will also publish the same values (to JACK) so that computation of latency
6025 for routes can consistently use public latency values.
6028 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6029 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
6032 /* because we latency compensate playback, our published playback latencies should
6033 be the same for all output ports - all material played back by ardour has
6034 the same latency, whether its caused by plugins or by latency compensation. since
6035 these may differ from the values computed above, reset all playback port latencies
6039 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
6041 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6042 (*i)->set_public_port_latencies (max_latency, playback);
6047 post_playback_latency ();
6051 post_capture_latency ();
6054 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
6058 Session::post_playback_latency ()
6060 set_worst_playback_latency ();
6062 boost::shared_ptr<RouteList> r = routes.reader ();
6064 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6065 if (!(*i)->is_auditioner() && ((*i)->active())) {
6066 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
6070 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6071 (*i)->set_latency_compensation (_worst_track_latency);
6076 Session::post_capture_latency ()
6078 set_worst_capture_latency ();
6080 /* reflect any changes in capture latencies into capture offsets
6083 boost::shared_ptr<RouteList> rl = routes.reader();
6084 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
6085 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6087 tr->set_capture_offset ();
6093 Session::initialize_latencies ()
6096 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
6097 update_latency (false);
6098 update_latency (true);
6101 set_worst_io_latencies ();
6105 Session::set_worst_io_latencies ()
6107 set_worst_playback_latency ();
6108 set_worst_capture_latency ();
6112 Session::set_worst_playback_latency ()
6114 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6118 _worst_output_latency = 0;
6120 if (!_engine.connected()) {
6124 boost::shared_ptr<RouteList> r = routes.reader ();
6126 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6127 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
6130 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
6134 Session::set_worst_capture_latency ()
6136 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6140 _worst_input_latency = 0;
6142 if (!_engine.connected()) {
6146 boost::shared_ptr<RouteList> r = routes.reader ();
6148 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6149 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
6152 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
6156 Session::update_latency_compensation (bool force_whole_graph)
6158 bool some_track_latency_changed = false;
6160 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6164 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
6166 _worst_track_latency = 0;
6168 boost::shared_ptr<RouteList> r = routes.reader ();
6170 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6171 if (!(*i)->is_auditioner() && ((*i)->active())) {
6173 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
6174 some_track_latency_changed = true;
6176 _worst_track_latency = max (tl, _worst_track_latency);
6180 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
6181 (some_track_latency_changed ? "yes" : "no")));
6183 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
6185 if (some_track_latency_changed || force_whole_graph) {
6186 _engine.update_latencies ();
6190 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6191 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6195 tr->set_capture_offset ();
6200 Session::session_name_is_legal (const string& path)
6202 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
6204 for (int i = 0; illegal_chars[i]; ++i) {
6205 if (path.find (illegal_chars[i]) != string::npos) {
6206 return illegal_chars[i];
6214 Session::next_control_id () const
6218 /* the monitor bus remote ID is in a different
6219 * "namespace" than regular routes. its existence doesn't
6220 * affect normal (low) numbered routes.
6227 /* the same about masterbus in Waves Tracks */
6229 if (Profile->get_trx() && _master_out) {
6233 return nroutes() - subtract;
6237 Session::notify_remote_id_change ()
6239 if (deletion_in_progress()) {
6243 switch (Config->get_remote_model()) {
6245 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
6251 #ifdef USE_TRACKS_CODE_FEATURES
6252 /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
6253 * if track order has been changed by user
6255 reconnect_existing_routes(true, true);
6261 Session::sync_order_keys ()
6263 if (deletion_in_progress()) {
6267 /* tell everyone that something has happened to the sort keys
6268 and let them sync up with the change(s)
6269 this will give objects that manage the sort order keys the
6270 opportunity to keep them in sync if they wish to.
6273 DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
6275 reassign_track_numbers();
6277 Route::SyncOrderKeys (); /* EMIT SIGNAL */
6279 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
6283 Session::operation_in_progress (GQuark op) const
6285 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
6288 boost::shared_ptr<Port>
6289 Session::ltc_input_port () const
6291 return _ltc_input->nth (0);
6294 boost::shared_ptr<Port>
6295 Session::ltc_output_port () const
6297 return _ltc_output->nth (0);
6301 Session::reconnect_ltc_input ()
6305 string src = Config->get_ltc_source_port();
6307 _ltc_input->disconnect (this);
6309 if (src != _("None") && !src.empty()) {
6310 _ltc_input->nth (0)->connect (src);
6313 if ( ARDOUR::Profile->get_trx () ) {
6314 // Tracks need this signal to update timecode_source_dropdown
6315 MtcOrLtcInputPortChanged (); //emit signal
6321 Session::reconnect_ltc_output ()
6325 string src = Config->get_ltc_output_port();
6327 _ltc_output->disconnect (this);
6329 if (src != _("None") && !src.empty()) {
6330 _ltc_output->nth (0)->connect (src);
6336 Session::set_range_selection (framepos_t start, framepos_t end)
6338 _range_selection = Evoral::Range<framepos_t> (start, end);
6339 #ifdef USE_TRACKS_CODE_FEATURES
6340 follow_playhead_priority ();
6345 Session::set_object_selection (framepos_t start, framepos_t end)
6347 _object_selection = Evoral::Range<framepos_t> (start, end);
6348 #ifdef USE_TRACKS_CODE_FEATURES
6349 follow_playhead_priority ();
6354 Session::clear_range_selection ()
6356 _range_selection = Evoral::Range<framepos_t> (-1,-1);
6357 #ifdef USE_TRACKS_CODE_FEATURES
6358 follow_playhead_priority ();
6363 Session::clear_object_selection ()
6365 _object_selection = Evoral::Range<framepos_t> (-1,-1);
6366 #ifdef USE_TRACKS_CODE_FEATURES
6367 follow_playhead_priority ();