2 Copyright (C) 1999-2010 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 #include <cstdio> /* sprintf(3) ... grrr */
32 #include <glibmm/threads.h>
33 #include <glibmm/miscutils.h>
34 #include <glibmm/fileutils.h>
36 #include <boost/algorithm/string/erase.hpp>
38 #include "pbd/basename.h"
39 #include "pbd/boost_debug.h"
40 #include "pbd/convert.h"
41 #include "pbd/convert.h"
42 #include "pbd/error.h"
43 #include "pbd/file_utils.h"
45 #include "pbd/search_path.h"
46 #include "pbd/stacktrace.h"
47 #include "pbd/stl_delete.h"
48 #include "pbd/replace_all.h"
49 #include "pbd/unwind.h"
51 #include "ardour/amp.h"
52 #include "ardour/analyser.h"
53 #include "ardour/async_midi_port.h"
54 #include "ardour/audio_buffer.h"
55 #include "ardour/audio_diskstream.h"
56 #include "ardour/audio_port.h"
57 #include "ardour/audio_track.h"
58 #include "ardour/audioengine.h"
59 #include "ardour/audiofilesource.h"
60 #include "ardour/auditioner.h"
61 #include "ardour/buffer_manager.h"
62 #include "ardour/buffer_set.h"
63 #include "ardour/bundle.h"
64 #include "ardour/butler.h"
65 #include "ardour/click.h"
66 #include "ardour/control_protocol_manager.h"
67 #include "ardour/data_type.h"
68 #include "ardour/debug.h"
69 #include "ardour/directory_names.h"
70 #ifdef USE_TRACKS_CODE_FEATURES
71 #include "ardour/engine_state_controller.h"
73 #include "ardour/filename_extensions.h"
74 #include "ardour/graph.h"
75 #include "ardour/midiport_manager.h"
76 #include "ardour/scene_changer.h"
77 #include "ardour/midi_track.h"
78 #include "ardour/midi_ui.h"
79 #include "ardour/operations.h"
80 #include "ardour/playlist.h"
81 #include "ardour/plugin.h"
82 #include "ardour/plugin_insert.h"
83 #include "ardour/process_thread.h"
84 #include "ardour/profile.h"
85 #include "ardour/rc_configuration.h"
86 #include "ardour/recent_sessions.h"
87 #include "ardour/region.h"
88 #include "ardour/region_factory.h"
89 #include "ardour/route_graph.h"
90 #include "ardour/route_group.h"
91 #include "ardour/route_sorters.h"
92 #include "ardour/send.h"
93 #include "ardour/session.h"
94 #include "ardour/session_directory.h"
95 #include "ardour/session_playlists.h"
96 #include "ardour/smf_source.h"
97 #include "ardour/source_factory.h"
98 #include "ardour/speakers.h"
99 #include "ardour/tempo.h"
100 #include "ardour/track.h"
101 #include "ardour/user_bundle.h"
102 #include "ardour/utils.h"
104 #include "midi++/port.h"
105 #include "midi++/mmc.h"
109 #include <glibmm/checksum.h>
118 using namespace ARDOUR;
121 bool Session::_disable_all_loaded_plugins = false;
122 bool Session::_bypass_all_loaded_plugins = false;
124 PBD::Signal1<int,uint32_t> Session::AudioEngineSetupRequired;
125 PBD::Signal1<void,std::string> Session::Dialog;
126 PBD::Signal0<int> Session::AskAboutPendingState;
127 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
128 PBD::Signal0<void> Session::SendFeedback;
129 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
131 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
132 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
133 PBD::Signal2<void,std::string, std::string> Session::Exported;
134 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
135 PBD::Signal0<void> Session::Quit;
136 PBD::Signal0<void> Session::FeedbackDetected;
137 PBD::Signal0<void> Session::SuccessfulGraphSort;
138 PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
140 const framecnt_t Session::bounce_chunk_size = 8192;
141 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
142 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
144 // seconds should be added after the region exceeds end marker
145 #ifdef USE_TRACKS_CODE_FEATURES
146 const uint32_t Session::session_end_shift = 5;
148 const uint32_t Session::session_end_shift = 0;
151 /** @param snapshot_name Snapshot name, without .ardour suffix */
152 Session::Session (AudioEngine &eng,
153 const string& fullpath,
154 const string& snapshot_name,
155 BusProfile* bus_profile,
157 : playlists (new SessionPlaylists)
159 , process_function (&Session::process_with_events)
160 , _bounce_processing_active (false)
161 , waiting_for_sync_offset (false)
162 , _base_frame_rate (0)
163 , _current_frame_rate (0)
164 , _nominal_frame_rate (0)
165 , transport_sub_state (0)
166 , _record_status (Disabled)
167 , _transport_frame (0)
168 , _session_range_location (0)
171 , _transport_speed (0)
172 , _default_transport_speed (1.0)
173 , _last_transport_speed (0)
174 , _target_transport_speed (0.0)
175 , auto_play_legal (false)
176 , _last_slave_transport_frame (0)
177 , maximum_output_latency (0)
178 , _requested_return_frame (-1)
179 , current_block_size (0)
180 , _worst_output_latency (0)
181 , _worst_input_latency (0)
182 , _worst_track_latency (0)
183 , _have_captured (false)
184 , _non_soloed_outs_muted (false)
186 , _solo_isolated_cnt (0)
188 , _was_seamless (Config->get_seamless_loop ())
189 , _under_nsm_control (false)
191 , delta_accumulator_cnt (0)
192 , average_slave_delta (1800) // !!! why 1800 ???
194 , have_first_delta_accumulator (false)
195 , _slave_state (Stopped)
196 , _mtc_active (false)
197 , _ltc_active (false)
198 , post_export_sync (false)
199 , post_export_position (0)
201 , _export_started (false)
202 , _export_rolling (false)
203 , _pre_export_mmc_enabled (false)
204 , _name (snapshot_name)
206 , _send_qf_mtc (false)
207 , _pframes_since_last_mtc (0)
208 , session_midi_feedback (0)
210 , loop_changing (false)
212 , _session_dir (new SessionDirectory (fullpath))
213 , _current_snapshot_name (snapshot_name)
215 , state_was_pending (false)
216 , _state_of_the_state (StateOfTheState(CannotSave|InitialConnecting|Loading))
218 , _save_queued (false)
219 , _last_roll_location (0)
220 , _last_roll_or_reversal_location (0)
221 , _last_record_location (0)
222 , pending_locate_roll (false)
223 , pending_locate_frame (0)
224 , pending_locate_flush (false)
225 , pending_abort (false)
226 , pending_auto_loop (false)
227 , _butler (new Butler (*this))
228 , _post_transport_work (0)
229 , cumulative_rf_motion (0)
231 , _locations (new Locations (*this))
232 , _ignore_skips_updates (false)
233 , _rt_thread_active (false)
234 , _rt_emit_pending (false)
236 , outbound_mtc_timecode_frame (0)
237 , next_quarter_frame_to_send (-1)
238 , _frames_per_timecode_frame (0)
239 , _frames_per_hour (0)
240 , _timecode_frames_per_hour (0)
241 , last_timecode_valid (false)
242 , last_timecode_when (0)
243 , _send_timecode_update (false)
255 , ltc_timecode_offset (0)
256 , ltc_timecode_negative_offset (false)
257 , midi_control_ui (0)
259 , _all_route_group (new RouteGroup (*this, "all"))
260 , routes (new RouteList)
261 , _adding_routes_in_progress (false)
262 , _reconnecting_routes_in_progress (false)
263 , _route_deletion_in_progress (false)
264 , destructive_index (0)
265 , _track_number_decimals(1)
266 , default_fade_steepness (0)
267 , default_fade_msecs (0)
268 , _total_free_4k_blocks (0)
269 , _total_free_4k_blocks_uncertain (false)
270 , no_questions_about_missing_files (false)
273 , _bundles (new BundleList)
274 , _bundle_xml_node (0)
278 , click_emphasis_data (0)
280 , click_emphasis_length (0)
281 , _clicks_cleared (0)
282 , _play_range (false)
283 , _range_selection (-1,-1)
284 , _object_selection (-1,-1)
286 , first_file_data_format_reset (true)
287 , first_file_header_format_reset (true)
288 , have_looped (false)
289 , _have_rec_enabled_track (false)
290 , _have_rec_disabled_track (true)
292 , _suspend_timecode_transmission (0)
293 , _speakers (new Speakers)
295 , ignore_route_processor_changes (false)
302 pthread_mutex_init (&_rt_emit_mutex, 0);
303 pthread_cond_init (&_rt_emit_cond, 0);
305 pre_engine_init (fullpath);
309 Stateful::loading_state_version = CURRENT_SESSION_FILE_VERSION;
311 #ifdef USE_TRACKS_CODE_FEATURES
312 sr = EngineStateController::instance()->get_current_sample_rate();
314 if (ensure_engine (sr)) {
316 throw SessionException (_("Cannot connect to audio/midi engine"));
319 if (create (mix_template, bus_profile)) {
321 throw SessionException (_("Session initialization failed"));
324 /* if a mix template was provided, then ::create() will
325 * have copied it into the session and we need to load it
326 * so that we have the state ready for ::set_state()
327 * after the engine is started.
329 * Note that we do NOT try to get the sample rate from
330 * the template at this time, though doing so would
331 * be easy if we decided this was an appropriate part
335 if (!mix_template.empty()) {
336 if (load_state (_current_snapshot_name)) {
337 throw SessionException (_("Failed to load template/snapshot state"));
339 store_recent_templates (mix_template);
342 /* load default session properties - if any */
347 if (load_state (_current_snapshot_name)) {
348 throw SessionException (_("Failed to load state"));
351 /* try to get sample rate from XML state so that we
352 * can influence the SR if we set up the audio
357 const XMLProperty* prop;
358 if ((prop = state_tree->root()->property (X_("sample-rate"))) != 0) {
359 sr = atoi (prop->value());
363 if (ensure_engine (sr)) {
365 throw SessionException (_("Cannot connect to audio/midi engine"));
369 if (post_engine_init ()) {
371 throw SessionException (_("Cannot configure audio/midi engine with session parameters"));
374 store_recent_sessions (_name, _path);
376 bool was_dirty = dirty();
378 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
380 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
381 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
384 DirtyChanged (); /* EMIT SIGNAL */
387 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
388 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
390 emit_thread_start ();
392 /* hook us up to the engine since we are now completely constructed */
394 BootMessage (_("Connect to engine"));
396 _engine.set_session (this);
397 _engine.reset_timebase ();
399 #ifdef USE_TRACKS_CODE_FEATURES
401 EngineStateController::instance()->set_session(this);
404 if ( ARDOUR::Profile->get_trx () ) {
406 /* Waves Tracks: fill session with tracks basing on the amount of inputs.
407 * each available input must have corresponding track when session starts.
410 uint32_t how_many (0);
412 std::vector<std::string> inputs;
413 EngineStateController::instance()->get_physical_audio_inputs(inputs);
415 how_many = inputs.size();
417 list<boost::shared_ptr<AudioTrack> > tracks;
419 // Track names after driver
420 if (Config->get_tracks_auto_naming() == NameAfterDriver) {
421 string track_name = "";
422 for (std::vector<string>::size_type i = 0; i < inputs.size(); ++i) {
424 track_name = inputs[i];
425 replace_all (track_name, "system:capture", "");
427 list<boost::shared_ptr<AudioTrack> > single_track = new_audio_track (1, 1, Normal, 0, 1, track_name);
428 tracks.insert(tracks.begin(), single_track.front());
430 } else { // Default track names
431 tracks = new_audio_track (1, 1, Normal, 0, how_many, string());
434 if (tracks.size() != how_many) {
436 throw failed_constructor ();
445 BootMessage (_("Session loading complete"));
457 Session::ensure_engine (uint32_t desired_sample_rate)
459 if (_engine.current_backend() == 0) {
460 /* backend is unknown ... */
461 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
462 if (r.get_value_or (-1) != 0) {
465 } else if (_engine.setup_required()) {
466 /* backend is known, but setup is needed */
467 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
468 if (r.get_value_or (-1) != 0) {
471 } else if (!_engine.running()) {
472 if (_engine.start()) {
477 /* at this point the engine should be running
480 if (!_engine.running()) {
484 return immediately_post_engine ();
489 Session::immediately_post_engine ()
491 /* Do various initializations that should take place directly after we
492 * know that the engine is running, but before we either create a
493 * session or set state for an existing one.
496 if (how_many_dsp_threads () > 1) {
497 /* For now, only create the graph if we are using >1 DSP threads, as
498 it is a bit slower than the old code with 1 thread.
500 _process_graph.reset (new Graph (*this));
503 /* every time we reconnect, recompute worst case output latencies */
505 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
507 if (synced_to_engine()) {
508 _engine.transport_stop ();
511 if (config.get_jack_time_master()) {
512 _engine.transport_locate (_transport_frame);
516 BootMessage (_("Set up LTC"));
518 BootMessage (_("Set up Click"));
520 BootMessage (_("Set up standard connections"));
524 catch (failed_constructor& err) {
528 /* TODO, connect in different thread. (PortRegisteredOrUnregistered may be in RT context)
530 _engine.PortRegisteredOrUnregistered.connect_same_thread (*this, boost::bind (&Session::setup_bundles, this));
538 vector<void*> debug_pointers;
540 /* if we got to here, leaving pending capture state around
544 remove_pending_capture_state ();
546 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
548 /* disconnect from any and all signals that we are connected to */
552 /* shutdown control surface protocols while we still have ports
553 and the engine to move data to any devices.
556 ControlProtocolManager::instance().drop_protocols ();
558 _engine.remove_session ();
560 #ifdef USE_TRACKS_CODE_FEATURES
561 EngineStateController::instance()->remove_session();
564 /* deregister all ports - there will be no process or any other
565 * callbacks from the engine any more.
568 Port::PortDrop (); /* EMIT SIGNAL */
572 /* clear history so that no references to objects are held any more */
576 /* clear state tree so that no references to objects are held any more */
581 /* reset dynamic state version back to default */
583 Stateful::loading_state_version = 0;
585 _butler->drop_references ();
589 delete _all_route_group;
591 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
592 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
596 if (click_data != default_click) {
597 delete [] click_data;
600 if (click_emphasis_data != default_click_emphasis) {
601 delete [] click_emphasis_data;
606 /* need to remove auditioner before monitoring section
607 * otherwise it is re-connected */
610 /* drop references to routes held by the monitoring section
611 * specifically _monitor_out aux/listen references */
612 remove_monitor_section();
614 /* clear out any pending dead wood from RCU managed objects */
619 AudioDiskstream::free_working_buffers();
621 /* tell everyone who is still standing that we're about to die */
624 /* tell everyone to drop references and delete objects as we go */
626 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
627 RegionFactory::delete_all_regions ();
629 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
631 /* reset these three references to special routes before we do the usual route delete thing */
633 _master_out.reset ();
634 _monitor_out.reset ();
637 RCUWriter<RouteList> writer (routes);
638 boost::shared_ptr<RouteList> r = writer.get_copy ();
640 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
641 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
642 (*i)->drop_references ();
646 /* writer goes out of scope and updates master */
651 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
652 Glib::Threads::Mutex::Lock lm (source_lock);
653 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
654 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
655 i->second->drop_references ();
661 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
664 emit_thread_terminate ();
666 pthread_cond_destroy (&_rt_emit_cond);
667 pthread_mutex_destroy (&_rt_emit_mutex);
669 delete _scene_changer; _scene_changer = 0;
670 delete midi_control_ui; midi_control_ui = 0;
672 delete _mmc; _mmc = 0;
673 delete _midi_ports; _midi_ports = 0;
674 delete _locations; _locations = 0;
678 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
680 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
681 boost_debug_list_ptrs ();
686 Session::setup_ltc ()
690 _ltc_input.reset (new IO (*this, X_("LTC In"), IO::Input));
691 _ltc_output.reset (new IO (*this, X_("LTC Out"), IO::Output));
693 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC In"))) != 0) {
694 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
697 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
698 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
700 reconnect_ltc_input ();
703 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC Out"))) != 0) {
704 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
707 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
708 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
710 reconnect_ltc_output ();
713 /* fix up names of LTC ports because we don't want the normal
714 * IO style of NAME/TYPE-{in,out}N
717 _ltc_input->nth (0)->set_name (X_("LTC-in"));
718 _ltc_output->nth (0)->set_name (X_("LTC-out"));
722 Session::setup_click ()
725 _click_io.reset (new ClickIO (*this, X_("Click")));
726 _click_gain.reset (new Amp (*this));
727 _click_gain->activate ();
729 setup_click_state (state_tree->root());
731 setup_click_state (0);
736 Session::setup_click_state (const XMLNode* node)
738 const XMLNode* child = 0;
740 if (node && (child = find_named_node (*node, "Click")) != 0) {
742 /* existing state for Click */
745 if (Stateful::loading_state_version < 3000) {
746 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
748 const XMLNodeList& children (child->children());
749 XMLNodeList::const_iterator i = children.begin();
750 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
752 if (i != children.end()) {
753 c = _click_gain->set_state (**i, Stateful::loading_state_version);
759 _clicking = Config->get_clicking ();
763 error << _("could not setup Click I/O") << endmsg;
770 /* default state for Click: dual-mono to first 2 physical outputs */
773 _engine.get_physical_outputs (DataType::AUDIO, outs);
775 for (uint32_t physport = 0; physport < 2; ++physport) {
776 if (outs.size() > physport) {
777 if (_click_io->add_port (outs[physport], this)) {
778 // relax, even though its an error
783 if (_click_io->n_ports () > ChanCount::ZERO) {
784 _clicking = Config->get_clicking ();
790 Session::setup_bundles ()
794 RCUWriter<BundleList> writer (_bundles);
795 boost::shared_ptr<BundleList> b = writer.get_copy ();
796 for (BundleList::iterator i = b->begin(); i != b->end();) {
797 if (boost::dynamic_pointer_cast<UserBundle>(*i)) {
805 vector<string> inputs[DataType::num_types];
806 vector<string> outputs[DataType::num_types];
807 for (uint32_t i = 0; i < DataType::num_types; ++i) {
808 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
809 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
812 /* Create a set of Bundle objects that map
813 to the physical I/O currently available. We create both
814 mono and stereo bundles, so that the common cases of mono
815 and stereo tracks get bundles to put in their mixer strip
816 in / out menus. There may be a nicer way of achieving that;
817 it doesn't really scale that well to higher channel counts
820 /* mono output bundles */
822 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
824 std::string pn = _engine.get_pretty_name_by_name (outputs[DataType::AUDIO][np]);
826 snprintf (buf, sizeof (buf), _("out %s"), pn.c_str());
828 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
831 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
832 c->add_channel (_("mono"), DataType::AUDIO);
833 c->set_port (0, outputs[DataType::AUDIO][np]);
835 add_bundle (c, false);
838 /* stereo output bundles */
840 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
841 if (np + 1 < outputs[DataType::AUDIO].size()) {
843 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
844 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
845 c->add_channel (_("L"), DataType::AUDIO);
846 c->set_port (0, outputs[DataType::AUDIO][np]);
847 c->add_channel (_("R"), DataType::AUDIO);
848 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
850 add_bundle (c, false);
854 /* mono input bundles */
856 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
858 std::string pn = _engine.get_pretty_name_by_name (inputs[DataType::AUDIO][np]);
860 snprintf (buf, sizeof (buf), _("in %s"), pn.c_str());
862 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
865 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
866 c->add_channel (_("mono"), DataType::AUDIO);
867 c->set_port (0, inputs[DataType::AUDIO][np]);
869 add_bundle (c, false);
872 /* stereo input bundles */
874 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
875 if (np + 1 < inputs[DataType::AUDIO].size()) {
877 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
879 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
880 c->add_channel (_("L"), DataType::AUDIO);
881 c->set_port (0, inputs[DataType::AUDIO][np]);
882 c->add_channel (_("R"), DataType::AUDIO);
883 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
885 add_bundle (c, false);
889 /* MIDI input bundles */
891 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
892 string n = inputs[DataType::MIDI][np];
893 std::string pn = _engine.get_pretty_name_by_name (n);
897 boost::erase_first (n, X_("alsa_pcm:"));
899 boost::shared_ptr<Bundle> c (new Bundle (n, false));
900 c->add_channel ("", DataType::MIDI);
901 c->set_port (0, inputs[DataType::MIDI][np]);
902 add_bundle (c, false);
905 /* MIDI output bundles */
907 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
908 string n = outputs[DataType::MIDI][np];
909 std::string pn = _engine.get_pretty_name_by_name (n);
913 boost::erase_first (n, X_("alsa_pcm:"));
915 boost::shared_ptr<Bundle> c (new Bundle (n, true));
916 c->add_channel ("", DataType::MIDI);
917 c->set_port (0, outputs[DataType::MIDI][np]);
918 add_bundle (c, false);
921 // we trust the backend to only calls us if there's a change
922 BundleAddedOrRemoved (); /* EMIT SIGNAL */
926 Session::auto_connect_master_bus ()
928 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
932 // Waves Tracks: Do not connect master bas for Tracks if AutoConnectMaster option is not set
933 // In this case it means "Multi Out" output mode
934 if (ARDOUR::Profile->get_trx() && !(Config->get_output_auto_connect() & AutoConnectMaster) ) {
938 /* if requested auto-connect the outputs to the first N physical ports.
941 uint32_t limit = _master_out->n_outputs().n_total();
942 vector<string> outputs[DataType::num_types];
944 for (uint32_t i = 0; i < DataType::num_types; ++i) {
945 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
948 for (uint32_t n = 0; n < limit; ++n) {
949 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
951 if (outputs[p->type()].size() > n) {
952 connect_to = outputs[p->type()][n];
955 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
956 if (_master_out->output()->connect (p, connect_to, this)) {
957 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
966 Session::remove_monitor_section ()
968 if (!_monitor_out || Profile->get_trx()) {
972 /* force reversion to Solo-In-Place */
973 Config->set_solo_control_is_listen_control (false);
975 /* if we are auditioning, cancel it ... this is a workaround
976 to a problem (auditioning does not execute the process graph,
977 which is needed to remove routes when using >1 core for processing)
982 /* Hold process lock while doing this so that we don't hear bits and
983 * pieces of audio as we work on each route.
986 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
988 /* Connect tracks to monitor section. Note that in an
989 existing session, the internal sends will already exist, but we want the
990 routes to notice that they connect to the control out specifically.
994 boost::shared_ptr<RouteList> r = routes.reader ();
995 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
997 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
999 if ((*x)->is_monitor()) {
1001 } else if ((*x)->is_master()) {
1004 (*x)->remove_aux_or_listen (_monitor_out);
1009 remove_route (_monitor_out);
1010 auto_connect_master_bus ();
1013 auditioner->connect ();
1018 Session::add_monitor_section ()
1022 if (_monitor_out || !_master_out || Profile->get_trx()) {
1026 boost::shared_ptr<Route> r (new Route (*this, _("Monitor"), Route::MonitorOut, DataType::AUDIO));
1032 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1033 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
1036 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1037 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1038 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1040 error << _("Cannot create monitor section. 'Monitor' Port name is not unique.") << endmsg;
1045 add_routes (rl, false, false, false);
1047 assert (_monitor_out);
1049 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
1050 are undefined, at best.
1053 uint32_t limit = _monitor_out->n_inputs().n_audio();
1057 /* connect the inputs to the master bus outputs. this
1058 * represents a separate data feed from the internal sends from
1059 * each route. as of jan 2011, it allows the monitor section to
1060 * conditionally ignore either the internal sends or the normal
1061 * input feed, but we should really find a better way to do
1065 _master_out->output()->disconnect (this);
1067 for (uint32_t n = 0; n < limit; ++n) {
1068 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1069 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1072 string connect_to = o->name();
1073 if (_monitor_out->input()->connect (p, connect_to, this)) {
1074 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1082 /* if monitor section is not connected, connect it to physical outs
1085 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
1087 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1089 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1092 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1094 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1095 Config->get_monitor_bus_preferred_bundle())
1101 /* Monitor bus is audio only */
1103 vector<string> outputs[DataType::num_types];
1105 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1106 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1109 uint32_t mod = outputs[DataType::AUDIO].size();
1110 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1114 for (uint32_t n = 0; n < limit; ++n) {
1116 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1118 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1119 connect_to = outputs[DataType::AUDIO][n % mod];
1122 if (!connect_to.empty()) {
1123 if (_monitor_out->output()->connect (p, connect_to, this)) {
1124 error << string_compose (
1125 _("cannot connect control output %1 to %2"),
1136 /* Hold process lock while doing this so that we don't hear bits and
1137 * pieces of audio as we work on each route.
1140 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1142 /* Connect tracks to monitor section. Note that in an
1143 existing session, the internal sends will already exist, but we want the
1144 routes to notice that they connect to the control out specifically.
1148 boost::shared_ptr<RouteList> rls = routes.reader ();
1150 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1152 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1154 if ((*x)->is_monitor()) {
1156 } else if ((*x)->is_master()) {
1159 (*x)->enable_monitor_send ();
1164 auditioner->connect ();
1169 Session::reset_monitor_section ()
1171 /* Process lock should be held by the caller.*/
1173 if (!_monitor_out || Profile->get_trx()) {
1177 uint32_t limit = _master_out->n_outputs().n_audio();
1179 /* connect the inputs to the master bus outputs. this
1180 * represents a separate data feed from the internal sends from
1181 * each route. as of jan 2011, it allows the monitor section to
1182 * conditionally ignore either the internal sends or the normal
1183 * input feed, but we should really find a better way to do
1187 _master_out->output()->disconnect (this);
1188 _monitor_out->output()->disconnect (this);
1190 _monitor_out->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1191 _monitor_out->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1193 for (uint32_t n = 0; n < limit; ++n) {
1194 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1195 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1198 string connect_to = o->name();
1199 if (_monitor_out->input()->connect (p, connect_to, this)) {
1200 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1207 /* connect monitor section to physical outs
1210 if (Config->get_auto_connect_standard_busses()) {
1212 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1214 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1217 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1219 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1220 Config->get_monitor_bus_preferred_bundle())
1226 /* Monitor bus is audio only */
1228 vector<string> outputs[DataType::num_types];
1230 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1231 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1234 uint32_t mod = outputs[DataType::AUDIO].size();
1235 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1239 for (uint32_t n = 0; n < limit; ++n) {
1241 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1243 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1244 connect_to = outputs[DataType::AUDIO][n % mod];
1247 if (!connect_to.empty()) {
1248 if (_monitor_out->output()->connect (p, connect_to, this)) {
1249 error << string_compose (
1250 _("cannot connect control output %1 to %2"),
1261 /* Connect tracks to monitor section. Note that in an
1262 existing session, the internal sends will already exist, but we want the
1263 routes to notice that they connect to the control out specifically.
1267 boost::shared_ptr<RouteList> rls = routes.reader ();
1269 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1271 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1273 if ((*x)->is_monitor()) {
1275 } else if ((*x)->is_master()) {
1278 (*x)->enable_monitor_send ();
1284 Session::hookup_io ()
1286 /* stop graph reordering notifications from
1287 causing resorts, etc.
1290 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
1294 /* we delay creating the auditioner till now because
1295 it makes its own connections to ports.
1299 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
1301 throw failed_constructor ();
1303 a->use_new_diskstream ();
1307 catch (failed_constructor& err) {
1308 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
1312 /* load bundles, which we may have postponed earlier on */
1313 if (_bundle_xml_node) {
1314 load_bundles (*_bundle_xml_node);
1315 delete _bundle_xml_node;
1318 /* Tell all IO objects to connect themselves together */
1320 IO::enable_connecting ();
1322 /* Now tell all "floating" ports to connect to whatever
1323 they should be connected to.
1326 AudioEngine::instance()->reconnect_ports ();
1328 /* Anyone who cares about input state, wake up and do something */
1330 IOConnectionsComplete (); /* EMIT SIGNAL */
1332 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
1334 /* now handle the whole enchilada as if it was one
1335 graph reorder event.
1340 /* update the full solo state, which can't be
1341 correctly determined on a per-route basis, but
1342 needs the global overview that only the session
1346 update_route_solo_state ();
1350 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
1352 boost::shared_ptr<Track> track = wp.lock ();
1357 boost::shared_ptr<Playlist> playlist;
1359 if ((playlist = track->playlist()) != 0) {
1360 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
1361 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
1362 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
1367 Session::record_enabling_legal () const
1369 /* this used to be in here, but survey says.... we don't need to restrict it */
1370 // if (record_status() == Recording) {
1374 if (Config->get_all_safe()) {
1381 Session::set_track_monitor_input_status (bool yn)
1383 boost::shared_ptr<RouteList> rl = routes.reader ();
1384 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1385 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1386 if (tr && tr->record_enabled ()) {
1387 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1388 tr->request_input_monitoring (yn);
1394 Session::auto_punch_start_changed (Location* location)
1396 replace_event (SessionEvent::PunchIn, location->start());
1398 if (get_record_enabled() && config.get_punch_in()) {
1399 /* capture start has been changed, so save new pending state */
1400 save_state ("", true);
1405 Session::auto_punch_end_changed (Location* location)
1407 framepos_t when_to_stop = location->end();
1408 // when_to_stop += _worst_output_latency + _worst_input_latency;
1409 replace_event (SessionEvent::PunchOut, when_to_stop);
1413 Session::auto_punch_changed (Location* location)
1415 framepos_t when_to_stop = location->end();
1417 replace_event (SessionEvent::PunchIn, location->start());
1418 //when_to_stop += _worst_output_latency + _worst_input_latency;
1419 replace_event (SessionEvent::PunchOut, when_to_stop);
1422 /** @param loc A loop location.
1423 * @param pos Filled in with the start time of the required fade-out (in session frames).
1424 * @param length Filled in with the length of the required fade-out.
1427 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
1429 pos = max (loc->start(), loc->end() - 64);
1430 length = loc->end() - pos;
1434 Session::auto_loop_changed (Location* location)
1436 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1439 auto_loop_declick_range (location, dcp, dcl);
1441 if (transport_rolling() && play_loop) {
1443 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1445 // if (_transport_frame > location->end()) {
1447 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1448 // relocate to beginning of loop
1449 clear_events (SessionEvent::LocateRoll);
1451 request_locate (location->start(), true);
1454 else if (Config->get_seamless_loop() && !loop_changing) {
1456 // schedule a locate-roll to refill the diskstreams at the
1457 // previous loop end
1458 loop_changing = true;
1460 if (location->end() > last_loopend) {
1461 clear_events (SessionEvent::LocateRoll);
1462 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1468 clear_events (SessionEvent::AutoLoopDeclick);
1469 clear_events (SessionEvent::AutoLoop);
1472 /* possibly move playhead if not rolling; if we are rolling we'll move
1473 to the loop start on stop if that is appropriate.
1478 if (!transport_rolling() && select_playhead_priority_target (pos)) {
1479 if (pos == location->start()) {
1480 request_locate (pos);
1485 last_loopend = location->end();
1490 Session::set_auto_punch_location (Location* location)
1494 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1495 punch_connections.drop_connections();
1496 existing->set_auto_punch (false, this);
1497 remove_event (existing->start(), SessionEvent::PunchIn);
1498 clear_events (SessionEvent::PunchOut);
1499 auto_punch_location_changed (0);
1504 if (location == 0) {
1508 if (location->end() <= location->start()) {
1509 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1513 punch_connections.drop_connections ();
1515 location->StartChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, location));
1516 location->EndChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, location));
1517 location->Changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, location));
1519 location->set_auto_punch (true, this);
1521 auto_punch_changed (location);
1523 auto_punch_location_changed (location);
1527 Session::set_session_extents (framepos_t start, framepos_t end)
1530 if ((existing = _locations->session_range_location()) == 0) {
1531 //if there is no existing session, we need to make a new session location (should never happen)
1532 existing = new Location (*this, 0, 0, _("session"), Location::IsSessionRange);
1536 error << _("Session: you can't use that location for session start/end)") << endmsg;
1540 existing->set( start, end );
1546 Session::set_auto_loop_location (Location* location)
1550 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1551 loop_connections.drop_connections ();
1552 existing->set_auto_loop (false, this);
1553 remove_event (existing->end(), SessionEvent::AutoLoop);
1556 auto_loop_declick_range (existing, dcp, dcl);
1557 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1558 auto_loop_location_changed (0);
1563 if (location == 0) {
1567 if (location->end() <= location->start()) {
1568 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1572 last_loopend = location->end();
1574 loop_connections.drop_connections ();
1576 location->StartChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1577 location->EndChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1578 location->Changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1579 location->FlagsChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1581 location->set_auto_loop (true, this);
1583 if (Config->get_loop_is_mode() && play_loop && Config->get_seamless_loop()) {
1584 // set all tracks to use internal looping
1585 boost::shared_ptr<RouteList> rl = routes.reader ();
1586 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1587 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1588 if (tr && !tr->hidden()) {
1589 tr->set_loop (location);
1594 /* take care of our stuff first */
1596 auto_loop_changed (location);
1598 /* now tell everyone else */
1600 auto_loop_location_changed (location);
1604 Session::update_marks (Location*)
1610 Session::update_skips (Location* loc, bool consolidate)
1612 if (_ignore_skips_updates) {
1616 Locations::LocationList skips;
1619 PBD::Unwinder<bool> uw (_ignore_skips_updates, true);
1620 consolidate_skips (loc);
1623 sync_locations_to_skips ();
1629 Session::consolidate_skips (Location* loc)
1631 Locations::LocationList all_locations = _locations->list ();
1633 for (Locations::LocationList::iterator l = all_locations.begin(); l != all_locations.end(); ) {
1635 if (!(*l)->is_skip ()) {
1640 /* don't test against self */
1647 switch (Evoral::coverage ((*l)->start(), (*l)->end(), loc->start(), loc->end())) {
1648 case Evoral::OverlapInternal:
1649 case Evoral::OverlapExternal:
1650 case Evoral::OverlapStart:
1651 case Evoral::OverlapEnd:
1652 /* adjust new location to cover existing one */
1653 loc->set_start (min (loc->start(), (*l)->start()));
1654 loc->set_end (max (loc->end(), (*l)->end()));
1655 /* we don't need this one any more */
1656 _locations->remove (*l);
1657 /* the location has been deleted, so remove reference to it in our local list */
1658 l = all_locations.erase (l);
1661 case Evoral::OverlapNone:
1669 Session::sync_locations_to_skips ()
1671 /* This happens asynchronously (in the audioengine thread). After the clear is done, we will call
1672 * Session::_sync_locations_to_skips() from the audioengine thread.
1674 clear_events (SessionEvent::Skip, boost::bind (&Session::_sync_locations_to_skips, this));
1678 Session::_sync_locations_to_skips ()
1680 /* called as a callback after existing Skip events have been cleared from a realtime audioengine thread */
1682 Locations::LocationList const & locs (_locations->list());
1684 for (Locations::LocationList::const_iterator i = locs.begin(); i != locs.end(); ++i) {
1686 Location* location = *i;
1688 if (location->is_skip() && location->is_skipping()) {
1689 SessionEvent* ev = new SessionEvent (SessionEvent::Skip, SessionEvent::Add, location->start(), location->end(), 1.0);
1697 Session::location_added (Location *location)
1699 if (location->is_auto_punch()) {
1700 set_auto_punch_location (location);
1703 if (location->is_auto_loop()) {
1704 set_auto_loop_location (location);
1707 if (location->is_session_range()) {
1708 /* no need for any signal handling or event setting with the session range,
1709 because we keep a direct reference to it and use its start/end directly.
1711 _session_range_location = location;
1714 if (location->is_mark()) {
1715 /* listen for per-location signals that require us to do any * global updates for marks */
1717 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1718 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1719 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1720 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1723 if (location->is_skip()) {
1724 /* listen for per-location signals that require us to update skip-locate events */
1726 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1727 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1728 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1729 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, false));
1731 update_skips (location, true);
1738 Session::location_removed (Location *location)
1740 if (location->is_auto_loop()) {
1741 set_auto_loop_location (0);
1742 set_track_loop (false);
1745 if (location->is_auto_punch()) {
1746 set_auto_punch_location (0);
1749 if (location->is_session_range()) {
1750 /* this is never supposed to happen */
1751 error << _("programming error: session range removed!") << endl;
1754 if (location->is_skip()) {
1756 update_skips (location, false);
1763 Session::locations_changed ()
1765 _locations->apply (*this, &Session::_locations_changed);
1769 Session::_locations_changed (const Locations::LocationList& locations)
1771 /* There was some mass-change in the Locations object.
1773 We might be re-adding a location here but it doesn't actually matter
1774 for all the locations that the Session takes an interest in.
1778 PBD::Unwinder<bool> protect_ignore_skip_updates (_ignore_skips_updates, true);
1779 for (Locations::LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
1780 location_added (*i);
1784 update_skips (NULL, false);
1788 Session::enable_record ()
1790 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1791 /* no recording at anything except normal speed */
1796 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1798 if (rs == Recording) {
1802 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1804 _last_record_location = _transport_frame;
1805 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1807 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1808 set_track_monitor_input_status (true);
1811 RecordStateChanged ();
1818 Session::disable_record (bool rt_context, bool force)
1822 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1824 if (!Config->get_latched_record_enable () || force) {
1825 g_atomic_int_set (&_record_status, Disabled);
1826 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1828 if (rs == Recording) {
1829 g_atomic_int_set (&_record_status, Enabled);
1833 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1834 set_track_monitor_input_status (false);
1837 RecordStateChanged (); /* emit signal */
1840 remove_pending_capture_state ();
1846 Session::step_back_from_record ()
1848 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1850 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1851 set_track_monitor_input_status (false);
1854 RecordStateChanged (); /* emit signal */
1859 Session::maybe_enable_record ()
1861 if (_step_editors > 0) {
1865 g_atomic_int_set (&_record_status, Enabled);
1867 /* This function is currently called from somewhere other than an RT thread.
1868 This save_state() call therefore doesn't impact anything. Doing it here
1869 means that we save pending state of which sources the next record will use,
1870 which gives us some chance of recovering from a crash during the record.
1873 save_state ("", true);
1875 if (_transport_speed) {
1876 if (!config.get_punch_in()) {
1880 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1881 RecordStateChanged (); /* EMIT SIGNAL */
1888 Session::audible_frame () const
1894 offset = worst_playback_latency ();
1896 if (synced_to_engine()) {
1897 /* Note: this is basically just sync-to-JACK */
1898 tf = _engine.transport_frame();
1900 tf = _transport_frame;
1905 if (!non_realtime_work_pending()) {
1909 /* Check to see if we have passed the first guaranteed
1910 audible frame past our last start position. if not,
1911 return that last start point because in terms
1912 of audible frames, we have not moved yet.
1914 `Start position' in this context means the time we last
1915 either started, located, or changed transport direction.
1918 if (_transport_speed > 0.0f) {
1920 if (!play_loop || !have_looped) {
1921 if (tf < _last_roll_or_reversal_location + offset) {
1922 return _last_roll_or_reversal_location;
1930 } else if (_transport_speed < 0.0f) {
1932 /* XXX wot? no backward looping? */
1934 if (tf > _last_roll_or_reversal_location - offset) {
1935 return _last_roll_or_reversal_location;
1947 Session::set_frame_rate (framecnt_t frames_per_second)
1949 /** \fn void Session::set_frame_size(framecnt_t)
1950 the AudioEngine object that calls this guarantees
1951 that it will not be called while we are also in
1952 ::process(). Its fine to do things that block
1956 _base_frame_rate = frames_per_second;
1957 _nominal_frame_rate = frames_per_second;
1962 reset_write_sources (false);
1964 // XXX we need some equivalent to this, somehow
1965 // SndFileSource::setup_standard_crossfades (frames_per_second);
1969 /* XXX need to reset/reinstantiate all LADSPA plugins */
1973 Session::set_block_size (pframes_t nframes)
1975 /* the AudioEngine guarantees
1976 that it will not be called while we are also in
1977 ::process(). It is therefore fine to do things that block
1982 current_block_size = nframes;
1986 boost::shared_ptr<RouteList> r = routes.reader ();
1988 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1989 (*i)->set_block_size (nframes);
1992 boost::shared_ptr<RouteList> rl = routes.reader ();
1993 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1994 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1996 tr->set_block_size (nframes);
2000 set_worst_io_latencies ();
2006 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
2008 boost::shared_ptr<Route> r2;
2010 if (r1->feeds (rbase) && rbase->feeds (r1)) {
2011 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
2015 /* make a copy of the existing list of routes that feed r1 */
2017 Route::FedBy existing (r1->fed_by());
2019 /* for each route that feeds r1, recurse, marking it as feeding
2023 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
2024 if (!(r2 = i->r.lock ())) {
2025 /* (*i) went away, ignore it */
2029 /* r2 is a route that feeds r1 which somehow feeds base. mark
2030 base as being fed by r2
2033 rbase->add_fed_by (r2, i->sends_only);
2037 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
2041 if (r1->feeds (r2) && r2->feeds (r1)) {
2045 /* now recurse, so that we can mark base as being fed by
2046 all routes that feed r2
2049 trace_terminal (r2, rbase);
2056 Session::resort_routes ()
2058 /* don't do anything here with signals emitted
2059 by Routes during initial setup or while we
2060 are being destroyed.
2063 if (_state_of_the_state & (InitialConnecting | Deletion)) {
2068 RCUWriter<RouteList> writer (routes);
2069 boost::shared_ptr<RouteList> r = writer.get_copy ();
2070 resort_routes_using (r);
2071 /* writer goes out of scope and forces update */
2075 boost::shared_ptr<RouteList> rl = routes.reader ();
2076 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2077 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
2079 const Route::FedBy& fb ((*i)->fed_by());
2081 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
2082 boost::shared_ptr<Route> sf = f->r.lock();
2084 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
2092 /** This is called whenever we need to rebuild the graph of how we will process
2094 * @param r List of routes, in any order.
2098 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
2100 /* We are going to build a directed graph of our routes;
2101 this is where the edges of that graph are put.
2106 /* Go through all routes doing two things:
2108 * 1. Collect the edges of the route graph. Each of these edges
2109 * is a pair of routes, one of which directly feeds the other
2110 * either by a JACK connection or by an internal send.
2112 * 2. Begin the process of making routes aware of which other
2113 * routes directly or indirectly feed them. This information
2114 * is used by the solo code.
2117 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2119 /* Clear out the route's list of direct or indirect feeds */
2120 (*i)->clear_fed_by ();
2122 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
2124 bool via_sends_only;
2126 /* See if this *j feeds *i according to the current state of the JACK
2127 connections and internal sends.
2129 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
2130 /* add the edge to the graph (part #1) */
2131 edges.add (*j, *i, via_sends_only);
2132 /* tell the route (for part #2) */
2133 (*i)->add_fed_by (*j, via_sends_only);
2138 /* Attempt a topological sort of the route graph */
2139 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
2141 if (sorted_routes) {
2142 /* We got a satisfactory topological sort, so there is no feedback;
2145 Note: the process graph rechain does not require a
2146 topologically-sorted list, but hey ho.
2148 if (_process_graph) {
2149 _process_graph->rechain (sorted_routes, edges);
2152 _current_route_graph = edges;
2154 /* Complete the building of the routes' lists of what directly
2155 or indirectly feeds them.
2157 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2158 trace_terminal (*i, *i);
2161 *r = *sorted_routes;
2164 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
2165 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2166 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
2167 (*i)->name(), (*i)->order_key ()));
2171 SuccessfulGraphSort (); /* EMIT SIGNAL */
2174 /* The topological sort failed, so we have a problem. Tell everyone
2175 and stick to the old graph; this will continue to be processed, so
2176 until the feedback is fixed, what is played back will not quite
2177 reflect what is actually connected. Note also that we do not
2178 do trace_terminal here, as it would fail due to an endless recursion,
2179 so the solo code will think that everything is still connected
2183 FeedbackDetected (); /* EMIT SIGNAL */
2188 /** Find a route name starting with \a base, maybe followed by the
2189 * lowest \a id. \a id will always be added if \a definitely_add_number
2190 * is true on entry; otherwise it will only be added if required
2191 * to make the name unique.
2193 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
2194 * The available route name with the lowest ID will be used, and \a id
2195 * will be set to the ID.
2197 * \return false if a route name could not be found, and \a track_name
2198 * and \a id do not reflect a free route name.
2201 Session::find_route_name (string const & base, uint32_t& id, string& name, bool definitely_add_number)
2203 /* the base may conflict with ports that do not belong to existing
2204 routes, but hidden objects like the click track. So check port names
2205 before anything else.
2208 for (vector<string>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
2209 if (base == *reserved) {
2210 definitely_add_number = true;
2218 if (!definitely_add_number && route_by_name (base) == 0) {
2219 /* juse use the base */
2225 name = string_compose ("%1 %2", base, id);
2227 if (route_by_name (name) == 0) {
2233 } while (id < (UINT_MAX-1));
2238 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
2240 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
2242 in = ChanCount::ZERO;
2243 out = ChanCount::ZERO;
2245 boost::shared_ptr<RouteList> r = routes.reader ();
2247 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2248 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2249 if (tr && !tr->is_auditioner()) {
2250 in += tr->n_inputs();
2251 out += tr->n_outputs();
2257 Session::default_track_name_pattern (DataType t)
2260 case DataType::AUDIO:
2261 if (Profile->get_trx()) {
2268 case DataType::MIDI:
2275 /** Caller must not hold process lock
2276 * @param name_template string to use for the start of the name, or "" to use "MIDI".
2277 * @param instrument plugin info for the instrument to insert pre-fader, if any
2279 list<boost::shared_ptr<MidiTrack> >
2280 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
2281 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
2284 uint32_t track_id = 0;
2286 RouteList new_routes;
2287 list<boost::shared_ptr<MidiTrack> > ret;
2289 const string name_pattern = default_track_name_pattern (DataType::MIDI);
2290 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
2293 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, use_number)) {
2294 error << "cannot find name for new midi track" << endmsg;
2298 boost::shared_ptr<MidiTrack> track;
2301 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
2303 if (track->init ()) {
2307 track->use_new_diskstream();
2309 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2310 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2313 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2314 if (track->input()->ensure_io (input, false, this)) {
2315 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
2319 if (track->output()->ensure_io (output, false, this)) {
2320 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
2325 track->non_realtime_input_change();
2328 route_group->add (track);
2331 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2333 if (Config->get_remote_model() == UserOrdered) {
2334 track->set_remote_control_id (next_control_id());
2337 new_routes.push_back (track);
2338 ret.push_back (track);
2340 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2343 catch (failed_constructor &err) {
2344 error << _("Session: could not create new midi track.") << endmsg;
2348 catch (AudioEngine::PortRegistrationFailure& pfe) {
2350 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;
2358 if (!new_routes.empty()) {
2359 StateProtector sp (this);
2360 if (Profile->get_trx()) {
2361 add_routes (new_routes, false, false, false);
2363 add_routes (new_routes, true, true, false);
2367 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
2368 PluginPtr plugin = instrument->load (*this);
2369 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2370 (*r)->add_processor (p, PreFader);
2380 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2382 boost::shared_ptr<Route> midi_track (wmt.lock());
2388 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2390 if (change.after.n_audio() <= change.before.n_audio()) {
2394 /* new audio ports: make sure the audio goes somewhere useful,
2395 unless the user has no-auto-connect selected.
2397 The existing ChanCounts don't matter for this call as they are only
2398 to do with matching input and output indices, and we are only changing
2404 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
2408 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
2409 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
2410 * @param output_start As \a input_start, but for outputs.
2413 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
2414 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
2416 if (!IO::connecting_legal) {
2420 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2426 /* If both inputs and outputs are auto-connected to physical ports,
2427 use the max of input and output offsets to ensure auto-connected
2428 port numbers always match up (e.g. the first audio input and the
2429 first audio output of the route will have the same physical
2430 port number). Otherwise just use the lowest input or output
2434 DEBUG_TRACE (DEBUG::Graph,
2435 string_compose("Auto-connect: existing in = %1 out = %2\n",
2436 existing_inputs, existing_outputs));
2438 const bool in_out_physical =
2439 (Config->get_input_auto_connect() & AutoConnectPhysical)
2440 && (Config->get_output_auto_connect() & AutoConnectPhysical)
2443 const ChanCount in_offset = in_out_physical
2444 ? ChanCount::max(existing_inputs, existing_outputs)
2447 const ChanCount out_offset = in_out_physical
2448 ? ChanCount::max(existing_inputs, existing_outputs)
2451 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2452 vector<string> physinputs;
2453 vector<string> physoutputs;
2455 _engine.get_physical_outputs (*t, physoutputs);
2456 _engine.get_physical_inputs (*t, physinputs);
2458 if (!physinputs.empty() && connect_inputs) {
2459 uint32_t nphysical_in = physinputs.size();
2461 DEBUG_TRACE (DEBUG::Graph,
2462 string_compose("There are %1 physical inputs of type %2\n",
2465 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
2468 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
2469 DEBUG_TRACE (DEBUG::Graph,
2470 string_compose("Get index %1 + %2 % %3 = %4\n",
2471 in_offset.get(*t), i, nphysical_in,
2472 (in_offset.get(*t) + i) % nphysical_in));
2473 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
2476 DEBUG_TRACE (DEBUG::Graph,
2477 string_compose("Connect route %1 IN to %2\n",
2478 route->name(), port));
2480 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
2484 ChanCount one_added (*t, 1);
2485 existing_inputs += one_added;
2489 if (!physoutputs.empty()) {
2490 uint32_t nphysical_out = physoutputs.size();
2491 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
2495 * do not create new connections if we reached the limit of physical outputs
2499 if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
2500 ARDOUR::Profile->get_trx () &&
2501 existing_outputs.get(*t) == nphysical_out ) {
2505 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
2506 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
2507 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
2508 /* master bus is audio only */
2509 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
2510 port = _master_out->input()->ports().port(*t,
2511 i % _master_out->input()->n_ports().get(*t))->name();
2515 DEBUG_TRACE (DEBUG::Graph,
2516 string_compose("Connect route %1 OUT to %2\n",
2517 route->name(), port));
2519 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
2523 ChanCount one_added (*t, 1);
2524 existing_outputs += one_added;
2530 #ifdef USE_TRACKS_CODE_FEATURES
2533 compare_routes_by_remote_id (const boost::shared_ptr<Route>& route1, const boost::shared_ptr<Route>& route2)
2535 return route1->remote_control_id() < route2->remote_control_id();
2539 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2541 // it is not allowed to perform connection
2542 if (!IO::connecting_legal) {
2546 // if we are deleting routes we will call this once at the end
2547 if (_route_deletion_in_progress) {
2551 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2557 // We need to disconnect the route's inputs and outputs first
2558 // basing on autoconnect configuration
2559 bool reconnectIputs = !(Config->get_input_auto_connect() & ManualConnect) && reconnect_inputs;
2560 bool reconnectOutputs = !(Config->get_output_auto_connect() & ManualConnect) && reconnect_outputs;
2562 ChanCount existing_inputs;
2563 ChanCount existing_outputs;
2564 count_existing_track_channels (existing_inputs, existing_outputs);
2566 //ChanCount inputs = ChanCount::ZERO;
2567 //ChanCount outputs = ChanCount::ZERO;
2569 RouteList existing_routes = *routes.reader ();
2570 existing_routes.sort (compare_routes_by_remote_id);
2573 PBD::Unwinder<bool> protect_ignore_changes (_reconnecting_routes_in_progress, true);
2575 vector<string> physinputs;
2576 vector<string> physoutputs;
2578 EngineStateController::instance()->get_physical_audio_outputs(physoutputs);
2579 EngineStateController::instance()->get_physical_audio_inputs(physinputs);
2581 uint32_t input_n = 0;
2582 uint32_t output_n = 0;
2583 RouteList::iterator rIter = existing_routes.begin();
2584 const AutoConnectOption current_input_auto_connection (Config->get_input_auto_connect());
2585 const AutoConnectOption current_output_auto_connection (Config->get_output_auto_connect());
2586 for (; rIter != existing_routes.end(); ++rIter) {
2587 if (*rIter == _master_out || *rIter == _monitor_out ) {
2591 if (current_output_auto_connection == AutoConnectPhysical) {
2592 (*rIter)->amp()->deactivate();
2593 } else if (current_output_auto_connection == AutoConnectMaster) {
2594 (*rIter)->amp()->activate();
2597 if (reconnectIputs) {
2598 (*rIter)->input()->disconnect (this); //GZ: check this; could be heavy
2600 for (uint32_t route_input_n = 0; route_input_n < (*rIter)->n_inputs().get(DataType::AUDIO); ++route_input_n) {
2602 if (current_input_auto_connection & AutoConnectPhysical) {
2604 if ( input_n == physinputs.size() ) {
2608 string port = physinputs[input_n];
2610 if (port.empty() ) {
2611 error << "Physical Input number "<< input_n << " is unavailable and cannot be connected" << endmsg;
2614 //GZ: check this; could be heavy
2615 (*rIter)->input()->connect ((*rIter)->input()->ports().port(DataType::AUDIO, route_input_n), port, this);
2621 if (reconnectOutputs) {
2623 //normalize route ouptuts: reduce the amount outputs to be equal to the amount of inputs
2624 if (current_output_auto_connection & AutoConnectPhysical) {
2626 //GZ: check this; could be heavy
2627 (*rIter)->output()->disconnect (this);
2628 size_t route_inputs_count = (*rIter)->n_inputs().get(DataType::AUDIO);
2630 //GZ: check this; could be heavy
2631 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, route_inputs_count), false, this );
2633 } else if (current_output_auto_connection & AutoConnectMaster){
2635 if (!reconnect_master) {
2639 //GZ: check this; could be heavy
2640 (*rIter)->output()->disconnect (this);
2643 uint32_t master_inputs_count = _master_out->n_inputs().get(DataType::AUDIO);
2644 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, master_inputs_count), false, this );
2646 error << error << "Master bus is not available" << endmsg;
2651 for (uint32_t route_output_n = 0; route_output_n < (*rIter)->n_outputs().get(DataType::AUDIO); ++route_output_n) {
2652 if (current_output_auto_connection & AutoConnectPhysical) {
2654 if ( output_n == physoutputs.size() ) {
2658 string port = physoutputs[output_n];
2660 if (port.empty() ) {
2661 error << "Physical Output number "<< output_n << " is unavailable and cannot be connected" << endmsg;
2664 //GZ: check this; could be heavy
2665 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2668 } else if (current_output_auto_connection & AutoConnectMaster) {
2670 if ( route_output_n == _master_out->n_inputs().get(DataType::AUDIO) ) {
2674 // connect to master bus
2675 string port = _master_out->input()->ports().port(DataType::AUDIO, route_output_n)->name();
2677 if (port.empty() ) {
2678 error << "MasterBus Input number "<< route_output_n << " is unavailable and cannot be connected" << endmsg;
2682 //GZ: check this; could be heavy
2683 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2689 //auto_connect_route (*rIter, inputs, outputs, false, reconnectIputs);
2692 _master_out->output()->disconnect (this);
2693 auto_connect_master_bus ();
2698 session_routes_reconnected (); /* EMIT SIGNAL */
2702 Session::reconnect_midi_scene_ports(bool inputs)
2706 boost::shared_ptr<MidiPort> scene_in_ptr = scene_in();
2708 scene_in_ptr->disconnect_all ();
2710 std::vector<EngineStateController::MidiPortState> midi_port_states;
2711 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2713 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2715 for (; state_iter != midi_port_states.end(); ++state_iter) {
2716 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2717 scene_in_ptr->connect (state_iter->name);
2724 boost::shared_ptr<MidiPort> scene_out_ptr = scene_out();
2726 if (scene_out_ptr ) {
2727 scene_out_ptr->disconnect_all ();
2729 std::vector<EngineStateController::MidiPortState> midi_port_states;
2730 EngineStateController::instance()->get_physical_midi_output_states (midi_port_states);
2732 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2734 for (; state_iter != midi_port_states.end(); ++state_iter) {
2735 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2736 scene_out_ptr->connect (state_iter->name);
2744 Session::reconnect_mtc_ports ()
2746 boost::shared_ptr<MidiPort> mtc_in_ptr = _midi_ports->mtc_input_port();
2752 mtc_in_ptr->disconnect_all ();
2754 std::vector<EngineStateController::MidiPortState> midi_port_states;
2755 EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2757 std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2759 for (; state_iter != midi_port_states.end(); ++state_iter) {
2760 if (state_iter->available && state_iter->mtc_in) {
2761 mtc_in_ptr->connect (state_iter->name);
2765 if (!_midi_ports->mtc_input_port ()->connected () &&
2766 config.get_external_sync () &&
2767 (Config->get_sync_source () == MTC) ) {
2768 config.set_external_sync (false);
2771 if ( ARDOUR::Profile->get_trx () ) {
2772 // Tracks need this signal to update timecode_source_dropdown
2773 MtcOrLtcInputPortChanged (); //emit signal
2778 Session::reconnect_mmc_ports(bool inputs)
2780 if (inputs ) { // get all enabled midi input ports
2782 boost::shared_ptr<MidiPort> mmc_in_ptr = _midi_ports->mmc_in();
2784 mmc_in_ptr->disconnect_all ();
2785 std::vector<std::string> enabled_midi_inputs;
2786 EngineStateController::instance()->get_physical_midi_inputs (enabled_midi_inputs);
2788 std::vector<std::string>::iterator port_iter = enabled_midi_inputs.begin();
2790 for (; port_iter != enabled_midi_inputs.end(); ++port_iter) {
2791 mmc_in_ptr->connect (*port_iter);
2795 } else { // get all enabled midi output ports
2797 boost::shared_ptr<MidiPort> mmc_out_ptr = _midi_ports->mmc_out();
2799 mmc_out_ptr->disconnect_all ();
2800 std::vector<std::string> enabled_midi_outputs;
2801 EngineStateController::instance()->get_physical_midi_outputs (enabled_midi_outputs);
2803 std::vector<std::string>::iterator port_iter = enabled_midi_outputs.begin();
2805 for (; port_iter != enabled_midi_outputs.end(); ++port_iter) {
2806 mmc_out_ptr->connect (*port_iter);
2814 /** Caller must not hold process lock
2815 * @param name_template string to use for the start of the name, or "" to use "Audio".
2817 list< boost::shared_ptr<AudioTrack> >
2818 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
2819 uint32_t how_many, string name_template)
2822 uint32_t track_id = 0;
2824 RouteList new_routes;
2825 list<boost::shared_ptr<AudioTrack> > ret;
2827 const string name_pattern = default_track_name_pattern (DataType::AUDIO);
2828 bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
2832 if (!find_route_name (name_template.empty() ? _(name_pattern.c_str()) : name_template, ++track_id, track_name, use_number)) {
2833 error << "cannot find name for new audio track" << endmsg;
2837 boost::shared_ptr<AudioTrack> track;
2840 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
2842 if (track->init ()) {
2846 if (ARDOUR::Profile->get_trx ()) {
2847 // TRACKS considers it's not a USE CASE, it's
2848 // a piece of behavior of the session model:
2850 // Gain for a newly created route depends on
2851 // the current output_auto_connect mode:
2853 // 0 for Stereo Out mode
2855 if (Config->get_output_auto_connect() & AutoConnectMaster) {
2856 track->set_gain (dB_to_coefficient (0), 0);
2860 track->use_new_diskstream();
2862 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2863 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2866 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2868 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2869 error << string_compose (
2870 _("cannot configure %1 in/%2 out configuration for new audio track"),
2871 input_channels, output_channels)
2876 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2877 error << string_compose (
2878 _("cannot configure %1 in/%2 out configuration for new audio track"),
2879 input_channels, output_channels)
2886 route_group->add (track);
2889 track->non_realtime_input_change();
2891 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2892 if (Config->get_remote_model() == UserOrdered) {
2893 track->set_remote_control_id (next_control_id());
2896 new_routes.push_back (track);
2897 ret.push_back (track);
2899 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2902 catch (failed_constructor &err) {
2903 error << _("Session: could not create new audio track.") << endmsg;
2907 catch (AudioEngine::PortRegistrationFailure& pfe) {
2909 error << pfe.what() << endmsg;
2917 if (!new_routes.empty()) {
2918 StateProtector sp (this);
2919 if (Profile->get_trx()) {
2920 add_routes (new_routes, false, false, false);
2922 add_routes (new_routes, true, true, false);
2929 /** Caller must not hold process lock.
2930 * @param name_template string to use for the start of the name, or "" to use "Bus".
2933 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
2936 uint32_t bus_id = 0;
2940 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
2943 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, use_number)) {
2944 error << "cannot find name for new audio bus" << endmsg;
2949 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
2955 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2956 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
2959 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2961 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2962 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2963 input_channels, output_channels)
2969 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2970 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2971 input_channels, output_channels)
2978 route_group->add (bus);
2980 if (Config->get_remote_model() == UserOrdered) {
2981 bus->set_remote_control_id (next_control_id());
2984 bus->add_internal_return ();
2986 ret.push_back (bus);
2988 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
2994 catch (failed_constructor &err) {
2995 error << _("Session: could not create new audio route.") << endmsg;
2999 catch (AudioEngine::PortRegistrationFailure& pfe) {
3000 error << pfe.what() << endmsg;
3010 StateProtector sp (this);
3011 if (Profile->get_trx()) {
3012 add_routes (ret, false, false, false);
3014 add_routes (ret, false, true, true); // autoconnect // outputs only
3023 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base)
3026 uint32_t control_id;
3028 uint32_t number = 0;
3029 const uint32_t being_added = how_many;
3031 if (!tree.read (template_path.c_str())) {
3035 XMLNode* node = tree.root();
3037 IO::disable_connecting ();
3039 control_id = next_control_id ();
3043 XMLNode node_copy (*node);
3045 /* Remove IDs of everything so that new ones are used */
3046 node_copy.remove_property_recursively (X_("id"));
3051 if (!name_base.empty()) {
3053 /* if we're adding more than one routes, force
3054 * all the names of the new routes to be
3055 * numbered, via the final parameter.
3058 if (!find_route_name (name_base.c_str(), ++number, name, (being_added > 1))) {
3059 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3065 string const route_name = node_copy.property(X_("name"))->value ();
3067 /* generate a new name by adding a number to the end of the template name */
3068 if (!find_route_name (route_name.c_str(), ++number, name, true)) {
3069 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3070 abort(); /*NOTREACHED*/
3074 /* set this name in the XML description that we are about to use */
3075 Route::set_name_in_state (node_copy, name);
3077 /* trim bitslots from listen sends so that new ones are used */
3078 XMLNodeList children = node_copy.children ();
3079 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
3080 if ((*i)->name() == X_("Processor")) {
3081 XMLProperty* role = (*i)->property (X_("role"));
3082 if (role && role->value() == X_("Listen")) {
3083 (*i)->remove_property (X_("bitslot"));
3088 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
3091 error << _("Session: cannot create track/bus from template description") << endmsg;
3095 if (boost::dynamic_pointer_cast<Track>(route)) {
3096 /* force input/output change signals so that the new diskstream
3097 picks up the configuration of the route. During session
3098 loading this normally happens in a different way.
3101 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3103 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
3104 change.after = route->input()->n_ports();
3105 route->input()->changed (change, this);
3106 change.after = route->output()->n_ports();
3107 route->output()->changed (change, this);
3110 route->set_remote_control_id (control_id);
3113 ret.push_back (route);
3115 RouteAddedOrRemoved (true); /* EMIT SIGNAL */
3118 catch (failed_constructor &err) {
3119 error << _("Session: could not create new route from template") << endmsg;
3123 catch (AudioEngine::PortRegistrationFailure& pfe) {
3124 error << pfe.what() << endmsg;
3133 StateProtector sp (this);
3134 if (Profile->get_trx()) {
3135 add_routes (ret, false, false, false);
3137 add_routes (ret, true, true, false);
3139 IO::enable_connecting ();
3146 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
3149 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
3150 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
3153 error << _("Adding new tracks/busses failed") << endmsg;
3158 update_latency (true);
3159 update_latency (false);
3164 save_state (_current_snapshot_name);
3167 reassign_track_numbers();
3169 update_route_record_state ();
3171 RouteAdded (new_routes); /* EMIT SIGNAL */
3175 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
3177 ChanCount existing_inputs;
3178 ChanCount existing_outputs;
3179 uint32_t order = next_control_id();
3181 if (_order_hint > -1) {
3182 order = _order_hint;
3186 count_existing_track_channels (existing_inputs, existing_outputs);
3189 RCUWriter<RouteList> writer (routes);
3190 boost::shared_ptr<RouteList> r = writer.get_copy ();
3191 r->insert (r->end(), new_routes.begin(), new_routes.end());
3193 /* if there is no control out and we're not in the middle of loading,
3194 resort the graph here. if there is a control out, we will resort
3195 toward the end of this method. if we are in the middle of loading,
3196 we will resort when done.
3199 if (!_monitor_out && IO::connecting_legal) {
3200 resort_routes_using (r);
3204 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3206 boost::weak_ptr<Route> wpr (*x);
3207 boost::shared_ptr<Route> r (*x);
3209 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _2, wpr));
3210 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _3, wpr));
3211 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
3212 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
3213 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
3214 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
3216 if (r->is_master()) {
3220 if (r->is_monitor()) {
3224 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
3226 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
3227 track_playlist_changed (boost::weak_ptr<Track> (tr));
3228 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
3230 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
3232 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
3233 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
3238 if (input_auto_connect || output_auto_connect) {
3239 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
3242 /* order keys are a GUI responsibility but we need to set up
3243 reasonable defaults because they also affect the remote control
3244 ID in most situations.
3247 if (!r->has_order_key ()) {
3248 if (r->is_auditioner()) {
3249 /* use an arbitrarily high value */
3250 r->set_order_key (UINT_MAX);
3252 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
3253 r->set_order_key (order);
3261 if (_monitor_out && IO::connecting_legal) {
3262 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
3264 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3265 if ((*x)->is_monitor()) {
3267 } else if ((*x)->is_master()) {
3270 (*x)->enable_monitor_send ();
3277 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
3279 boost::shared_ptr<RouteList> r = routes.reader ();
3280 boost::shared_ptr<Send> s;
3282 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3283 if ((s = (*i)->internal_send_for (dest)) != 0) {
3284 s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO);
3290 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
3292 boost::shared_ptr<RouteList> r = routes.reader ();
3293 boost::shared_ptr<Send> s;
3295 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3296 if ((s = (*i)->internal_send_for (dest)) != 0) {
3297 s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY);
3303 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
3305 boost::shared_ptr<RouteList> r = routes.reader ();
3306 boost::shared_ptr<Send> s;
3308 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3309 if ((s = (*i)->internal_send_for (dest)) != 0) {
3310 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
3315 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
3317 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
3319 boost::shared_ptr<RouteList> r = routes.reader ();
3320 boost::shared_ptr<RouteList> t (new RouteList);
3322 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3323 /* no MIDI sends because there are no MIDI busses yet */
3324 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
3329 add_internal_sends (dest, p, t);
3333 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
3335 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
3336 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
3341 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
3343 add_internal_send (dest, sender->before_processor_for_index (index), sender);
3347 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
3349 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
3353 if (!dest->internal_return()) {
3354 dest->add_internal_return ();
3357 sender->add_aux_send (dest, before);
3364 Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
3366 PBD::Unwinder<bool> uw_flag (_route_deletion_in_progress, true);
3368 { // RCU Writer scope
3369 RCUWriter<RouteList> writer (routes);
3370 boost::shared_ptr<RouteList> rs = writer.get_copy ();
3373 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3375 if (*iter == _master_out) {
3379 (*iter)->set_solo (false, this);
3383 /* deleting the master out seems like a dumb
3384 idea, but its more of a UI policy issue
3388 if (*iter == _master_out) {
3389 _master_out = boost::shared_ptr<Route> ();
3392 if (*iter == _monitor_out) {
3393 _monitor_out.reset ();
3396 // We need to disconnect the route's inputs and outputs
3398 (*iter)->input()->disconnect (0);
3399 (*iter)->output()->disconnect (0);
3401 /* if the route had internal sends sending to it, remove them */
3402 if ((*iter)->internal_return()) {
3404 boost::shared_ptr<RouteList> r = routes.reader ();
3405 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3406 boost::shared_ptr<Send> s = (*i)->internal_send_for (*iter);
3408 (*i)->remove_processor (s);
3413 /* if the monitoring section had a pointer to this route, remove it */
3414 if (_monitor_out && !(*iter)->is_master() && !(*iter)->is_monitor()) {
3415 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3416 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
3417 (*iter)->remove_aux_or_listen (_monitor_out);
3420 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*iter);
3421 if (mt && mt->step_editing()) {
3422 if (_step_editors > 0) {
3428 /* writer goes out of scope, forces route list update */
3430 } // end of RCU Writer scope
3432 update_route_solo_state ();
3433 RouteAddedOrRemoved (false); /* EMIT SIGNAL */
3434 update_latency_compensation ();
3437 /* Re-sort routes to remove the graph's current references to the one that is
3438 * going away, then flush old references out of the graph.
3439 * Wave Tracks: reconnect routes
3442 #ifdef USE_TRACKS_CODE_FEATURES
3443 reconnect_existing_routes(true, false);
3445 routes.flush (); // maybe unsafe, see below.
3449 if (_process_graph) {
3450 _process_graph->clear_other_chain ();
3453 /* get rid of it from the dead wood collection in the route list manager */
3454 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
3458 /* try to cause everyone to drop their references
3459 * and unregister ports from the backend
3462 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3463 (*iter)->drop_references ();
3466 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
3468 /* save the new state of the world */
3470 if (save_state (_current_snapshot_name)) {
3471 save_history (_current_snapshot_name);
3474 reassign_track_numbers();
3475 update_route_record_state ();
3479 Session::remove_route (boost::shared_ptr<Route> route)
3481 boost::shared_ptr<RouteList> rl (new RouteList);
3482 rl->push_back (route);
3487 Session::route_mute_changed (void* /*src*/)
3493 Session::route_listen_changed (bool leave_group_alone, boost::weak_ptr<Route> wpr)
3495 boost::shared_ptr<Route> route = wpr.lock();
3497 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_listen_changed")) << endmsg;
3501 if (route->listening_via_monitor ()) {
3503 if (Config->get_exclusive_solo()) {
3504 /* new listen: disable all other listen, except solo-grouped channels */
3505 RouteGroup* rg = route->route_group ();
3506 boost::shared_ptr<RouteList> r = routes.reader ();
3507 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3508 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() || (leave_group_alone && ((*i)->route_group() == rg))) {
3511 (*i)->set_listen (false, this);
3517 } else if (_listen_cnt > 0) {
3522 update_route_solo_state ();
3525 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
3527 boost::shared_ptr<Route> route = wpr.lock ();
3530 /* should not happen */
3531 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_isolated_changed")) << endmsg;
3535 bool send_changed = false;
3537 if (route->solo_isolated()) {
3538 if (_solo_isolated_cnt == 0) {
3539 send_changed = true;
3541 _solo_isolated_cnt++;
3542 } else if (_solo_isolated_cnt > 0) {
3543 _solo_isolated_cnt--;
3544 if (_solo_isolated_cnt == 0) {
3545 send_changed = true;
3550 IsolatedChanged (); /* EMIT SIGNAL */
3555 Session::route_solo_changed (bool self_solo_change, bool leave_group_alone, boost::weak_ptr<Route> wpr)
3557 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
3559 if (!self_solo_change) {
3560 // session doesn't care about changes to soloed-by-others
3564 boost::shared_ptr<Route> route = wpr.lock ();
3567 boost::shared_ptr<RouteList> r = routes.reader ();
3570 if (route->self_soloed()) {
3576 RouteGroup* rg = route->route_group ();
3577 if (delta == 1 && Config->get_exclusive_solo()) {
3579 /* new solo: disable all other solos, but not the group if its solo-enabled */
3581 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3582 if ((*i) == route || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3583 (leave_group_alone && ((*i)->route_group() == rg))) {
3586 (*i)->set_solo (false, this);
3590 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3592 RouteList uninvolved;
3594 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
3596 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3597 bool via_sends_only;
3598 bool in_signal_flow;
3600 if ((*i) == route || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
3601 (leave_group_alone && ((*i)->route_group() == rg))) {
3605 in_signal_flow = false;
3607 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3609 if ((*i)->feeds (route, &via_sends_only)) {
3610 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3611 if (!via_sends_only) {
3612 if (!route->soloed_by_others_upstream()) {
3613 (*i)->mod_solo_by_others_downstream (delta);
3615 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others upstream\n");
3618 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3620 in_signal_flow = true;
3622 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3625 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3627 if (route->feeds (*i, &via_sends_only)) {
3628 /* propagate solo upstream only if routing other than
3629 sends is involved, but do consider the other route
3630 (*i) to be part of the signal flow even if only
3633 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3637 route->soloed_by_others_downstream(),
3638 route->soloed_by_others_upstream()));
3639 if (!via_sends_only) {
3640 //NB. Triggers Invert Push, which handles soloed by downstream
3641 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3642 (*i)->mod_solo_by_others_upstream (delta);
3644 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3646 in_signal_flow = true;
3648 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3651 if (!in_signal_flow) {
3652 uninvolved.push_back (*i);
3656 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3658 update_route_solo_state (r);
3660 /* now notify that the mute state of the routes not involved in the signal
3661 pathway of the just-solo-changed route may have altered.
3664 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3665 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
3666 (*i)->act_on_mute ();
3667 (*i)->mute_changed (this);
3670 SoloChanged (); /* EMIT SIGNAL */
3675 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
3677 /* now figure out if anything that matters is soloed (or is "listening")*/
3679 bool something_soloed = false;
3680 uint32_t listeners = 0;
3681 uint32_t isolated = 0;
3684 r = routes.reader();
3687 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3688 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
3689 something_soloed = true;
3692 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
3693 if (Config->get_solo_control_is_listen_control()) {
3696 (*i)->set_listen (false, this);
3700 if ((*i)->solo_isolated()) {
3705 if (something_soloed != _non_soloed_outs_muted) {
3706 _non_soloed_outs_muted = something_soloed;
3707 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
3710 _listen_cnt = listeners;
3712 if (isolated != _solo_isolated_cnt) {
3713 _solo_isolated_cnt = isolated;
3714 IsolatedChanged (); /* EMIT SIGNAL */
3717 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
3718 something_soloed, listeners, isolated));
3721 boost::shared_ptr<RouteList>
3722 Session::get_routes_with_internal_returns() const
3724 boost::shared_ptr<RouteList> r = routes.reader ();
3725 boost::shared_ptr<RouteList> rl (new RouteList);
3727 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3728 if ((*i)->internal_return ()) {
3736 Session::io_name_is_legal (const std::string& name)
3738 boost::shared_ptr<RouteList> r = routes.reader ();
3740 for (vector<string>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
3741 if (name == *reserved) {
3746 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3747 if ((*i)->name() == name) {
3751 if ((*i)->has_io_processor_named (name)) {
3760 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
3763 vector<string> connections;
3765 /* if we are passed only a single route and we're not told to turn
3766 * others off, then just do the simple thing.
3769 if (flip_others == false && rl->size() == 1) {
3770 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
3772 mt->set_input_active (onoff);
3777 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
3779 PortSet& ps ((*rt)->input()->ports());
3781 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
3782 p->get_connections (connections);
3785 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
3786 routes_using_input_from (*s, rl2);
3789 /* scan all relevant routes to see if others are on or off */
3791 bool others_are_already_on = false;
3793 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3795 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3801 if ((*r) != (*rt)) {
3802 if (mt->input_active()) {
3803 others_are_already_on = true;
3806 /* this one needs changing */
3807 mt->set_input_active (onoff);
3813 /* globally reverse other routes */
3815 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3816 if ((*r) != (*rt)) {
3817 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3819 mt->set_input_active (!others_are_already_on);
3828 Session::routes_using_input_from (const string& str, RouteList& rl)
3830 boost::shared_ptr<RouteList> r = routes.reader();
3832 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3833 if ((*i)->input()->connected_to (str)) {
3839 boost::shared_ptr<Route>
3840 Session::route_by_name (string name)
3842 boost::shared_ptr<RouteList> r = routes.reader ();
3844 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3845 if ((*i)->name() == name) {
3850 return boost::shared_ptr<Route> ((Route*) 0);
3853 boost::shared_ptr<Route>
3854 Session::route_by_id (PBD::ID id)
3856 boost::shared_ptr<RouteList> r = routes.reader ();
3858 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3859 if ((*i)->id() == id) {
3864 return boost::shared_ptr<Route> ((Route*) 0);
3867 boost::shared_ptr<Track>
3868 Session::track_by_diskstream_id (PBD::ID id)
3870 boost::shared_ptr<RouteList> r = routes.reader ();
3872 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3873 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3874 if (t && t->using_diskstream_id (id)) {
3879 return boost::shared_ptr<Track> ();
3882 boost::shared_ptr<Route>
3883 Session::route_by_remote_id (uint32_t id)
3885 boost::shared_ptr<RouteList> r = routes.reader ();
3887 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3888 if ((*i)->remote_control_id() == id) {
3893 return boost::shared_ptr<Route> ((Route*) 0);
3898 Session::reassign_track_numbers ()
3902 RouteList r (*(routes.reader ()));
3903 SignalOrderRouteSorter sorter;
3906 StateProtector sp (this);
3908 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3909 if (boost::dynamic_pointer_cast<Track> (*i)) {
3910 (*i)->set_track_number(++tn);
3912 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
3913 (*i)->set_track_number(--bn);
3916 const uint32_t decimals = ceilf (log10f (tn + 1));
3917 const bool decimals_changed = _track_number_decimals != decimals;
3918 _track_number_decimals = decimals;
3920 if (decimals_changed && config.get_track_name_number ()) {
3921 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3922 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3924 t->resync_track_name();
3927 // trigger GUI re-layout
3928 config.ParameterChanged("track-name-number");
3933 Session::playlist_region_added (boost::weak_ptr<Region> w)
3935 boost::shared_ptr<Region> r = w.lock ();
3940 /* These are the operations that are currently in progress... */
3941 list<GQuark> curr = _current_trans_quarks;
3944 /* ...and these are the operations during which we want to update
3945 the session range location markers.
3948 ops.push_back (Operations::capture);
3949 ops.push_back (Operations::paste);
3950 ops.push_back (Operations::duplicate_region);
3951 ops.push_back (Operations::insert_file);
3952 ops.push_back (Operations::insert_region);
3953 ops.push_back (Operations::drag_region_brush);
3954 ops.push_back (Operations::region_drag);
3955 ops.push_back (Operations::selection_grab);
3956 ops.push_back (Operations::region_fill);
3957 ops.push_back (Operations::fill_selection);
3958 ops.push_back (Operations::create_region);
3959 ops.push_back (Operations::region_copy);
3960 ops.push_back (Operations::fixed_time_region_copy);
3963 /* See if any of the current operations match the ones that we want */
3965 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
3967 /* If so, update the session range markers */
3969 maybe_update_session_range (r->position (), r->last_frame ());
3973 /** Update the session range markers if a is before the current start or
3974 * b is after the current end.
3977 Session::maybe_update_session_range (framepos_t a, framepos_t b)
3979 if (_state_of_the_state & Loading) {
3983 framepos_t session_end_marker_shift_samples = session_end_shift * _nominal_frame_rate;
3985 if (_session_range_location == 0) {
3987 set_session_range_location (a, b + session_end_marker_shift_samples);
3991 if (a < _session_range_location->start()) {
3992 _session_range_location->set_start (a);
3995 if (b > _session_range_location->end()) {
3996 _session_range_location->set_end (b);
4002 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
4004 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4005 maybe_update_session_range (i->to, i->to + i->length);
4010 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
4012 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4013 maybe_update_session_range (i->from, i->to);
4017 /* Region management */
4019 boost::shared_ptr<Region>
4020 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
4022 const RegionFactory::RegionMap& regions (RegionFactory::regions());
4023 RegionFactory::RegionMap::const_iterator i;
4024 boost::shared_ptr<Region> region;
4026 Glib::Threads::Mutex::Lock lm (region_lock);
4028 for (i = regions.begin(); i != regions.end(); ++i) {
4032 if (region->whole_file()) {
4034 if (child->source_equivalent (region)) {
4040 return boost::shared_ptr<Region> ();
4044 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
4046 set<boost::shared_ptr<Region> > relevant_regions;
4048 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
4049 RegionFactory::get_regions_using_source (*s, relevant_regions);
4052 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
4053 set<boost::shared_ptr<Region> >::iterator tmp;
4058 playlists->destroy_region (*r);
4059 RegionFactory::map_remove (*r);
4061 (*r)->drop_sources ();
4062 (*r)->drop_references ();
4064 relevant_regions.erase (r);
4069 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
4072 Glib::Threads::Mutex::Lock ls (source_lock);
4073 /* remove from the main source list */
4074 sources.erase ((*s)->id());
4077 (*s)->mark_for_remove ();
4078 (*s)->drop_references ();
4087 Session::remove_last_capture ()
4089 list<boost::shared_ptr<Source> > srcs;
4091 boost::shared_ptr<RouteList> rl = routes.reader ();
4092 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4093 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4098 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
4101 srcs.insert (srcs.end(), l.begin(), l.end());
4106 destroy_sources (srcs);
4108 save_state (_current_snapshot_name);
4113 /* Source Management */
4116 Session::add_source (boost::shared_ptr<Source> source)
4118 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
4119 pair<SourceMap::iterator,bool> result;
4121 entry.first = source->id();
4122 entry.second = source;
4125 Glib::Threads::Mutex::Lock lm (source_lock);
4126 result = sources.insert (entry);
4129 if (result.second) {
4131 /* yay, new source */
4133 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
4136 if (!fs->within_session()) {
4137 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
4143 boost::shared_ptr<AudioFileSource> afs;
4145 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
4146 if (Config->get_auto_analyse_audio()) {
4147 Analyser::queue_source_for_analysis (source, false);
4151 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
4156 Session::remove_source (boost::weak_ptr<Source> src)
4158 if (_state_of_the_state & Deletion) {
4162 SourceMap::iterator i;
4163 boost::shared_ptr<Source> source = src.lock();
4170 Glib::Threads::Mutex::Lock lm (source_lock);
4172 if ((i = sources.find (source->id())) != sources.end()) {
4177 if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
4179 /* save state so we don't end up with a session file
4180 referring to non-existent sources.
4183 save_state (_current_snapshot_name);
4187 boost::shared_ptr<Source>
4188 Session::source_by_id (const PBD::ID& id)
4190 Glib::Threads::Mutex::Lock lm (source_lock);
4191 SourceMap::iterator i;
4192 boost::shared_ptr<Source> source;
4194 if ((i = sources.find (id)) != sources.end()) {
4201 boost::shared_ptr<AudioFileSource>
4202 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
4204 /* Restricted to audio files because only audio sources have channel
4208 Glib::Threads::Mutex::Lock lm (source_lock);
4210 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
4211 boost::shared_ptr<AudioFileSource> afs
4212 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
4214 if (afs && afs->path() == path && chn == afs->channel()) {
4219 return boost::shared_ptr<AudioFileSource>();
4222 boost::shared_ptr<MidiSource>
4223 Session::midi_source_by_path (const std::string& path) const
4225 /* Restricted to MIDI files because audio sources require a channel
4226 for unique identification, in addition to a path.
4229 Glib::Threads::Mutex::Lock lm (source_lock);
4231 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
4232 boost::shared_ptr<MidiSource> ms
4233 = boost::dynamic_pointer_cast<MidiSource>(s->second);
4234 boost::shared_ptr<FileSource> fs
4235 = boost::dynamic_pointer_cast<FileSource>(s->second);
4237 if (ms && fs && fs->path() == path) {
4242 return boost::shared_ptr<MidiSource>();
4246 Session::count_sources_by_origin (const string& path)
4249 Glib::Threads::Mutex::Lock lm (source_lock);
4251 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
4252 boost::shared_ptr<FileSource> fs
4253 = boost::dynamic_pointer_cast<FileSource>(i->second);
4255 if (fs && fs->origin() == path) {
4264 peak_file_helper (const string& peak_path, const string& file_path, const string& file_base, bool hash) {
4266 std::string checksum = Glib::Checksum::compute_checksum(Glib::Checksum::CHECKSUM_SHA1, file_path + G_DIR_SEPARATOR + file_base);
4267 return Glib::build_filename (peak_path, checksum + peakfile_suffix);
4269 return Glib::build_filename (peak_path, file_base + peakfile_suffix);
4274 Session::construct_peak_filepath (const string& filepath, const bool in_session, const bool old_peak_name) const
4276 string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
4278 if (Glib::path_is_absolute (filepath)) {
4280 /* rip the session dir from the audiofile source */
4282 string session_path;
4283 bool in_another_session = true;
4285 if (filepath.find (interchange_dir_string) != string::npos) {
4287 session_path = Glib::path_get_dirname (filepath); /* now ends in audiofiles */
4288 session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
4289 session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
4290 session_path = Glib::path_get_dirname (session_path); /* now has session path */
4292 /* see if it is within our session */
4294 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4295 if (i->path == session_path) {
4296 in_another_session = false;
4301 in_another_session = false;
4305 if (in_another_session) {
4306 SessionDirectory sd (session_path);
4307 return peak_file_helper (sd.peak_path(), "", Glib::path_get_basename (filepath), !old_peak_name);
4311 /* 1) if file belongs to this session
4312 * it may be a relative path (interchange/...)
4313 * or just basename (session_state, remove source)
4314 * -> just use the basename
4316 std::string filename = Glib::path_get_basename (filepath);
4319 /* 2) if the file is outside our session dir:
4320 * (imported but not copied) add the path for check-summming */
4322 path = Glib::path_get_dirname (filepath);
4325 return peak_file_helper (_session_dir->peak_path(), path, Glib::path_get_basename (filepath), !old_peak_name);
4329 Session::new_audio_source_path_for_embedded (const std::string& path)
4333 * we know that the filename is already unique because it exists
4334 * out in the filesystem.
4336 * However, when we bring it into the session, we could get a
4339 * Eg. two embedded files:
4344 * When merged into session, these collide.
4346 * There will not be a conflict with in-memory sources
4347 * because when the source was created we already picked
4348 * a unique name for it.
4350 * This collision is not likely to be common, but we have to guard
4351 * against it. So, if there is a collision, take the md5 hash of the
4352 * the path, and use that as the filename instead.
4355 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4356 string base = Glib::path_get_basename (path);
4357 string newpath = Glib::build_filename (sdir.sound_path(), base);
4359 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4363 md5.digestString (path.c_str());
4364 md5.writeToString ();
4365 base = md5.digestChars;
4367 string ext = get_suffix (path);
4374 newpath = Glib::build_filename (sdir.sound_path(), base);
4376 /* if this collides, we're screwed */
4378 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4379 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
4388 /** Return true if there are no audio file sources that use @param name as
4389 * the filename component of their path.
4391 * Return false otherwise.
4393 * This method MUST ONLY be used to check in-session, mono files since it
4394 * hard-codes the channel of the audio file source we are looking for as zero.
4396 * If/when Ardour supports native files in non-mono formats, the logic here
4397 * will need to be revisited.
4400 Session::audio_source_name_is_unique (const string& name)
4402 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
4403 vector<space_and_path>::iterator i;
4404 uint32_t existing = 0;
4406 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4408 /* note that we search *without* the extension so that
4409 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
4410 in the event that this new name is required for
4411 a file format change.
4414 const string spath = *i;
4416 if (matching_unsuffixed_filename_exists_in (spath, name)) {
4421 /* it is possible that we have the path already
4422 * assigned to a source that has not yet been written
4423 * (ie. the write source for a diskstream). we have to
4424 * check this in order to make sure that our candidate
4425 * path isn't used again, because that can lead to
4426 * two Sources point to the same file with different
4427 * notions of their removability.
4431 string possible_path = Glib::build_filename (spath, name);
4433 if (audio_source_by_path_and_channel (possible_path, 0)) {
4439 return (existing == 0);
4443 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)
4446 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4448 if (Profile->get_trx() && destructive) {
4450 sstr << setfill ('0') << setw (4) << cnt;
4451 sstr << legalized_base;
4453 sstr << legalized_base;
4455 if (take_required || related_exists) {
4467 } else if (nchan > 2) {
4472 /* XXX what? more than 26 channels! */
4483 /** Return a unique name based on \a base for a new internal audio source */
4485 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
4488 string possible_name;
4489 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
4491 bool some_related_source_name_exists = false;
4493 legalized = legalize_for_path (base);
4495 // Find a "version" of the base name that doesn't exist in any of the possible directories.
4497 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
4499 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
4501 if (audio_source_name_is_unique (possible_name)) {
4505 some_related_source_name_exists = true;
4508 error << string_compose(
4509 _("There are already %1 recordings for %2, which I consider too many."),
4510 limit, base) << endmsg;
4512 throw failed_constructor();
4516 /* We've established that the new name does not exist in any session
4517 * directory, so now find out which one we should use for this new
4521 SessionDirectory sdir (get_best_session_directory_for_new_audio());
4523 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
4528 /** Return a unique name based on `base` for a new internal MIDI source */
4530 Session::new_midi_source_path (const string& base)
4533 char buf[PATH_MAX+1];
4534 const uint32_t limit = 10000;
4536 string possible_path;
4537 string possible_name;
4540 legalized = legalize_for_path (base);
4542 // Find a "version" of the file name that doesn't exist in any of the possible directories.
4543 std::vector<string> sdirs = source_search_path(DataType::MIDI);
4545 /* - the main session folder is the first in the vector.
4546 * - after checking all locations for file-name uniqueness,
4547 * we keep the one from the last iteration as new file name
4548 * - midi files are small and should just be kept in the main session-folder
4550 * -> reverse the array, check main session folder last and use that as location
4553 std::reverse(sdirs.begin(), sdirs.end());
4555 for (cnt = 1; cnt <= limit; ++cnt) {
4557 vector<space_and_path>::iterator i;
4558 uint32_t existing = 0;
4560 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4562 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
4563 possible_name = buf;
4565 possible_path = Glib::build_filename (*i, possible_name);
4567 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
4571 if (midi_source_by_path (possible_path)) {
4576 if (existing == 0) {
4581 error << string_compose(
4582 _("There are already %1 recordings for %2, which I consider too many."),
4583 limit, base) << endmsg;
4589 /* No need to "find best location" for software/app-based RAID, because
4590 MIDI is so small that we always put it in the same place.
4593 return possible_path;
4597 /** Create a new within-session audio source */
4598 boost::shared_ptr<AudioFileSource>
4599 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
4601 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
4603 if (!path.empty()) {
4604 return boost::dynamic_pointer_cast<AudioFileSource> (
4605 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate(), true, true));
4607 throw failed_constructor ();
4611 /** Create a new within-session MIDI source */
4612 boost::shared_ptr<MidiSource>
4613 Session::create_midi_source_for_session (string const & basic_name)
4615 const string path = new_midi_source_path (basic_name);
4617 if (!path.empty()) {
4618 return boost::dynamic_pointer_cast<SMFSource> (
4619 SourceFactory::createWritable (
4620 DataType::MIDI, *this, path, false, frame_rate()));
4622 throw failed_constructor ();
4626 /** Create a new within-session MIDI source */
4627 boost::shared_ptr<MidiSource>
4628 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
4630 /* the caller passes in the track the source will be used in,
4631 so that we can keep the numbering sane.
4633 Rationale: a track with the name "Foo" that has had N
4634 captures carried out so far will ALREADY have a write source
4635 named "Foo-N+1.mid" waiting to be used for the next capture.
4637 If we call new_midi_source_name() we will get "Foo-N+2". But
4638 there is no region corresponding to "Foo-N+1", so when
4639 "Foo-N+2" appears in the track, the gap presents the user
4640 with odd behaviour - why did it skip past Foo-N+1?
4642 We could explain this to the user in some odd way, but
4643 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
4646 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
4649 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
4651 std::string name = track->steal_write_source_name ();
4654 return boost::shared_ptr<MidiSource>();
4657 /* MIDI files are small, just put them in the first location of the
4658 session source search path.
4661 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
4663 return boost::dynamic_pointer_cast<SMFSource> (
4664 SourceFactory::createWritable (
4665 DataType::MIDI, *this, path, false, frame_rate()));
4670 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
4672 if (playlist->hidden()) {
4676 playlists->add (playlist);
4679 playlist->release();
4686 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
4688 if (_state_of_the_state & Deletion) {
4692 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
4698 playlists->remove (playlist);
4704 Session::set_audition (boost::shared_ptr<Region> r)
4706 pending_audition_region = r;
4707 add_post_transport_work (PostTransportAudition);
4708 _butler->schedule_transport_work ();
4712 Session::audition_playlist ()
4714 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4715 ev->region.reset ();
4720 Session::non_realtime_set_audition ()
4722 assert (pending_audition_region);
4723 auditioner->audition_region (pending_audition_region);
4724 pending_audition_region.reset ();
4725 AuditionActive (true); /* EMIT SIGNAL */
4729 Session::audition_region (boost::shared_ptr<Region> r)
4731 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4737 Session::cancel_audition ()
4742 if (auditioner->auditioning()) {
4743 auditioner->cancel_audition ();
4744 AuditionActive (false); /* EMIT SIGNAL */
4749 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
4751 if (a->is_monitor()) {
4754 if (b->is_monitor()) {
4757 return a->order_key () < b->order_key ();
4761 Session::is_auditioning () const
4763 /* can be called before we have an auditioner object */
4765 return auditioner->auditioning();
4772 Session::graph_reordered ()
4774 /* don't do this stuff if we are setting up connections
4775 from a set_state() call or creating new tracks. Ditto for deletion.
4778 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _reconnecting_routes_in_progress || _route_deletion_in_progress) {
4782 /* every track/bus asked for this to be handled but it was deferred because
4783 we were connecting. do it now.
4786 request_input_change_handling ();
4790 /* force all diskstreams to update their capture offset values to
4791 reflect any changes in latencies within the graph.
4794 boost::shared_ptr<RouteList> rl = routes.reader ();
4795 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4796 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4798 tr->set_capture_offset ();
4803 /** @return Number of frames that there is disk space available to write,
4806 boost::optional<framecnt_t>
4807 Session::available_capture_duration ()
4809 Glib::Threads::Mutex::Lock lm (space_lock);
4811 if (_total_free_4k_blocks_uncertain) {
4812 return boost::optional<framecnt_t> ();
4815 float sample_bytes_on_disk = 4.0; // keep gcc happy
4817 switch (config.get_native_file_data_format()) {
4819 sample_bytes_on_disk = 4.0;
4823 sample_bytes_on_disk = 3.0;
4827 sample_bytes_on_disk = 2.0;
4831 /* impossible, but keep some gcc versions happy */
4832 fatal << string_compose (_("programming error: %1"),
4833 X_("illegal native file data format"))
4835 abort(); /*NOTREACHED*/
4838 double scale = 4096.0 / sample_bytes_on_disk;
4840 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
4841 return max_framecnt;
4844 return (framecnt_t) floor (_total_free_4k_blocks * scale);
4848 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
4851 RCUWriter<BundleList> writer (_bundles);
4852 boost::shared_ptr<BundleList> b = writer.get_copy ();
4853 b->push_back (bundle);
4857 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4864 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
4866 bool removed = false;
4869 RCUWriter<BundleList> writer (_bundles);
4870 boost::shared_ptr<BundleList> b = writer.get_copy ();
4871 BundleList::iterator i = find (b->begin(), b->end(), bundle);
4873 if (i != b->end()) {
4880 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4886 boost::shared_ptr<Bundle>
4887 Session::bundle_by_name (string name) const
4889 boost::shared_ptr<BundleList> b = _bundles.reader ();
4891 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
4892 if ((*i)->name() == name) {
4897 return boost::shared_ptr<Bundle> ();
4901 Session::tempo_map_changed (const PropertyChange&)
4905 playlists->update_after_tempo_map_change ();
4907 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
4913 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
4915 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
4916 (*i)->recompute_frames_from_bbt ();
4920 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
4921 * the given count with the current block size.
4924 Session::ensure_buffers (ChanCount howmany)
4926 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
4930 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
4932 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4933 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
4938 Session::next_insert_id ()
4940 /* this doesn't really loop forever. just think about it */
4943 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
4944 if (!insert_bitset[n]) {
4945 insert_bitset[n] = true;
4951 /* none available, so resize and try again */
4953 insert_bitset.resize (insert_bitset.size() + 16, false);
4958 Session::next_send_id ()
4960 /* this doesn't really loop forever. just think about it */
4963 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
4964 if (!send_bitset[n]) {
4965 send_bitset[n] = true;
4971 /* none available, so resize and try again */
4973 send_bitset.resize (send_bitset.size() + 16, false);
4978 Session::next_aux_send_id ()
4980 /* this doesn't really loop forever. just think about it */
4983 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
4984 if (!aux_send_bitset[n]) {
4985 aux_send_bitset[n] = true;
4991 /* none available, so resize and try again */
4993 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
4998 Session::next_return_id ()
5000 /* this doesn't really loop forever. just think about it */
5003 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
5004 if (!return_bitset[n]) {
5005 return_bitset[n] = true;
5011 /* none available, so resize and try again */
5013 return_bitset.resize (return_bitset.size() + 16, false);
5018 Session::mark_send_id (uint32_t id)
5020 if (id >= send_bitset.size()) {
5021 send_bitset.resize (id+16, false);
5023 if (send_bitset[id]) {
5024 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
5026 send_bitset[id] = true;
5030 Session::mark_aux_send_id (uint32_t id)
5032 if (id >= aux_send_bitset.size()) {
5033 aux_send_bitset.resize (id+16, false);
5035 if (aux_send_bitset[id]) {
5036 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
5038 aux_send_bitset[id] = true;
5042 Session::mark_return_id (uint32_t id)
5044 if (id >= return_bitset.size()) {
5045 return_bitset.resize (id+16, false);
5047 if (return_bitset[id]) {
5048 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
5050 return_bitset[id] = true;
5054 Session::mark_insert_id (uint32_t id)
5056 if (id >= insert_bitset.size()) {
5057 insert_bitset.resize (id+16, false);
5059 if (insert_bitset[id]) {
5060 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
5062 insert_bitset[id] = true;
5066 Session::unmark_send_id (uint32_t id)
5068 if (id < send_bitset.size()) {
5069 send_bitset[id] = false;
5074 Session::unmark_aux_send_id (uint32_t id)
5076 if (id < aux_send_bitset.size()) {
5077 aux_send_bitset[id] = false;
5082 Session::unmark_return_id (uint32_t id)
5084 if (id < return_bitset.size()) {
5085 return_bitset[id] = false;
5090 Session::unmark_insert_id (uint32_t id)
5092 if (id < insert_bitset.size()) {
5093 insert_bitset[id] = false;
5098 Session::reset_native_file_format ()
5100 boost::shared_ptr<RouteList> rl = routes.reader ();
5102 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5103 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5105 /* don't save state as we do this, there's no point
5107 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
5108 tr->reset_write_sources (false);
5109 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
5115 Session::route_name_unique (string n) const
5117 boost::shared_ptr<RouteList> r = routes.reader ();
5119 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5120 if ((*i)->name() == n) {
5129 Session::route_name_internal (string n) const
5131 if (auditioner && auditioner->name() == n) {
5135 if (_click_io && _click_io->name() == n) {
5143 Session::freeze_all (InterThreadInfo& itt)
5145 boost::shared_ptr<RouteList> r = routes.reader ();
5147 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5149 boost::shared_ptr<Track> t;
5151 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
5152 /* XXX this is wrong because itt.progress will keep returning to zero at the start
5162 boost::shared_ptr<Region>
5163 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
5164 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
5165 InterThreadInfo& itt,
5166 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
5167 bool for_export, bool for_freeze)
5169 boost::shared_ptr<Region> result;
5170 boost::shared_ptr<Playlist> playlist;
5171 boost::shared_ptr<Source> source;
5172 ChanCount diskstream_channels (track.n_channels());
5173 framepos_t position;
5174 framecnt_t this_chunk;
5176 framepos_t latency_skip;
5178 framepos_t len = end - start;
5179 bool need_block_size_reset = false;
5180 ChanCount const max_proc = track.max_processor_streams ();
5181 string legal_playlist_name;
5182 string possible_path;
5185 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
5186 end, start) << endmsg;
5190 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
5191 include_endpoint, for_export, for_freeze);
5193 if (diskstream_channels.n(track.data_type()) < 1) {
5194 error << _("Cannot write a range with no data.") << endmsg;
5198 // block all process callback handling
5200 block_processing ();
5203 // synchronize with AudioEngine::process_callback()
5204 // make sure processing is not currently running
5205 // and processing_blocked() is honored before
5206 // acquiring thread buffers
5207 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5210 _bounce_processing_active = true;
5212 /* call tree *MUST* hold route_lock */
5214 if ((playlist = track.playlist()) == 0) {
5218 legal_playlist_name = legalize_for_path (playlist->name());
5220 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
5222 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
5223 string path = ((track.data_type() == DataType::AUDIO)
5224 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
5225 : new_midi_source_path (legal_playlist_name));
5232 source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
5235 catch (failed_constructor& err) {
5236 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
5240 srcs.push_back (source);
5243 /* tell redirects that care that we are about to use a much larger
5244 * blocksize. this will flush all plugins too, so that they are ready
5245 * to be used for this process.
5248 need_block_size_reset = true;
5249 track.set_block_size (bounce_chunk_size);
5250 _engine.main_thread()->get_buffers ();
5254 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5256 /* create a set of reasonably-sized buffers */
5257 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5258 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
5260 buffers.set_count (max_proc);
5262 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5263 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5264 boost::shared_ptr<MidiSource> ms;
5266 afs->prepare_for_peakfile_writes ();
5267 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5268 Source::Lock lock(ms->mutex());
5269 ms->mark_streaming_write_started(lock);
5273 while (to_do && !itt.cancel) {
5275 this_chunk = min (to_do, bounce_chunk_size);
5277 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
5281 start += this_chunk;
5282 to_do -= this_chunk;
5283 itt.progress = (float) (1.0 - ((double) to_do / len));
5285 if (latency_skip >= bounce_chunk_size) {
5286 latency_skip -= bounce_chunk_size;
5290 const framecnt_t current_chunk = this_chunk - latency_skip;
5293 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5294 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5295 boost::shared_ptr<MidiSource> ms;
5298 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
5301 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5302 Source::Lock lock(ms->mutex());
5304 const MidiBuffer& buf = buffers.get_midi(0);
5305 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
5306 Evoral::Event<framepos_t> ev = *i;
5307 ev.set_time(ev.time() - position);
5308 ms->append_event_frames(lock, ev, ms->timeline_position());
5315 /* post-roll, pick up delayed processor output */
5316 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5318 while (latency_skip && !itt.cancel) {
5319 this_chunk = min (latency_skip, bounce_chunk_size);
5320 latency_skip -= this_chunk;
5322 buffers.silence (this_chunk, 0);
5323 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
5326 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5327 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5330 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
5342 xnow = localtime (&now);
5344 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
5345 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5346 boost::shared_ptr<MidiSource> ms;
5349 afs->update_header (position, *xnow, now);
5350 afs->flush_header ();
5351 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5352 Source::Lock lock(ms->mutex());
5353 ms->mark_streaming_write_completed(lock);
5357 /* construct a region to represent the bounced material */
5361 plist.add (Properties::start, 0);
5362 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
5363 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
5365 result = RegionFactory::create (srcs, plist);
5371 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5372 (*src)->mark_for_remove ();
5373 (*src)->drop_references ();
5377 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5378 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5381 afs->done_with_peakfile_writes ();
5385 _bounce_processing_active = false;
5387 if (need_block_size_reset) {
5388 _engine.main_thread()->drop_buffers ();
5389 track.set_block_size (get_block_size());
5392 unblock_processing ();
5398 Session::gain_automation_buffer() const
5400 return ProcessThread::gain_automation_buffer ();
5404 Session::trim_automation_buffer() const
5406 return ProcessThread::trim_automation_buffer ();
5410 Session::send_gain_automation_buffer() const
5412 return ProcessThread::send_gain_automation_buffer ();
5416 Session::pan_automation_buffer() const
5418 return ProcessThread::pan_automation_buffer ();
5422 Session::get_silent_buffers (ChanCount count)
5424 return ProcessThread::get_silent_buffers (count);
5428 Session::get_scratch_buffers (ChanCount count, bool silence)
5430 return ProcessThread::get_scratch_buffers (count, silence);
5434 Session::get_route_buffers (ChanCount count, bool silence)
5436 return ProcessThread::get_route_buffers (count, silence);
5441 Session::get_mix_buffers (ChanCount count)
5443 return ProcessThread::get_mix_buffers (count);
5447 Session::ntracks () const
5450 boost::shared_ptr<RouteList> r = routes.reader ();
5452 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5453 if (boost::dynamic_pointer_cast<Track> (*i)) {
5462 Session::nbusses () const
5465 boost::shared_ptr<RouteList> r = routes.reader ();
5467 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5468 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
5477 Session::add_automation_list(AutomationList *al)
5479 automation_lists[al->id()] = al;
5482 /** @return true if there is at least one record-enabled track, otherwise false */
5484 Session::have_rec_enabled_track () const
5486 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
5490 Session::have_rec_disabled_track () const
5492 return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
5495 /** Update the state of our rec-enabled tracks flag */
5497 Session::update_route_record_state ()
5499 boost::shared_ptr<RouteList> rl = routes.reader ();
5500 RouteList::iterator i = rl->begin();
5501 while (i != rl->end ()) {
5503 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5504 if (tr && tr->record_enabled ()) {
5511 int const old = g_atomic_int_get (&_have_rec_enabled_track);
5513 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
5515 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
5516 RecordStateChanged (); /* EMIT SIGNAL */
5519 for (i = rl->begin(); i != rl->end (); ++i) {
5520 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5521 if (tr && !tr->record_enabled ()) {
5526 g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
5528 bool record_arm_state_changed = (old != g_atomic_int_get (&_have_rec_enabled_track) );
5530 if (record_status() == Recording && record_arm_state_changed ) {
5531 RecordArmStateChanged ();
5537 Session::listen_position_changed ()
5539 boost::shared_ptr<RouteList> r = routes.reader ();
5541 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5542 (*i)->listen_position_changed ();
5547 Session::solo_control_mode_changed ()
5549 /* cancel all solo or all listen when solo control mode changes */
5552 set_solo (get_routes(), false);
5553 } else if (listening()) {
5554 set_listen (get_routes(), false);
5558 /** Called when a property of one of our route groups changes */
5560 Session::route_group_property_changed (RouteGroup* rg)
5562 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
5565 /** Called when a route is added to one of our route groups */
5567 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5569 RouteAddedToRouteGroup (rg, r);
5572 /** Called when a route is removed from one of our route groups */
5574 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
5576 update_route_record_state ();
5577 RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
5580 boost::shared_ptr<RouteList>
5581 Session::get_tracks () const
5583 boost::shared_ptr<RouteList> rl = routes.reader ();
5584 boost::shared_ptr<RouteList> tl (new RouteList);
5586 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
5587 if (boost::dynamic_pointer_cast<Track> (*r)) {
5588 if (!(*r)->is_auditioner()) {
5596 boost::shared_ptr<RouteList>
5597 Session::get_routes_with_regions_at (framepos_t const p) const
5599 boost::shared_ptr<RouteList> r = routes.reader ();
5600 boost::shared_ptr<RouteList> rl (new RouteList);
5602 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5603 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5608 boost::shared_ptr<Playlist> pl = tr->playlist ();
5613 if (pl->has_region_at (p)) {
5622 Session::goto_end ()
5624 if (_session_range_location) {
5625 request_locate (_session_range_location->end(), false);
5627 request_locate (0, false);
5632 Session::goto_start ()
5634 if (_session_range_location) {
5635 request_locate (_session_range_location->start(), false);
5637 request_locate (0, false);
5642 Session::current_start_frame () const
5644 return _session_range_location ? _session_range_location->start() : 0;
5648 Session::current_end_frame () const
5650 return _session_range_location ? _session_range_location->end() : 0;
5654 Session::set_session_range_location (framepos_t start, framepos_t end)
5656 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
5657 _locations->add (_session_range_location);
5661 Session::step_edit_status_change (bool yn)
5667 send = (_step_editors == 0);
5672 send = (_step_editors == 1);
5675 if (_step_editors > 0) {
5681 StepEditStatusChange (val);
5687 Session::start_time_changed (framepos_t old)
5689 /* Update the auto loop range to match the session range
5690 (unless the auto loop range has been changed by the user)
5693 Location* s = _locations->session_range_location ();
5698 Location* l = _locations->auto_loop_location ();
5700 if (l && l->start() == old) {
5701 l->set_start (s->start(), true);
5706 Session::end_time_changed (framepos_t old)
5708 /* Update the auto loop range to match the session range
5709 (unless the auto loop range has been changed by the user)
5712 Location* s = _locations->session_range_location ();
5717 Location* l = _locations->auto_loop_location ();
5719 if (l && l->end() == old) {
5720 l->set_end (s->end(), true);
5724 std::vector<std::string>
5725 Session::source_search_path (DataType type) const
5729 if (session_dirs.size() == 1) {
5731 case DataType::AUDIO:
5732 sp.push_back (_session_dir->sound_path());
5734 case DataType::MIDI:
5735 sp.push_back (_session_dir->midi_path());
5739 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
5740 SessionDirectory sdir (i->path);
5742 case DataType::AUDIO:
5743 sp.push_back (sdir.sound_path());
5745 case DataType::MIDI:
5746 sp.push_back (sdir.midi_path());
5752 if (type == DataType::AUDIO) {
5753 const string sound_path_2X = _session_dir->sound_path_2X();
5754 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
5755 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
5756 sp.push_back (sound_path_2X);
5761 // now check the explicit (possibly user-specified) search path
5764 case DataType::AUDIO:
5765 sp += Searchpath(config.get_audio_search_path ());
5767 case DataType::MIDI:
5768 sp += Searchpath(config.get_midi_search_path ());
5776 Session::ensure_search_path_includes (const string& path, DataType type)
5785 case DataType::AUDIO:
5786 sp += Searchpath(config.get_audio_search_path ());
5788 case DataType::MIDI:
5789 sp += Searchpath (config.get_midi_search_path ());
5793 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
5794 /* No need to add this new directory if it has the same inode as
5795 an existing one; checking inode rather than name prevents duplicated
5796 directories when we are using symlinks.
5798 On Windows, I think we could just do if (*i == path) here.
5800 if (PBD::equivalent_paths (*i, path)) {
5808 case DataType::AUDIO:
5809 config.set_audio_search_path (sp.to_string());
5811 case DataType::MIDI:
5812 config.set_midi_search_path (sp.to_string());
5818 Session::remove_dir_from_search_path (const string& dir, DataType type)
5823 case DataType::AUDIO:
5824 sp = Searchpath(config.get_audio_search_path ());
5826 case DataType::MIDI:
5827 sp = Searchpath (config.get_midi_search_path ());
5834 case DataType::AUDIO:
5835 config.set_audio_search_path (sp.to_string());
5837 case DataType::MIDI:
5838 config.set_midi_search_path (sp.to_string());
5844 boost::shared_ptr<Speakers>
5845 Session::get_speakers()
5851 Session::unknown_processors () const
5855 boost::shared_ptr<RouteList> r = routes.reader ();
5856 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5857 list<string> t = (*i)->unknown_processors ();
5858 copy (t.begin(), t.end(), back_inserter (p));
5868 Session::update_latency (bool playback)
5870 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
5872 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
5876 boost::shared_ptr<RouteList> r = routes.reader ();
5877 framecnt_t max_latency = 0;
5880 /* reverse the list so that we work backwards from the last route to run to the first */
5881 RouteList* rl = routes.reader().get();
5882 r.reset (new RouteList (*rl));
5883 reverse (r->begin(), r->end());
5886 /* compute actual latency values for the given direction and store them all in per-port
5887 structures. this will also publish the same values (to JACK) so that computation of latency
5888 for routes can consistently use public latency values.
5891 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5892 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
5895 /* because we latency compensate playback, our published playback latencies should
5896 be the same for all output ports - all material played back by ardour has
5897 the same latency, whether its caused by plugins or by latency compensation. since
5898 these may differ from the values computed above, reset all playback port latencies
5902 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
5904 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5905 (*i)->set_public_port_latencies (max_latency, playback);
5910 post_playback_latency ();
5914 post_capture_latency ();
5917 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
5921 Session::post_playback_latency ()
5923 set_worst_playback_latency ();
5925 boost::shared_ptr<RouteList> r = routes.reader ();
5927 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5928 if (!(*i)->is_auditioner() && ((*i)->active())) {
5929 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
5933 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5934 (*i)->set_latency_compensation (_worst_track_latency);
5939 Session::post_capture_latency ()
5941 set_worst_capture_latency ();
5943 /* reflect any changes in capture latencies into capture offsets
5946 boost::shared_ptr<RouteList> rl = routes.reader();
5947 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5948 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5950 tr->set_capture_offset ();
5956 Session::initialize_latencies ()
5959 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5960 update_latency (false);
5961 update_latency (true);
5964 set_worst_io_latencies ();
5968 Session::set_worst_io_latencies ()
5970 set_worst_playback_latency ();
5971 set_worst_capture_latency ();
5975 Session::set_worst_playback_latency ()
5977 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5981 _worst_output_latency = 0;
5983 if (!_engine.connected()) {
5987 boost::shared_ptr<RouteList> r = routes.reader ();
5989 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5990 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
5993 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
5997 Session::set_worst_capture_latency ()
5999 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6003 _worst_input_latency = 0;
6005 if (!_engine.connected()) {
6009 boost::shared_ptr<RouteList> r = routes.reader ();
6011 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6012 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
6015 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
6019 Session::update_latency_compensation (bool force_whole_graph)
6021 bool some_track_latency_changed = false;
6023 if (_state_of_the_state & (InitialConnecting|Deletion)) {
6027 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
6029 _worst_track_latency = 0;
6031 boost::shared_ptr<RouteList> r = routes.reader ();
6033 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6034 if (!(*i)->is_auditioner() && ((*i)->active())) {
6036 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
6037 some_track_latency_changed = true;
6039 _worst_track_latency = max (tl, _worst_track_latency);
6043 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
6044 (some_track_latency_changed ? "yes" : "no")));
6046 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
6048 if (some_track_latency_changed || force_whole_graph) {
6049 _engine.update_latencies ();
6053 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6054 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6058 tr->set_capture_offset ();
6063 Session::session_name_is_legal (const string& path)
6065 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
6067 for (int i = 0; illegal_chars[i]; ++i) {
6068 if (path.find (illegal_chars[i]) != string::npos) {
6069 return illegal_chars[i];
6077 Session::next_control_id () const
6081 /* the monitor bus remote ID is in a different
6082 * "namespace" than regular routes. its existence doesn't
6083 * affect normal (low) numbered routes.
6090 /* the same about masterbus in Waves Tracks */
6092 if (Profile->get_trx() && _master_out) {
6096 return nroutes() - subtract;
6100 Session::notify_remote_id_change ()
6102 if (deletion_in_progress()) {
6106 switch (Config->get_remote_model()) {
6108 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
6114 #ifdef USE_TRACKS_CODE_FEATURES
6115 /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
6116 * if track order has been changed by user
6118 reconnect_existing_routes(true, true);
6124 Session::sync_order_keys ()
6126 if (deletion_in_progress()) {
6130 /* tell everyone that something has happened to the sort keys
6131 and let them sync up with the change(s)
6132 this will give objects that manage the sort order keys the
6133 opportunity to keep them in sync if they wish to.
6136 DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
6138 reassign_track_numbers();
6140 Route::SyncOrderKeys (); /* EMIT SIGNAL */
6142 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
6146 Session::operation_in_progress (GQuark op) const
6148 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
6151 boost::shared_ptr<Port>
6152 Session::ltc_input_port () const
6154 return _ltc_input->nth (0);
6157 boost::shared_ptr<Port>
6158 Session::ltc_output_port () const
6160 return _ltc_output->nth (0);
6164 Session::reconnect_ltc_input ()
6168 string src = Config->get_ltc_source_port();
6170 _ltc_input->disconnect (this);
6172 if (src != _("None") && !src.empty()) {
6173 _ltc_input->nth (0)->connect (src);
6176 if ( ARDOUR::Profile->get_trx () ) {
6177 // Tracks need this signal to update timecode_source_dropdown
6178 MtcOrLtcInputPortChanged (); //emit signal
6184 Session::reconnect_ltc_output ()
6188 string src = Config->get_ltc_output_port();
6190 _ltc_output->disconnect (this);
6192 if (src != _("None") && !src.empty()) {
6193 _ltc_output->nth (0)->connect (src);
6199 Session::set_range_selection (framepos_t start, framepos_t end)
6201 _range_selection = Evoral::Range<framepos_t> (start, end);
6202 #ifdef USE_TRACKS_CODE_FEATURES
6203 follow_playhead_priority ();
6208 Session::set_object_selection (framepos_t start, framepos_t end)
6210 _object_selection = Evoral::Range<framepos_t> (start, end);
6211 #ifdef USE_TRACKS_CODE_FEATURES
6212 follow_playhead_priority ();
6217 Session::clear_range_selection ()
6219 _range_selection = Evoral::Range<framepos_t> (-1,-1);
6220 #ifdef USE_TRACKS_CODE_FEATURES
6221 follow_playhead_priority ();
6226 Session::clear_object_selection ()
6228 _object_selection = Evoral::Range<framepos_t> (-1,-1);
6229 #ifdef USE_TRACKS_CODE_FEATURES
6230 follow_playhead_priority ();