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 /* shutdown control surface protocols while we still have ports
555 and the engine to move data to any devices.
558 ControlProtocolManager::instance().drop_protocols ();
560 _engine.remove_session ();
562 #ifdef USE_TRACKS_CODE_FEATURES
563 EngineStateController::instance()->remove_session();
566 /* deregister all ports - there will be no process or any other
567 * callbacks from the engine any more.
570 Port::PortDrop (); /* EMIT SIGNAL */
574 /* clear history so that no references to objects are held any more */
578 /* clear state tree so that no references to objects are held any more */
583 /* reset dynamic state version back to default */
585 Stateful::loading_state_version = 0;
587 _butler->drop_references ();
591 delete _all_route_group;
593 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
594 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
598 if (click_data != default_click) {
599 delete [] click_data;
602 if (click_emphasis_data != default_click_emphasis) {
603 delete [] click_emphasis_data;
608 /* need to remove auditioner before monitoring section
609 * otherwise it is re-connected */
612 /* drop references to routes held by the monitoring section
613 * specifically _monitor_out aux/listen references */
614 remove_monitor_section();
616 /* clear out any pending dead wood from RCU managed objects */
621 AudioDiskstream::free_working_buffers();
623 /* tell everyone who is still standing that we're about to die */
626 /* tell everyone to drop references and delete objects as we go */
628 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
629 RegionFactory::delete_all_regions ();
631 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
633 /* reset these three references to special routes before we do the usual route delete thing */
635 _master_out.reset ();
636 _monitor_out.reset ();
639 RCUWriter<RouteList> writer (routes);
640 boost::shared_ptr<RouteList> r = writer.get_copy ();
642 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
643 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
644 (*i)->drop_references ();
648 /* writer goes out of scope and updates master */
653 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
654 Glib::Threads::Mutex::Lock lm (source_lock);
655 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
656 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
657 i->second->drop_references ();
663 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
666 emit_thread_terminate ();
668 pthread_cond_destroy (&_rt_emit_cond);
669 pthread_mutex_destroy (&_rt_emit_mutex);
671 delete _scene_changer; _scene_changer = 0;
672 delete midi_control_ui; midi_control_ui = 0;
674 delete _mmc; _mmc = 0;
675 delete _midi_ports; _midi_ports = 0;
676 delete _locations; _locations = 0;
680 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
682 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
683 boost_debug_list_ptrs ();
688 Session::setup_ltc ()
692 _ltc_input.reset (new IO (*this, X_("LTC In"), IO::Input));
693 _ltc_output.reset (new IO (*this, X_("LTC Out"), IO::Output));
695 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC In"))) != 0) {
696 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
699 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
700 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
702 reconnect_ltc_input ();
705 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC Out"))) != 0) {
706 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
709 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
710 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
712 reconnect_ltc_output ();
715 /* fix up names of LTC ports because we don't want the normal
716 * IO style of NAME/TYPE-{in,out}N
719 _ltc_input->nth (0)->set_name (X_("LTC-in"));
720 _ltc_output->nth (0)->set_name (X_("LTC-out"));
724 Session::setup_click ()
727 _click_io.reset (new ClickIO (*this, X_("Click")));
728 _click_gain.reset (new Amp (*this));
729 _click_gain->activate ();
731 setup_click_state (state_tree->root());
733 setup_click_state (0);
738 Session::setup_click_state (const XMLNode* node)
740 const XMLNode* child = 0;
742 if (node && (child = find_named_node (*node, "Click")) != 0) {
744 /* existing state for Click */
747 if (Stateful::loading_state_version < 3000) {
748 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
750 const XMLNodeList& children (child->children());
751 XMLNodeList::const_iterator i = children.begin();
752 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
754 if (i != children.end()) {
755 c = _click_gain->set_state (**i, Stateful::loading_state_version);
761 _clicking = Config->get_clicking ();
765 error << _("could not setup Click I/O") << endmsg;
772 /* default state for Click: dual-mono to first 2 physical outputs */
775 _engine.get_physical_outputs (DataType::AUDIO, outs);
777 for (uint32_t physport = 0; physport < 2; ++physport) {
778 if (outs.size() > physport) {
779 if (_click_io->add_port (outs[physport], this)) {
780 // relax, even though its an error
785 if (_click_io->n_ports () > ChanCount::ZERO) {
786 _clicking = Config->get_clicking ();
792 Session::setup_bundles ()
796 RCUWriter<BundleList> writer (_bundles);
797 boost::shared_ptr<BundleList> b = writer.get_copy ();
798 for (BundleList::iterator i = b->begin(); i != b->end();) {
799 if (boost::dynamic_pointer_cast<UserBundle>(*i)) {
807 vector<string> inputs[DataType::num_types];
808 vector<string> outputs[DataType::num_types];
809 for (uint32_t i = 0; i < DataType::num_types; ++i) {
810 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
811 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
814 /* Create a set of Bundle objects that map
815 to the physical I/O currently available. We create both
816 mono and stereo bundles, so that the common cases of mono
817 and stereo tracks get bundles to put in their mixer strip
818 in / out menus. There may be a nicer way of achieving that;
819 it doesn't really scale that well to higher channel counts
822 /* mono output bundles */
824 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
826 std::string pn = _engine.get_pretty_name_by_name (outputs[DataType::AUDIO][np]);
828 snprintf (buf, sizeof (buf), _("out %s"), pn.c_str());
830 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
833 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
834 c->add_channel (_("mono"), DataType::AUDIO);
835 c->set_port (0, outputs[DataType::AUDIO][np]);
837 add_bundle (c, false);
840 /* stereo output bundles */
842 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
843 if (np + 1 < outputs[DataType::AUDIO].size()) {
845 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
846 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
847 c->add_channel (_("L"), DataType::AUDIO);
848 c->set_port (0, outputs[DataType::AUDIO][np]);
849 c->add_channel (_("R"), DataType::AUDIO);
850 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
852 add_bundle (c, false);
856 /* mono input bundles */
858 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
860 std::string pn = _engine.get_pretty_name_by_name (inputs[DataType::AUDIO][np]);
862 snprintf (buf, sizeof (buf), _("in %s"), pn.c_str());
864 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
867 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
868 c->add_channel (_("mono"), DataType::AUDIO);
869 c->set_port (0, inputs[DataType::AUDIO][np]);
871 add_bundle (c, false);
874 /* stereo input bundles */
876 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
877 if (np + 1 < inputs[DataType::AUDIO].size()) {
879 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
881 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
882 c->add_channel (_("L"), DataType::AUDIO);
883 c->set_port (0, inputs[DataType::AUDIO][np]);
884 c->add_channel (_("R"), DataType::AUDIO);
885 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
887 add_bundle (c, false);
891 /* MIDI input bundles */
893 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
894 string n = inputs[DataType::MIDI][np];
895 std::string pn = _engine.get_pretty_name_by_name (n);
899 boost::erase_first (n, X_("alsa_pcm:"));
901 boost::shared_ptr<Bundle> c (new Bundle (n, false));
902 c->add_channel ("", DataType::MIDI);
903 c->set_port (0, inputs[DataType::MIDI][np]);
904 add_bundle (c, false);
907 /* MIDI output bundles */
909 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
910 string n = outputs[DataType::MIDI][np];
911 std::string pn = _engine.get_pretty_name_by_name (n);
915 boost::erase_first (n, X_("alsa_pcm:"));
917 boost::shared_ptr<Bundle> c (new Bundle (n, true));
918 c->add_channel ("", DataType::MIDI);
919 c->set_port (0, outputs[DataType::MIDI][np]);
920 add_bundle (c, false);
923 // we trust the backend to only calls us if there's a change
924 BundleAddedOrRemoved (); /* EMIT SIGNAL */
928 Session::auto_connect_master_bus ()
930 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
934 // Waves Tracks: Do not connect master bas for Tracks if AutoConnectMaster option is not set
935 // In this case it means "Multi Out" output mode
936 if (ARDOUR::Profile->get_trx() && !(Config->get_output_auto_connect() & AutoConnectMaster) ) {
940 /* if requested auto-connect the outputs to the first N physical ports.
943 uint32_t limit = _master_out->n_outputs().n_total();
944 vector<string> outputs[DataType::num_types];
946 for (uint32_t i = 0; i < DataType::num_types; ++i) {
947 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
950 for (uint32_t n = 0; n < limit; ++n) {
951 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
953 if (outputs[p->type()].size() > n) {
954 connect_to = outputs[p->type()][n];
957 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
958 if (_master_out->output()->connect (p, connect_to, this)) {
959 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
968 Session::remove_monitor_section ()
970 if (!_monitor_out || Profile->get_trx()) {
974 /* force reversion to Solo-In-Place */
975 Config->set_solo_control_is_listen_control (false);
977 /* if we are auditioning, cancel it ... this is a workaround
978 to a problem (auditioning does not execute the process graph,
979 which is needed to remove routes when using >1 core for processing)
984 /* Hold process lock while doing this so that we don't hear bits and
985 * pieces of audio as we work on each route.
988 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
990 /* Connect tracks to monitor section. Note that in an
991 existing session, the internal sends will already exist, but we want the
992 routes to notice that they connect to the control out specifically.
996 boost::shared_ptr<RouteList> r = routes.reader ();
997 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
999 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
1001 if ((*x)->is_monitor()) {
1003 } else if ((*x)->is_master()) {
1006 (*x)->remove_aux_or_listen (_monitor_out);
1011 remove_route (_monitor_out);
1012 auto_connect_master_bus ();
1015 auditioner->connect ();
1020 Session::add_monitor_section ()
1024 if (_monitor_out || !_master_out || Profile->get_trx()) {
1028 boost::shared_ptr<Route> r (new Route (*this, _("Monitor"), Route::MonitorOut, DataType::AUDIO));
1034 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1035 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
1038 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1039 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1040 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1042 error << _("Cannot create monitor section. 'Monitor' Port name is not unique.") << endmsg;
1047 add_routes (rl, false, false, false);
1049 assert (_monitor_out);
1051 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
1052 are undefined, at best.
1055 uint32_t limit = _monitor_out->n_inputs().n_audio();
1059 /* connect the inputs to the master bus outputs. this
1060 * represents a separate data feed from the internal sends from
1061 * each route. as of jan 2011, it allows the monitor section to
1062 * conditionally ignore either the internal sends or the normal
1063 * input feed, but we should really find a better way to do
1067 _master_out->output()->disconnect (this);
1069 for (uint32_t n = 0; n < limit; ++n) {
1070 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1071 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1074 string connect_to = o->name();
1075 if (_monitor_out->input()->connect (p, connect_to, this)) {
1076 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1084 /* if monitor section is not connected, connect it to physical outs
1087 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
1089 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1091 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1094 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1096 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1097 Config->get_monitor_bus_preferred_bundle())
1103 /* Monitor bus is audio only */
1105 vector<string> outputs[DataType::num_types];
1107 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1108 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1111 uint32_t mod = outputs[DataType::AUDIO].size();
1112 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1116 for (uint32_t n = 0; n < limit; ++n) {
1118 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1120 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1121 connect_to = outputs[DataType::AUDIO][n % mod];
1124 if (!connect_to.empty()) {
1125 if (_monitor_out->output()->connect (p, connect_to, this)) {
1126 error << string_compose (
1127 _("cannot connect control output %1 to %2"),
1138 /* Hold process lock while doing this so that we don't hear bits and
1139 * pieces of audio as we work on each route.
1142 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1144 /* Connect tracks to monitor section. Note that in an
1145 existing session, the internal sends will already exist, but we want the
1146 routes to notice that they connect to the control out specifically.
1150 boost::shared_ptr<RouteList> rls = routes.reader ();
1152 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1154 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1156 if ((*x)->is_monitor()) {
1158 } else if ((*x)->is_master()) {
1161 (*x)->enable_monitor_send ();
1166 auditioner->connect ();
1171 Session::reset_monitor_section ()
1173 /* Process lock should be held by the caller.*/
1175 if (!_monitor_out || Profile->get_trx()) {
1179 uint32_t limit = _master_out->n_outputs().n_audio();
1181 /* connect the inputs to the master bus outputs. this
1182 * represents a separate data feed from the internal sends from
1183 * each route. as of jan 2011, it allows the monitor section to
1184 * conditionally ignore either the internal sends or the normal
1185 * input feed, but we should really find a better way to do
1189 _master_out->output()->disconnect (this);
1190 _monitor_out->output()->disconnect (this);
1192 _monitor_out->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1193 _monitor_out->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1195 for (uint32_t n = 0; n < limit; ++n) {
1196 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1197 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1200 string connect_to = o->name();
1201 if (_monitor_out->input()->connect (p, connect_to, this)) {
1202 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1209 /* connect monitor section to physical outs
1212 if (Config->get_auto_connect_standard_busses()) {
1214 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1216 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1219 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1221 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1222 Config->get_monitor_bus_preferred_bundle())
1228 /* Monitor bus is audio only */
1230 vector<string> outputs[DataType::num_types];
1232 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1233 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1236 uint32_t mod = outputs[DataType::AUDIO].size();
1237 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1241 for (uint32_t n = 0; n < limit; ++n) {
1243 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1245 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1246 connect_to = outputs[DataType::AUDIO][n % mod];
1249 if (!connect_to.empty()) {
1250 if (_monitor_out->output()->connect (p, connect_to, this)) {
1251 error << string_compose (
1252 _("cannot connect control output %1 to %2"),
1263 /* Connect tracks to monitor section. Note that in an
1264 existing session, the internal sends will already exist, but we want the
1265 routes to notice that they connect to the control out specifically.
1269 boost::shared_ptr<RouteList> rls = routes.reader ();
1271 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1273 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1275 if ((*x)->is_monitor()) {
1277 } else if ((*x)->is_master()) {
1280 (*x)->enable_monitor_send ();
1286 Session::hookup_io ()
1288 /* stop graph reordering notifications from
1289 causing resorts, etc.
1292 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
1296 /* we delay creating the auditioner till now because
1297 it makes its own connections to ports.
1301 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
1303 throw failed_constructor ();
1305 a->use_new_diskstream ();
1309 catch (failed_constructor& err) {
1310 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
1314 /* load bundles, which we may have postponed earlier on */
1315 if (_bundle_xml_node) {
1316 load_bundles (*_bundle_xml_node);
1317 delete _bundle_xml_node;
1320 /* Tell all IO objects to connect themselves together */
1322 IO::enable_connecting ();
1324 /* Now tell all "floating" ports to connect to whatever
1325 they should be connected to.
1328 AudioEngine::instance()->reconnect_ports ();
1330 /* Anyone who cares about input state, wake up and do something */
1332 IOConnectionsComplete (); /* EMIT SIGNAL */
1334 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
1336 /* now handle the whole enchilada as if it was one
1337 graph reorder event.
1342 /* update the full solo state, which can't be
1343 correctly determined on a per-route basis, but
1344 needs the global overview that only the session
1348 update_route_solo_state ();
1352 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
1354 boost::shared_ptr<Track> track = wp.lock ();
1359 boost::shared_ptr<Playlist> playlist;
1361 if ((playlist = track->playlist()) != 0) {
1362 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
1363 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
1364 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
1369 Session::record_enabling_legal () const
1371 /* this used to be in here, but survey says.... we don't need to restrict it */
1372 // if (record_status() == Recording) {
1376 if (Config->get_all_safe()) {
1383 Session::set_track_monitor_input_status (bool yn)
1385 boost::shared_ptr<RouteList> rl = routes.reader ();
1386 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1387 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1388 if (tr && tr->record_enabled ()) {
1389 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1390 tr->request_input_monitoring (yn);
1396 Session::auto_punch_start_changed (Location* location)
1398 replace_event (SessionEvent::PunchIn, location->start());
1400 if (get_record_enabled() && config.get_punch_in()) {
1401 /* capture start has been changed, so save new pending state */
1402 save_state ("", true);
1407 Session::auto_punch_end_changed (Location* location)
1409 framepos_t when_to_stop = location->end();
1410 // when_to_stop += _worst_output_latency + _worst_input_latency;
1411 replace_event (SessionEvent::PunchOut, when_to_stop);
1415 Session::auto_punch_changed (Location* location)
1417 framepos_t when_to_stop = location->end();
1419 replace_event (SessionEvent::PunchIn, location->start());
1420 //when_to_stop += _worst_output_latency + _worst_input_latency;
1421 replace_event (SessionEvent::PunchOut, when_to_stop);
1424 /** @param loc A loop location.
1425 * @param pos Filled in with the start time of the required fade-out (in session frames).
1426 * @param length Filled in with the length of the required fade-out.
1429 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
1431 pos = max (loc->start(), loc->end() - 64);
1432 length = loc->end() - pos;
1436 Session::auto_loop_changed (Location* location)
1438 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1441 auto_loop_declick_range (location, dcp, dcl);
1443 if (transport_rolling() && play_loop) {
1445 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1447 // if (_transport_frame > location->end()) {
1449 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1450 // relocate to beginning of loop
1451 clear_events (SessionEvent::LocateRoll);
1453 request_locate (location->start(), true);
1456 else if (Config->get_seamless_loop() && !loop_changing) {
1458 // schedule a locate-roll to refill the diskstreams at the
1459 // previous loop end
1460 loop_changing = true;
1462 if (location->end() > last_loopend) {
1463 clear_events (SessionEvent::LocateRoll);
1464 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1470 clear_events (SessionEvent::AutoLoopDeclick);
1471 clear_events (SessionEvent::AutoLoop);
1474 /* possibly move playhead if not rolling; if we are rolling we'll move
1475 to the loop start on stop if that is appropriate.
1480 if (!transport_rolling() && select_playhead_priority_target (pos)) {
1481 if (pos == location->start()) {
1482 request_locate (pos);
1487 last_loopend = location->end();
1492 Session::set_auto_punch_location (Location* location)
1496 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1497 punch_connections.drop_connections();
1498 existing->set_auto_punch (false, this);
1499 remove_event (existing->start(), SessionEvent::PunchIn);
1500 clear_events (SessionEvent::PunchOut);
1501 auto_punch_location_changed (0);
1506 if (location == 0) {
1510 if (location->end() <= location->start()) {
1511 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1515 punch_connections.drop_connections ();
1517 location->StartChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, location));
1518 location->EndChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, location));
1519 location->Changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, location));
1521 location->set_auto_punch (true, this);
1523 auto_punch_changed (location);
1525 auto_punch_location_changed (location);
1529 Session::set_session_extents (framepos_t start, framepos_t end)
1532 if ((existing = _locations->session_range_location()) == 0) {
1533 //if there is no existing session, we need to make a new session location (should never happen)
1534 existing = new Location (*this, 0, 0, _("session"), Location::IsSessionRange);
1538 error << _("Session: you can't use that location for session start/end)") << endmsg;
1542 existing->set( start, end );
1548 Session::set_auto_loop_location (Location* location)
1552 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1553 loop_connections.drop_connections ();
1554 existing->set_auto_loop (false, this);
1555 remove_event (existing->end(), SessionEvent::AutoLoop);
1558 auto_loop_declick_range (existing, dcp, dcl);
1559 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1560 auto_loop_location_changed (0);
1565 if (location == 0) {
1569 if (location->end() <= location->start()) {
1570 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1574 last_loopend = location->end();
1576 loop_connections.drop_connections ();
1578 location->StartChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1579 location->EndChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1580 location->Changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1581 location->FlagsChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1583 location->set_auto_loop (true, this);
1585 if (Config->get_loop_is_mode() && play_loop && Config->get_seamless_loop()) {
1586 // set all tracks to use internal looping
1587 boost::shared_ptr<RouteList> rl = routes.reader ();
1588 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1589 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1590 if (tr && !tr->hidden()) {
1591 tr->set_loop (location);
1596 /* take care of our stuff first */
1598 auto_loop_changed (location);
1600 /* now tell everyone else */
1602 auto_loop_location_changed (location);
1606 Session::update_marks (Location*)
1612 Session::update_skips (Location* loc, bool consolidate)
1614 if (_ignore_skips_updates) {
1618 Locations::LocationList skips;
1621 PBD::Unwinder<bool> uw (_ignore_skips_updates, true);
1622 consolidate_skips (loc);
1625 sync_locations_to_skips ();
1631 Session::consolidate_skips (Location* loc)
1633 Locations::LocationList all_locations = _locations->list ();
1635 for (Locations::LocationList::iterator l = all_locations.begin(); l != all_locations.end(); ) {
1637 if (!(*l)->is_skip ()) {
1642 /* don't test against self */
1649 switch (Evoral::coverage ((*l)->start(), (*l)->end(), loc->start(), loc->end())) {
1650 case Evoral::OverlapInternal:
1651 case Evoral::OverlapExternal:
1652 case Evoral::OverlapStart:
1653 case Evoral::OverlapEnd:
1654 /* adjust new location to cover existing one */
1655 loc->set_start (min (loc->start(), (*l)->start()));
1656 loc->set_end (max (loc->end(), (*l)->end()));
1657 /* we don't need this one any more */
1658 _locations->remove (*l);
1659 /* the location has been deleted, so remove reference to it in our local list */
1660 l = all_locations.erase (l);
1663 case Evoral::OverlapNone:
1671 Session::sync_locations_to_skips ()
1673 /* This happens asynchronously (in the audioengine thread). After the clear is done, we will call
1674 * Session::_sync_locations_to_skips() from the audioengine thread.
1676 clear_events (SessionEvent::Skip, boost::bind (&Session::_sync_locations_to_skips, this));
1680 Session::_sync_locations_to_skips ()
1682 /* called as a callback after existing Skip events have been cleared from a realtime audioengine thread */
1684 Locations::LocationList const & locs (_locations->list());
1686 for (Locations::LocationList::const_iterator i = locs.begin(); i != locs.end(); ++i) {
1688 Location* location = *i;
1690 if (location->is_skip() && location->is_skipping()) {
1691 SessionEvent* ev = new SessionEvent (SessionEvent::Skip, SessionEvent::Add, location->start(), location->end(), 1.0);
1699 Session::location_added (Location *location)
1701 if (location->is_auto_punch()) {
1702 set_auto_punch_location (location);
1705 if (location->is_auto_loop()) {
1706 set_auto_loop_location (location);
1709 if (location->is_session_range()) {
1710 /* no need for any signal handling or event setting with the session range,
1711 because we keep a direct reference to it and use its start/end directly.
1713 _session_range_location = location;
1716 if (location->is_mark()) {
1717 /* listen for per-location signals that require us to do any * global updates for marks */
1719 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1720 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1721 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1722 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1725 if (location->is_skip()) {
1726 /* listen for per-location signals that require us to update skip-locate events */
1728 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1729 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1730 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1731 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, false));
1733 update_skips (location, true);
1740 Session::location_removed (Location *location)
1742 if (location->is_auto_loop()) {
1743 set_auto_loop_location (0);
1744 set_track_loop (false);
1747 if (location->is_auto_punch()) {
1748 set_auto_punch_location (0);
1751 if (location->is_session_range()) {
1752 /* this is never supposed to happen */
1753 error << _("programming error: session range removed!") << endl;
1756 if (location->is_skip()) {
1758 update_skips (location, false);
1765 Session::locations_changed ()
1767 _locations->apply (*this, &Session::_locations_changed);
1771 Session::_locations_changed (const Locations::LocationList& locations)
1773 /* There was some mass-change in the Locations object.
1775 We might be re-adding a location here but it doesn't actually matter
1776 for all the locations that the Session takes an interest in.
1780 PBD::Unwinder<bool> protect_ignore_skip_updates (_ignore_skips_updates, true);
1781 for (Locations::LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
1782 location_added (*i);
1786 update_skips (NULL, false);
1790 Session::enable_record ()
1792 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1793 /* no recording at anything except normal speed */
1798 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1800 if (rs == Recording) {
1804 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1806 _last_record_location = _transport_frame;
1807 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1809 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1810 set_track_monitor_input_status (true);
1813 RecordStateChanged ();
1820 Session::disable_record (bool rt_context, bool force)
1824 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1826 if (!Config->get_latched_record_enable () || force) {
1827 g_atomic_int_set (&_record_status, Disabled);
1828 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1830 if (rs == Recording) {
1831 g_atomic_int_set (&_record_status, Enabled);
1835 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1836 set_track_monitor_input_status (false);
1839 RecordStateChanged (); /* emit signal */
1842 remove_pending_capture_state ();
1848 Session::step_back_from_record ()
1850 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1852 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1853 set_track_monitor_input_status (false);
1856 RecordStateChanged (); /* emit signal */
1861 Session::maybe_enable_record ()
1863 if (_step_editors > 0) {
1867 g_atomic_int_set (&_record_status, Enabled);
1869 /* This function is currently called from somewhere other than an RT thread.
1870 This save_state() call therefore doesn't impact anything. Doing it here
1871 means that we save pending state of which sources the next record will use,
1872 which gives us some chance of recovering from a crash during the record.
1875 save_state ("", true);
1877 if (_transport_speed) {
1878 if (!config.get_punch_in()) {
1882 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1883 RecordStateChanged (); /* EMIT SIGNAL */
1890 Session::audible_frame () const
1896 offset = worst_playback_latency ();
1898 if (synced_to_engine()) {
1899 /* Note: this is basically just sync-to-JACK */
1900 tf = _engine.transport_frame();
1902 tf = _transport_frame;
1907 if (!non_realtime_work_pending()) {
1911 /* Check to see if we have passed the first guaranteed
1912 audible frame past our last start position. if not,
1913 return that last start point because in terms
1914 of audible frames, we have not moved yet.
1916 `Start position' in this context means the time we last
1917 either started, located, or changed transport direction.
1920 if (_transport_speed > 0.0f) {
1922 if (!play_loop || !have_looped) {
1923 if (tf < _last_roll_or_reversal_location + offset) {
1924 return _last_roll_or_reversal_location;
1932 } else if (_transport_speed < 0.0f) {
1934 /* XXX wot? no backward looping? */
1936 if (tf > _last_roll_or_reversal_location - offset) {
1937 return _last_roll_or_reversal_location;
1949 Session::set_frame_rate (framecnt_t frames_per_second)
1951 /** \fn void Session::set_frame_size(framecnt_t)
1952 the AudioEngine object that calls this guarantees
1953 that it will not be called while we are also in
1954 ::process(). Its fine to do things that block
1958 _base_frame_rate = frames_per_second;
1959 _nominal_frame_rate = frames_per_second;
1964 reset_write_sources (false);
1966 // XXX we need some equivalent to this, somehow
1967 // SndFileSource::setup_standard_crossfades (frames_per_second);
1971 /* XXX need to reset/reinstantiate all LADSPA plugins */
1975 Session::set_block_size (pframes_t nframes)
1977 /* the AudioEngine guarantees
1978 that it will not be called while we are also in
1979 ::process(). It is therefore fine to do things that block
1984 current_block_size = nframes;
1988 boost::shared_ptr<RouteList> r = routes.reader ();
1990 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1991 (*i)->set_block_size (nframes);
1994 boost::shared_ptr<RouteList> rl = routes.reader ();
1995 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1996 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1998 tr->set_block_size (nframes);
2002 set_worst_io_latencies ();
2008 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
2010 boost::shared_ptr<Route> r2;
2012 if (r1->feeds (rbase) && rbase->feeds (r1)) {
2013 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
2017 /* make a copy of the existing list of routes that feed r1 */
2019 Route::FedBy existing (r1->fed_by());
2021 /* for each route that feeds r1, recurse, marking it as feeding
2025 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
2026 if (!(r2 = i->r.lock ())) {
2027 /* (*i) went away, ignore it */
2031 /* r2 is a route that feeds r1 which somehow feeds base. mark
2032 base as being fed by r2
2035 rbase->add_fed_by (r2, i->sends_only);
2039 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
2043 if (r1->feeds (r2) && r2->feeds (r1)) {
2047 /* now recurse, so that we can mark base as being fed by
2048 all routes that feed r2
2051 trace_terminal (r2, rbase);
2058 Session::resort_routes ()
2060 /* don't do anything here with signals emitted
2061 by Routes during initial setup or while we
2062 are being destroyed.
2065 if (_state_of_the_state & (InitialConnecting | Deletion)) {
2070 RCUWriter<RouteList> writer (routes);
2071 boost::shared_ptr<RouteList> r = writer.get_copy ();
2072 resort_routes_using (r);
2073 /* writer goes out of scope and forces update */
2077 boost::shared_ptr<RouteList> rl = routes.reader ();
2078 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2079 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
2081 const Route::FedBy& fb ((*i)->fed_by());
2083 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
2084 boost::shared_ptr<Route> sf = f->r.lock();
2086 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
2094 /** This is called whenever we need to rebuild the graph of how we will process
2096 * @param r List of routes, in any order.
2100 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
2102 /* We are going to build a directed graph of our routes;
2103 this is where the edges of that graph are put.
2108 /* Go through all routes doing two things:
2110 * 1. Collect the edges of the route graph. Each of these edges
2111 * is a pair of routes, one of which directly feeds the other
2112 * either by a JACK connection or by an internal send.
2114 * 2. Begin the process of making routes aware of which other
2115 * routes directly or indirectly feed them. This information
2116 * is used by the solo code.
2119 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2121 /* Clear out the route's list of direct or indirect feeds */
2122 (*i)->clear_fed_by ();
2124 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
2126 bool via_sends_only;
2128 /* See if this *j feeds *i according to the current state of the JACK
2129 connections and internal sends.
2131 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
2132 /* add the edge to the graph (part #1) */
2133 edges.add (*j, *i, via_sends_only);
2134 /* tell the route (for part #2) */
2135 (*i)->add_fed_by (*j, via_sends_only);
2140 /* Attempt a topological sort of the route graph */
2141 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
2143 if (sorted_routes) {
2144 /* We got a satisfactory topological sort, so there is no feedback;
2147 Note: the process graph rechain does not require a
2148 topologically-sorted list, but hey ho.
2150 if (_process_graph) {
2151 _process_graph->rechain (sorted_routes, edges);
2154 _current_route_graph = edges;
2156 /* Complete the building of the routes' lists of what directly
2157 or indirectly feeds them.
2159 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2160 trace_terminal (*i, *i);
2163 *r = *sorted_routes;
2166 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
2167 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2168 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
2169 (*i)->name(), (*i)->order_key ()));
2173 SuccessfulGraphSort (); /* EMIT SIGNAL */
2176 /* The topological sort failed, so we have a problem. Tell everyone
2177 and stick to the old graph; this will continue to be processed, so
2178 until the feedback is fixed, what is played back will not quite
2179 reflect what is actually connected. Note also that we do not
2180 do trace_terminal here, as it would fail due to an endless recursion,
2181 so the solo code will think that everything is still connected
2185 FeedbackDetected (); /* EMIT SIGNAL */
2190 /** Find a route name starting with \a base, maybe followed by the
2191 * lowest \a id. \a id will always be added if \a definitely_add_number
2192 * is true on entry; otherwise it will only be added if required
2193 * to make the name unique.
2195 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
2196 * The available route name with the lowest ID will be used, and \a id
2197 * will be set to the ID.
2199 * \return false if a route name could not be found, and \a track_name
2200 * and \a id do not reflect a free route name.
2203 Session::find_route_name (string const & base, uint32_t& id, string& name, bool definitely_add_number)
2205 /* the base may conflict with ports that do not belong to existing
2206 routes, but hidden objects like the click track. So check port names
2207 before anything else.
2210 for (vector<string>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
2211 if (base == *reserved) {
2212 definitely_add_number = true;
2220 if (!definitely_add_number && route_by_name (base) == 0) {
2221 /* juse use the base */
2227 name = string_compose ("%1 %2", base, id);
2229 if (route_by_name (name) == 0) {
2235 } while (id < (UINT_MAX-1));
2240 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
2242 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
2244 in = ChanCount::ZERO;
2245 out = ChanCount::ZERO;
2247 boost::shared_ptr<RouteList> r = routes.reader ();
2249 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2250 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2251 if (tr && !tr->is_auditioner()) {
2252 in += tr->n_inputs();
2253 out += tr->n_outputs();
2259 Session::default_track_name_pattern (DataType t)
2262 case DataType::AUDIO:
2263 if (Profile->get_trx()) {
2270 case DataType::MIDI:
2277 /** Caller must not hold process lock
2278 * @param name_template string to use for the start of the name, or "" to use "MIDI".
2279 * @param instrument plugin info for the instrument to insert pre-fader, if any
2281 list<boost::shared_ptr<MidiTrack> >
2282 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
2283 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
2286 uint32_t track_id = 0;
2288 RouteList new_routes;
2289 list<boost::shared_ptr<MidiTrack> > ret;
2291 const string name_pattern = default_track_name_pattern (DataType::MIDI);
2292 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
2295 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, use_number)) {
2296 error << "cannot find name for new midi track" << endmsg;
2300 boost::shared_ptr<MidiTrack> track;
2303 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
2305 if (track->init ()) {
2309 track->use_new_diskstream();
2311 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2312 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2315 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2316 if (track->input()->ensure_io (input, false, this)) {
2317 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
2321 if (track->output()->ensure_io (output, false, this)) {
2322 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
2327 track->non_realtime_input_change();
2330 route_group->add (track);
2333 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2335 if (Config->get_remote_model() == UserOrdered) {
2336 track->set_remote_control_id (next_control_id());
2339 new_routes.push_back (track);
2340 ret.push_back (track);
2342 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2345 catch (failed_constructor &err) {
2346 error << _("Session: could not create new midi track.") << endmsg;
2350 catch (AudioEngine::PortRegistrationFailure& pfe) {
2352 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;
2360 if (!new_routes.empty()) {
2361 StateProtector sp (this);
2362 if (Profile->get_trx()) {
2363 add_routes (new_routes, false, false, false);
2365 add_routes (new_routes, true, true, false);
2369 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
2370 PluginPtr plugin = instrument->load (*this);
2371 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2372 (*r)->add_processor (p, PreFader);
2382 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2384 boost::shared_ptr<Route> midi_track (wmt.lock());
2390 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2392 if (change.after.n_audio() <= change.before.n_audio()) {
2396 /* new audio ports: make sure the audio goes somewhere useful,
2397 unless the user has no-auto-connect selected.
2399 The existing ChanCounts don't matter for this call as they are only
2400 to do with matching input and output indices, and we are only changing
2406 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
2410 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
2411 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
2412 * @param output_start As \a input_start, but for outputs.
2415 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
2416 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
2418 if (!IO::connecting_legal) {
2422 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2428 /* If both inputs and outputs are auto-connected to physical ports,
2429 use the max of input and output offsets to ensure auto-connected
2430 port numbers always match up (e.g. the first audio input and the
2431 first audio output of the route will have the same physical
2432 port number). Otherwise just use the lowest input or output
2436 DEBUG_TRACE (DEBUG::Graph,
2437 string_compose("Auto-connect: existing in = %1 out = %2\n",
2438 existing_inputs, existing_outputs));
2440 const bool in_out_physical =
2441 (Config->get_input_auto_connect() & AutoConnectPhysical)
2442 && (Config->get_output_auto_connect() & AutoConnectPhysical)
2445 const ChanCount in_offset = in_out_physical
2446 ? ChanCount::max(existing_inputs, existing_outputs)
2449 const ChanCount out_offset = in_out_physical
2450 ? ChanCount::max(existing_inputs, existing_outputs)
2453 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2454 vector<string> physinputs;
2455 vector<string> physoutputs;
2457 _engine.get_physical_outputs (*t, physoutputs);
2458 _engine.get_physical_inputs (*t, physinputs);
2460 if (!physinputs.empty() && connect_inputs) {
2461 uint32_t nphysical_in = physinputs.size();
2463 DEBUG_TRACE (DEBUG::Graph,
2464 string_compose("There are %1 physical inputs of type %2\n",
2467 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
2470 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
2471 DEBUG_TRACE (DEBUG::Graph,
2472 string_compose("Get index %1 + %2 % %3 = %4\n",
2473 in_offset.get(*t), i, nphysical_in,
2474 (in_offset.get(*t) + i) % nphysical_in));
2475 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
2478 DEBUG_TRACE (DEBUG::Graph,
2479 string_compose("Connect route %1 IN to %2\n",
2480 route->name(), port));
2482 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
2486 ChanCount one_added (*t, 1);
2487 existing_inputs += one_added;
2491 if (!physoutputs.empty()) {
2492 uint32_t nphysical_out = physoutputs.size();
2493 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
2497 * do not create new connections if we reached the limit of physical outputs
2501 if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
2502 ARDOUR::Profile->get_trx () &&
2503 existing_outputs.get(*t) == nphysical_out ) {
2507 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
2508 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
2509 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
2510 /* master bus is audio only */
2511 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
2512 port = _master_out->input()->ports().port(*t,
2513 i % _master_out->input()->n_ports().get(*t))->name();
2517 DEBUG_TRACE (DEBUG::Graph,
2518 string_compose("Connect route %1 OUT to %2\n",
2519 route->name(), port));
2521 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
2525 ChanCount one_added (*t, 1);
2526 existing_outputs += one_added;
2532 #ifdef USE_TRACKS_CODE_FEATURES
2535 compare_routes_by_remote_id (const boost::shared_ptr<Route>& route1, const boost::shared_ptr<Route>& route2)
2537 return route1->remote_control_id() < route2->remote_control_id();
2541 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2543 // it is not allowed to perform connection
2544 if (!IO::connecting_legal) {
2548 // if we are deleting routes we will call this once at the end
2549 if (_route_deletion_in_progress) {
2553 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2559 // We need to disconnect the route's inputs and outputs first
2560 // basing on autoconnect configuration
2561 bool reconnectIputs = !(Config->get_input_auto_connect() & ManualConnect) && reconnect_inputs;
2562 bool reconnectOutputs = !(Config->get_output_auto_connect() & ManualConnect) && reconnect_outputs;
2564 ChanCount existing_inputs;
2565 ChanCount existing_outputs;
2566 count_existing_track_channels (existing_inputs, existing_outputs);
2568 //ChanCount inputs = ChanCount::ZERO;
2569 //ChanCount outputs = ChanCount::ZERO;
2571 RouteList existing_routes = *routes.reader ();
2572 existing_routes.sort (compare_routes_by_remote_id);
2575 PBD::Unwinder<bool> protect_ignore_changes (_reconnecting_routes_in_progress, true);
2577 vector<string> physinputs;
2578 vector<string> physoutputs;
2580 EngineStateController::instance()->get_physical_audio_outputs(physoutputs);
2581 EngineStateController::instance()->get_physical_audio_inputs(physinputs);
2583 uint32_t input_n = 0;
2584 uint32_t output_n = 0;
2585 RouteList::iterator rIter = existing_routes.begin();
2586 const AutoConnectOption current_input_auto_connection (Config->get_input_auto_connect());
2587 const AutoConnectOption current_output_auto_connection (Config->get_output_auto_connect());
2588 for (; rIter != existing_routes.end(); ++rIter) {
2589 if (*rIter == _master_out || *rIter == _monitor_out ) {
2593 if (current_output_auto_connection == AutoConnectPhysical) {
2594 (*rIter)->amp()->deactivate();
2595 } else if (current_output_auto_connection == AutoConnectMaster) {
2596 (*rIter)->amp()->activate();
2599 if (reconnectIputs) {
2600 (*rIter)->input()->disconnect (this); //GZ: check this; could be heavy
2602 for (uint32_t route_input_n = 0; route_input_n < (*rIter)->n_inputs().get(DataType::AUDIO); ++route_input_n) {
2604 if (current_input_auto_connection & AutoConnectPhysical) {
2606 if ( input_n == physinputs.size() ) {
2610 string port = physinputs[input_n];
2612 if (port.empty() ) {
2613 error << "Physical Input number "<< input_n << " is unavailable and cannot be connected" << endmsg;
2616 //GZ: check this; could be heavy
2617 (*rIter)->input()->connect ((*rIter)->input()->ports().port(DataType::AUDIO, route_input_n), port, this);
2623 if (reconnectOutputs) {
2625 //normalize route ouptuts: reduce the amount outputs to be equal to the amount of inputs
2626 if (current_output_auto_connection & AutoConnectPhysical) {
2628 //GZ: check this; could be heavy
2629 (*rIter)->output()->disconnect (this);
2630 size_t route_inputs_count = (*rIter)->n_inputs().get(DataType::AUDIO);
2632 //GZ: check this; could be heavy
2633 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, route_inputs_count), false, this );
2635 } else if (current_output_auto_connection & AutoConnectMaster){
2637 if (!reconnect_master) {
2641 //GZ: check this; could be heavy
2642 (*rIter)->output()->disconnect (this);
2645 uint32_t master_inputs_count = _master_out->n_inputs().get(DataType::AUDIO);
2646 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, master_inputs_count), false, this );
2648 error << error << "Master bus is not available" << endmsg;
2653 for (uint32_t route_output_n = 0; route_output_n < (*rIter)->n_outputs().get(DataType::AUDIO); ++route_output_n) {
2654 if (current_output_auto_connection & AutoConnectPhysical) {
2656 if ( output_n == physoutputs.size() ) {
2660 string port = physoutputs[output_n];
2662 if (port.empty() ) {
2663 error << "Physical Output number "<< output_n << " is unavailable and cannot be connected" << endmsg;
2666 //GZ: check this; could be heavy
2667 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2670 } else if (current_output_auto_connection & AutoConnectMaster) {
2672 if ( route_output_n == _master_out->n_inputs().get(DataType::AUDIO) ) {
2676 // connect to master bus
2677 string port = _master_out->input()->ports().port(DataType::AUDIO, route_output_n)->name();
2679 if (port.empty() ) {
2680 error << "MasterBus Input number "<< route_output_n << " is unavailable and cannot be connected" << endmsg;
2684 //GZ: check this; could be heavy
2685 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2691 //auto_connect_route (*rIter, inputs, outputs, false, reconnectIputs);
2694 _master_out->output()->disconnect (this);
2695 auto_connect_master_bus ();
2700 session_routes_reconnected (); /* EMIT SIGNAL */
2704 Session::reconnect_midi_scene_ports(bool inputs)
2708 boost::shared_ptr<MidiPort> scene_in_ptr = scene_in();
2710 scene_in_ptr->disconnect_all ();
2712 std::vector<EngineStateController::MidiPortState> midi_port_states;
2713 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2715 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2717 for (; state_iter != midi_port_states.end(); ++state_iter) {
2718 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2719 scene_in_ptr->connect (state_iter->name);
2726 boost::shared_ptr<MidiPort> scene_out_ptr = scene_out();
2728 if (scene_out_ptr ) {
2729 scene_out_ptr->disconnect_all ();
2731 std::vector<EngineStateController::MidiPortState> midi_port_states;
2732 EngineStateController::instance()->get_physical_midi_output_states (midi_port_states);
2734 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2736 for (; state_iter != midi_port_states.end(); ++state_iter) {
2737 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2738 scene_out_ptr->connect (state_iter->name);
2746 Session::reconnect_mtc_ports ()
2748 boost::shared_ptr<MidiPort> mtc_in_ptr = _midi_ports->mtc_input_port();
2754 mtc_in_ptr->disconnect_all ();
2756 std::vector<EngineStateController::MidiPortState> midi_port_states;
2757 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2759 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2761 for (; state_iter != midi_port_states.end(); ++state_iter) {
2762 if (state_iter->available && state_iter->mtc_in) {
2763 mtc_in_ptr->connect (state_iter->name);
2767 if (!_midi_ports->mtc_input_port ()->connected () &&
2768 config.get_external_sync () &&
2769 (Config->get_sync_source () == MTC) ) {
2770 config.set_external_sync (false);
2773 if ( ARDOUR::Profile->get_trx () ) {
2774 // Tracks need this signal to update timecode_source_dropdown
2775 MtcOrLtcInputPortChanged (); //emit signal
2780 Session::reconnect_mmc_ports(bool inputs)
2782 if (inputs ) { // get all enabled midi input ports
2784 boost::shared_ptr<MidiPort> mmc_in_ptr = _midi_ports->mmc_in();
2786 mmc_in_ptr->disconnect_all ();
2787 std::vector<std::string> enabled_midi_inputs;
2788 EngineStateController::instance()->get_physical_midi_inputs (enabled_midi_inputs);
2790 std::vector<std::string>::iterator port_iter = enabled_midi_inputs.begin();
2792 for (; port_iter != enabled_midi_inputs.end(); ++port_iter) {
2793 mmc_in_ptr->connect (*port_iter);
2797 } else { // get all enabled midi output ports
2799 boost::shared_ptr<MidiPort> mmc_out_ptr = _midi_ports->mmc_out();
2801 mmc_out_ptr->disconnect_all ();
2802 std::vector<std::string> enabled_midi_outputs;
2803 EngineStateController::instance()->get_physical_midi_outputs (enabled_midi_outputs);
2805 std::vector<std::string>::iterator port_iter = enabled_midi_outputs.begin();
2807 for (; port_iter != enabled_midi_outputs.end(); ++port_iter) {
2808 mmc_out_ptr->connect (*port_iter);
2816 /** Caller must not hold process lock
2817 * @param name_template string to use for the start of the name, or "" to use "Audio".
2819 list< boost::shared_ptr<AudioTrack> >
2820 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
2821 uint32_t how_many, string name_template)
2824 uint32_t track_id = 0;
2826 RouteList new_routes;
2827 list<boost::shared_ptr<AudioTrack> > ret;
2829 const string name_pattern = default_track_name_pattern (DataType::AUDIO);
2830 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
2834 if (!find_route_name (name_template.empty() ? _(name_pattern.c_str()) : name_template, ++track_id, track_name, use_number)) {
2835 error << "cannot find name for new audio track" << endmsg;
2839 boost::shared_ptr<AudioTrack> track;
2842 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
2844 if (track->init ()) {
2848 if (ARDOUR::Profile->get_trx ()) {
2849 // TRACKS considers it's not a USE CASE, it's
2850 // a piece of behavior of the session model:
2852 // Gain for a newly created route depends on
2853 // the current output_auto_connect mode:
2855 // 0 for Stereo Out mode
2857 if (Config->get_output_auto_connect() & AutoConnectMaster) {
2858 track->set_gain (dB_to_coefficient (0), 0);
2862 track->use_new_diskstream();
2864 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2865 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2868 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2870 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2871 error << string_compose (
2872 _("cannot configure %1 in/%2 out configuration for new audio track"),
2873 input_channels, output_channels)
2878 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2879 error << string_compose (
2880 _("cannot configure %1 in/%2 out configuration for new audio track"),
2881 input_channels, output_channels)
2888 route_group->add (track);
2891 track->non_realtime_input_change();
2893 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2894 if (Config->get_remote_model() == UserOrdered) {
2895 track->set_remote_control_id (next_control_id());
2898 new_routes.push_back (track);
2899 ret.push_back (track);
2901 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2904 catch (failed_constructor &err) {
2905 error << _("Session: could not create new audio track.") << endmsg;
2909 catch (AudioEngine::PortRegistrationFailure& pfe) {
2911 error << pfe.what() << endmsg;
2919 if (!new_routes.empty()) {
2920 StateProtector sp (this);
2921 if (Profile->get_trx()) {
2922 add_routes (new_routes, false, false, false);
2924 add_routes (new_routes, true, true, false);
2931 /** Caller must not hold process lock.
2932 * @param name_template string to use for the start of the name, or "" to use "Bus".
2935 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
2938 uint32_t bus_id = 0;
2942 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
2945 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, use_number)) {
2946 error << "cannot find name for new audio bus" << endmsg;
2951 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
2957 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2958 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
2961 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2963 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2964 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2965 input_channels, output_channels)
2971 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2972 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2973 input_channels, output_channels)
2980 route_group->add (bus);
2982 if (Config->get_remote_model() == UserOrdered) {
2983 bus->set_remote_control_id (next_control_id());
2986 bus->add_internal_return ();
2988 ret.push_back (bus);
2990 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2996 catch (failed_constructor &err) {
2997 error << _("Session: could not create new audio route.") << endmsg;
3001 catch (AudioEngine::PortRegistrationFailure& pfe) {
3002 error << pfe.what() << endmsg;
3012 StateProtector sp (this);
3013 if (Profile->get_trx()) {
3014 add_routes (ret, false, false, false);
3016 add_routes (ret, false, true, true); // autoconnect // outputs only
3025 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base)
3028 uint32_t control_id;
3030 uint32_t number = 0;
3031 const uint32_t being_added = how_many;
3033 if (!tree.read (template_path.c_str())) {
3037 XMLNode* node = tree.root();
3039 IO::disable_connecting ();
3041 control_id = next_control_id ();
3045 XMLNode node_copy (*node);
3047 /* Remove IDs of everything so that new ones are used */
3048 node_copy.remove_property_recursively (X_("id"));
3053 if (!name_base.empty()) {
3055 /* if we're adding more than one routes, force
3056 * all the names of the new routes to be
3057 * numbered, via the final parameter.
3060 if (!find_route_name (name_base.c_str(), ++number, name, (being_added > 1))) {
3061 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3067 string const route_name = node_copy.property(X_("name"))->value ();
3069 /* generate a new name by adding a number to the end of the template name */
3070 if (!find_route_name (route_name.c_str(), ++number, name, true)) {
3071 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3072 abort(); /*NOTREACHED*/
3076 /* set this name in the XML description that we are about to use */
3077 Route::set_name_in_state (node_copy, name);
3079 /* trim bitslots from listen sends so that new ones are used */
3080 XMLNodeList children = node_copy.children ();
3081 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
3082 if ((*i)->name() == X_("Processor")) {
3083 XMLProperty* role = (*i)->property (X_("role"));
3084 if (role && role->value() == X_("Listen")) {
3085 (*i)->remove_property (X_("bitslot"));
3090 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
3093 error << _("Session: cannot create track/bus from template description") << endmsg;
3097 if (boost::dynamic_pointer_cast<Track>(route)) {
3098 /* force input/output change signals so that the new diskstream
3099 picks up the configuration of the route. During session
3100 loading this normally happens in a different way.
3103 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3105 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
3106 change.after = route->input()->n_ports();
3107 route->input()->changed (change, this);
3108 change.after = route->output()->n_ports();
3109 route->output()->changed (change, this);
3112 route->set_remote_control_id (control_id);
3115 ret.push_back (route);
3117 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
3120 catch (failed_constructor &err) {
3121 error << _("Session: could not create new route from template") << endmsg;
3125 catch (AudioEngine::PortRegistrationFailure& pfe) {
3126 error << pfe.what() << endmsg;
3135 StateProtector sp (this);
3136 if (Profile->get_trx()) {
3137 add_routes (ret, false, false, false);
3139 add_routes (ret, true, true, false);
3141 IO::enable_connecting ();
3148 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
3151 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
3152 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
3155 error << _("Adding new tracks/busses failed") << endmsg;
3160 update_latency (true);
3161 update_latency (false);
3166 save_state (_current_snapshot_name);
3169 reassign_track_numbers();
3171 update_route_record_state ();
3173 RouteAdded (new_routes); /* EMIT SIGNAL */
3177 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
3179 ChanCount existing_inputs;
3180 ChanCount existing_outputs;
3181 uint32_t order = next_control_id();
3183 if (_order_hint > -1) {
3184 order = _order_hint;
3188 count_existing_track_channels (existing_inputs, existing_outputs);
3191 RCUWriter<RouteList> writer (routes);
3192 boost::shared_ptr<RouteList> r = writer.get_copy ();
3193 r->insert (r->end(), new_routes.begin(), new_routes.end());
3195 /* if there is no control out and we're not in the middle of loading,
3196 resort the graph here. if there is a control out, we will resort
3197 toward the end of this method. if we are in the middle of loading,
3198 we will resort when done.
3201 if (!_monitor_out && IO::connecting_legal) {
3202 resort_routes_using (r);
3206 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3208 boost::weak_ptr<Route> wpr (*x);
3209 boost::shared_ptr<Route> r (*x);
3211 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
3212 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
3213 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
3214 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
3215 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
3216 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
3218 if (r->is_master()) {
3222 if (r->is_monitor()) {
3226 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
3228 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
3229 track_playlist_changed (boost::weak_ptr<Track> (tr));
3230 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
3232 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
3234 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
3235 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
3240 if (input_auto_connect || output_auto_connect) {
3241 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
3244 /* order keys are a GUI responsibility but we need to set up
3245 reasonable defaults because they also affect the remote control
3246 ID in most situations.
3249 if (!r->has_order_key ()) {
3250 if (r->is_auditioner()) {
3251 /* use an arbitrarily high value */
3252 r->set_order_key (UINT_MAX);
3254 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
3255 r->set_order_key (order);
3263 if (_monitor_out && IO::connecting_legal) {
3264 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
3266 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3267 if ((*x)->is_monitor()) {
3269 } else if ((*x)->is_master()) {
3272 (*x)->enable_monitor_send ();
3279 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
3281 boost::shared_ptr<RouteList> r = routes.reader ();
3282 boost::shared_ptr<Send> s;
3284 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3285 if ((s = (*i)->internal_send_for (dest)) != 0) {
3286 s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO);
3292 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
3294 boost::shared_ptr<RouteList> r = routes.reader ();
3295 boost::shared_ptr<Send> s;
3297 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3298 if ((s = (*i)->internal_send_for (dest)) != 0) {
3299 s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY);
3305 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
3307 boost::shared_ptr<RouteList> r = routes.reader ();
3308 boost::shared_ptr<Send> s;
3310 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3311 if ((s = (*i)->internal_send_for (dest)) != 0) {
3312 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
3317 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
3319 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
3321 boost::shared_ptr<RouteList> r = routes.reader ();
3322 boost::shared_ptr<RouteList> t (new RouteList);
3324 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3325 /* no MIDI sends because there are no MIDI busses yet */
3326 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
3331 add_internal_sends (dest, p, t);
3335 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
3337 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
3338 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
3343 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
3345 add_internal_send (dest, sender->before_processor_for_index (index), sender);
3349 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
3351 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
3355 if (!dest->internal_return()) {
3356 dest->add_internal_return ();
3359 sender->add_aux_send (dest, before);
3366 Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
3368 PBD::Unwinder<bool> uw_flag (_route_deletion_in_progress, true);
3370 { // RCU Writer scope
3371 RCUWriter<RouteList> writer (routes);
3372 boost::shared_ptr<RouteList> rs = writer.get_copy ();
3375 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3377 if (*iter == _master_out) {
3381 (*iter)->set_solo (false, this);
3385 /* deleting the master out seems like a dumb
3386 idea, but its more of a UI policy issue
3390 if (*iter == _master_out) {
3391 _master_out = boost::shared_ptr<Route> ();
3394 if (*iter == _monitor_out) {
3395 _monitor_out.reset ();
3398 // We need to disconnect the route's inputs and outputs
3400 (*iter)->input()->disconnect (0);
3401 (*iter)->output()->disconnect (0);
3403 /* if the route had internal sends sending to it, remove them */
3404 if ((*iter)->internal_return()) {
3406 boost::shared_ptr<RouteList> r = routes.reader ();
3407 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3408 boost::shared_ptr<Send> s = (*i)->internal_send_for (*iter);
3410 (*i)->remove_processor (s);
3415 /* if the monitoring section had a pointer to this route, remove it */
3416 if (_monitor_out && !(*iter)->is_master() && !(*iter)->is_monitor()) {
3417 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3418 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
3419 (*iter)->remove_aux_or_listen (_monitor_out);
3422 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*iter);
3423 if (mt && mt->step_editing()) {
3424 if (_step_editors > 0) {
3430 /* writer goes out of scope, forces route list update */
3432 } // end of RCU Writer scope
3434 update_route_solo_state ();
3435 RouteAddedOrRemoved (false); /* EMIT SIGNAL */
3436 update_latency_compensation ();
3439 /* Re-sort routes to remove the graph's current references to the one that is
3440 * going away, then flush old references out of the graph.
3441 * Wave Tracks: reconnect routes
3444 #ifdef USE_TRACKS_CODE_FEATURES
3445 reconnect_existing_routes(true, false);
3447 routes.flush (); // maybe unsafe, see below.
3451 if (_process_graph) {
3452 _process_graph->clear_other_chain ();
3455 /* get rid of it from the dead wood collection in the route list manager */
3456 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
3460 /* try to cause everyone to drop their references
3461 * and unregister ports from the backend
3464 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3465 (*iter)->drop_references ();
3468 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
3470 /* save the new state of the world */
3472 if (save_state (_current_snapshot_name)) {
3473 save_history (_current_snapshot_name);
3476 reassign_track_numbers();
3477 update_route_record_state ();
3481 Session::remove_route (boost::shared_ptr<Route> route)
3483 boost::shared_ptr<RouteList> rl (new RouteList);
3484 rl->push_back (route);
3489 Session::route_mute_changed (void* /*src*/)
3495 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3497 boost::shared_ptr<Route> route = wpr.lock();
3499 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
3503 if (route->listening_via_monitor ()) {
3505 if (Config->get_exclusive_solo()) {
3506 /* new listen: disable all other listen */
3507 boost::shared_ptr<RouteList> r = routes.reader ();
3508 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3509 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3512 (*i)->set_listen (false, this);
3518 } else if (_listen_cnt > 0) {
3523 update_route_solo_state ();
3526 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3528 boost::shared_ptr<Route> route = wpr.lock ();
3531 /* should not happen */
3532 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
3536 bool send_changed = false;
3538 if (route->solo_isolated()) {
3539 if (_solo_isolated_cnt == 0) {
3540 send_changed = true;
3542 _solo_isolated_cnt++;
3543 } else if (_solo_isolated_cnt > 0) {
3544 _solo_isolated_cnt--;
3545 if (_solo_isolated_cnt == 0) {
3546 send_changed = true;
3551 IsolatedChanged (); /* EMIT SIGNAL */
3556 Session::routes_solo_changed (boost::shared_ptr<RouteList> solo_change_routes)
3558 if (solo_update_disabled) {
3560 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
3564 if (solo_change_routes->empty() ) {
3568 boost::shared_ptr<RouteList> non_solo_change_routes (new RouteList);
3569 boost::shared_ptr<RouteList> r = routes.reader ();
3572 std::set_difference (r->begin(), r->end(),
3573 solo_change_routes->begin(), solo_change_routes->end(),
3574 std::back_inserter(*non_solo_change_routes) );
3576 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3578 solo_update_disabled = true;
3579 RouteList uninvolved;
3581 for (RouteList::iterator route = solo_change_routes->begin(); route != solo_change_routes->end(); ++route) {
3583 if ((*route)->self_soloed() ) {
3589 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", (*route)->name()));
3591 for (RouteList::iterator i = non_solo_change_routes->begin(); i != non_solo_change_routes->end(); ++i) {
3592 bool via_sends_only;
3593 bool in_signal_flow;
3595 if ((*i) == *route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ) {
3599 in_signal_flow = false;
3601 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3603 if ((*i)->feeds (*route, &via_sends_only)) {
3604 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3605 if (!via_sends_only) {
3606 if (!(*route)->soloed_by_others_upstream()) {
3607 (*i)->mod_solo_by_others_downstream (delta);
3610 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3612 in_signal_flow = true;
3614 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3617 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3619 if ((*route)->feeds (*i, &via_sends_only)) {
3620 /* propagate solo upstream only if routing other than
3621 sends is involved, but do consider the other route
3622 (*i) to be part of the signal flow even if only
3625 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3629 (*route)->soloed_by_others_downstream(),
3630 (*route)->soloed_by_others_upstream()));
3631 if (!via_sends_only) {
3632 if (!(*route)->soloed_by_others_downstream()) {
3633 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3634 (*i)->mod_solo_by_others_upstream (delta);
3636 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
3639 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3641 in_signal_flow = true;
3643 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3646 if (!in_signal_flow) {
3647 uninvolved.push_back (*i);
3651 solo_update_disabled = false;
3652 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3654 update_route_solo_state ();
3656 /* now notify that the mute state of the routes not involved in the signal
3657 pathway of the just-solo-changed route may have altered.
3660 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3661 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1\n", (*i)->name() ));
3662 (*i)->mute_changed (this);
3665 SoloChanged (); /* EMIT SIGNAL */
3670 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
3672 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
3674 if (!self_solo_change) {
3675 // session doesn't care about changes to soloed-by-others
3679 if (solo_update_disabled) {
3681 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
3685 boost::shared_ptr<Route> route = wpr.lock ();
3688 boost::shared_ptr<RouteList> r = routes.reader ();
3691 if (route->self_soloed()) {
3697 RouteGroup* rg = route->route_group ();
3698 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
3700 if (delta == 1 && Config->get_exclusive_solo()) {
3702 /* new solo: disable all other solos, but not the group if its solo-enabled */
3704 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3705 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3706 (leave_group_alone && ((*i)->route_group() == rg))) {
3709 (*i)->set_solo (false, this);
3713 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3715 solo_update_disabled = true;
3717 RouteList uninvolved;
3719 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
3721 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3722 bool via_sends_only;
3723 bool in_signal_flow;
3725 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3726 (leave_group_alone && ((*i)->route_group() == rg))) {
3730 in_signal_flow = false;
3732 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3734 if ((*i)->feeds (route, &via_sends_only)) {
3735 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3736 if (!via_sends_only) {
3737 if (!route->soloed_by_others_upstream()) {
3738 (*i)->mod_solo_by_others_downstream (delta);
3741 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3743 in_signal_flow = true;
3745 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3748 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3750 if (route->feeds (*i, &via_sends_only)) {
3751 /* propagate solo upstream only if routing other than
3752 sends is involved, but do consider the other route
3753 (*i) to be part of the signal flow even if only
3756 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3760 route->soloed_by_others_downstream(),
3761 route->soloed_by_others_upstream()));
3762 if (!via_sends_only) {
3763 if (!route->soloed_by_others_downstream()) {
3764 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3765 (*i)->mod_solo_by_others_upstream (delta);
3767 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
3770 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3772 in_signal_flow = true;
3774 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3777 if (!in_signal_flow) {
3778 uninvolved.push_back (*i);
3782 solo_update_disabled = false;
3783 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3785 update_route_solo_state (r);
3787 /* now notify that the mute state of the routes not involved in the signal
3788 pathway of the just-solo-changed route may have altered.
3791 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3792 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
3793 (*i)->act_on_mute ();
3794 (*i)->mute_changed (this);
3797 SoloChanged (); /* EMIT SIGNAL */
3802 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
3804 /* now figure out if anything that matters is soloed (or is "listening")*/
3806 bool something_soloed = false;
3807 uint32_t listeners = 0;
3808 uint32_t isolated = 0;
3811 r = routes.reader();
3814 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3815 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
3816 something_soloed = true;
3819 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
3820 if (Config->get_solo_control_is_listen_control()) {
3823 (*i)->set_listen (false, this);
3827 if ((*i)->solo_isolated()) {
3832 if (something_soloed != _non_soloed_outs_muted) {
3833 _non_soloed_outs_muted = something_soloed;
3834 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
3837 _listen_cnt = listeners;
3839 if (isolated != _solo_isolated_cnt) {
3840 _solo_isolated_cnt = isolated;
3841 IsolatedChanged (); /* EMIT SIGNAL */
3844 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
3845 something_soloed, listeners, isolated));
3848 boost::shared_ptr<RouteList>
3849 Session::get_routes_with_internal_returns() const
3851 boost::shared_ptr<RouteList> r = routes.reader ();
3852 boost::shared_ptr<RouteList> rl (new RouteList);
3854 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3855 if ((*i)->internal_return ()) {
3863 Session::io_name_is_legal (const std::string& name)
3865 boost::shared_ptr<RouteList> r = routes.reader ();
3867 for (vector<string>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
3868 if (name == *reserved) {
3873 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3874 if ((*i)->name() == name) {
3878 if ((*i)->has_io_processor_named (name)) {
3887 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
3890 vector<string> connections;
3892 /* if we are passed only a single route and we're not told to turn
3893 * others off, then just do the simple thing.
3896 if (flip_others == false && rl->size() == 1) {
3897 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
3899 mt->set_input_active (onoff);
3904 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
3906 PortSet& ps ((*rt)->input()->ports());
3908 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
3909 p->get_connections (connections);
3912 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
3913 routes_using_input_from (*s, rl2);
3916 /* scan all relevant routes to see if others are on or off */
3918 bool others_are_already_on = false;
3920 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3922 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3928 if ((*r) != (*rt)) {
3929 if (mt->input_active()) {
3930 others_are_already_on = true;
3933 /* this one needs changing */
3934 mt->set_input_active (onoff);
3940 /* globally reverse other routes */
3942 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3943 if ((*r) != (*rt)) {
3944 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3946 mt->set_input_active (!others_are_already_on);
3955 Session::routes_using_input_from (const string& str, RouteList& rl)
3957 boost::shared_ptr<RouteList> r = routes.reader();
3959 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3960 if ((*i)->input()->connected_to (str)) {
3966 boost::shared_ptr<Route>
3967 Session::route_by_name (string name)
3969 boost::shared_ptr<RouteList> r = routes.reader ();
3971 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3972 if ((*i)->name() == name) {
3977 return boost::shared_ptr<Route> ((Route*) 0);
3980 boost::shared_ptr<Route>
3981 Session::route_by_id (PBD::ID id)
3983 boost::shared_ptr<RouteList> r = routes.reader ();
3985 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3986 if ((*i)->id() == id) {
3991 return boost::shared_ptr<Route> ((Route*) 0);
3994 boost::shared_ptr<Track>
3995 Session::track_by_diskstream_id (PBD::ID id)
3997 boost::shared_ptr<RouteList> r = routes.reader ();
3999 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4000 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
4001 if (t && t->using_diskstream_id (id)) {
4006 return boost::shared_ptr<Track> ();
4009 boost::shared_ptr<Route>
4010 Session::route_by_remote_id (uint32_t id)
4012 boost::shared_ptr<RouteList> r = routes.reader ();
4014 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4015 if ((*i)->remote_control_id() == id) {
4020 return boost::shared_ptr<Route> ((Route*) 0);
4025 Session::reassign_track_numbers ()
4029 RouteList r (*(routes.reader ()));
4030 SignalOrderRouteSorter sorter;
4033 StateProtector sp (this);
4035 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4036 if (boost::dynamic_pointer_cast<Track> (*i)) {
4037 (*i)->set_track_number(++tn);
4039 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
4040 (*i)->set_track_number(--bn);
4043 const uint32_t decimals = ceilf (log10f (tn + 1));
4044 const bool decimals_changed = _track_number_decimals != decimals;
4045 _track_number_decimals = decimals;
4047 if (decimals_changed && config.get_track_name_number ()) {
4048 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4049 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
4051 t->resync_track_name();
4054 // trigger GUI re-layout
4055 config.ParameterChanged("track-name-number");
4060 Session::playlist_region_added (boost::weak_ptr<Region> w)
4062 boost::shared_ptr<Region> r = w.lock ();
4067 /* These are the operations that are currently in progress... */
4068 list<GQuark> curr = _current_trans_quarks;
4071 /* ...and these are the operations during which we want to update
4072 the session range location markers.
4075 ops.push_back (Operations::capture);
4076 ops.push_back (Operations::paste);
4077 ops.push_back (Operations::duplicate_region);
4078 ops.push_back (Operations::insert_file);
4079 ops.push_back (Operations::insert_region);
4080 ops.push_back (Operations::drag_region_brush);
4081 ops.push_back (Operations::region_drag);
4082 ops.push_back (Operations::selection_grab);
4083 ops.push_back (Operations::region_fill);
4084 ops.push_back (Operations::fill_selection);
4085 ops.push_back (Operations::create_region);
4086 ops.push_back (Operations::region_copy);
4087 ops.push_back (Operations::fixed_time_region_copy);
4090 /* See if any of the current operations match the ones that we want */
4092 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
4094 /* If so, update the session range markers */
4096 maybe_update_session_range (r->position (), r->last_frame ());
4100 /** Update the session range markers if a is before the current start or
4101 * b is after the current end.
4104 Session::maybe_update_session_range (framepos_t a, framepos_t b)
4106 if (_state_of_the_state & Loading) {
4110 framepos_t session_end_marker_shift_samples = session_end_shift * _nominal_frame_rate;
4112 if (_session_range_location == 0) {
4114 set_session_range_location (a, b + session_end_marker_shift_samples);
4118 if (a < _session_range_location->start()) {
4119 _session_range_location->set_start (a);
4122 if (b > _session_range_location->end()) {
4123 _session_range_location->set_end (b);
4129 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
4131 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4132 maybe_update_session_range (i->to, i->to + i->length);
4137 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
4139 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4140 maybe_update_session_range (i->from, i->to);
4144 /* Region management */
4146 boost::shared_ptr<Region>
4147 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
4149 const RegionFactory::RegionMap& regions (RegionFactory::regions());
4150 RegionFactory::RegionMap::const_iterator i;
4151 boost::shared_ptr<Region> region;
4153 Glib::Threads::Mutex::Lock lm (region_lock);
4155 for (i = regions.begin(); i != regions.end(); ++i) {
4159 if (region->whole_file()) {
4161 if (child->source_equivalent (region)) {
4167 return boost::shared_ptr<Region> ();
4171 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
4173 set<boost::shared_ptr<Region> > relevant_regions;
4175 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
4176 RegionFactory::get_regions_using_source (*s, relevant_regions);
4179 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
4180 set<boost::shared_ptr<Region> >::iterator tmp;
4185 playlists->destroy_region (*r);
4186 RegionFactory::map_remove (*r);
4188 (*r)->drop_sources ();
4189 (*r)->drop_references ();
4191 relevant_regions.erase (r);
4196 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
4199 Glib::Threads::Mutex::Lock ls (source_lock);
4200 /* remove from the main source list */
4201 sources.erase ((*s)->id());
4204 (*s)->mark_for_remove ();
4205 (*s)->drop_references ();
4214 Session::remove_last_capture ()
4216 list<boost::shared_ptr<Source> > srcs;
4218 boost::shared_ptr<RouteList> rl = routes.reader ();
4219 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4220 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4225 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
4228 srcs.insert (srcs.end(), l.begin(), l.end());
4233 destroy_sources (srcs);
4235 save_state (_current_snapshot_name);
4240 /* Source Management */
4243 Session::add_source (boost::shared_ptr<Source> source)
4245 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
4246 pair<SourceMap::iterator,bool> result;
4248 entry.first = source->id();
4249 entry.second = source;
4252 Glib::Threads::Mutex::Lock lm (source_lock);
4253 result = sources.insert (entry);
4256 if (result.second) {
4258 /* yay, new source */
4260 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
4263 if (!fs->within_session()) {
4264 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
4270 boost::shared_ptr<AudioFileSource> afs;
4272 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
4273 if (Config->get_auto_analyse_audio()) {
4274 Analyser::queue_source_for_analysis (source, false);
4278 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
4283 Session::remove_source (boost::weak_ptr<Source> src)
4285 if (_state_of_the_state & Deletion) {
4289 SourceMap::iterator i;
4290 boost::shared_ptr<Source> source = src.lock();
4297 Glib::Threads::Mutex::Lock lm (source_lock);
4299 if ((i = sources.find (source->id())) != sources.end()) {
4304 if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
4306 /* save state so we don't end up with a session file
4307 referring to non-existent sources.
4310 save_state (_current_snapshot_name);
4314 boost::shared_ptr<Source>
4315 Session::source_by_id (const PBD::ID& id)
4317 Glib::Threads::Mutex::Lock lm (source_lock);
4318 SourceMap::iterator i;
4319 boost::shared_ptr<Source> source;
4321 if ((i = sources.find (id)) != sources.end()) {
4328 boost::shared_ptr<AudioFileSource>
4329 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
4331 /* Restricted to audio files because only audio sources have channel
4335 Glib::Threads::Mutex::Lock lm (source_lock);
4337 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
4338 boost::shared_ptr<AudioFileSource> afs
4339 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
4341 if (afs && afs->path() == path && chn == afs->channel()) {
4346 return boost::shared_ptr<AudioFileSource>();
4349 boost::shared_ptr<MidiSource>
4350 Session::midi_source_by_path (const std::string& path) const
4352 /* Restricted to MIDI files because audio sources require a channel
4353 for unique identification, in addition to a path.
4356 Glib::Threads::Mutex::Lock lm (source_lock);
4358 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
4359 boost::shared_ptr<MidiSource> ms
4360 = boost::dynamic_pointer_cast<MidiSource>(s->second);
4361 boost::shared_ptr<FileSource> fs
4362 = boost::dynamic_pointer_cast<FileSource>(s->second);
4364 if (ms && fs && fs->path() == path) {
4369 return boost::shared_ptr<MidiSource>();
4373 Session::count_sources_by_origin (const string& path)
4376 Glib::Threads::Mutex::Lock lm (source_lock);
4378 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
4379 boost::shared_ptr<FileSource> fs
4380 = boost::dynamic_pointer_cast<FileSource>(i->second);
4382 if (fs && fs->origin() == path) {
4391 peak_file_helper (const string& peak_path, const string& file_path, const string& file_base, bool hash) {
4393 std::string checksum = Glib::Checksum::compute_checksum(Glib::Checksum::CHECKSUM_SHA1, file_path + G_DIR_SEPARATOR + file_base);
4394 return Glib::build_filename (peak_path, checksum + peakfile_suffix);
4396 return Glib::build_filename (peak_path, file_base + peakfile_suffix);
4401 Session::construct_peak_filepath (const string& filepath, const bool in_session, const bool old_peak_name) const
4403 string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
4405 if (Glib::path_is_absolute (filepath)) {
4407 /* rip the session dir from the audiofile source */
4409 string session_path;
4410 bool in_another_session = true;
4412 if (filepath.find (interchange_dir_string) != string::npos) {
4414 session_path = Glib::path_get_dirname (filepath); /* now ends in audiofiles */
4415 session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
4416 session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
4417 session_path = Glib::path_get_dirname (session_path); /* now has session path */
4419 /* see if it is within our session */
4421 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4422 if (i->path == session_path) {
4423 in_another_session = false;
4428 in_another_session = false;
4432 if (in_another_session) {
4433 SessionDirectory sd (session_path);
4434 return peak_file_helper (sd.peak_path(), "", Glib::path_get_basename (filepath), !old_peak_name);
4438 /* 1) if file belongs to this session
4439 * it may be a relative path (interchange/...)
4440 * or just basename (session_state, remove source)
4441 * -> just use the basename
4443 std::string filename = Glib::path_get_basename (filepath);
4446 /* 2) if the file is outside our session dir:
4447 * (imported but not copied) add the path for check-summming */
4449 path = Glib::path_get_dirname (filepath);
4452 return peak_file_helper (_session_dir->peak_path(), path, Glib::path_get_basename (filepath), !old_peak_name);
4456 Session::new_audio_source_path_for_embedded (const std::string& path)
4460 * we know that the filename is already unique because it exists
4461 * out in the filesystem.
4463 * However, when we bring it into the session, we could get a
4466 * Eg. two embedded files:
4471 * When merged into session, these collide.
4473 * There will not be a conflict with in-memory sources
4474 * because when the source was created we already picked
4475 * a unique name for it.
4477 * This collision is not likely to be common, but we have to guard
4478 * against it. So, if there is a collision, take the md5 hash of the
4479 * the path, and use that as the filename instead.
4482 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4483 string base = Glib::path_get_basename (path);
4484 string newpath = Glib::build_filename (sdir.sound_path(), base);
4486 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4490 md5.digestString (path.c_str());
4491 md5.writeToString ();
4492 base = md5.digestChars;
4494 string ext = get_suffix (path);
4501 newpath = Glib::build_filename (sdir.sound_path(), base);
4503 /* if this collides, we're screwed */
4505 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4506 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
4515 /** Return true if there are no audio file sources that use @param name as
4516 * the filename component of their path.
4518 * Return false otherwise.
4520 * This method MUST ONLY be used to check in-session, mono files since it
4521 * hard-codes the channel of the audio file source we are looking for as zero.
4523 * If/when Ardour supports native files in non-mono formats, the logic here
4524 * will need to be revisited.
4527 Session::audio_source_name_is_unique (const string& name)
4529 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
4530 vector<space_and_path>::iterator i;
4531 uint32_t existing = 0;
4533 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4535 /* note that we search *without* the extension so that
4536 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
4537 in the event that this new name is required for
4538 a file format change.
4541 const string spath = *i;
4543 if (matching_unsuffixed_filename_exists_in (spath, name)) {
4548 /* it is possible that we have the path already
4549 * assigned to a source that has not yet been written
4550 * (ie. the write source for a diskstream). we have to
4551 * check this in order to make sure that our candidate
4552 * path isn't used again, because that can lead to
4553 * two Sources point to the same file with different
4554 * notions of their removability.
4558 string possible_path = Glib::build_filename (spath, name);
4560 if (audio_source_by_path_and_channel (possible_path, 0)) {
4566 return (existing == 0);
4570 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)
4573 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4575 if (Profile->get_trx() && destructive) {
4577 sstr << setfill ('0') << setw (4) << cnt;
4578 sstr << legalized_base;
4580 sstr << legalized_base;
4582 if (take_required || related_exists) {
4594 } else if (nchan > 2) {
4599 /* XXX what? more than 26 channels! */
4610 /** Return a unique name based on \a base for a new internal audio source */
4612 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
4615 string possible_name;
4616 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
4618 bool some_related_source_name_exists = false;
4620 legalized = legalize_for_path (base);
4622 // Find a "version" of the base name that doesn't exist in any of the possible directories.
4624 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
4626 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
4628 if (audio_source_name_is_unique (possible_name)) {
4632 some_related_source_name_exists = true;
4635 error << string_compose(
4636 _("There are already %1 recordings for %2, which I consider too many."),
4637 limit, base) << endmsg;
4639 throw failed_constructor();
4643 /* We've established that the new name does not exist in any session
4644 * directory, so now find out which one we should use for this new
4648 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4650 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
4655 /** Return a unique name based on `base` for a new internal MIDI source */
4657 Session::new_midi_source_path (const string& base)
4660 char buf[PATH_MAX+1];
4661 const uint32_t limit = 10000;
4663 string possible_path;
4664 string possible_name;
4667 legalized = legalize_for_path (base);
4669 // Find a "version" of the file name that doesn't exist in any of the possible directories.
4670 std::vector<string> sdirs = source_search_path(DataType::MIDI);
4672 /* - the main session folder is the first in the vector.
4673 * - after checking all locations for file-name uniqueness,
4674 * we keep the one from the last iteration as new file name
4675 * - midi files are small and should just be kept in the main session-folder
4677 * -> reverse the array, check main session folder last and use that as location
4680 std::reverse(sdirs.begin(), sdirs.end());
4682 for (cnt = 1; cnt <= limit; ++cnt) {
4684 vector<space_and_path>::iterator i;
4685 uint32_t existing = 0;
4687 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4689 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
4690 possible_name = buf;
4692 possible_path = Glib::build_filename (*i, possible_name);
4694 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
4698 if (midi_source_by_path (possible_path)) {
4703 if (existing == 0) {
4708 error << string_compose(
4709 _("There are already %1 recordings for %2, which I consider too many."),
4710 limit, base) << endmsg;
4716 /* No need to "find best location" for software/app-based RAID, because
4717 MIDI is so small that we always put it in the same place.
4720 return possible_path;
4724 /** Create a new within-session audio source */
4725 boost::shared_ptr<AudioFileSource>
4726 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
4728 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
4730 if (!path.empty()) {
4731 return boost::dynamic_pointer_cast<AudioFileSource> (
4732 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate(), true, true));
4734 throw failed_constructor ();
4738 /** Create a new within-session MIDI source */
4739 boost::shared_ptr<MidiSource>
4740 Session::create_midi_source_for_session (string const & basic_name)
4742 const string path = new_midi_source_path (basic_name);
4744 if (!path.empty()) {
4745 return boost::dynamic_pointer_cast<SMFSource> (
4746 SourceFactory::createWritable (
4747 DataType::MIDI, *this, path, false, frame_rate()));
4749 throw failed_constructor ();
4753 /** Create a new within-session MIDI source */
4754 boost::shared_ptr<MidiSource>
4755 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
4757 /* the caller passes in the track the source will be used in,
4758 so that we can keep the numbering sane.
4760 Rationale: a track with the name "Foo" that has had N
4761 captures carried out so far will ALREADY have a write source
4762 named "Foo-N+1.mid" waiting to be used for the next capture.
4764 If we call new_midi_source_name() we will get "Foo-N+2". But
4765 there is no region corresponding to "Foo-N+1", so when
4766 "Foo-N+2" appears in the track, the gap presents the user
4767 with odd behaviour - why did it skip past Foo-N+1?
4769 We could explain this to the user in some odd way, but
4770 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
4773 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
4776 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
4778 std::string name = track->steal_write_source_name ();
4781 return boost::shared_ptr<MidiSource>();
4784 /* MIDI files are small, just put them in the first location of the
4785 session source search path.
4788 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
4790 return boost::dynamic_pointer_cast<SMFSource> (
4791 SourceFactory::createWritable (
4792 DataType::MIDI, *this, path, false, frame_rate()));
4797 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
4799 if (playlist->hidden()) {
4803 playlists->add (playlist);
4806 playlist->release();
4813 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
4815 if (_state_of_the_state & Deletion) {
4819 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
4825 playlists->remove (playlist);
4831 Session::set_audition (boost::shared_ptr<Region> r)
4833 pending_audition_region = r;
4834 add_post_transport_work (PostTransportAudition);
4835 _butler->schedule_transport_work ();
4839 Session::audition_playlist ()
4841 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4842 ev->region.reset ();
4847 Session::non_realtime_set_audition ()
4849 assert (pending_audition_region);
4850 auditioner->audition_region (pending_audition_region);
4851 pending_audition_region.reset ();
4852 AuditionActive (true); /* EMIT SIGNAL */
4856 Session::audition_region (boost::shared_ptr<Region> r)
4858 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4864 Session::cancel_audition ()
4869 if (auditioner->auditioning()) {
4870 auditioner->cancel_audition ();
4871 AuditionActive (false); /* EMIT SIGNAL */
4876 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
4878 if (a->is_monitor()) {
4881 if (b->is_monitor()) {
4884 return a->order_key () < b->order_key ();
4888 Session::is_auditioning () const
4890 /* can be called before we have an auditioner object */
4892 return auditioner->auditioning();
4899 Session::graph_reordered ()
4901 /* don't do this stuff if we are setting up connections
4902 from a set_state() call or creating new tracks. Ditto for deletion.
4905 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _reconnecting_routes_in_progress || _route_deletion_in_progress) {
4909 /* every track/bus asked for this to be handled but it was deferred because
4910 we were connecting. do it now.
4913 request_input_change_handling ();
4917 /* force all diskstreams to update their capture offset values to
4918 reflect any changes in latencies within the graph.
4921 boost::shared_ptr<RouteList> rl = routes.reader ();
4922 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4923 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4925 tr->set_capture_offset ();
4930 /** @return Number of frames that there is disk space available to write,
4933 boost::optional<framecnt_t>
4934 Session::available_capture_duration ()
4936 Glib::Threads::Mutex::Lock lm (space_lock);
4938 if (_total_free_4k_blocks_uncertain) {
4939 return boost::optional<framecnt_t> ();
4942 float sample_bytes_on_disk = 4.0; // keep gcc happy
4944 switch (config.get_native_file_data_format()) {
4946 sample_bytes_on_disk = 4.0;
4950 sample_bytes_on_disk = 3.0;
4954 sample_bytes_on_disk = 2.0;
4958 /* impossible, but keep some gcc versions happy */
4959 fatal << string_compose (_("programming error: %1"),
4960 X_("illegal native file data format"))
4962 abort(); /*NOTREACHED*/
4965 double scale = 4096.0 / sample_bytes_on_disk;
4967 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
4968 return max_framecnt;
4971 return (framecnt_t) floor (_total_free_4k_blocks * scale);
4975 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
4978 RCUWriter<BundleList> writer (_bundles);
4979 boost::shared_ptr<BundleList> b = writer.get_copy ();
4980 b->push_back (bundle);
4984 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4991 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
4993 bool removed = false;
4996 RCUWriter<BundleList> writer (_bundles);
4997 boost::shared_ptr<BundleList> b = writer.get_copy ();
4998 BundleList::iterator i = find (b->begin(), b->end(), bundle);
5000 if (i != b->end()) {
5007 BundleAddedOrRemoved (); /* EMIT SIGNAL */
5013 boost::shared_ptr<Bundle>
5014 Session::bundle_by_name (string name) const
5016 boost::shared_ptr<BundleList> b = _bundles.reader ();
5018 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
5019 if ((*i)->name() == name) {
5024 return boost::shared_ptr<Bundle> ();
5028 Session::tempo_map_changed (const PropertyChange&)
5032 playlists->update_after_tempo_map_change ();
5034 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
5040 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
5042 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
5043 (*i)->recompute_frames_from_bbt ();
5047 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
5048 * the given count with the current block size.
5051 Session::ensure_buffers (ChanCount howmany)
5053 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
5057 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
5059 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5060 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
5065 Session::next_insert_id ()
5067 /* this doesn't really loop forever. just think about it */
5070 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
5071 if (!insert_bitset[n]) {
5072 insert_bitset[n] = true;
5078 /* none available, so resize and try again */
5080 insert_bitset.resize (insert_bitset.size() + 16, false);
5085 Session::next_send_id ()
5087 /* this doesn't really loop forever. just think about it */
5090 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
5091 if (!send_bitset[n]) {
5092 send_bitset[n] = true;
5098 /* none available, so resize and try again */
5100 send_bitset.resize (send_bitset.size() + 16, false);
5105 Session::next_aux_send_id ()
5107 /* this doesn't really loop forever. just think about it */
5110 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
5111 if (!aux_send_bitset[n]) {
5112 aux_send_bitset[n] = true;
5118 /* none available, so resize and try again */
5120 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
5125 Session::next_return_id ()
5127 /* this doesn't really loop forever. just think about it */
5130 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
5131 if (!return_bitset[n]) {
5132 return_bitset[n] = true;
5138 /* none available, so resize and try again */
5140 return_bitset.resize (return_bitset.size() + 16, false);
5145 Session::mark_send_id (uint32_t id)
5147 if (id >= send_bitset.size()) {
5148 send_bitset.resize (id+16, false);
5150 if (send_bitset[id]) {
5151 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
5153 send_bitset[id] = true;
5157 Session::mark_aux_send_id (uint32_t id)
5159 if (id >= aux_send_bitset.size()) {
5160 aux_send_bitset.resize (id+16, false);
5162 if (aux_send_bitset[id]) {
5163 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
5165 aux_send_bitset[id] = true;
5169 Session::mark_return_id (uint32_t id)
5171 if (id >= return_bitset.size()) {
5172 return_bitset.resize (id+16, false);
5174 if (return_bitset[id]) {
5175 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
5177 return_bitset[id] = true;
5181 Session::mark_insert_id (uint32_t id)
5183 if (id >= insert_bitset.size()) {
5184 insert_bitset.resize (id+16, false);
5186 if (insert_bitset[id]) {
5187 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
5189 insert_bitset[id] = true;
5193 Session::unmark_send_id (uint32_t id)
5195 if (id < send_bitset.size()) {
5196 send_bitset[id] = false;
5201 Session::unmark_aux_send_id (uint32_t id)
5203 if (id < aux_send_bitset.size()) {
5204 aux_send_bitset[id] = false;
5209 Session::unmark_return_id (uint32_t id)
5211 if (id < return_bitset.size()) {
5212 return_bitset[id] = false;
5217 Session::unmark_insert_id (uint32_t id)
5219 if (id < insert_bitset.size()) {
5220 insert_bitset[id] = false;
5225 Session::reset_native_file_format ()
5227 boost::shared_ptr<RouteList> rl = routes.reader ();
5229 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5230 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5232 /* don't save state as we do this, there's no point
5234 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
5235 tr->reset_write_sources (false);
5236 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
5242 Session::route_name_unique (string n) const
5244 boost::shared_ptr<RouteList> r = routes.reader ();
5246 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5247 if ((*i)->name() == n) {
5256 Session::route_name_internal (string n) const
5258 if (auditioner && auditioner->name() == n) {
5262 if (_click_io && _click_io->name() == n) {
5270 Session::freeze_all (InterThreadInfo& itt)
5272 boost::shared_ptr<RouteList> r = routes.reader ();
5274 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5276 boost::shared_ptr<Track> t;
5278 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
5279 /* XXX this is wrong because itt.progress will keep returning to zero at the start
5289 boost::shared_ptr<Region>
5290 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
5291 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
5292 InterThreadInfo& itt,
5293 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
5294 bool for_export, bool for_freeze)
5296 boost::shared_ptr<Region> result;
5297 boost::shared_ptr<Playlist> playlist;
5298 boost::shared_ptr<Source> source;
5299 ChanCount diskstream_channels (track.n_channels());
5300 framepos_t position;
5301 framecnt_t this_chunk;
5303 framepos_t latency_skip;
5305 framepos_t len = end - start;
5306 bool need_block_size_reset = false;
5307 ChanCount const max_proc = track.max_processor_streams ();
5308 string legal_playlist_name;
5309 string possible_path;
5312 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
5313 end, start) << endmsg;
5317 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
5318 include_endpoint, for_export, for_freeze);
5320 if (diskstream_channels.n(track.data_type()) < 1) {
5321 error << _("Cannot write a range with no data.") << endmsg;
5325 // block all process callback handling
5327 block_processing ();
5330 // synchronize with AudioEngine::process_callback()
5331 // make sure processing is not currently running
5332 // and processing_blocked() is honored before
5333 // acquiring thread buffers
5334 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5337 _bounce_processing_active = true;
5339 /* call tree *MUST* hold route_lock */
5341 if ((playlist = track.playlist()) == 0) {
5345 legal_playlist_name = legalize_for_path (playlist->name());
5347 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
5349 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
5350 string path = ((track.data_type() == DataType::AUDIO)
5351 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
5352 : new_midi_source_path (legal_playlist_name));
5359 source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
5362 catch (failed_constructor& err) {
5363 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
5367 srcs.push_back (source);
5370 /* tell redirects that care that we are about to use a much larger
5371 * blocksize. this will flush all plugins too, so that they are ready
5372 * to be used for this process.
5375 need_block_size_reset = true;
5376 track.set_block_size (bounce_chunk_size);
5377 _engine.main_thread()->get_buffers ();
5381 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5383 /* create a set of reasonably-sized buffers */
5384 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5385 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
5387 buffers.set_count (max_proc);
5389 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5390 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5391 boost::shared_ptr<MidiSource> ms;
5393 afs->prepare_for_peakfile_writes ();
5394 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5395 Source::Lock lock(ms->mutex());
5396 ms->mark_streaming_write_started(lock);
5400 while (to_do && !itt.cancel) {
5402 this_chunk = min (to_do, bounce_chunk_size);
5404 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
5408 start += this_chunk;
5409 to_do -= this_chunk;
5410 itt.progress = (float) (1.0 - ((double) to_do / len));
5412 if (latency_skip >= bounce_chunk_size) {
5413 latency_skip -= bounce_chunk_size;
5417 const framecnt_t current_chunk = this_chunk - latency_skip;
5420 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5421 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5422 boost::shared_ptr<MidiSource> ms;
5425 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
5428 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5429 Source::Lock lock(ms->mutex());
5431 const MidiBuffer& buf = buffers.get_midi(0);
5432 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
5433 Evoral::Event<framepos_t> ev = *i;
5434 ev.set_time(ev.time() - position);
5435 ms->append_event_frames(lock, ev, ms->timeline_position());
5442 /* post-roll, pick up delayed processor output */
5443 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5445 while (latency_skip && !itt.cancel) {
5446 this_chunk = min (latency_skip, bounce_chunk_size);
5447 latency_skip -= this_chunk;
5449 buffers.silence (this_chunk, 0);
5450 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
5453 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5454 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5457 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
5469 xnow = localtime (&now);
5471 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
5472 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5473 boost::shared_ptr<MidiSource> ms;
5476 afs->update_header (position, *xnow, now);
5477 afs->flush_header ();
5478 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5479 Source::Lock lock(ms->mutex());
5480 ms->mark_streaming_write_completed(lock);
5484 /* construct a region to represent the bounced material */
5488 plist.add (Properties::start, 0);
5489 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
5490 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
5492 result = RegionFactory::create (srcs, plist);
5498 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5499 (*src)->mark_for_remove ();
5500 (*src)->drop_references ();
5504 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5505 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5508 afs->done_with_peakfile_writes ();
5512 _bounce_processing_active = false;
5514 if (need_block_size_reset) {
5515 _engine.main_thread()->drop_buffers ();
5516 track.set_block_size (get_block_size());
5519 unblock_processing ();
5525 Session::gain_automation_buffer() const
5527 return ProcessThread::gain_automation_buffer ();
5531 Session::trim_automation_buffer() const
5533 return ProcessThread::trim_automation_buffer ();
5537 Session::send_gain_automation_buffer() const
5539 return ProcessThread::send_gain_automation_buffer ();
5543 Session::pan_automation_buffer() const
5545 return ProcessThread::pan_automation_buffer ();
5549 Session::get_silent_buffers (ChanCount count)
5551 return ProcessThread::get_silent_buffers (count);
5555 Session::get_scratch_buffers (ChanCount count, bool silence)
5557 return ProcessThread::get_scratch_buffers (count, silence);
5561 Session::get_route_buffers (ChanCount count, bool silence)
5563 return ProcessThread::get_route_buffers (count, silence);
5568 Session::get_mix_buffers (ChanCount count)
5570 return ProcessThread::get_mix_buffers (count);
5574 Session::ntracks () const
5577 boost::shared_ptr<RouteList> r = routes.reader ();
5579 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5580 if (boost::dynamic_pointer_cast<Track> (*i)) {
5589 Session::nbusses () const
5592 boost::shared_ptr<RouteList> r = routes.reader ();
5594 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5595 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
5604 Session::add_automation_list(AutomationList *al)
5606 automation_lists[al->id()] = al;
5609 /** @return true if there is at least one record-enabled track, otherwise false */
5611 Session::have_rec_enabled_track () const
5613 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
5617 Session::have_rec_disabled_track () const
5619 return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
5622 /** Update the state of our rec-enabled tracks flag */
5624 Session::update_route_record_state ()
5626 boost::shared_ptr<RouteList> rl = routes.reader ();
5627 RouteList::iterator i = rl->begin();
5628 while (i != rl->end ()) {
5630 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5631 if (tr && tr->record_enabled ()) {
5638 int const old = g_atomic_int_get (&_have_rec_enabled_track);
5640 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
5642 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
5643 RecordStateChanged (); /* EMIT SIGNAL */
5646 for (i = rl->begin(); i != rl->end (); ++i) {
5647 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5648 if (tr && !tr->record_enabled ()) {
5653 g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
5655 bool record_arm_state_changed = (old != g_atomic_int_get (&_have_rec_enabled_track) );
5657 if (record_status() == Recording && record_arm_state_changed ) {
5658 RecordArmStateChanged ();
5664 Session::listen_position_changed ()
5666 boost::shared_ptr<RouteList> r = routes.reader ();
5668 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5669 (*i)->listen_position_changed ();
5674 Session::solo_control_mode_changed ()
5676 /* cancel all solo or all listen when solo control mode changes */
5679 set_solo (get_routes(), false);
5680 } else if (listening()) {
5681 set_listen (get_routes(), false);
5685 /** Called when a property of one of our route groups changes */
5687 Session::route_group_property_changed (RouteGroup* rg)
5689 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
5692 /** Called when a route is added to one of our route groups */
5694 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5696 RouteAddedToRouteGroup (rg, r);
5699 /** Called when a route is removed from one of our route groups */
5701 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5703 update_route_record_state ();
5704 RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
5707 boost::shared_ptr<RouteList>
5708 Session::get_tracks () const
5710 boost::shared_ptr<RouteList> rl = routes.reader ();
5711 boost::shared_ptr<RouteList> tl (new RouteList);
5713 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
5714 if (boost::dynamic_pointer_cast<Track> (*r)) {
5715 if (!(*r)->is_auditioner()) {
5723 boost::shared_ptr<RouteList>
5724 Session::get_routes_with_regions_at (framepos_t const p) const
5726 boost::shared_ptr<RouteList> r = routes.reader ();
5727 boost::shared_ptr<RouteList> rl (new RouteList);
5729 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5730 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5735 boost::shared_ptr<Playlist> pl = tr->playlist ();
5740 if (pl->has_region_at (p)) {
5749 Session::goto_end ()
5751 if (_session_range_location) {
5752 request_locate (_session_range_location->end(), false);
5754 request_locate (0, false);
5759 Session::goto_start ()
5761 if (_session_range_location) {
5762 request_locate (_session_range_location->start(), false);
5764 request_locate (0, false);
5769 Session::current_start_frame () const
5771 return _session_range_location ? _session_range_location->start() : 0;
5775 Session::current_end_frame () const
5777 return _session_range_location ? _session_range_location->end() : 0;
5781 Session::set_session_range_location (framepos_t start, framepos_t end)
5783 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
5784 _locations->add (_session_range_location);
5788 Session::step_edit_status_change (bool yn)
5794 send = (_step_editors == 0);
5799 send = (_step_editors == 1);
5802 if (_step_editors > 0) {
5808 StepEditStatusChange (val);
5814 Session::start_time_changed (framepos_t old)
5816 /* Update the auto loop range to match the session range
5817 (unless the auto loop range has been changed by the user)
5820 Location* s = _locations->session_range_location ();
5825 Location* l = _locations->auto_loop_location ();
5827 if (l && l->start() == old) {
5828 l->set_start (s->start(), true);
5833 Session::end_time_changed (framepos_t old)
5835 /* Update the auto loop range to match the session range
5836 (unless the auto loop range has been changed by the user)
5839 Location* s = _locations->session_range_location ();
5844 Location* l = _locations->auto_loop_location ();
5846 if (l && l->end() == old) {
5847 l->set_end (s->end(), true);
5851 std::vector<std::string>
5852 Session::source_search_path (DataType type) const
5856 if (session_dirs.size() == 1) {
5858 case DataType::AUDIO:
5859 sp.push_back (_session_dir->sound_path());
5861 case DataType::MIDI:
5862 sp.push_back (_session_dir->midi_path());
5866 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
5867 SessionDirectory sdir (i->path);
5869 case DataType::AUDIO:
5870 sp.push_back (sdir.sound_path());
5872 case DataType::MIDI:
5873 sp.push_back (sdir.midi_path());
5879 if (type == DataType::AUDIO) {
5880 const string sound_path_2X = _session_dir->sound_path_2X();
5881 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
5882 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
5883 sp.push_back (sound_path_2X);
5888 // now check the explicit (possibly user-specified) search path
5891 case DataType::AUDIO:
5892 sp += Searchpath(config.get_audio_search_path ());
5894 case DataType::MIDI:
5895 sp += Searchpath(config.get_midi_search_path ());
5903 Session::ensure_search_path_includes (const string& path, DataType type)
5912 case DataType::AUDIO:
5913 sp += Searchpath(config.get_audio_search_path ());
5915 case DataType::MIDI:
5916 sp += Searchpath (config.get_midi_search_path ());
5920 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
5921 /* No need to add this new directory if it has the same inode as
5922 an existing one; checking inode rather than name prevents duplicated
5923 directories when we are using symlinks.
5925 On Windows, I think we could just do if (*i == path) here.
5927 if (PBD::equivalent_paths (*i, path)) {
5935 case DataType::AUDIO:
5936 config.set_audio_search_path (sp.to_string());
5938 case DataType::MIDI:
5939 config.set_midi_search_path (sp.to_string());
5945 Session::remove_dir_from_search_path (const string& dir, DataType type)
5950 case DataType::AUDIO:
5951 sp = Searchpath(config.get_audio_search_path ());
5953 case DataType::MIDI:
5954 sp = Searchpath (config.get_midi_search_path ());
5961 case DataType::AUDIO:
5962 config.set_audio_search_path (sp.to_string());
5964 case DataType::MIDI:
5965 config.set_midi_search_path (sp.to_string());
5971 boost::shared_ptr<Speakers>
5972 Session::get_speakers()
5978 Session::unknown_processors () const
5982 boost::shared_ptr<RouteList> r = routes.reader ();
5983 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5984 list<string> t = (*i)->unknown_processors ();
5985 copy (t.begin(), t.end(), back_inserter (p));
5995 Session::update_latency (bool playback)
5997 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
5999 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
6003 boost::shared_ptr<RouteList> r = routes.reader ();
6004 framecnt_t max_latency = 0;
6007 /* reverse the list so that we work backwards from the last route to run to the first */
6008 RouteList* rl = routes.reader().get();
6009 r.reset (new RouteList (*rl));
6010 reverse (r->begin(), r->end());
6013 /* compute actual latency values for the given direction and store them all in per-port
6014 structures. this will also publish the same values (to JACK) so that computation of latency
6015 for routes can consistently use public latency values.
6018 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6019 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
6022 /* because we latency compensate playback, our published playback latencies should
6023 be the same for all output ports - all material played back by ardour has
6024 the same latency, whether its caused by plugins or by latency compensation. since
6025 these may differ from the values computed above, reset all playback port latencies
6029 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
6031 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6032 (*i)->set_public_port_latencies (max_latency, playback);
6037 post_playback_latency ();
6041 post_capture_latency ();
6044 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
6048 Session::post_playback_latency ()
6050 set_worst_playback_latency ();
6052 boost::shared_ptr<RouteList> r = routes.reader ();
6054 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6055 if (!(*i)->is_auditioner() && ((*i)->active())) {
6056 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
6060 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6061 (*i)->set_latency_compensation (_worst_track_latency);
6066 Session::post_capture_latency ()
6068 set_worst_capture_latency ();
6070 /* reflect any changes in capture latencies into capture offsets
6073 boost::shared_ptr<RouteList> rl = routes.reader();
6074 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
6075 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6077 tr->set_capture_offset ();
6083 Session::initialize_latencies ()
6086 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
6087 update_latency (false);
6088 update_latency (true);
6091 set_worst_io_latencies ();
6095 Session::set_worst_io_latencies ()
6097 set_worst_playback_latency ();
6098 set_worst_capture_latency ();
6102 Session::set_worst_playback_latency ()
6104 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6108 _worst_output_latency = 0;
6110 if (!_engine.connected()) {
6114 boost::shared_ptr<RouteList> r = routes.reader ();
6116 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6117 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
6120 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
6124 Session::set_worst_capture_latency ()
6126 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6130 _worst_input_latency = 0;
6132 if (!_engine.connected()) {
6136 boost::shared_ptr<RouteList> r = routes.reader ();
6138 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6139 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
6142 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
6146 Session::update_latency_compensation (bool force_whole_graph)
6148 bool some_track_latency_changed = false;
6150 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6154 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
6156 _worst_track_latency = 0;
6158 boost::shared_ptr<RouteList> r = routes.reader ();
6160 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6161 if (!(*i)->is_auditioner() && ((*i)->active())) {
6163 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
6164 some_track_latency_changed = true;
6166 _worst_track_latency = max (tl, _worst_track_latency);
6170 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
6171 (some_track_latency_changed ? "yes" : "no")));
6173 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
6175 if (some_track_latency_changed || force_whole_graph) {
6176 _engine.update_latencies ();
6180 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6181 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6185 tr->set_capture_offset ();
6190 Session::session_name_is_legal (const string& path)
6192 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
6194 for (int i = 0; illegal_chars[i]; ++i) {
6195 if (path.find (illegal_chars[i]) != string::npos) {
6196 return illegal_chars[i];
6204 Session::next_control_id () const
6208 /* the monitor bus remote ID is in a different
6209 * "namespace" than regular routes. its existence doesn't
6210 * affect normal (low) numbered routes.
6217 /* the same about masterbus in Waves Tracks */
6219 if (Profile->get_trx() && _master_out) {
6223 return nroutes() - subtract;
6227 Session::notify_remote_id_change ()
6229 if (deletion_in_progress()) {
6233 switch (Config->get_remote_model()) {
6235 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
6241 #ifdef USE_TRACKS_CODE_FEATURES
6242 /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
6243 * if track order has been changed by user
6245 reconnect_existing_routes(true, true);
6251 Session::sync_order_keys ()
6253 if (deletion_in_progress()) {
6257 /* tell everyone that something has happened to the sort keys
6258 and let them sync up with the change(s)
6259 this will give objects that manage the sort order keys the
6260 opportunity to keep them in sync if they wish to.
6263 DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
6265 reassign_track_numbers();
6267 Route::SyncOrderKeys (); /* EMIT SIGNAL */
6269 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
6273 Session::operation_in_progress (GQuark op) const
6275 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
6278 boost::shared_ptr<Port>
6279 Session::ltc_input_port () const
6281 return _ltc_input->nth (0);
6284 boost::shared_ptr<Port>
6285 Session::ltc_output_port () const
6287 return _ltc_output->nth (0);
6291 Session::reconnect_ltc_input ()
6295 string src = Config->get_ltc_source_port();
6297 _ltc_input->disconnect (this);
6299 if (src != _("None") && !src.empty()) {
6300 _ltc_input->nth (0)->connect (src);
6303 if ( ARDOUR::Profile->get_trx () ) {
6304 // Tracks need this signal to update timecode_source_dropdown
6305 MtcOrLtcInputPortChanged (); //emit signal
6311 Session::reconnect_ltc_output ()
6315 string src = Config->get_ltc_output_port();
6317 _ltc_output->disconnect (this);
6319 if (src != _("None") && !src.empty()) {
6320 _ltc_output->nth (0)->connect (src);
6326 Session::set_range_selection (framepos_t start, framepos_t end)
6328 _range_selection = Evoral::Range<framepos_t> (start, end);
6329 #ifdef USE_TRACKS_CODE_FEATURES
6330 follow_playhead_priority ();
6335 Session::set_object_selection (framepos_t start, framepos_t end)
6337 _object_selection = Evoral::Range<framepos_t> (start, end);
6338 #ifdef USE_TRACKS_CODE_FEATURES
6339 follow_playhead_priority ();
6344 Session::clear_range_selection ()
6346 _range_selection = Evoral::Range<framepos_t> (-1,-1);
6347 #ifdef USE_TRACKS_CODE_FEATURES
6348 follow_playhead_priority ();
6353 Session::clear_object_selection ()
6355 _object_selection = Evoral::Range<framepos_t> (-1,-1);
6356 #ifdef USE_TRACKS_CODE_FEATURES
6357 follow_playhead_priority ();