2 Copyright (C) 1999-2010 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #include <cstdio> /* sprintf(3) ... grrr */
33 #include <glibmm/threads.h>
34 #include <glibmm/miscutils.h>
35 #include <glibmm/fileutils.h>
37 #include <boost/algorithm/string/erase.hpp>
39 #include "pbd/basename.h"
40 #include "pbd/boost_debug.h"
41 #include "pbd/convert.h"
42 #include "pbd/convert.h"
43 #include "pbd/error.h"
44 #include "pbd/file_utils.h"
46 #include "pbd/search_path.h"
47 #include "pbd/stacktrace.h"
48 #include "pbd/stl_delete.h"
49 #include "pbd/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/filename_extensions.h"
70 #include "ardour/graph.h"
71 #include "ardour/midiport_manager.h"
72 #include "ardour/scene_changer.h"
73 #include "ardour/midi_track.h"
74 #include "ardour/midi_ui.h"
75 #include "ardour/operations.h"
76 #include "ardour/playlist.h"
77 #include "ardour/plugin.h"
78 #include "ardour/plugin_insert.h"
79 #include "ardour/process_thread.h"
80 #include "ardour/rc_configuration.h"
81 #include "ardour/recent_sessions.h"
82 #include "ardour/region.h"
83 #include "ardour/region_factory.h"
84 #include "ardour/route_graph.h"
85 #include "ardour/route_group.h"
86 #include "ardour/route_sorters.h"
87 #include "ardour/send.h"
88 #include "ardour/session.h"
89 #include "ardour/session_directory.h"
90 #include "ardour/session_playlists.h"
91 #include "ardour/smf_source.h"
92 #include "ardour/source_factory.h"
93 #include "ardour/speakers.h"
94 #include "ardour/track.h"
95 #include "ardour/user_bundle.h"
96 #include "ardour/utils.h"
98 #include "midi++/port.h"
99 #include "midi++/mmc.h"
110 using namespace ARDOUR;
113 bool Session::_disable_all_loaded_plugins = false;
115 PBD::Signal1<int,uint32_t> Session::AudioEngineSetupRequired;
116 PBD::Signal1<void,std::string> Session::Dialog;
117 PBD::Signal0<int> Session::AskAboutPendingState;
118 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
119 PBD::Signal0<void> Session::SendFeedback;
120 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
122 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
123 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
124 PBD::Signal2<void,std::string, std::string> Session::Exported;
125 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
126 PBD::Signal0<void> Session::Quit;
127 PBD::Signal0<void> Session::FeedbackDetected;
128 PBD::Signal0<void> Session::SuccessfulGraphSort;
129 PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
131 const framecnt_t Session::bounce_chunk_size = 65536;
132 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
133 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
135 /** @param snapshot_name Snapshot name, without .ardour suffix */
136 Session::Session (AudioEngine &eng,
137 const string& fullpath,
138 const string& snapshot_name,
139 BusProfile* bus_profile,
141 : playlists (new SessionPlaylists)
143 , process_function (&Session::process_with_events)
144 , _bounce_processing_active (false)
145 , waiting_for_sync_offset (false)
146 , _base_frame_rate (0)
147 , _current_frame_rate (0)
148 , _nominal_frame_rate (0)
149 , transport_sub_state (0)
150 , _record_status (Disabled)
151 , _transport_frame (0)
152 , _session_range_location (0)
155 , _transport_speed (0)
156 , _default_transport_speed (1.0)
157 , _last_transport_speed (0)
158 , _target_transport_speed (0.0)
159 , auto_play_legal (false)
160 , _last_slave_transport_frame (0)
161 , maximum_output_latency (0)
162 , _requested_return_frame (-1)
163 , current_block_size (0)
164 , _worst_output_latency (0)
165 , _worst_input_latency (0)
166 , _worst_track_latency (0)
167 , _have_captured (false)
168 , _non_soloed_outs_muted (false)
170 , _solo_isolated_cnt (0)
172 , _was_seamless (Config->get_seamless_loop ())
173 , _under_nsm_control (false)
174 , delta_accumulator_cnt (0)
175 , average_slave_delta (1800) // !!! why 1800 ???
177 , have_first_delta_accumulator (false)
178 , _slave_state (Stopped)
179 , post_export_sync (false)
180 , post_export_position (0)
182 , _export_started (false)
183 , _export_rolling (false)
184 , _pre_export_mmc_enabled (false)
185 , _name (snapshot_name)
187 , _send_qf_mtc (false)
188 , _pframes_since_last_mtc (0)
189 , session_midi_feedback (0)
191 , loop_changing (false)
193 , _session_dir (new SessionDirectory (fullpath))
194 , _current_snapshot_name (snapshot_name)
196 , state_was_pending (false)
197 , _state_of_the_state (StateOfTheState(CannotSave|InitialConnecting|Loading))
199 , _save_queued (false)
200 , _last_roll_location (0)
201 , _last_roll_or_reversal_location (0)
202 , _last_record_location (0)
203 , pending_locate_roll (false)
204 , pending_locate_frame (0)
205 , pending_locate_flush (false)
206 , pending_abort (false)
207 , pending_auto_loop (false)
208 , _butler (new Butler (*this))
209 , _post_transport_work (0)
210 , cumulative_rf_motion (0)
212 , _locations (new Locations (*this))
213 , _ignore_skips_updates (false)
215 , outbound_mtc_timecode_frame (0)
216 , next_quarter_frame_to_send (-1)
217 , _frames_per_timecode_frame (0)
218 , _frames_per_hour (0)
219 , _timecode_frames_per_hour (0)
220 , last_timecode_valid (false)
221 , last_timecode_when (0)
222 , _send_timecode_update (false)
234 , ltc_timecode_offset (0)
235 , ltc_timecode_negative_offset (false)
236 , midi_control_ui (0)
238 , _all_route_group (new RouteGroup (*this, "all"))
239 , routes (new RouteList)
240 , _adding_routes_in_progress (false)
241 , destructive_index (0)
242 , _track_number_decimals(1)
243 , solo_update_disabled (false)
244 , default_fade_steepness (0)
245 , default_fade_msecs (0)
246 , _total_free_4k_blocks (0)
247 , _total_free_4k_blocks_uncertain (false)
248 , no_questions_about_missing_files (false)
251 , _bundles (new BundleList)
252 , _bundle_xml_node (0)
256 , click_emphasis_data (0)
258 , click_emphasis_length (0)
259 , _clicks_cleared (0)
260 , _play_range (false)
262 , first_file_data_format_reset (true)
263 , first_file_header_format_reset (true)
264 , have_looped (false)
265 , _have_rec_enabled_track (false)
267 , _suspend_timecode_transmission (0)
268 , _speakers (new Speakers)
270 , ignore_route_processor_changes (false)
277 pre_engine_init (fullpath);
280 if (ensure_engine (sr)) {
282 throw failed_constructor ();
285 if (create (mix_template, bus_profile)) {
287 throw failed_constructor ();
290 /* if a mix template was provided, then ::create() will
291 * have copied it into the session and we need to load it
292 * so that we have the state ready for ::set_state()
293 * after the engine is started.
295 * Note that we do NOT try to get the sample rate from
296 * the template at this time, though doing so would
297 * be easy if we decided this was an appropriate part
301 if (!mix_template.empty() && load_state (_current_snapshot_name)) {
302 throw failed_constructor ();
305 /* load default session properties - if any */
310 if (load_state (_current_snapshot_name)) {
311 throw failed_constructor ();
314 /* try to get sample rate from XML state so that we
315 * can influence the SR if we set up the audio
320 const XMLProperty* prop;
321 if ((prop = state_tree->root()->property (X_("sample-rate"))) != 0) {
322 sr = atoi (prop->value());
326 if (ensure_engine (sr)) {
328 throw failed_constructor ();
332 if (post_engine_init ()) {
334 throw failed_constructor ();
337 store_recent_sessions (_name, _path);
339 bool was_dirty = dirty();
341 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
343 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
344 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
347 DirtyChanged (); /* EMIT SIGNAL */
350 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
351 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
355 /* hook us up to the engine since we are now completely constructed */
357 BootMessage (_("Connect to engine"));
359 _engine.set_session (this);
360 _engine.reset_timebase ();
362 BootMessage (_("Session loading complete"));
375 Session::ensure_engine (uint32_t desired_sample_rate)
377 if (_engine.current_backend() == 0) {
378 /* backend is unknown ... */
379 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
380 if (r.get_value_or (-1) != 0) {
383 } else if (_engine.setup_required()) {
384 /* backend is known, but setup is needed */
385 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
386 if (r.get_value_or (-1) != 0) {
389 } else if (!_engine.running()) {
390 if (_engine.start()) {
395 /* at this point the engine should be running
398 if (!_engine.running()) {
402 return immediately_post_engine ();
407 Session::immediately_post_engine ()
409 /* Do various initializations that should take place directly after we
410 * know that the engine is running, but before we either create a
411 * session or set state for an existing one.
414 if (how_many_dsp_threads () > 1) {
415 /* For now, only create the graph if we are using >1 DSP threads, as
416 it is a bit slower than the old code with 1 thread.
418 _process_graph.reset (new Graph (*this));
421 /* every time we reconnect, recompute worst case output latencies */
423 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
425 if (synced_to_engine()) {
426 _engine.transport_stop ();
429 if (config.get_jack_time_master()) {
430 _engine.transport_locate (_transport_frame);
434 BootMessage (_("Set up LTC"));
436 BootMessage (_("Set up Click"));
438 BootMessage (_("Set up standard connections"));
442 catch (failed_constructor& err) {
446 /* TODO, connect in different thread. (PortRegisteredOrUnregistered may be in RT context)
448 _engine.PortRegisteredOrUnregistered.connect_same_thread (*this, boost::bind (&Session::setup_bundles, this));
456 vector<void*> debug_pointers;
458 /* if we got to here, leaving pending capture state around
462 remove_pending_capture_state ();
464 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
466 /* disconnect from any and all signals that we are connected to */
470 _engine.remove_session ();
472 /* deregister all ports - there will be no process or any other
473 * callbacks from the engine any more.
476 Port::PortDrop (); /* EMIT SIGNAL */
480 /* clear history so that no references to objects are held any more */
484 /* clear state tree so that no references to objects are held any more */
489 /* reset dynamic state version back to default */
491 Stateful::loading_state_version = 0;
493 _butler->drop_references ();
497 delete _all_route_group;
499 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
500 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
504 if (click_data != default_click) {
505 delete [] click_data;
508 if (click_emphasis_data != default_click_emphasis) {
509 delete [] click_emphasis_data;
514 /* need to remove auditioner before monitoring section
515 * otherwise it is re-connected */
518 /* drop references to routes held by the monitoring section
519 * specifically _monitor_out aux/listen references */
520 remove_monitor_section();
522 /* clear out any pending dead wood from RCU managed objects */
527 AudioDiskstream::free_working_buffers();
529 /* tell everyone who is still standing that we're about to die */
532 /* tell everyone to drop references and delete objects as we go */
534 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
535 RegionFactory::delete_all_regions ();
537 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
539 /* reset these three references to special routes before we do the usual route delete thing */
541 _master_out.reset ();
542 _monitor_out.reset ();
545 RCUWriter<RouteList> writer (routes);
546 boost::shared_ptr<RouteList> r = writer.get_copy ();
548 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
549 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
550 (*i)->drop_references ();
554 /* writer goes out of scope and updates master */
559 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
560 Glib::Threads::Mutex::Lock lm (source_lock);
561 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
562 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
563 i->second->drop_references ();
569 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
572 delete _scene_changer; _scene_changer = 0;
573 delete midi_control_ui; midi_control_ui = 0;
575 delete _mmc; _mmc = 0;
576 delete _midi_ports; _midi_ports = 0;
577 delete _locations; _locations = 0;
579 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
581 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
582 boost_debug_list_ptrs ();
587 Session::setup_ltc ()
591 _ltc_input.reset (new IO (*this, X_("LTC In"), IO::Input));
592 _ltc_output.reset (new IO (*this, X_("LTC Out"), IO::Output));
594 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC In"))) != 0) {
595 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
598 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
599 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
601 reconnect_ltc_input ();
604 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC Out"))) != 0) {
605 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
608 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
609 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
611 reconnect_ltc_output ();
614 /* fix up names of LTC ports because we don't want the normal
615 * IO style of NAME/TYPE-{in,out}N
618 _ltc_input->nth (0)->set_name (X_("LTC-in"));
619 _ltc_output->nth (0)->set_name (X_("LTC-out"));
623 Session::setup_click ()
626 _click_io.reset (new ClickIO (*this, X_("Click")));
627 _click_gain.reset (new Amp (*this));
628 _click_gain->activate ();
630 setup_click_state (state_tree->root());
632 setup_click_state (0);
637 Session::setup_click_state (const XMLNode* node)
639 const XMLNode* child = 0;
641 if (node && (child = find_named_node (*node, "Click")) != 0) {
643 /* existing state for Click */
646 if (Stateful::loading_state_version < 3000) {
647 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
649 const XMLNodeList& children (child->children());
650 XMLNodeList::const_iterator i = children.begin();
651 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
653 if (i != children.end()) {
654 c = _click_gain->set_state (**i, Stateful::loading_state_version);
660 _clicking = Config->get_clicking ();
664 error << _("could not setup Click I/O") << endmsg;
671 /* default state for Click: dual-mono to first 2 physical outputs */
674 _engine.get_physical_outputs (DataType::AUDIO, outs);
676 for (uint32_t physport = 0; physport < 2; ++physport) {
677 if (outs.size() > physport) {
678 if (_click_io->add_port (outs[physport], this)) {
679 // relax, even though its an error
684 if (_click_io->n_ports () > ChanCount::ZERO) {
685 _clicking = Config->get_clicking ();
691 Session::setup_bundles ()
695 RCUWriter<BundleList> writer (_bundles);
696 boost::shared_ptr<BundleList> b = writer.get_copy ();
697 for (BundleList::iterator i = b->begin(); i != b->end();) {
698 if (boost::dynamic_pointer_cast<UserBundle>(*i)) {
706 vector<string> inputs[DataType::num_types];
707 vector<string> outputs[DataType::num_types];
708 for (uint32_t i = 0; i < DataType::num_types; ++i) {
709 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
710 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
713 /* Create a set of Bundle objects that map
714 to the physical I/O currently available. We create both
715 mono and stereo bundles, so that the common cases of mono
716 and stereo tracks get bundles to put in their mixer strip
717 in / out menus. There may be a nicer way of achieving that;
718 it doesn't really scale that well to higher channel counts
721 /* mono output bundles */
723 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
725 std::string pn = _engine.get_pretty_name_by_name (outputs[DataType::AUDIO][np]);
727 snprintf (buf, sizeof (buf), _("out %s"), pn.substr(0,12).c_str());
729 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
732 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
733 c->add_channel (_("mono"), DataType::AUDIO);
734 c->set_port (0, outputs[DataType::AUDIO][np]);
736 add_bundle (c, false);
739 /* stereo output bundles */
741 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
742 if (np + 1 < outputs[DataType::AUDIO].size()) {
744 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
745 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
746 c->add_channel (_("L"), DataType::AUDIO);
747 c->set_port (0, outputs[DataType::AUDIO][np]);
748 c->add_channel (_("R"), DataType::AUDIO);
749 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
751 add_bundle (c, false);
755 /* mono input bundles */
757 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
759 std::string pn = _engine.get_pretty_name_by_name (inputs[DataType::AUDIO][np]);
761 snprintf (buf, sizeof (buf), _("in %s"), pn.substr(0,12).c_str());
763 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
766 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
767 c->add_channel (_("mono"), DataType::AUDIO);
768 c->set_port (0, inputs[DataType::AUDIO][np]);
770 add_bundle (c, false);
773 /* stereo input bundles */
775 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
776 if (np + 1 < inputs[DataType::AUDIO].size()) {
778 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
780 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
781 c->add_channel (_("L"), DataType::AUDIO);
782 c->set_port (0, inputs[DataType::AUDIO][np]);
783 c->add_channel (_("R"), DataType::AUDIO);
784 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
786 add_bundle (c, false);
790 /* MIDI input bundles */
792 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
793 string n = inputs[DataType::MIDI][np];
794 std::string pn = _engine.get_pretty_name_by_name (n);
798 boost::erase_first (n, X_("alsa_pcm:"));
800 boost::shared_ptr<Bundle> c (new Bundle (n, false));
801 c->add_channel ("", DataType::MIDI);
802 c->set_port (0, inputs[DataType::MIDI][np]);
803 add_bundle (c, false);
806 /* MIDI output bundles */
808 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
809 string n = outputs[DataType::MIDI][np];
810 std::string pn = _engine.get_pretty_name_by_name (n);
814 boost::erase_first (n, X_("alsa_pcm:"));
816 boost::shared_ptr<Bundle> c (new Bundle (n, true));
817 c->add_channel ("", DataType::MIDI);
818 c->set_port (0, outputs[DataType::MIDI][np]);
819 add_bundle (c, false);
822 // we trust the backend to only calls us if there's a change
823 BundleAddedOrRemoved (); /* EMIT SIGNAL */
827 Session::auto_connect_master_bus ()
829 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
833 /* if requested auto-connect the outputs to the first N physical ports.
836 uint32_t limit = _master_out->n_outputs().n_total();
837 vector<string> outputs[DataType::num_types];
839 for (uint32_t i = 0; i < DataType::num_types; ++i) {
840 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
843 for (uint32_t n = 0; n < limit; ++n) {
844 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
846 if (outputs[p->type()].size() > n) {
847 connect_to = outputs[p->type()][n];
850 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
851 if (_master_out->output()->connect (p, connect_to, this)) {
852 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
861 Session::remove_monitor_section ()
867 /* force reversion to Solo-In-Place */
868 Config->set_solo_control_is_listen_control (false);
870 /* if we are auditioning, cancel it ... this is a workaround
871 to a problem (auditioning does not execute the process graph,
872 which is needed to remove routes when using >1 core for processing)
877 /* Hold process lock while doing this so that we don't hear bits and
878 * pieces of audio as we work on each route.
881 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
883 /* Connect tracks to monitor section. Note that in an
884 existing session, the internal sends will already exist, but we want the
885 routes to notice that they connect to the control out specifically.
889 boost::shared_ptr<RouteList> r = routes.reader ();
890 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
892 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
894 if ((*x)->is_monitor()) {
896 } else if ((*x)->is_master()) {
899 (*x)->remove_aux_or_listen (_monitor_out);
904 remove_route (_monitor_out);
905 auto_connect_master_bus ();
908 auditioner->connect ();
913 Session::add_monitor_section ()
917 if (_monitor_out || !_master_out) {
921 boost::shared_ptr<Route> r (new Route (*this, _("Monitor"), Route::MonitorOut, DataType::AUDIO));
927 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
928 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
931 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
932 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
933 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
937 add_routes (rl, false, false, false);
939 assert (_monitor_out);
941 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
942 are undefined, at best.
945 uint32_t limit = _monitor_out->n_inputs().n_audio();
949 /* connect the inputs to the master bus outputs. this
950 * represents a separate data feed from the internal sends from
951 * each route. as of jan 2011, it allows the monitor section to
952 * conditionally ignore either the internal sends or the normal
953 * input feed, but we should really find a better way to do
957 _master_out->output()->disconnect (this);
959 for (uint32_t n = 0; n < limit; ++n) {
960 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
961 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
964 string connect_to = o->name();
965 if (_monitor_out->input()->connect (p, connect_to, this)) {
966 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
974 /* if monitor section is not connected, connect it to physical outs
977 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
979 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
981 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
984 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
986 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
987 Config->get_monitor_bus_preferred_bundle())
993 /* Monitor bus is audio only */
995 vector<string> outputs[DataType::num_types];
997 for (uint32_t i = 0; i < DataType::num_types; ++i) {
998 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1001 uint32_t mod = outputs[DataType::AUDIO].size();
1002 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1006 for (uint32_t n = 0; n < limit; ++n) {
1008 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1010 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1011 connect_to = outputs[DataType::AUDIO][n % mod];
1014 if (!connect_to.empty()) {
1015 if (_monitor_out->output()->connect (p, connect_to, this)) {
1016 error << string_compose (
1017 _("cannot connect control output %1 to %2"),
1028 /* Hold process lock while doing this so that we don't hear bits and
1029 * pieces of audio as we work on each route.
1032 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1034 /* Connect tracks to monitor section. Note that in an
1035 existing session, the internal sends will already exist, but we want the
1036 routes to notice that they connect to the control out specifically.
1040 boost::shared_ptr<RouteList> rls = routes.reader ();
1042 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1044 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1046 if ((*x)->is_monitor()) {
1048 } else if ((*x)->is_master()) {
1051 (*x)->enable_monitor_send ();
1056 auditioner->connect ();
1061 Session::hookup_io ()
1063 /* stop graph reordering notifications from
1064 causing resorts, etc.
1067 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
1071 /* we delay creating the auditioner till now because
1072 it makes its own connections to ports.
1076 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
1078 throw failed_constructor ();
1080 a->use_new_diskstream ();
1084 catch (failed_constructor& err) {
1085 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
1089 /* load bundles, which we may have postponed earlier on */
1090 if (_bundle_xml_node) {
1091 load_bundles (*_bundle_xml_node);
1092 delete _bundle_xml_node;
1095 /* Tell all IO objects to connect themselves together */
1097 IO::enable_connecting ();
1099 /* Now tell all "floating" ports to connect to whatever
1100 they should be connected to.
1103 AudioEngine::instance()->reconnect_ports ();
1105 /* Anyone who cares about input state, wake up and do something */
1107 IOConnectionsComplete (); /* EMIT SIGNAL */
1109 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
1111 /* now handle the whole enchilada as if it was one
1112 graph reorder event.
1117 /* update the full solo state, which can't be
1118 correctly determined on a per-route basis, but
1119 needs the global overview that only the session
1123 update_route_solo_state ();
1127 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
1129 boost::shared_ptr<Track> track = wp.lock ();
1134 boost::shared_ptr<Playlist> playlist;
1136 if ((playlist = track->playlist()) != 0) {
1137 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
1138 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
1139 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
1144 Session::record_enabling_legal () const
1146 /* this used to be in here, but survey says.... we don't need to restrict it */
1147 // if (record_status() == Recording) {
1151 if (Config->get_all_safe()) {
1158 Session::set_track_monitor_input_status (bool yn)
1160 boost::shared_ptr<RouteList> rl = routes.reader ();
1161 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1162 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1163 if (tr && tr->record_enabled ()) {
1164 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1165 tr->request_input_monitoring (yn);
1171 Session::auto_punch_start_changed (Location* location)
1173 replace_event (SessionEvent::PunchIn, location->start());
1175 if (get_record_enabled() && config.get_punch_in()) {
1176 /* capture start has been changed, so save new pending state */
1177 save_state ("", true);
1182 Session::auto_punch_end_changed (Location* location)
1184 framepos_t when_to_stop = location->end();
1185 // when_to_stop += _worst_output_latency + _worst_input_latency;
1186 replace_event (SessionEvent::PunchOut, when_to_stop);
1190 Session::auto_punch_changed (Location* location)
1192 framepos_t when_to_stop = location->end();
1194 replace_event (SessionEvent::PunchIn, location->start());
1195 //when_to_stop += _worst_output_latency + _worst_input_latency;
1196 replace_event (SessionEvent::PunchOut, when_to_stop);
1199 /** @param loc A loop location.
1200 * @param pos Filled in with the start time of the required fade-out (in session frames).
1201 * @param length Filled in with the length of the required fade-out.
1204 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
1206 pos = max (loc->start(), loc->end() - 64);
1207 length = loc->end() - pos;
1211 Session::auto_loop_changed (Location* location)
1213 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1216 auto_loop_declick_range (location, dcp, dcl);
1217 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1219 if (transport_rolling() && play_loop) {
1222 // if (_transport_frame > location->end()) {
1224 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1225 // relocate to beginning of loop
1226 clear_events (SessionEvent::LocateRoll);
1228 request_locate (location->start(), true);
1231 else if (Config->get_seamless_loop() && !loop_changing) {
1233 // schedule a locate-roll to refill the diskstreams at the
1234 // previous loop end
1235 loop_changing = true;
1237 if (location->end() > last_loopend) {
1238 clear_events (SessionEvent::LocateRoll);
1239 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1246 last_loopend = location->end();
1251 Session::set_auto_punch_location (Location* location)
1255 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1256 punch_connections.drop_connections();
1257 existing->set_auto_punch (false, this);
1258 remove_event (existing->start(), SessionEvent::PunchIn);
1259 clear_events (SessionEvent::PunchOut);
1260 auto_punch_location_changed (0);
1265 if (location == 0) {
1269 if (location->end() <= location->start()) {
1270 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1274 punch_connections.drop_connections ();
1276 location->StartChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, location));
1277 location->EndChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, location));
1278 location->Changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, location));
1280 location->set_auto_punch (true, this);
1282 auto_punch_changed (location);
1284 auto_punch_location_changed (location);
1288 Session::set_session_extents (framepos_t start, framepos_t end)
1291 if ((existing = _locations->session_range_location()) == 0) {
1292 //if there is no existing session, we need to make a new session location (should never happen)
1293 existing = new Location (*this, 0, 0, _("session"), Location::IsSessionRange);
1297 error << _("Session: you can't use that location for session start/end)") << endmsg;
1301 existing->set( start, end );
1307 Session::set_auto_loop_location (Location* location)
1311 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1312 loop_connections.drop_connections ();
1313 existing->set_auto_loop (false, this);
1314 remove_event (existing->end(), SessionEvent::AutoLoop);
1317 auto_loop_declick_range (existing, dcp, dcl);
1318 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1319 auto_loop_location_changed (0);
1324 if (location == 0) {
1328 if (location->end() <= location->start()) {
1329 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1333 last_loopend = location->end();
1335 loop_connections.drop_connections ();
1337 location->StartChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1338 location->EndChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1339 location->Changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1341 location->set_auto_loop (true, this);
1343 /* take care of our stuff first */
1345 auto_loop_changed (location);
1347 /* now tell everyone else */
1349 auto_loop_location_changed (location);
1353 Session::update_loop (Location*)
1359 Session::update_marks (Location*)
1365 Session::update_skips (Location* loc, bool consolidate)
1367 if (_ignore_skips_updates) {
1371 Locations::LocationList skips;
1374 PBD::Unwinder<bool> uw (_ignore_skips_updates, true);
1375 consolidate_skips (loc);
1378 sync_locations_to_skips ();
1384 Session::consolidate_skips (Location* loc)
1386 Locations::LocationList all_locations = _locations->list ();
1388 for (Locations::LocationList::iterator l = all_locations.begin(); l != all_locations.end(); ) {
1390 if (!(*l)->is_skip ()) {
1395 /* don't test against self */
1402 switch (Evoral::coverage ((*l)->start(), (*l)->end(), loc->start(), loc->end())) {
1403 case Evoral::OverlapInternal:
1404 case Evoral::OverlapExternal:
1405 case Evoral::OverlapStart:
1406 case Evoral::OverlapEnd:
1407 /* adjust new location to cover existing one */
1408 loc->set_start (min (loc->start(), (*l)->start()));
1409 loc->set_end (max (loc->end(), (*l)->end()));
1410 /* we don't need this one any more */
1411 _locations->remove (*l);
1412 /* the location has been deleted, so remove reference to it in our local list */
1413 l = all_locations.erase (l);
1416 case Evoral::OverlapNone:
1424 Session::sync_locations_to_skips ()
1426 /* This happens asynchronously (in the audioengine thread). After the clear is done, we will call
1427 * Session::_sync_locations_to_skips() from the audioengine thread.
1429 clear_events (SessionEvent::Skip, boost::bind (&Session::_sync_locations_to_skips, this));
1433 Session::_sync_locations_to_skips ()
1435 /* called as a callback after existing Skip events have been cleared from a realtime audioengine thread */
1437 Locations::LocationList const & locs (_locations->list());
1439 for (Locations::LocationList::const_iterator i = locs.begin(); i != locs.end(); ++i) {
1441 Location* location = *i;
1443 if (location->is_skip() && location->is_skipping()) {
1444 SessionEvent* ev = new SessionEvent (SessionEvent::Skip, SessionEvent::Add, location->start(), location->end(), 1.0);
1452 Session::location_added (Location *location)
1454 if (location->is_auto_punch()) {
1455 set_auto_punch_location (location);
1458 if (location->is_auto_loop()) {
1459 set_auto_loop_location (location);
1462 if (location->is_session_range()) {
1463 /* no need for any signal handling or event setting with the session range,
1464 because we keep a direct reference to it and use its start/end directly.
1466 _session_range_location = location;
1469 if (location->is_skip()) {
1470 /* listen for per-location signals that require us to update skip-locate events */
1472 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1473 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1474 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1475 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, false));
1477 update_skips (location, true);
1484 Session::location_removed (Location *location)
1486 if (location->is_auto_loop()) {
1487 set_auto_loop_location (0);
1488 set_track_loop (false);
1491 if (location->is_auto_punch()) {
1492 set_auto_punch_location (0);
1495 if (location->is_session_range()) {
1496 /* this is never supposed to happen */
1497 error << _("programming error: session range removed!") << endl;
1500 if (location->is_skip()) {
1502 update_skips (location, false);
1509 Session::locations_changed ()
1511 _locations->apply (*this, &Session::_locations_changed);
1515 Session::_locations_changed (const Locations::LocationList& locations)
1517 /* There was some mass-change in the Locations object.
1519 We might be re-adding a location here but it doesn't actually matter
1520 for all the locations that the Session takes an interest in.
1523 for (Locations::LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
1524 location_added (*i);
1529 Session::enable_record ()
1531 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1532 /* no recording at anything except normal speed */
1537 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1539 if (rs == Recording) {
1543 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1545 _last_record_location = _transport_frame;
1546 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1548 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1549 set_track_monitor_input_status (true);
1552 RecordStateChanged ();
1559 Session::disable_record (bool rt_context, bool force)
1563 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1565 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1566 g_atomic_int_set (&_record_status, Disabled);
1567 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1569 if (rs == Recording) {
1570 g_atomic_int_set (&_record_status, Enabled);
1574 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1575 set_track_monitor_input_status (false);
1578 RecordStateChanged (); /* emit signal */
1581 remove_pending_capture_state ();
1587 Session::step_back_from_record ()
1589 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1591 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1592 set_track_monitor_input_status (false);
1595 RecordStateChanged (); /* emit signal */
1600 Session::maybe_enable_record ()
1602 if (_step_editors > 0) {
1606 g_atomic_int_set (&_record_status, Enabled);
1608 /* This function is currently called from somewhere other than an RT thread.
1609 This save_state() call therefore doesn't impact anything. Doing it here
1610 means that we save pending state of which sources the next record will use,
1611 which gives us some chance of recovering from a crash during the record.
1614 save_state ("", true);
1616 if (_transport_speed) {
1617 if (!config.get_punch_in()) {
1621 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1622 RecordStateChanged (); /* EMIT SIGNAL */
1629 Session::audible_frame () const
1635 offset = worst_playback_latency ();
1637 if (synced_to_engine()) {
1638 /* Note: this is basically just sync-to-JACK */
1639 tf = _engine.transport_frame();
1641 tf = _transport_frame;
1646 if (!non_realtime_work_pending()) {
1650 /* Check to see if we have passed the first guaranteed
1651 audible frame past our last start position. if not,
1652 return that last start point because in terms
1653 of audible frames, we have not moved yet.
1655 `Start position' in this context means the time we last
1656 either started, located, or changed transport direction.
1659 if (_transport_speed > 0.0f) {
1661 if (!play_loop || !have_looped) {
1662 if (tf < _last_roll_or_reversal_location + offset) {
1663 return _last_roll_or_reversal_location;
1671 } else if (_transport_speed < 0.0f) {
1673 /* XXX wot? no backward looping? */
1675 if (tf > _last_roll_or_reversal_location - offset) {
1676 return _last_roll_or_reversal_location;
1688 Session::set_frame_rate (framecnt_t frames_per_second)
1690 /** \fn void Session::set_frame_size(framecnt_t)
1691 the AudioEngine object that calls this guarantees
1692 that it will not be called while we are also in
1693 ::process(). Its fine to do things that block
1697 _base_frame_rate = frames_per_second;
1698 _nominal_frame_rate = frames_per_second;
1704 // XXX we need some equivalent to this, somehow
1705 // SndFileSource::setup_standard_crossfades (frames_per_second);
1709 /* XXX need to reset/reinstantiate all LADSPA plugins */
1713 Session::set_block_size (pframes_t nframes)
1715 /* the AudioEngine guarantees
1716 that it will not be called while we are also in
1717 ::process(). It is therefore fine to do things that block
1722 current_block_size = nframes;
1726 boost::shared_ptr<RouteList> r = routes.reader ();
1728 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1729 (*i)->set_block_size (nframes);
1732 boost::shared_ptr<RouteList> rl = routes.reader ();
1733 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1734 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1736 tr->set_block_size (nframes);
1740 set_worst_io_latencies ();
1746 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1748 boost::shared_ptr<Route> r2;
1750 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1751 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1755 /* make a copy of the existing list of routes that feed r1 */
1757 Route::FedBy existing (r1->fed_by());
1759 /* for each route that feeds r1, recurse, marking it as feeding
1763 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1764 if (!(r2 = i->r.lock ())) {
1765 /* (*i) went away, ignore it */
1769 /* r2 is a route that feeds r1 which somehow feeds base. mark
1770 base as being fed by r2
1773 rbase->add_fed_by (r2, i->sends_only);
1777 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1781 if (r1->feeds (r2) && r2->feeds (r1)) {
1785 /* now recurse, so that we can mark base as being fed by
1786 all routes that feed r2
1789 trace_terminal (r2, rbase);
1796 Session::resort_routes ()
1798 /* don't do anything here with signals emitted
1799 by Routes during initial setup or while we
1800 are being destroyed.
1803 if (_state_of_the_state & (InitialConnecting | Deletion)) {
1808 RCUWriter<RouteList> writer (routes);
1809 boost::shared_ptr<RouteList> r = writer.get_copy ();
1810 resort_routes_using (r);
1811 /* writer goes out of scope and forces update */
1815 boost::shared_ptr<RouteList> rl = routes.reader ();
1816 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1817 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1819 const Route::FedBy& fb ((*i)->fed_by());
1821 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1822 boost::shared_ptr<Route> sf = f->r.lock();
1824 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1832 /** This is called whenever we need to rebuild the graph of how we will process
1834 * @param r List of routes, in any order.
1838 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1840 /* We are going to build a directed graph of our routes;
1841 this is where the edges of that graph are put.
1846 /* Go through all routes doing two things:
1848 * 1. Collect the edges of the route graph. Each of these edges
1849 * is a pair of routes, one of which directly feeds the other
1850 * either by a JACK connection or by an internal send.
1852 * 2. Begin the process of making routes aware of which other
1853 * routes directly or indirectly feed them. This information
1854 * is used by the solo code.
1857 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1859 /* Clear out the route's list of direct or indirect feeds */
1860 (*i)->clear_fed_by ();
1862 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
1864 bool via_sends_only;
1866 /* See if this *j feeds *i according to the current state of the JACK
1867 connections and internal sends.
1869 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
1870 /* add the edge to the graph (part #1) */
1871 edges.add (*j, *i, via_sends_only);
1872 /* tell the route (for part #2) */
1873 (*i)->add_fed_by (*j, via_sends_only);
1878 /* Attempt a topological sort of the route graph */
1879 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
1881 if (sorted_routes) {
1882 /* We got a satisfactory topological sort, so there is no feedback;
1885 Note: the process graph rechain does not require a
1886 topologically-sorted list, but hey ho.
1888 if (_process_graph) {
1889 _process_graph->rechain (sorted_routes, edges);
1892 _current_route_graph = edges;
1894 /* Complete the building of the routes' lists of what directly
1895 or indirectly feeds them.
1897 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1898 trace_terminal (*i, *i);
1901 *r = *sorted_routes;
1904 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1905 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1906 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1907 (*i)->name(), (*i)->order_key ()));
1911 SuccessfulGraphSort (); /* EMIT SIGNAL */
1914 /* The topological sort failed, so we have a problem. Tell everyone
1915 and stick to the old graph; this will continue to be processed, so
1916 until the feedback is fixed, what is played back will not quite
1917 reflect what is actually connected. Note also that we do not
1918 do trace_terminal here, as it would fail due to an endless recursion,
1919 so the solo code will think that everything is still connected
1923 FeedbackDetected (); /* EMIT SIGNAL */
1928 /** Find a route name starting with \a base, maybe followed by the
1929 * lowest \a id. \a id will always be added if \a definitely_add_number
1930 * is true on entry; otherwise it will only be added if required
1931 * to make the name unique.
1933 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1934 * The available route name with the lowest ID will be used, and \a id
1935 * will be set to the ID.
1937 * \return false if a route name could not be found, and \a track_name
1938 * and \a id do not reflect a free route name.
1941 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1943 if (!definitely_add_number && route_by_name (base) == 0) {
1944 /* juse use the base */
1945 snprintf (name, name_len, "%s", base.c_str());
1950 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1952 if (route_by_name (name) == 0) {
1958 } while (id < (UINT_MAX-1));
1963 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
1965 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
1967 in = ChanCount::ZERO;
1968 out = ChanCount::ZERO;
1970 boost::shared_ptr<RouteList> r = routes.reader ();
1972 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1973 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1974 if (tr && !tr->is_auditioner()) {
1975 in += tr->n_inputs();
1976 out += tr->n_outputs();
1981 /** Caller must not hold process lock
1982 * @param name_template string to use for the start of the name, or "" to use "MIDI".
1983 * @param instrument plugin info for the instrument to insert pre-fader, if any
1985 list<boost::shared_ptr<MidiTrack> >
1986 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
1987 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1989 char track_name[32];
1990 uint32_t track_id = 0;
1992 RouteList new_routes;
1993 list<boost::shared_ptr<MidiTrack> > ret;
1995 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
1998 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1999 error << "cannot find name for new midi track" << endmsg;
2003 boost::shared_ptr<MidiTrack> track;
2006 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
2008 if (track->init ()) {
2012 track->use_new_diskstream();
2014 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2015 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2018 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2019 if (track->input()->ensure_io (input, false, this)) {
2020 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
2024 if (track->output()->ensure_io (output, false, this)) {
2025 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
2030 track->non_realtime_input_change();
2033 route_group->add (track);
2036 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2038 if (Config->get_remote_model() == UserOrdered) {
2039 track->set_remote_control_id (next_control_id());
2042 new_routes.push_back (track);
2043 ret.push_back (track);
2046 catch (failed_constructor &err) {
2047 error << _("Session: could not create new midi track.") << endmsg;
2051 catch (AudioEngine::PortRegistrationFailure& pfe) {
2053 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;
2061 if (!new_routes.empty()) {
2062 StateProtector sp (this);
2063 add_routes (new_routes, true, true, true);
2066 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
2067 PluginPtr plugin = instrument->load (*this);
2068 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2069 (*r)->add_processor (p, PreFader);
2079 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2081 boost::shared_ptr<Route> midi_track (wmt.lock());
2087 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2089 if (change.after.n_audio() <= change.before.n_audio()) {
2093 /* new audio ports: make sure the audio goes somewhere useful,
2094 unless the user has no-auto-connect selected.
2096 The existing ChanCounts don't matter for this call as they are only
2097 to do with matching input and output indices, and we are only changing
2103 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
2107 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
2108 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
2109 * @param output_start As \a input_start, but for outputs.
2112 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
2113 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
2115 if (!IO::connecting_legal) {
2119 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2125 /* If both inputs and outputs are auto-connected to physical ports,
2126 use the max of input and output offsets to ensure auto-connected
2127 port numbers always match up (e.g. the first audio input and the
2128 first audio output of the route will have the same physical
2129 port number). Otherwise just use the lowest input or output
2133 DEBUG_TRACE (DEBUG::Graph,
2134 string_compose("Auto-connect: existing in = %1 out = %2\n",
2135 existing_inputs, existing_outputs));
2137 const bool in_out_physical =
2138 (Config->get_input_auto_connect() & AutoConnectPhysical)
2139 && (Config->get_output_auto_connect() & AutoConnectPhysical)
2142 const ChanCount in_offset = in_out_physical
2143 ? ChanCount::max(existing_inputs, existing_outputs)
2146 const ChanCount out_offset = in_out_physical
2147 ? ChanCount::max(existing_inputs, existing_outputs)
2150 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2151 vector<string> physinputs;
2152 vector<string> physoutputs;
2154 _engine.get_physical_outputs (*t, physoutputs);
2155 _engine.get_physical_inputs (*t, physinputs);
2157 if (!physinputs.empty() && connect_inputs) {
2158 uint32_t nphysical_in = physinputs.size();
2160 DEBUG_TRACE (DEBUG::Graph,
2161 string_compose("There are %1 physical inputs of type %2\n",
2164 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
2167 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
2168 DEBUG_TRACE (DEBUG::Graph,
2169 string_compose("Get index %1 + %2 % %3 = %4\n",
2170 in_offset.get(*t), i, nphysical_in,
2171 (in_offset.get(*t) + i) % nphysical_in));
2172 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
2175 DEBUG_TRACE (DEBUG::Graph,
2176 string_compose("Connect route %1 IN to %2\n",
2177 route->name(), port));
2179 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
2183 ChanCount one_added (*t, 1);
2184 existing_inputs += one_added;
2188 if (!physoutputs.empty()) {
2189 uint32_t nphysical_out = physoutputs.size();
2190 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
2193 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
2194 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
2195 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
2196 /* master bus is audio only */
2197 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
2198 port = _master_out->input()->ports().port(*t,
2199 i % _master_out->input()->n_ports().get(*t))->name();
2203 DEBUG_TRACE (DEBUG::Graph,
2204 string_compose("Connect route %1 OUT to %2\n",
2205 route->name(), port));
2207 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
2211 ChanCount one_added (*t, 1);
2212 existing_outputs += one_added;
2219 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2221 /* TRX does stuff here, ardour does not (but probably should). This is called after an engine reset (in particular).
2226 /** Caller must not hold process lock
2227 * @param name_template string to use for the start of the name, or "" to use "Audio".
2229 list< boost::shared_ptr<AudioTrack> >
2230 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
2231 uint32_t how_many, string name_template)
2233 char track_name[32];
2234 uint32_t track_id = 0;
2236 RouteList new_routes;
2237 list<boost::shared_ptr<AudioTrack> > ret;
2239 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
2242 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
2243 error << "cannot find name for new audio track" << endmsg;
2247 boost::shared_ptr<AudioTrack> track;
2250 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
2252 if (track->init ()) {
2256 track->use_new_diskstream();
2258 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2259 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2262 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2264 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2265 error << string_compose (
2266 _("cannot configure %1 in/%2 out configuration for new audio track"),
2267 input_channels, output_channels)
2272 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2273 error << string_compose (
2274 _("cannot configure %1 in/%2 out configuration for new audio track"),
2275 input_channels, output_channels)
2282 route_group->add (track);
2285 track->non_realtime_input_change();
2287 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2288 if (Config->get_remote_model() == UserOrdered) {
2289 track->set_remote_control_id (next_control_id());
2292 new_routes.push_back (track);
2293 ret.push_back (track);
2296 catch (failed_constructor &err) {
2297 error << _("Session: could not create new audio track.") << endmsg;
2301 catch (AudioEngine::PortRegistrationFailure& pfe) {
2303 error << pfe.what() << endmsg;
2311 if (!new_routes.empty()) {
2312 StateProtector sp (this);
2313 add_routes (new_routes, true, true, true);
2319 /** Caller must not hold process lock.
2320 * @param name_template string to use for the start of the name, or "" to use "Bus".
2323 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
2326 uint32_t bus_id = 0;
2330 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
2333 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
2334 error << "cannot find name for new audio bus" << endmsg;
2339 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
2345 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2346 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
2349 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2351 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2352 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2353 input_channels, output_channels)
2359 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2360 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2361 input_channels, output_channels)
2368 route_group->add (bus);
2370 if (Config->get_remote_model() == UserOrdered) {
2371 bus->set_remote_control_id (next_control_id());
2374 bus->add_internal_return ();
2376 ret.push_back (bus);
2382 catch (failed_constructor &err) {
2383 error << _("Session: could not create new audio route.") << endmsg;
2387 catch (AudioEngine::PortRegistrationFailure& pfe) {
2388 error << pfe.what() << endmsg;
2398 StateProtector sp (this);
2399 add_routes (ret, false, true, true); // autoconnect outputs only
2407 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base)
2410 uint32_t control_id;
2412 uint32_t number = 0;
2413 const uint32_t being_added = how_many;
2415 if (!tree.read (template_path.c_str())) {
2419 XMLNode* node = tree.root();
2421 IO::disable_connecting ();
2423 control_id = next_control_id ();
2427 XMLNode node_copy (*node);
2429 /* Remove IDs of everything so that new ones are used */
2430 node_copy.remove_property_recursively (X_("id"));
2435 if (!name_base.empty()) {
2437 /* if we're adding more than one routes, force
2438 * all the names of the new routes to be
2439 * numbered, via the final parameter.
2442 if (!find_route_name (name_base.c_str(), ++number, name, sizeof(name), (being_added > 1))) {
2443 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2449 string const route_name = node_copy.property(X_("name"))->value ();
2451 /* generate a new name by adding a number to the end of the template name */
2452 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2453 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2454 abort(); /*NOTREACHED*/
2458 /* set this name in the XML description that we are about to use */
2459 Route::set_name_in_state (node_copy, name);
2461 /* trim bitslots from listen sends so that new ones are used */
2462 XMLNodeList children = node_copy.children ();
2463 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2464 if ((*i)->name() == X_("Processor")) {
2465 XMLProperty* role = (*i)->property (X_("role"));
2466 if (role && role->value() == X_("Listen")) {
2467 (*i)->remove_property (X_("bitslot"));
2472 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2475 error << _("Session: cannot create track/bus from template description") << endmsg;
2479 if (boost::dynamic_pointer_cast<Track>(route)) {
2480 /* force input/output change signals so that the new diskstream
2481 picks up the configuration of the route. During session
2482 loading this normally happens in a different way.
2485 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2487 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2488 change.after = route->input()->n_ports();
2489 route->input()->changed (change, this);
2490 change.after = route->output()->n_ports();
2491 route->output()->changed (change, this);
2494 route->set_remote_control_id (control_id);
2497 ret.push_back (route);
2500 catch (failed_constructor &err) {
2501 error << _("Session: could not create new route from template") << endmsg;
2505 catch (AudioEngine::PortRegistrationFailure& pfe) {
2506 error << pfe.what() << endmsg;
2515 StateProtector sp (this);
2516 add_routes (ret, true, true, true);
2517 IO::enable_connecting ();
2524 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
2527 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
2528 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
2531 error << _("Adding new tracks/busses failed") << endmsg;
2536 update_latency (true);
2537 update_latency (false);
2542 save_state (_current_snapshot_name);
2545 reassign_track_numbers();
2547 RouteAdded (new_routes); /* EMIT SIGNAL */
2551 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
2553 ChanCount existing_inputs;
2554 ChanCount existing_outputs;
2555 uint32_t order = next_control_id();
2557 if (_order_hint > -1) {
2558 order = _order_hint;
2562 count_existing_track_channels (existing_inputs, existing_outputs);
2565 RCUWriter<RouteList> writer (routes);
2566 boost::shared_ptr<RouteList> r = writer.get_copy ();
2567 r->insert (r->end(), new_routes.begin(), new_routes.end());
2569 /* if there is no control out and we're not in the middle of loading,
2570 resort the graph here. if there is a control out, we will resort
2571 toward the end of this method. if we are in the middle of loading,
2572 we will resort when done.
2575 if (!_monitor_out && IO::connecting_legal) {
2576 resort_routes_using (r);
2580 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2582 boost::weak_ptr<Route> wpr (*x);
2583 boost::shared_ptr<Route> r (*x);
2585 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2586 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2587 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2588 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2589 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2590 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2592 if (r->is_master()) {
2596 if (r->is_monitor()) {
2600 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2602 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2603 track_playlist_changed (boost::weak_ptr<Track> (tr));
2604 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2606 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2608 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2609 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2614 if (input_auto_connect || output_auto_connect) {
2615 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
2618 /* order keys are a GUI responsibility but we need to set up
2619 reasonable defaults because they also affect the remote control
2620 ID in most situations.
2623 if (!r->has_order_key ()) {
2624 if (r->is_auditioner()) {
2625 /* use an arbitrarily high value */
2626 r->set_order_key (UINT_MAX);
2628 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
2629 r->set_order_key (order);
2637 if (_monitor_out && IO::connecting_legal) {
2638 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
2640 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2641 if ((*x)->is_monitor()) {
2643 } else if ((*x)->is_master()) {
2646 (*x)->enable_monitor_send ();
2653 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2655 boost::shared_ptr<RouteList> r = routes.reader ();
2656 boost::shared_ptr<Send> s;
2658 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2659 if ((s = (*i)->internal_send_for (dest)) != 0) {
2660 s->amp()->gain_control()->set_value (0.0);
2666 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2668 boost::shared_ptr<RouteList> r = routes.reader ();
2669 boost::shared_ptr<Send> s;
2671 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2672 if ((s = (*i)->internal_send_for (dest)) != 0) {
2673 s->amp()->gain_control()->set_value (1.0);
2679 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2681 boost::shared_ptr<RouteList> r = routes.reader ();
2682 boost::shared_ptr<Send> s;
2684 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2685 if ((s = (*i)->internal_send_for (dest)) != 0) {
2686 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2691 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2693 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2695 boost::shared_ptr<RouteList> r = routes.reader ();
2696 boost::shared_ptr<RouteList> t (new RouteList);
2698 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2699 /* no MIDI sends because there are no MIDI busses yet */
2700 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2705 add_internal_sends (dest, p, t);
2709 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2711 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2712 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
2717 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
2719 add_internal_send (dest, sender->before_processor_for_index (index), sender);
2723 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
2725 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
2729 if (!dest->internal_return()) {
2730 dest->add_internal_return ();
2733 sender->add_aux_send (dest, before);
2739 Session::remove_route (boost::shared_ptr<Route> route)
2741 if (route == _master_out) {
2745 route->set_solo (false, this);
2748 RCUWriter<RouteList> writer (routes);
2749 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2753 /* deleting the master out seems like a dumb
2754 idea, but its more of a UI policy issue
2758 if (route == _master_out) {
2759 _master_out = boost::shared_ptr<Route> ();
2762 if (route == _monitor_out) {
2763 _monitor_out.reset ();
2766 /* writer goes out of scope, forces route list update */
2769 update_route_solo_state ();
2771 // We need to disconnect the route's inputs and outputs
2773 route->input()->disconnect (0);
2774 route->output()->disconnect (0);
2776 /* if the route had internal sends sending to it, remove them */
2777 if (route->internal_return()) {
2779 boost::shared_ptr<RouteList> r = routes.reader ();
2780 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2781 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2783 (*i)->remove_processor (s);
2788 /* if the monitoring section had a pointer to this route, remove it */
2789 if (_monitor_out && !route->is_master() && !route->is_monitor()) {
2790 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2791 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
2792 route->remove_aux_or_listen (_monitor_out);
2795 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2796 if (mt && mt->step_editing()) {
2797 if (_step_editors > 0) {
2802 update_latency_compensation ();
2805 /* Re-sort routes to remove the graph's current references to the one that is
2806 * going away, then flush old references out of the graph.
2810 if (_process_graph) {
2811 _process_graph->clear_other_chain ();
2814 /* get rid of it from the dead wood collection in the route list manager */
2816 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2820 /* try to cause everyone to drop their references */
2822 route->drop_references ();
2824 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2826 /* save the new state of the world */
2828 if (save_state (_current_snapshot_name)) {
2829 save_history (_current_snapshot_name);
2831 reassign_track_numbers();
2835 Session::route_mute_changed (void* /*src*/)
2841 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2843 boost::shared_ptr<Route> route = wpr.lock();
2845 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2849 if (route->listening_via_monitor ()) {
2851 if (Config->get_exclusive_solo()) {
2852 /* new listen: disable all other listen */
2853 boost::shared_ptr<RouteList> r = routes.reader ();
2854 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2855 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
2858 (*i)->set_listen (false, this);
2864 } else if (_listen_cnt > 0) {
2869 update_route_solo_state ();
2872 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2874 boost::shared_ptr<Route> route = wpr.lock ();
2877 /* should not happen */
2878 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2882 bool send_changed = false;
2884 if (route->solo_isolated()) {
2885 if (_solo_isolated_cnt == 0) {
2886 send_changed = true;
2888 _solo_isolated_cnt++;
2889 } else if (_solo_isolated_cnt > 0) {
2890 _solo_isolated_cnt--;
2891 if (_solo_isolated_cnt == 0) {
2892 send_changed = true;
2897 IsolatedChanged (); /* EMIT SIGNAL */
2902 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2904 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
2906 if (!self_solo_change) {
2907 // session doesn't care about changes to soloed-by-others
2911 if (solo_update_disabled) {
2913 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
2917 boost::shared_ptr<Route> route = wpr.lock ();
2920 boost::shared_ptr<RouteList> r = routes.reader ();
2923 if (route->self_soloed()) {
2929 RouteGroup* rg = route->route_group ();
2930 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
2932 if (delta == 1 && Config->get_exclusive_solo()) {
2934 /* new solo: disable all other solos, but not the group if its solo-enabled */
2936 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2937 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
2938 (leave_group_alone && ((*i)->route_group() == rg))) {
2941 (*i)->set_solo (false, this);
2945 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
2947 solo_update_disabled = true;
2949 RouteList uninvolved;
2951 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
2953 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2954 bool via_sends_only;
2955 bool in_signal_flow;
2957 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
2958 (leave_group_alone && ((*i)->route_group() == rg))) {
2962 in_signal_flow = false;
2964 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
2966 if ((*i)->feeds (route, &via_sends_only)) {
2967 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
2968 if (!via_sends_only) {
2969 if (!route->soloed_by_others_upstream()) {
2970 (*i)->mod_solo_by_others_downstream (delta);
2973 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
2975 in_signal_flow = true;
2977 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
2980 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
2982 if (route->feeds (*i, &via_sends_only)) {
2983 /* propagate solo upstream only if routing other than
2984 sends is involved, but do consider the other route
2985 (*i) to be part of the signal flow even if only
2988 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
2992 route->soloed_by_others_downstream(),
2993 route->soloed_by_others_upstream()));
2994 if (!via_sends_only) {
2995 if (!route->soloed_by_others_downstream()) {
2996 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
2997 (*i)->mod_solo_by_others_upstream (delta);
2999 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
3002 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3004 in_signal_flow = true;
3006 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3009 if (!in_signal_flow) {
3010 uninvolved.push_back (*i);
3014 solo_update_disabled = false;
3015 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3017 update_route_solo_state (r);
3019 /* now notify that the mute state of the routes not involved in the signal
3020 pathway of the just-solo-changed route may have altered.
3023 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3024 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
3025 (*i)->mute_changed (this);
3028 SoloChanged (); /* EMIT SIGNAL */
3033 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
3035 /* now figure out if anything that matters is soloed (or is "listening")*/
3037 bool something_soloed = false;
3038 uint32_t listeners = 0;
3039 uint32_t isolated = 0;
3042 r = routes.reader();
3045 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3046 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
3047 something_soloed = true;
3050 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
3051 if (Config->get_solo_control_is_listen_control()) {
3054 (*i)->set_listen (false, this);
3058 if ((*i)->solo_isolated()) {
3063 if (something_soloed != _non_soloed_outs_muted) {
3064 _non_soloed_outs_muted = something_soloed;
3065 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
3068 _listen_cnt = listeners;
3070 if (isolated != _solo_isolated_cnt) {
3071 _solo_isolated_cnt = isolated;
3072 IsolatedChanged (); /* EMIT SIGNAL */
3075 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
3076 something_soloed, listeners, isolated));
3079 boost::shared_ptr<RouteList>
3080 Session::get_routes_with_internal_returns() const
3082 boost::shared_ptr<RouteList> r = routes.reader ();
3083 boost::shared_ptr<RouteList> rl (new RouteList);
3085 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3086 if ((*i)->internal_return ()) {
3094 Session::io_name_is_legal (const std::string& name)
3096 boost::shared_ptr<RouteList> r = routes.reader ();
3098 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3099 if ((*i)->name() == name) {
3103 if ((*i)->has_io_processor_named (name)) {
3112 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
3115 vector<string> connections;
3117 /* if we are passed only a single route and we're not told to turn
3118 * others off, then just do the simple thing.
3121 if (flip_others == false && rl->size() == 1) {
3122 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
3124 mt->set_input_active (onoff);
3129 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
3131 PortSet& ps ((*rt)->input()->ports());
3133 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
3134 p->get_connections (connections);
3137 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
3138 routes_using_input_from (*s, rl2);
3141 /* scan all relevant routes to see if others are on or off */
3143 bool others_are_already_on = false;
3145 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3147 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3153 if ((*r) != (*rt)) {
3154 if (mt->input_active()) {
3155 others_are_already_on = true;
3158 /* this one needs changing */
3159 mt->set_input_active (onoff);
3165 /* globally reverse other routes */
3167 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3168 if ((*r) != (*rt)) {
3169 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3171 mt->set_input_active (!others_are_already_on);
3180 Session::routes_using_input_from (const string& str, RouteList& rl)
3182 boost::shared_ptr<RouteList> r = routes.reader();
3184 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3185 if ((*i)->input()->connected_to (str)) {
3191 boost::shared_ptr<Route>
3192 Session::route_by_name (string name)
3194 boost::shared_ptr<RouteList> r = routes.reader ();
3196 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3197 if ((*i)->name() == name) {
3202 return boost::shared_ptr<Route> ((Route*) 0);
3205 boost::shared_ptr<Route>
3206 Session::route_by_id (PBD::ID id)
3208 boost::shared_ptr<RouteList> r = routes.reader ();
3210 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3211 if ((*i)->id() == id) {
3216 return boost::shared_ptr<Route> ((Route*) 0);
3219 boost::shared_ptr<Track>
3220 Session::track_by_diskstream_id (PBD::ID id)
3222 boost::shared_ptr<RouteList> r = routes.reader ();
3224 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3225 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3226 if (t && t->using_diskstream_id (id)) {
3231 return boost::shared_ptr<Track> ();
3234 boost::shared_ptr<Route>
3235 Session::route_by_remote_id (uint32_t id)
3237 boost::shared_ptr<RouteList> r = routes.reader ();
3239 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3240 if ((*i)->remote_control_id() == id) {
3245 return boost::shared_ptr<Route> ((Route*) 0);
3250 Session::reassign_track_numbers ()
3254 RouteList r (*(routes.reader ()));
3255 SignalOrderRouteSorter sorter;
3258 StateProtector sp (this);
3260 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3261 if (boost::dynamic_pointer_cast<Track> (*i)) {
3262 (*i)->set_track_number(++tn);
3264 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
3265 (*i)->set_track_number(--bn);
3268 const uint32_t decimals = ceilf (log10f (tn + 1));
3269 const bool decimals_changed = _track_number_decimals != decimals;
3270 _track_number_decimals = decimals;
3272 if (decimals_changed && config.get_track_name_number ()) {
3273 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3274 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3276 t->resync_track_name();
3279 // trigger GUI re-layout
3280 config.ParameterChanged("track-name-number");
3285 Session::playlist_region_added (boost::weak_ptr<Region> w)
3287 boost::shared_ptr<Region> r = w.lock ();
3292 /* These are the operations that are currently in progress... */
3293 list<GQuark> curr = _current_trans_quarks;
3296 /* ...and these are the operations during which we want to update
3297 the session range location markers.
3300 ops.push_back (Operations::capture);
3301 ops.push_back (Operations::paste);
3302 ops.push_back (Operations::duplicate_region);
3303 ops.push_back (Operations::insert_file);
3304 ops.push_back (Operations::insert_region);
3305 ops.push_back (Operations::drag_region_brush);
3306 ops.push_back (Operations::region_drag);
3307 ops.push_back (Operations::selection_grab);
3308 ops.push_back (Operations::region_fill);
3309 ops.push_back (Operations::fill_selection);
3310 ops.push_back (Operations::create_region);
3311 ops.push_back (Operations::region_copy);
3312 ops.push_back (Operations::fixed_time_region_copy);
3315 /* See if any of the current operations match the ones that we want */
3317 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
3319 /* If so, update the session range markers */
3321 maybe_update_session_range (r->position (), r->last_frame ());
3325 /** Update the session range markers if a is before the current start or
3326 * b is after the current end.
3329 Session::maybe_update_session_range (framepos_t a, framepos_t b)
3331 if (_state_of_the_state & Loading) {
3335 if (_session_range_location == 0) {
3337 add_session_range_location (a, b);
3341 if (a < _session_range_location->start()) {
3342 _session_range_location->set_start (a);
3345 if (b > _session_range_location->end()) {
3346 _session_range_location->set_end (b);
3352 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
3354 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3355 maybe_update_session_range (i->to, i->to + i->length);
3360 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
3362 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3363 maybe_update_session_range (i->from, i->to);
3367 /* Region management */
3369 boost::shared_ptr<Region>
3370 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
3372 const RegionFactory::RegionMap& regions (RegionFactory::regions());
3373 RegionFactory::RegionMap::const_iterator i;
3374 boost::shared_ptr<Region> region;
3376 Glib::Threads::Mutex::Lock lm (region_lock);
3378 for (i = regions.begin(); i != regions.end(); ++i) {
3382 if (region->whole_file()) {
3384 if (child->source_equivalent (region)) {
3390 return boost::shared_ptr<Region> ();
3394 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
3396 set<boost::shared_ptr<Region> > relevant_regions;
3398 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
3399 RegionFactory::get_regions_using_source (*s, relevant_regions);
3402 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
3403 set<boost::shared_ptr<Region> >::iterator tmp;
3408 playlists->destroy_region (*r);
3409 RegionFactory::map_remove (*r);
3411 (*r)->drop_sources ();
3412 (*r)->drop_references ();
3414 relevant_regions.erase (r);
3419 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
3422 Glib::Threads::Mutex::Lock ls (source_lock);
3423 /* remove from the main source list */
3424 sources.erase ((*s)->id());
3427 (*s)->mark_for_remove ();
3428 (*s)->drop_references ();
3437 Session::remove_last_capture ()
3439 list<boost::shared_ptr<Source> > srcs;
3441 boost::shared_ptr<RouteList> rl = routes.reader ();
3442 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3443 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3448 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
3451 srcs.insert (srcs.end(), l.begin(), l.end());
3456 destroy_sources (srcs);
3458 save_state (_current_snapshot_name);
3463 /* Source Management */
3466 Session::add_source (boost::shared_ptr<Source> source)
3468 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
3469 pair<SourceMap::iterator,bool> result;
3471 entry.first = source->id();
3472 entry.second = source;
3475 Glib::Threads::Mutex::Lock lm (source_lock);
3476 result = sources.insert (entry);
3479 if (result.second) {
3481 /* yay, new source */
3483 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
3486 if (!fs->within_session()) {
3487 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
3493 boost::shared_ptr<AudioFileSource> afs;
3495 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
3496 if (Config->get_auto_analyse_audio()) {
3497 Analyser::queue_source_for_analysis (source, false);
3501 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
3506 Session::remove_source (boost::weak_ptr<Source> src)
3508 if (_state_of_the_state & Deletion) {
3512 SourceMap::iterator i;
3513 boost::shared_ptr<Source> source = src.lock();
3520 Glib::Threads::Mutex::Lock lm (source_lock);
3522 if ((i = sources.find (source->id())) != sources.end()) {
3527 if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
3529 /* save state so we don't end up with a session file
3530 referring to non-existent sources.
3533 save_state (_current_snapshot_name);
3537 boost::shared_ptr<Source>
3538 Session::source_by_id (const PBD::ID& id)
3540 Glib::Threads::Mutex::Lock lm (source_lock);
3541 SourceMap::iterator i;
3542 boost::shared_ptr<Source> source;
3544 if ((i = sources.find (id)) != sources.end()) {
3551 boost::shared_ptr<AudioFileSource>
3552 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
3554 /* Restricted to audio files because only audio sources have channel
3558 Glib::Threads::Mutex::Lock lm (source_lock);
3560 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
3561 boost::shared_ptr<AudioFileSource> afs
3562 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
3564 if (afs && afs->path() == path && chn == afs->channel()) {
3569 return boost::shared_ptr<AudioFileSource>();
3572 boost::shared_ptr<MidiSource>
3573 Session::midi_source_by_path (const std::string& path) const
3575 /* Restricted to MIDI files because audio sources require a channel
3576 for unique identification, in addition to a path.
3579 Glib::Threads::Mutex::Lock lm (source_lock);
3581 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
3582 boost::shared_ptr<MidiSource> ms
3583 = boost::dynamic_pointer_cast<MidiSource>(s->second);
3584 boost::shared_ptr<FileSource> fs
3585 = boost::dynamic_pointer_cast<FileSource>(s->second);
3587 if (ms && fs && fs->path() == path) {
3592 return boost::shared_ptr<MidiSource>();
3596 Session::count_sources_by_origin (const string& path)
3599 Glib::Threads::Mutex::Lock lm (source_lock);
3601 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3602 boost::shared_ptr<FileSource> fs
3603 = boost::dynamic_pointer_cast<FileSource>(i->second);
3605 if (fs && fs->origin() == path) {
3614 Session::peak_path (string base) const
3616 return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
3620 Session::new_audio_source_path_for_embedded (const std::string& path)
3624 * we know that the filename is already unique because it exists
3625 * out in the filesystem.
3627 * However, when we bring it into the session, we could get a
3630 * Eg. two embedded files:
3635 * When merged into session, these collide.
3637 * There will not be a conflict with in-memory sources
3638 * because when the source was created we already picked
3639 * a unique name for it.
3641 * This collision is not likely to be common, but we have to guard
3642 * against it. So, if there is a collision, take the md5 hash of the
3643 * the path, and use that as the filename instead.
3646 SessionDirectory sdir (get_best_session_directory_for_new_audio());
3647 string base = Glib::path_get_basename (path);
3648 string newpath = Glib::build_filename (sdir.sound_path(), base);
3650 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
3654 md5.digestString (path.c_str());
3655 md5.writeToString ();
3656 base = md5.digestChars;
3658 string ext = get_suffix (path);
3665 newpath = Glib::build_filename (sdir.sound_path(), base);
3667 /* if this collides, we're screwed */
3669 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
3670 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
3679 /** Return true if there are no audio file sources that use @param name as
3680 * the filename component of their path.
3682 * Return false otherwise.
3684 * This method MUST ONLY be used to check in-session, mono files since it
3685 * hard-codes the channel of the audio file source we are looking for as zero.
3687 * If/when Ardour supports native files in non-mono formats, the logic here
3688 * will need to be revisited.
3691 Session::audio_source_name_is_unique (const string& name)
3693 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
3694 vector<space_and_path>::iterator i;
3695 uint32_t existing = 0;
3697 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
3699 /* note that we search *without* the extension so that
3700 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3701 in the event that this new name is required for
3702 a file format change.
3705 const string spath = *i;
3707 if (matching_unsuffixed_filename_exists_in (spath, name)) {
3712 /* it is possible that we have the path already
3713 * assigned to a source that has not yet been written
3714 * (ie. the write source for a diskstream). we have to
3715 * check this in order to make sure that our candidate
3716 * path isn't used again, because that can lead to
3717 * two Sources point to the same file with different
3718 * notions of their removability.
3722 string possible_path = Glib::build_filename (spath, name);
3724 if (audio_source_by_path_and_channel (possible_path, 0)) {
3730 return (existing == 0);
3734 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)
3737 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3741 sstr << setfill ('0') << setw (4) << cnt;
3742 sstr << legalized_base;
3744 sstr << legalized_base;
3746 if (take_required || related_exists) {
3758 } else if (nchan > 2) {
3763 /* XXX what? more than 26 channels! */
3774 /** Return a unique name based on \a base for a new internal audio source */
3776 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
3779 string possible_name;
3780 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
3782 bool some_related_source_name_exists = false;
3784 legalized = legalize_for_path (base);
3786 // Find a "version" of the base name that doesn't exist in any of the possible directories.
3788 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3790 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
3792 if (audio_source_name_is_unique (possible_name)) {
3796 some_related_source_name_exists = true;
3799 error << string_compose(
3800 _("There are already %1 recordings for %2, which I consider too many."),
3801 limit, base) << endmsg;
3803 throw failed_constructor();
3807 /* We've established that the new name does not exist in any session
3808 * directory, so now find out which one we should use for this new
3812 SessionDirectory sdir (get_best_session_directory_for_new_audio());
3814 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
3819 /** Return a unique name based on `base` for a new internal MIDI source */
3821 Session::new_midi_source_path (const string& base)
3824 char buf[PATH_MAX+1];
3825 const uint32_t limit = 10000;
3827 string possible_path;
3828 string possible_name;
3831 legalized = legalize_for_path (base);
3833 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3834 std::vector<string> sdirs = source_search_path(DataType::MIDI);
3836 /* - the main session folder is the first in the vector.
3837 * - after checking all locations for file-name uniqueness,
3838 * we keep the one from the last iteration as new file name
3839 * - midi files are small and should just be kept in the main session-folder
3841 * -> reverse the array, check main session folder last and use that as location
3844 std::reverse(sdirs.begin(), sdirs.end());
3846 for (cnt = 1; cnt <= limit; ++cnt) {
3848 vector<space_and_path>::iterator i;
3849 uint32_t existing = 0;
3851 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
3853 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
3854 possible_name = buf;
3856 possible_path = Glib::build_filename (*i, possible_name);
3858 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
3862 if (midi_source_by_path (possible_path)) {
3867 if (existing == 0) {
3872 error << string_compose(
3873 _("There are already %1 recordings for %2, which I consider too many."),
3874 limit, base) << endmsg;
3880 /* No need to "find best location" for software/app-based RAID, because
3881 MIDI is so small that we always put it in the same place.
3884 return possible_path;
3888 /** Create a new within-session audio source */
3889 boost::shared_ptr<AudioFileSource>
3890 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
3892 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
3894 if (!path.empty()) {
3895 return boost::dynamic_pointer_cast<AudioFileSource> (
3896 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
3898 throw failed_constructor ();
3902 /** Create a new within-session MIDI source */
3903 boost::shared_ptr<MidiSource>
3904 Session::create_midi_source_for_session (string const & basic_name)
3906 const string path = new_midi_source_path (basic_name);
3908 if (!path.empty()) {
3909 return boost::dynamic_pointer_cast<SMFSource> (
3910 SourceFactory::createWritable (
3911 DataType::MIDI, *this, path, false, frame_rate()));
3913 throw failed_constructor ();
3917 /** Create a new within-session MIDI source */
3918 boost::shared_ptr<MidiSource>
3919 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
3921 /* the caller passes in the track the source will be used in,
3922 so that we can keep the numbering sane.
3924 Rationale: a track with the name "Foo" that has had N
3925 captures carried out so far will ALREADY have a write source
3926 named "Foo-N+1.mid" waiting to be used for the next capture.
3928 If we call new_midi_source_name() we will get "Foo-N+2". But
3929 there is no region corresponding to "Foo-N+1", so when
3930 "Foo-N+2" appears in the track, the gap presents the user
3931 with odd behaviour - why did it skip past Foo-N+1?
3933 We could explain this to the user in some odd way, but
3934 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
3937 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
3940 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
3942 std::string name = track->steal_write_source_name ();
3945 return boost::shared_ptr<MidiSource>();
3948 /* MIDI files are small, just put them in the first location of the
3949 session source search path.
3952 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
3954 return boost::dynamic_pointer_cast<SMFSource> (
3955 SourceFactory::createWritable (
3956 DataType::MIDI, *this, path, false, frame_rate()));
3961 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3963 if (playlist->hidden()) {
3967 playlists->add (playlist);
3970 playlist->release();
3977 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3979 if (_state_of_the_state & Deletion) {
3983 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3989 playlists->remove (playlist);
3995 Session::set_audition (boost::shared_ptr<Region> r)
3997 pending_audition_region = r;
3998 add_post_transport_work (PostTransportAudition);
3999 _butler->schedule_transport_work ();
4003 Session::audition_playlist ()
4005 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4006 ev->region.reset ();
4011 Session::non_realtime_set_audition ()
4013 assert (pending_audition_region);
4014 auditioner->audition_region (pending_audition_region);
4015 pending_audition_region.reset ();
4016 AuditionActive (true); /* EMIT SIGNAL */
4020 Session::audition_region (boost::shared_ptr<Region> r)
4022 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4028 Session::cancel_audition ()
4033 if (auditioner->auditioning()) {
4034 auditioner->cancel_audition ();
4035 AuditionActive (false); /* EMIT SIGNAL */
4040 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
4042 if (a->is_monitor()) {
4045 if (b->is_monitor()) {
4048 return a->order_key () < b->order_key ();
4052 Session::is_auditioning () const
4054 /* can be called before we have an auditioner object */
4056 return auditioner->auditioning();
4063 Session::graph_reordered ()
4065 /* don't do this stuff if we are setting up connections
4066 from a set_state() call or creating new tracks. Ditto for deletion.
4069 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
4073 /* every track/bus asked for this to be handled but it was deferred because
4074 we were connecting. do it now.
4077 request_input_change_handling ();
4081 /* force all diskstreams to update their capture offset values to
4082 reflect any changes in latencies within the graph.
4085 boost::shared_ptr<RouteList> rl = routes.reader ();
4086 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4087 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4089 tr->set_capture_offset ();
4094 /** @return Number of frames that there is disk space available to write,
4097 boost::optional<framecnt_t>
4098 Session::available_capture_duration ()
4100 Glib::Threads::Mutex::Lock lm (space_lock);
4102 if (_total_free_4k_blocks_uncertain) {
4103 return boost::optional<framecnt_t> ();
4106 float sample_bytes_on_disk = 4.0; // keep gcc happy
4108 switch (config.get_native_file_data_format()) {
4110 sample_bytes_on_disk = 4.0;
4114 sample_bytes_on_disk = 3.0;
4118 sample_bytes_on_disk = 2.0;
4122 /* impossible, but keep some gcc versions happy */
4123 fatal << string_compose (_("programming error: %1"),
4124 X_("illegal native file data format"))
4126 abort(); /*NOTREACHED*/
4129 double scale = 4096.0 / sample_bytes_on_disk;
4131 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
4132 return max_framecnt;
4135 return (framecnt_t) floor (_total_free_4k_blocks * scale);
4139 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
4142 RCUWriter<BundleList> writer (_bundles);
4143 boost::shared_ptr<BundleList> b = writer.get_copy ();
4144 b->push_back (bundle);
4148 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4155 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
4157 bool removed = false;
4160 RCUWriter<BundleList> writer (_bundles);
4161 boost::shared_ptr<BundleList> b = writer.get_copy ();
4162 BundleList::iterator i = find (b->begin(), b->end(), bundle);
4164 if (i != b->end()) {
4171 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4177 boost::shared_ptr<Bundle>
4178 Session::bundle_by_name (string name) const
4180 boost::shared_ptr<BundleList> b = _bundles.reader ();
4182 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
4183 if ((*i)->name() == name) {
4188 return boost::shared_ptr<Bundle> ();
4192 Session::tempo_map_changed (const PropertyChange&)
4196 playlists->update_after_tempo_map_change ();
4198 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
4204 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
4206 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
4207 (*i)->recompute_frames_from_bbt ();
4211 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
4212 * the given count with the current block size.
4215 Session::ensure_buffers (ChanCount howmany)
4217 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
4221 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
4223 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4224 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
4229 Session::next_insert_id ()
4231 /* this doesn't really loop forever. just think about it */
4234 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
4235 if (!insert_bitset[n]) {
4236 insert_bitset[n] = true;
4242 /* none available, so resize and try again */
4244 insert_bitset.resize (insert_bitset.size() + 16, false);
4249 Session::next_send_id ()
4251 /* this doesn't really loop forever. just think about it */
4254 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
4255 if (!send_bitset[n]) {
4256 send_bitset[n] = true;
4262 /* none available, so resize and try again */
4264 send_bitset.resize (send_bitset.size() + 16, false);
4269 Session::next_aux_send_id ()
4271 /* this doesn't really loop forever. just think about it */
4274 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
4275 if (!aux_send_bitset[n]) {
4276 aux_send_bitset[n] = true;
4282 /* none available, so resize and try again */
4284 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
4289 Session::next_return_id ()
4291 /* this doesn't really loop forever. just think about it */
4294 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
4295 if (!return_bitset[n]) {
4296 return_bitset[n] = true;
4302 /* none available, so resize and try again */
4304 return_bitset.resize (return_bitset.size() + 16, false);
4309 Session::mark_send_id (uint32_t id)
4311 if (id >= send_bitset.size()) {
4312 send_bitset.resize (id+16, false);
4314 if (send_bitset[id]) {
4315 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
4317 send_bitset[id] = true;
4321 Session::mark_aux_send_id (uint32_t id)
4323 if (id >= aux_send_bitset.size()) {
4324 aux_send_bitset.resize (id+16, false);
4326 if (aux_send_bitset[id]) {
4327 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
4329 aux_send_bitset[id] = true;
4333 Session::mark_return_id (uint32_t id)
4335 if (id >= return_bitset.size()) {
4336 return_bitset.resize (id+16, false);
4338 if (return_bitset[id]) {
4339 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
4341 return_bitset[id] = true;
4345 Session::mark_insert_id (uint32_t id)
4347 if (id >= insert_bitset.size()) {
4348 insert_bitset.resize (id+16, false);
4350 if (insert_bitset[id]) {
4351 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
4353 insert_bitset[id] = true;
4357 Session::unmark_send_id (uint32_t id)
4359 if (id < send_bitset.size()) {
4360 send_bitset[id] = false;
4365 Session::unmark_aux_send_id (uint32_t id)
4367 if (id < aux_send_bitset.size()) {
4368 aux_send_bitset[id] = false;
4373 Session::unmark_return_id (uint32_t id)
4375 if (id < return_bitset.size()) {
4376 return_bitset[id] = false;
4381 Session::unmark_insert_id (uint32_t id)
4383 if (id < insert_bitset.size()) {
4384 insert_bitset[id] = false;
4389 Session::reset_native_file_format ()
4391 boost::shared_ptr<RouteList> rl = routes.reader ();
4392 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4393 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4395 /* don't save state as we do this, there's no point
4398 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
4399 tr->reset_write_sources (false);
4400 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
4406 Session::route_name_unique (string n) const
4408 boost::shared_ptr<RouteList> r = routes.reader ();
4410 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4411 if ((*i)->name() == n) {
4420 Session::route_name_internal (string n) const
4422 if (auditioner && auditioner->name() == n) {
4426 if (_click_io && _click_io->name() == n) {
4434 Session::freeze_all (InterThreadInfo& itt)
4436 boost::shared_ptr<RouteList> r = routes.reader ();
4438 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4440 boost::shared_ptr<Track> t;
4442 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
4443 /* XXX this is wrong because itt.progress will keep returning to zero at the start
4453 boost::shared_ptr<Region>
4454 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
4455 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
4456 InterThreadInfo& itt,
4457 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
4458 bool for_export, bool for_freeze)
4460 boost::shared_ptr<Region> result;
4461 boost::shared_ptr<Playlist> playlist;
4462 boost::shared_ptr<Source> source;
4463 ChanCount diskstream_channels (track.n_channels());
4464 framepos_t position;
4465 framecnt_t this_chunk;
4467 framepos_t latency_skip;
4469 framepos_t len = end - start;
4470 bool need_block_size_reset = false;
4471 ChanCount const max_proc = track.max_processor_streams ();
4472 string legal_playlist_name;
4473 string possible_path;
4476 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
4477 end, start) << endmsg;
4481 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
4482 include_endpoint, for_export, for_freeze);
4484 if (diskstream_channels.n(track.data_type()) < 1) {
4485 error << _("Cannot write a range with no data.") << endmsg;
4489 // block all process callback handling
4491 block_processing ();
4494 // synchronize with AudioEngine::process_callback()
4495 // make sure processing is not currently running
4496 // and processing_blocked() is honored before
4497 // acquiring thread buffers
4498 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
4501 _bounce_processing_active = true;
4503 /* call tree *MUST* hold route_lock */
4505 if ((playlist = track.playlist()) == 0) {
4509 legal_playlist_name = legalize_for_path (playlist->name());
4511 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
4513 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
4514 string path = ((track.data_type() == DataType::AUDIO)
4515 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
4516 : new_midi_source_path (legal_playlist_name));
4523 source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
4526 catch (failed_constructor& err) {
4527 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
4531 srcs.push_back (source);
4534 /* tell redirects that care that we are about to use a much larger
4535 * blocksize. this will flush all plugins too, so that they are ready
4536 * to be used for this process.
4539 need_block_size_reset = true;
4540 track.set_block_size (bounce_chunk_size);
4541 _engine.main_thread()->get_buffers ();
4545 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
4547 /* create a set of reasonably-sized buffers */
4548 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4549 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
4551 buffers.set_count (max_proc);
4553 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4554 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4555 boost::shared_ptr<MidiSource> ms;
4557 afs->prepare_for_peakfile_writes ();
4558 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
4559 Source::Lock lock(ms->mutex());
4560 ms->mark_streaming_write_started(lock);
4564 while (to_do && !itt.cancel) {
4566 this_chunk = min (to_do, bounce_chunk_size);
4568 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
4572 start += this_chunk;
4573 to_do -= this_chunk;
4574 itt.progress = (float) (1.0 - ((double) to_do / len));
4576 if (latency_skip >= bounce_chunk_size) {
4577 latency_skip -= bounce_chunk_size;
4581 const framecnt_t current_chunk = this_chunk - latency_skip;
4584 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4585 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4586 boost::shared_ptr<MidiSource> ms;
4589 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
4592 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
4593 Source::Lock lock(ms->mutex());
4595 const MidiBuffer& buf = buffers.get_midi(0);
4596 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
4597 Evoral::Event<framepos_t> ev = *i;
4598 ev.set_time(ev.time() - position);
4599 ms->append_event_frames(lock, ev, ms->timeline_position());
4606 /* post-roll, pick up delayed processor output */
4607 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
4609 while (latency_skip && !itt.cancel) {
4610 this_chunk = min (latency_skip, bounce_chunk_size);
4611 latency_skip -= this_chunk;
4613 buffers.silence (this_chunk, 0);
4614 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
4617 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4618 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4621 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
4633 xnow = localtime (&now);
4635 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
4636 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4637 boost::shared_ptr<MidiSource> ms;
4640 afs->update_header (position, *xnow, now);
4641 afs->flush_header ();
4642 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
4643 Source::Lock lock(ms->mutex());
4644 ms->mark_streaming_write_completed(lock);
4648 /* construct a region to represent the bounced material */
4652 plist.add (Properties::start, 0);
4653 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4654 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4656 result = RegionFactory::create (srcs, plist);
4662 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4663 (*src)->mark_for_remove ();
4664 (*src)->drop_references ();
4668 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4669 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4672 afs->done_with_peakfile_writes ();
4676 _bounce_processing_active = false;
4678 if (need_block_size_reset) {
4679 _engine.main_thread()->drop_buffers ();
4680 track.set_block_size (get_block_size());
4683 unblock_processing ();
4689 Session::gain_automation_buffer() const
4691 return ProcessThread::gain_automation_buffer ();
4695 Session::send_gain_automation_buffer() const
4697 return ProcessThread::send_gain_automation_buffer ();
4701 Session::pan_automation_buffer() const
4703 return ProcessThread::pan_automation_buffer ();
4707 Session::get_silent_buffers (ChanCount count)
4709 return ProcessThread::get_silent_buffers (count);
4713 Session::get_scratch_buffers (ChanCount count, bool silence)
4715 return ProcessThread::get_scratch_buffers (count, silence);
4719 Session::get_route_buffers (ChanCount count, bool silence)
4721 return ProcessThread::get_route_buffers (count, silence);
4726 Session::get_mix_buffers (ChanCount count)
4728 return ProcessThread::get_mix_buffers (count);
4732 Session::ntracks () const
4735 boost::shared_ptr<RouteList> r = routes.reader ();
4737 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4738 if (boost::dynamic_pointer_cast<Track> (*i)) {
4747 Session::nbusses () const
4750 boost::shared_ptr<RouteList> r = routes.reader ();
4752 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4753 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
4762 Session::add_automation_list(AutomationList *al)
4764 automation_lists[al->id()] = al;
4767 /** @return true if there is at least one record-enabled track, otherwise false */
4769 Session::have_rec_enabled_track () const
4771 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
4774 /** Update the state of our rec-enabled tracks flag */
4776 Session::update_have_rec_enabled_track ()
4778 boost::shared_ptr<RouteList> rl = routes.reader ();
4779 RouteList::iterator i = rl->begin();
4780 while (i != rl->end ()) {
4782 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4783 if (tr && tr->record_enabled ()) {
4790 int const old = g_atomic_int_get (&_have_rec_enabled_track);
4792 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4794 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4795 RecordStateChanged (); /* EMIT SIGNAL */
4800 Session::listen_position_changed ()
4802 boost::shared_ptr<RouteList> r = routes.reader ();
4804 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4805 (*i)->listen_position_changed ();
4810 Session::solo_control_mode_changed ()
4812 /* cancel all solo or all listen when solo control mode changes */
4815 set_solo (get_routes(), false);
4816 } else if (listening()) {
4817 set_listen (get_routes(), false);
4821 /** Called when a property of one of our route groups changes */
4823 Session::route_group_property_changed (RouteGroup* rg)
4825 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4828 /** Called when a route is added to one of our route groups */
4830 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4832 RouteAddedToRouteGroup (rg, r);
4835 /** Called when a route is removed from one of our route groups */
4837 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4839 RouteRemovedFromRouteGroup (rg, r);
4842 boost::shared_ptr<RouteList>
4843 Session::get_tracks () const
4845 boost::shared_ptr<RouteList> rl = routes.reader ();
4846 boost::shared_ptr<RouteList> tl (new RouteList);
4848 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
4849 if (boost::dynamic_pointer_cast<Track> (*r)) {
4850 if (!(*r)->is_auditioner()) {
4858 boost::shared_ptr<RouteList>
4859 Session::get_routes_with_regions_at (framepos_t const p) const
4861 boost::shared_ptr<RouteList> r = routes.reader ();
4862 boost::shared_ptr<RouteList> rl (new RouteList);
4864 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4865 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4870 boost::shared_ptr<Playlist> pl = tr->playlist ();
4875 if (pl->has_region_at (p)) {
4884 Session::goto_end ()
4886 if (_session_range_location) {
4887 request_locate (_session_range_location->end(), false);
4889 request_locate (0, false);
4894 Session::goto_start ()
4896 if (_session_range_location) {
4897 request_locate (_session_range_location->start(), false);
4899 request_locate (0, false);
4904 Session::current_start_frame () const
4906 return _session_range_location ? _session_range_location->start() : 0;
4910 Session::current_end_frame () const
4912 return _session_range_location ? _session_range_location->end() : 0;
4916 Session::add_session_range_location (framepos_t start, framepos_t end)
4918 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4919 _locations->add (_session_range_location);
4923 Session::step_edit_status_change (bool yn)
4929 send = (_step_editors == 0);
4934 send = (_step_editors == 1);
4937 if (_step_editors > 0) {
4943 StepEditStatusChange (val);
4949 Session::start_time_changed (framepos_t old)
4951 /* Update the auto loop range to match the session range
4952 (unless the auto loop range has been changed by the user)
4955 Location* s = _locations->session_range_location ();
4960 Location* l = _locations->auto_loop_location ();
4962 if (l && l->start() == old) {
4963 l->set_start (s->start(), true);
4968 Session::end_time_changed (framepos_t old)
4970 /* Update the auto loop range to match the session range
4971 (unless the auto loop range has been changed by the user)
4974 Location* s = _locations->session_range_location ();
4979 Location* l = _locations->auto_loop_location ();
4981 if (l && l->end() == old) {
4982 l->set_end (s->end(), true);
4986 std::vector<std::string>
4987 Session::source_search_path (DataType type) const
4991 if (session_dirs.size() == 1) {
4993 case DataType::AUDIO:
4994 sp.push_back (_session_dir->sound_path());
4996 case DataType::MIDI:
4997 sp.push_back (_session_dir->midi_path());
5001 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
5002 SessionDirectory sdir (i->path);
5004 case DataType::AUDIO:
5005 sp.push_back (sdir.sound_path());
5007 case DataType::MIDI:
5008 sp.push_back (sdir.midi_path());
5014 if (type == DataType::AUDIO) {
5015 const string sound_path_2X = _session_dir->sound_path_2X();
5016 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
5017 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
5018 sp.push_back (sound_path_2X);
5023 // now check the explicit (possibly user-specified) search path
5026 case DataType::AUDIO:
5027 sp += Searchpath(config.get_audio_search_path ());
5029 case DataType::MIDI:
5030 sp += Searchpath(config.get_midi_search_path ());
5038 Session::ensure_search_path_includes (const string& path, DataType type)
5047 case DataType::AUDIO:
5048 sp += Searchpath(config.get_audio_search_path ());
5050 case DataType::MIDI:
5051 sp += Searchpath (config.get_midi_search_path ());
5055 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
5056 /* No need to add this new directory if it has the same inode as
5057 an existing one; checking inode rather than name prevents duplicated
5058 directories when we are using symlinks.
5060 On Windows, I think we could just do if (*i == path) here.
5062 if (PBD::equivalent_paths (*i, path)) {
5070 case DataType::AUDIO:
5071 config.set_audio_search_path (sp.to_string());
5073 case DataType::MIDI:
5074 config.set_midi_search_path (sp.to_string());
5080 Session::remove_dir_from_search_path (const string& dir, DataType type)
5085 case DataType::AUDIO:
5086 sp = Searchpath(config.get_audio_search_path ());
5088 case DataType::MIDI:
5089 sp = Searchpath (config.get_midi_search_path ());
5096 case DataType::AUDIO:
5097 config.set_audio_search_path (sp.to_string());
5099 case DataType::MIDI:
5100 config.set_midi_search_path (sp.to_string());
5106 boost::shared_ptr<Speakers>
5107 Session::get_speakers()
5113 Session::unknown_processors () const
5117 boost::shared_ptr<RouteList> r = routes.reader ();
5118 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5119 list<string> t = (*i)->unknown_processors ();
5120 copy (t.begin(), t.end(), back_inserter (p));
5130 Session::update_latency (bool playback)
5132 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
5134 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
5138 boost::shared_ptr<RouteList> r = routes.reader ();
5139 framecnt_t max_latency = 0;
5142 /* reverse the list so that we work backwards from the last route to run to the first */
5143 RouteList* rl = routes.reader().get();
5144 r.reset (new RouteList (*rl));
5145 reverse (r->begin(), r->end());
5148 /* compute actual latency values for the given direction and store them all in per-port
5149 structures. this will also publish the same values (to JACK) so that computation of latency
5150 for routes can consistently use public latency values.
5153 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5154 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
5157 /* because we latency compensate playback, our published playback latencies should
5158 be the same for all output ports - all material played back by ardour has
5159 the same latency, whether its caused by plugins or by latency compensation. since
5160 these may differ from the values computed above, reset all playback port latencies
5164 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
5166 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5167 (*i)->set_public_port_latencies (max_latency, playback);
5172 post_playback_latency ();
5176 post_capture_latency ();
5179 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
5183 Session::post_playback_latency ()
5185 set_worst_playback_latency ();
5187 boost::shared_ptr<RouteList> r = routes.reader ();
5189 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5190 if (!(*i)->is_auditioner() && ((*i)->active())) {
5191 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
5195 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5196 (*i)->set_latency_compensation (_worst_track_latency);
5201 Session::post_capture_latency ()
5203 set_worst_capture_latency ();
5205 /* reflect any changes in capture latencies into capture offsets
5208 boost::shared_ptr<RouteList> rl = routes.reader();
5209 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5210 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5212 tr->set_capture_offset ();
5218 Session::initialize_latencies ()
5221 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5222 update_latency (false);
5223 update_latency (true);
5226 set_worst_io_latencies ();
5230 Session::set_worst_io_latencies ()
5232 set_worst_playback_latency ();
5233 set_worst_capture_latency ();
5237 Session::set_worst_playback_latency ()
5239 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5243 _worst_output_latency = 0;
5245 if (!_engine.connected()) {
5249 boost::shared_ptr<RouteList> r = routes.reader ();
5251 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5252 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
5255 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
5259 Session::set_worst_capture_latency ()
5261 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5265 _worst_input_latency = 0;
5267 if (!_engine.connected()) {
5271 boost::shared_ptr<RouteList> r = routes.reader ();
5273 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5274 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
5277 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
5281 Session::update_latency_compensation (bool force_whole_graph)
5283 bool some_track_latency_changed = false;
5285 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5289 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
5291 _worst_track_latency = 0;
5293 boost::shared_ptr<RouteList> r = routes.reader ();
5295 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5296 if (!(*i)->is_auditioner() && ((*i)->active())) {
5298 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
5299 some_track_latency_changed = true;
5301 _worst_track_latency = max (tl, _worst_track_latency);
5305 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
5306 (some_track_latency_changed ? "yes" : "no")));
5308 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
5310 if (some_track_latency_changed || force_whole_graph) {
5311 _engine.update_latencies ();
5315 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5316 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5320 tr->set_capture_offset ();
5325 Session::session_name_is_legal (const string& path)
5327 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
5329 for (int i = 0; illegal_chars[i]; ++i) {
5330 if (path.find (illegal_chars[i]) != string::npos) {
5331 return illegal_chars[i];
5339 Session::next_control_id () const
5343 /* the monitor bus remote ID is in a different
5344 * "namespace" than regular routes. its existence doesn't
5345 * affect normal (low) numbered routes.
5352 return nroutes() - subtract;
5356 Session::notify_remote_id_change ()
5358 if (deletion_in_progress()) {
5362 switch (Config->get_remote_model()) {
5364 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
5372 Session::sync_order_keys ()
5374 if (deletion_in_progress()) {
5378 /* tell everyone that something has happened to the sort keys
5379 and let them sync up with the change(s)
5380 this will give objects that manage the sort order keys the
5381 opportunity to keep them in sync if they wish to.
5384 DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
5386 reassign_track_numbers();
5388 Route::SyncOrderKeys (); /* EMIT SIGNAL */
5390 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
5394 Session::operation_in_progress (GQuark op) const
5396 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
5399 boost::shared_ptr<Port>
5400 Session::ltc_input_port () const
5402 return _ltc_input->nth (0);
5405 boost::shared_ptr<Port>
5406 Session::ltc_output_port () const
5408 return _ltc_output->nth (0);
5412 Session::reconnect_ltc_input ()
5416 string src = Config->get_ltc_source_port();
5418 _ltc_input->disconnect (this);
5420 if (src != _("None") && !src.empty()) {
5421 _ltc_input->nth (0)->connect (src);
5427 Session::reconnect_ltc_output ()
5432 string src = Config->get_ltc_sink_port();
5434 _ltc_output->disconnect (this);
5436 if (src != _("None") && !src.empty()) {
5437 _ltc_output->nth (0)->connect (src);