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)->act_on_mute ();
3026 (*i)->mute_changed (this);
3029 SoloChanged (); /* EMIT SIGNAL */
3034 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
3036 /* now figure out if anything that matters is soloed (or is "listening")*/
3038 bool something_soloed = false;
3039 uint32_t listeners = 0;
3040 uint32_t isolated = 0;
3043 r = routes.reader();
3046 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3047 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
3048 something_soloed = true;
3051 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
3052 if (Config->get_solo_control_is_listen_control()) {
3055 (*i)->set_listen (false, this);
3059 if ((*i)->solo_isolated()) {
3064 if (something_soloed != _non_soloed_outs_muted) {
3065 _non_soloed_outs_muted = something_soloed;
3066 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
3069 _listen_cnt = listeners;
3071 if (isolated != _solo_isolated_cnt) {
3072 _solo_isolated_cnt = isolated;
3073 IsolatedChanged (); /* EMIT SIGNAL */
3076 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
3077 something_soloed, listeners, isolated));
3080 boost::shared_ptr<RouteList>
3081 Session::get_routes_with_internal_returns() const
3083 boost::shared_ptr<RouteList> r = routes.reader ();
3084 boost::shared_ptr<RouteList> rl (new RouteList);
3086 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3087 if ((*i)->internal_return ()) {
3095 Session::io_name_is_legal (const std::string& name)
3097 boost::shared_ptr<RouteList> r = routes.reader ();
3099 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3100 if ((*i)->name() == name) {
3104 if ((*i)->has_io_processor_named (name)) {
3113 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
3116 vector<string> connections;
3118 /* if we are passed only a single route and we're not told to turn
3119 * others off, then just do the simple thing.
3122 if (flip_others == false && rl->size() == 1) {
3123 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
3125 mt->set_input_active (onoff);
3130 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
3132 PortSet& ps ((*rt)->input()->ports());
3134 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
3135 p->get_connections (connections);
3138 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
3139 routes_using_input_from (*s, rl2);
3142 /* scan all relevant routes to see if others are on or off */
3144 bool others_are_already_on = false;
3146 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3148 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3154 if ((*r) != (*rt)) {
3155 if (mt->input_active()) {
3156 others_are_already_on = true;
3159 /* this one needs changing */
3160 mt->set_input_active (onoff);
3166 /* globally reverse other routes */
3168 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3169 if ((*r) != (*rt)) {
3170 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3172 mt->set_input_active (!others_are_already_on);
3181 Session::routes_using_input_from (const string& str, RouteList& rl)
3183 boost::shared_ptr<RouteList> r = routes.reader();
3185 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3186 if ((*i)->input()->connected_to (str)) {
3192 boost::shared_ptr<Route>
3193 Session::route_by_name (string name)
3195 boost::shared_ptr<RouteList> r = routes.reader ();
3197 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3198 if ((*i)->name() == name) {
3203 return boost::shared_ptr<Route> ((Route*) 0);
3206 boost::shared_ptr<Route>
3207 Session::route_by_id (PBD::ID id)
3209 boost::shared_ptr<RouteList> r = routes.reader ();
3211 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3212 if ((*i)->id() == id) {
3217 return boost::shared_ptr<Route> ((Route*) 0);
3220 boost::shared_ptr<Track>
3221 Session::track_by_diskstream_id (PBD::ID id)
3223 boost::shared_ptr<RouteList> r = routes.reader ();
3225 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3226 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3227 if (t && t->using_diskstream_id (id)) {
3232 return boost::shared_ptr<Track> ();
3235 boost::shared_ptr<Route>
3236 Session::route_by_remote_id (uint32_t id)
3238 boost::shared_ptr<RouteList> r = routes.reader ();
3240 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3241 if ((*i)->remote_control_id() == id) {
3246 return boost::shared_ptr<Route> ((Route*) 0);
3251 Session::reassign_track_numbers ()
3255 RouteList r (*(routes.reader ()));
3256 SignalOrderRouteSorter sorter;
3259 StateProtector sp (this);
3261 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3262 if (boost::dynamic_pointer_cast<Track> (*i)) {
3263 (*i)->set_track_number(++tn);
3265 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
3266 (*i)->set_track_number(--bn);
3269 const uint32_t decimals = ceilf (log10f (tn + 1));
3270 const bool decimals_changed = _track_number_decimals != decimals;
3271 _track_number_decimals = decimals;
3273 if (decimals_changed && config.get_track_name_number ()) {
3274 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3275 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3277 t->resync_track_name();
3280 // trigger GUI re-layout
3281 config.ParameterChanged("track-name-number");
3286 Session::playlist_region_added (boost::weak_ptr<Region> w)
3288 boost::shared_ptr<Region> r = w.lock ();
3293 /* These are the operations that are currently in progress... */
3294 list<GQuark> curr = _current_trans_quarks;
3297 /* ...and these are the operations during which we want to update
3298 the session range location markers.
3301 ops.push_back (Operations::capture);
3302 ops.push_back (Operations::paste);
3303 ops.push_back (Operations::duplicate_region);
3304 ops.push_back (Operations::insert_file);
3305 ops.push_back (Operations::insert_region);
3306 ops.push_back (Operations::drag_region_brush);
3307 ops.push_back (Operations::region_drag);
3308 ops.push_back (Operations::selection_grab);
3309 ops.push_back (Operations::region_fill);
3310 ops.push_back (Operations::fill_selection);
3311 ops.push_back (Operations::create_region);
3312 ops.push_back (Operations::region_copy);
3313 ops.push_back (Operations::fixed_time_region_copy);
3316 /* See if any of the current operations match the ones that we want */
3318 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
3320 /* If so, update the session range markers */
3322 maybe_update_session_range (r->position (), r->last_frame ());
3326 /** Update the session range markers if a is before the current start or
3327 * b is after the current end.
3330 Session::maybe_update_session_range (framepos_t a, framepos_t b)
3332 if (_state_of_the_state & Loading) {
3336 if (_session_range_location == 0) {
3338 add_session_range_location (a, b);
3342 if (a < _session_range_location->start()) {
3343 _session_range_location->set_start (a);
3346 if (b > _session_range_location->end()) {
3347 _session_range_location->set_end (b);
3353 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
3355 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3356 maybe_update_session_range (i->to, i->to + i->length);
3361 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
3363 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3364 maybe_update_session_range (i->from, i->to);
3368 /* Region management */
3370 boost::shared_ptr<Region>
3371 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
3373 const RegionFactory::RegionMap& regions (RegionFactory::regions());
3374 RegionFactory::RegionMap::const_iterator i;
3375 boost::shared_ptr<Region> region;
3377 Glib::Threads::Mutex::Lock lm (region_lock);
3379 for (i = regions.begin(); i != regions.end(); ++i) {
3383 if (region->whole_file()) {
3385 if (child->source_equivalent (region)) {
3391 return boost::shared_ptr<Region> ();
3395 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
3397 set<boost::shared_ptr<Region> > relevant_regions;
3399 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
3400 RegionFactory::get_regions_using_source (*s, relevant_regions);
3403 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
3404 set<boost::shared_ptr<Region> >::iterator tmp;
3409 playlists->destroy_region (*r);
3410 RegionFactory::map_remove (*r);
3412 (*r)->drop_sources ();
3413 (*r)->drop_references ();
3415 relevant_regions.erase (r);
3420 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
3423 Glib::Threads::Mutex::Lock ls (source_lock);
3424 /* remove from the main source list */
3425 sources.erase ((*s)->id());
3428 (*s)->mark_for_remove ();
3429 (*s)->drop_references ();
3438 Session::remove_last_capture ()
3440 list<boost::shared_ptr<Source> > srcs;
3442 boost::shared_ptr<RouteList> rl = routes.reader ();
3443 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3444 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3449 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
3452 srcs.insert (srcs.end(), l.begin(), l.end());
3457 destroy_sources (srcs);
3459 save_state (_current_snapshot_name);
3464 /* Source Management */
3467 Session::add_source (boost::shared_ptr<Source> source)
3469 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
3470 pair<SourceMap::iterator,bool> result;
3472 entry.first = source->id();
3473 entry.second = source;
3476 Glib::Threads::Mutex::Lock lm (source_lock);
3477 result = sources.insert (entry);
3480 if (result.second) {
3482 /* yay, new source */
3484 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
3487 if (!fs->within_session()) {
3488 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
3494 boost::shared_ptr<AudioFileSource> afs;
3496 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
3497 if (Config->get_auto_analyse_audio()) {
3498 Analyser::queue_source_for_analysis (source, false);
3502 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
3507 Session::remove_source (boost::weak_ptr<Source> src)
3509 if (_state_of_the_state & Deletion) {
3513 SourceMap::iterator i;
3514 boost::shared_ptr<Source> source = src.lock();
3521 Glib::Threads::Mutex::Lock lm (source_lock);
3523 if ((i = sources.find (source->id())) != sources.end()) {
3528 if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
3530 /* save state so we don't end up with a session file
3531 referring to non-existent sources.
3534 save_state (_current_snapshot_name);
3538 boost::shared_ptr<Source>
3539 Session::source_by_id (const PBD::ID& id)
3541 Glib::Threads::Mutex::Lock lm (source_lock);
3542 SourceMap::iterator i;
3543 boost::shared_ptr<Source> source;
3545 if ((i = sources.find (id)) != sources.end()) {
3552 boost::shared_ptr<AudioFileSource>
3553 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
3555 /* Restricted to audio files because only audio sources have channel
3559 Glib::Threads::Mutex::Lock lm (source_lock);
3561 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
3562 boost::shared_ptr<AudioFileSource> afs
3563 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
3565 if (afs && afs->path() == path && chn == afs->channel()) {
3570 return boost::shared_ptr<AudioFileSource>();
3573 boost::shared_ptr<MidiSource>
3574 Session::midi_source_by_path (const std::string& path) const
3576 /* Restricted to MIDI files because audio sources require a channel
3577 for unique identification, in addition to a path.
3580 Glib::Threads::Mutex::Lock lm (source_lock);
3582 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
3583 boost::shared_ptr<MidiSource> ms
3584 = boost::dynamic_pointer_cast<MidiSource>(s->second);
3585 boost::shared_ptr<FileSource> fs
3586 = boost::dynamic_pointer_cast<FileSource>(s->second);
3588 if (ms && fs && fs->path() == path) {
3593 return boost::shared_ptr<MidiSource>();
3597 Session::count_sources_by_origin (const string& path)
3600 Glib::Threads::Mutex::Lock lm (source_lock);
3602 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3603 boost::shared_ptr<FileSource> fs
3604 = boost::dynamic_pointer_cast<FileSource>(i->second);
3606 if (fs && fs->origin() == path) {
3615 Session::peak_path (string base) const
3617 return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
3621 Session::new_audio_source_path_for_embedded (const std::string& path)
3625 * we know that the filename is already unique because it exists
3626 * out in the filesystem.
3628 * However, when we bring it into the session, we could get a
3631 * Eg. two embedded files:
3636 * When merged into session, these collide.
3638 * There will not be a conflict with in-memory sources
3639 * because when the source was created we already picked
3640 * a unique name for it.
3642 * This collision is not likely to be common, but we have to guard
3643 * against it. So, if there is a collision, take the md5 hash of the
3644 * the path, and use that as the filename instead.
3647 SessionDirectory sdir (get_best_session_directory_for_new_audio());
3648 string base = Glib::path_get_basename (path);
3649 string newpath = Glib::build_filename (sdir.sound_path(), base);
3651 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
3655 md5.digestString (path.c_str());
3656 md5.writeToString ();
3657 base = md5.digestChars;
3659 string ext = get_suffix (path);
3666 newpath = Glib::build_filename (sdir.sound_path(), base);
3668 /* if this collides, we're screwed */
3670 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
3671 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
3680 /** Return true if there are no audio file sources that use @param name as
3681 * the filename component of their path.
3683 * Return false otherwise.
3685 * This method MUST ONLY be used to check in-session, mono files since it
3686 * hard-codes the channel of the audio file source we are looking for as zero.
3688 * If/when Ardour supports native files in non-mono formats, the logic here
3689 * will need to be revisited.
3692 Session::audio_source_name_is_unique (const string& name)
3694 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
3695 vector<space_and_path>::iterator i;
3696 uint32_t existing = 0;
3698 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
3700 /* note that we search *without* the extension so that
3701 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3702 in the event that this new name is required for
3703 a file format change.
3706 const string spath = *i;
3708 if (matching_unsuffixed_filename_exists_in (spath, name)) {
3713 /* it is possible that we have the path already
3714 * assigned to a source that has not yet been written
3715 * (ie. the write source for a diskstream). we have to
3716 * check this in order to make sure that our candidate
3717 * path isn't used again, because that can lead to
3718 * two Sources point to the same file with different
3719 * notions of their removability.
3723 string possible_path = Glib::build_filename (spath, name);
3725 if (audio_source_by_path_and_channel (possible_path, 0)) {
3731 return (existing == 0);
3735 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)
3738 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3742 sstr << setfill ('0') << setw (4) << cnt;
3743 sstr << legalized_base;
3745 sstr << legalized_base;
3747 if (take_required || related_exists) {
3759 } else if (nchan > 2) {
3764 /* XXX what? more than 26 channels! */
3775 /** Return a unique name based on \a base for a new internal audio source */
3777 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
3780 string possible_name;
3781 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
3783 bool some_related_source_name_exists = false;
3785 legalized = legalize_for_path (base);
3787 // Find a "version" of the base name that doesn't exist in any of the possible directories.
3789 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3791 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
3793 if (audio_source_name_is_unique (possible_name)) {
3797 some_related_source_name_exists = true;
3800 error << string_compose(
3801 _("There are already %1 recordings for %2, which I consider too many."),
3802 limit, base) << endmsg;
3804 throw failed_constructor();
3808 /* We've established that the new name does not exist in any session
3809 * directory, so now find out which one we should use for this new
3813 SessionDirectory sdir (get_best_session_directory_for_new_audio());
3815 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
3820 /** Return a unique name based on `base` for a new internal MIDI source */
3822 Session::new_midi_source_path (const string& base)
3825 char buf[PATH_MAX+1];
3826 const uint32_t limit = 10000;
3828 string possible_path;
3829 string possible_name;
3832 legalized = legalize_for_path (base);
3834 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3835 std::vector<string> sdirs = source_search_path(DataType::MIDI);
3837 /* - the main session folder is the first in the vector.
3838 * - after checking all locations for file-name uniqueness,
3839 * we keep the one from the last iteration as new file name
3840 * - midi files are small and should just be kept in the main session-folder
3842 * -> reverse the array, check main session folder last and use that as location
3845 std::reverse(sdirs.begin(), sdirs.end());
3847 for (cnt = 1; cnt <= limit; ++cnt) {
3849 vector<space_and_path>::iterator i;
3850 uint32_t existing = 0;
3852 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
3854 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
3855 possible_name = buf;
3857 possible_path = Glib::build_filename (*i, possible_name);
3859 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
3863 if (midi_source_by_path (possible_path)) {
3868 if (existing == 0) {
3873 error << string_compose(
3874 _("There are already %1 recordings for %2, which I consider too many."),
3875 limit, base) << endmsg;
3881 /* No need to "find best location" for software/app-based RAID, because
3882 MIDI is so small that we always put it in the same place.
3885 return possible_path;
3889 /** Create a new within-session audio source */
3890 boost::shared_ptr<AudioFileSource>
3891 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
3893 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
3895 if (!path.empty()) {
3896 return boost::dynamic_pointer_cast<AudioFileSource> (
3897 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
3899 throw failed_constructor ();
3903 /** Create a new within-session MIDI source */
3904 boost::shared_ptr<MidiSource>
3905 Session::create_midi_source_for_session (string const & basic_name)
3907 const string path = new_midi_source_path (basic_name);
3909 if (!path.empty()) {
3910 return boost::dynamic_pointer_cast<SMFSource> (
3911 SourceFactory::createWritable (
3912 DataType::MIDI, *this, path, false, frame_rate()));
3914 throw failed_constructor ();
3918 /** Create a new within-session MIDI source */
3919 boost::shared_ptr<MidiSource>
3920 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
3922 /* the caller passes in the track the source will be used in,
3923 so that we can keep the numbering sane.
3925 Rationale: a track with the name "Foo" that has had N
3926 captures carried out so far will ALREADY have a write source
3927 named "Foo-N+1.mid" waiting to be used for the next capture.
3929 If we call new_midi_source_name() we will get "Foo-N+2". But
3930 there is no region corresponding to "Foo-N+1", so when
3931 "Foo-N+2" appears in the track, the gap presents the user
3932 with odd behaviour - why did it skip past Foo-N+1?
3934 We could explain this to the user in some odd way, but
3935 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
3938 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
3941 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
3943 std::string name = track->steal_write_source_name ();
3946 return boost::shared_ptr<MidiSource>();
3949 /* MIDI files are small, just put them in the first location of the
3950 session source search path.
3953 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
3955 return boost::dynamic_pointer_cast<SMFSource> (
3956 SourceFactory::createWritable (
3957 DataType::MIDI, *this, path, false, frame_rate()));
3962 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3964 if (playlist->hidden()) {
3968 playlists->add (playlist);
3971 playlist->release();
3978 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3980 if (_state_of_the_state & Deletion) {
3984 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3990 playlists->remove (playlist);
3996 Session::set_audition (boost::shared_ptr<Region> r)
3998 pending_audition_region = r;
3999 add_post_transport_work (PostTransportAudition);
4000 _butler->schedule_transport_work ();
4004 Session::audition_playlist ()
4006 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4007 ev->region.reset ();
4012 Session::non_realtime_set_audition ()
4014 assert (pending_audition_region);
4015 auditioner->audition_region (pending_audition_region);
4016 pending_audition_region.reset ();
4017 AuditionActive (true); /* EMIT SIGNAL */
4021 Session::audition_region (boost::shared_ptr<Region> r)
4023 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4029 Session::cancel_audition ()
4034 if (auditioner->auditioning()) {
4035 auditioner->cancel_audition ();
4036 AuditionActive (false); /* EMIT SIGNAL */
4041 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
4043 if (a->is_monitor()) {
4046 if (b->is_monitor()) {
4049 return a->order_key () < b->order_key ();
4053 Session::is_auditioning () const
4055 /* can be called before we have an auditioner object */
4057 return auditioner->auditioning();
4064 Session::graph_reordered ()
4066 /* don't do this stuff if we are setting up connections
4067 from a set_state() call or creating new tracks. Ditto for deletion.
4070 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
4074 /* every track/bus asked for this to be handled but it was deferred because
4075 we were connecting. do it now.
4078 request_input_change_handling ();
4082 /* force all diskstreams to update their capture offset values to
4083 reflect any changes in latencies within the graph.
4086 boost::shared_ptr<RouteList> rl = routes.reader ();
4087 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4088 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4090 tr->set_capture_offset ();
4095 /** @return Number of frames that there is disk space available to write,
4098 boost::optional<framecnt_t>
4099 Session::available_capture_duration ()
4101 Glib::Threads::Mutex::Lock lm (space_lock);
4103 if (_total_free_4k_blocks_uncertain) {
4104 return boost::optional<framecnt_t> ();
4107 float sample_bytes_on_disk = 4.0; // keep gcc happy
4109 switch (config.get_native_file_data_format()) {
4111 sample_bytes_on_disk = 4.0;
4115 sample_bytes_on_disk = 3.0;
4119 sample_bytes_on_disk = 2.0;
4123 /* impossible, but keep some gcc versions happy */
4124 fatal << string_compose (_("programming error: %1"),
4125 X_("illegal native file data format"))
4127 abort(); /*NOTREACHED*/
4130 double scale = 4096.0 / sample_bytes_on_disk;
4132 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
4133 return max_framecnt;
4136 return (framecnt_t) floor (_total_free_4k_blocks * scale);
4140 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
4143 RCUWriter<BundleList> writer (_bundles);
4144 boost::shared_ptr<BundleList> b = writer.get_copy ();
4145 b->push_back (bundle);
4149 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4156 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
4158 bool removed = false;
4161 RCUWriter<BundleList> writer (_bundles);
4162 boost::shared_ptr<BundleList> b = writer.get_copy ();
4163 BundleList::iterator i = find (b->begin(), b->end(), bundle);
4165 if (i != b->end()) {
4172 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4178 boost::shared_ptr<Bundle>
4179 Session::bundle_by_name (string name) const
4181 boost::shared_ptr<BundleList> b = _bundles.reader ();
4183 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
4184 if ((*i)->name() == name) {
4189 return boost::shared_ptr<Bundle> ();
4193 Session::tempo_map_changed (const PropertyChange&)
4197 playlists->update_after_tempo_map_change ();
4199 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
4205 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
4207 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
4208 (*i)->recompute_frames_from_bbt ();
4212 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
4213 * the given count with the current block size.
4216 Session::ensure_buffers (ChanCount howmany)
4218 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
4222 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
4224 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4225 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
4230 Session::next_insert_id ()
4232 /* this doesn't really loop forever. just think about it */
4235 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
4236 if (!insert_bitset[n]) {
4237 insert_bitset[n] = true;
4243 /* none available, so resize and try again */
4245 insert_bitset.resize (insert_bitset.size() + 16, false);
4250 Session::next_send_id ()
4252 /* this doesn't really loop forever. just think about it */
4255 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
4256 if (!send_bitset[n]) {
4257 send_bitset[n] = true;
4263 /* none available, so resize and try again */
4265 send_bitset.resize (send_bitset.size() + 16, false);
4270 Session::next_aux_send_id ()
4272 /* this doesn't really loop forever. just think about it */
4275 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
4276 if (!aux_send_bitset[n]) {
4277 aux_send_bitset[n] = true;
4283 /* none available, so resize and try again */
4285 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
4290 Session::next_return_id ()
4292 /* this doesn't really loop forever. just think about it */
4295 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
4296 if (!return_bitset[n]) {
4297 return_bitset[n] = true;
4303 /* none available, so resize and try again */
4305 return_bitset.resize (return_bitset.size() + 16, false);
4310 Session::mark_send_id (uint32_t id)
4312 if (id >= send_bitset.size()) {
4313 send_bitset.resize (id+16, false);
4315 if (send_bitset[id]) {
4316 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
4318 send_bitset[id] = true;
4322 Session::mark_aux_send_id (uint32_t id)
4324 if (id >= aux_send_bitset.size()) {
4325 aux_send_bitset.resize (id+16, false);
4327 if (aux_send_bitset[id]) {
4328 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
4330 aux_send_bitset[id] = true;
4334 Session::mark_return_id (uint32_t id)
4336 if (id >= return_bitset.size()) {
4337 return_bitset.resize (id+16, false);
4339 if (return_bitset[id]) {
4340 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
4342 return_bitset[id] = true;
4346 Session::mark_insert_id (uint32_t id)
4348 if (id >= insert_bitset.size()) {
4349 insert_bitset.resize (id+16, false);
4351 if (insert_bitset[id]) {
4352 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
4354 insert_bitset[id] = true;
4358 Session::unmark_send_id (uint32_t id)
4360 if (id < send_bitset.size()) {
4361 send_bitset[id] = false;
4366 Session::unmark_aux_send_id (uint32_t id)
4368 if (id < aux_send_bitset.size()) {
4369 aux_send_bitset[id] = false;
4374 Session::unmark_return_id (uint32_t id)
4376 if (id < return_bitset.size()) {
4377 return_bitset[id] = false;
4382 Session::unmark_insert_id (uint32_t id)
4384 if (id < insert_bitset.size()) {
4385 insert_bitset[id] = false;
4390 Session::reset_native_file_format ()
4392 boost::shared_ptr<RouteList> rl = routes.reader ();
4393 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4394 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4396 /* don't save state as we do this, there's no point
4399 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
4400 tr->reset_write_sources (false);
4401 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
4407 Session::route_name_unique (string n) const
4409 boost::shared_ptr<RouteList> r = routes.reader ();
4411 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4412 if ((*i)->name() == n) {
4421 Session::route_name_internal (string n) const
4423 if (auditioner && auditioner->name() == n) {
4427 if (_click_io && _click_io->name() == n) {
4435 Session::freeze_all (InterThreadInfo& itt)
4437 boost::shared_ptr<RouteList> r = routes.reader ();
4439 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4441 boost::shared_ptr<Track> t;
4443 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
4444 /* XXX this is wrong because itt.progress will keep returning to zero at the start
4454 boost::shared_ptr<Region>
4455 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
4456 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
4457 InterThreadInfo& itt,
4458 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
4459 bool for_export, bool for_freeze)
4461 boost::shared_ptr<Region> result;
4462 boost::shared_ptr<Playlist> playlist;
4463 boost::shared_ptr<Source> source;
4464 ChanCount diskstream_channels (track.n_channels());
4465 framepos_t position;
4466 framecnt_t this_chunk;
4468 framepos_t latency_skip;
4470 framepos_t len = end - start;
4471 bool need_block_size_reset = false;
4472 ChanCount const max_proc = track.max_processor_streams ();
4473 string legal_playlist_name;
4474 string possible_path;
4477 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
4478 end, start) << endmsg;
4482 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
4483 include_endpoint, for_export, for_freeze);
4485 if (diskstream_channels.n(track.data_type()) < 1) {
4486 error << _("Cannot write a range with no data.") << endmsg;
4490 // block all process callback handling
4492 block_processing ();
4495 // synchronize with AudioEngine::process_callback()
4496 // make sure processing is not currently running
4497 // and processing_blocked() is honored before
4498 // acquiring thread buffers
4499 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
4502 _bounce_processing_active = true;
4504 /* call tree *MUST* hold route_lock */
4506 if ((playlist = track.playlist()) == 0) {
4510 legal_playlist_name = legalize_for_path (playlist->name());
4512 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
4514 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
4515 string path = ((track.data_type() == DataType::AUDIO)
4516 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
4517 : new_midi_source_path (legal_playlist_name));
4524 source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
4527 catch (failed_constructor& err) {
4528 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
4532 srcs.push_back (source);
4535 /* tell redirects that care that we are about to use a much larger
4536 * blocksize. this will flush all plugins too, so that they are ready
4537 * to be used for this process.
4540 need_block_size_reset = true;
4541 track.set_block_size (bounce_chunk_size);
4542 _engine.main_thread()->get_buffers ();
4546 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
4548 /* create a set of reasonably-sized buffers */
4549 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4550 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
4552 buffers.set_count (max_proc);
4554 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4555 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4556 boost::shared_ptr<MidiSource> ms;
4558 afs->prepare_for_peakfile_writes ();
4559 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
4560 Source::Lock lock(ms->mutex());
4561 ms->mark_streaming_write_started(lock);
4565 while (to_do && !itt.cancel) {
4567 this_chunk = min (to_do, bounce_chunk_size);
4569 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
4573 start += this_chunk;
4574 to_do -= this_chunk;
4575 itt.progress = (float) (1.0 - ((double) to_do / len));
4577 if (latency_skip >= bounce_chunk_size) {
4578 latency_skip -= bounce_chunk_size;
4582 const framecnt_t current_chunk = this_chunk - latency_skip;
4585 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4586 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4587 boost::shared_ptr<MidiSource> ms;
4590 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
4593 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
4594 Source::Lock lock(ms->mutex());
4596 const MidiBuffer& buf = buffers.get_midi(0);
4597 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
4598 Evoral::Event<framepos_t> ev = *i;
4599 ev.set_time(ev.time() - position);
4600 ms->append_event_frames(lock, ev, ms->timeline_position());
4607 /* post-roll, pick up delayed processor output */
4608 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
4610 while (latency_skip && !itt.cancel) {
4611 this_chunk = min (latency_skip, bounce_chunk_size);
4612 latency_skip -= this_chunk;
4614 buffers.silence (this_chunk, 0);
4615 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
4618 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4619 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4622 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
4634 xnow = localtime (&now);
4636 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
4637 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4638 boost::shared_ptr<MidiSource> ms;
4641 afs->update_header (position, *xnow, now);
4642 afs->flush_header ();
4643 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
4644 Source::Lock lock(ms->mutex());
4645 ms->mark_streaming_write_completed(lock);
4649 /* construct a region to represent the bounced material */
4653 plist.add (Properties::start, 0);
4654 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4655 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4657 result = RegionFactory::create (srcs, plist);
4663 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4664 (*src)->mark_for_remove ();
4665 (*src)->drop_references ();
4669 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4670 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4673 afs->done_with_peakfile_writes ();
4677 _bounce_processing_active = false;
4679 if (need_block_size_reset) {
4680 _engine.main_thread()->drop_buffers ();
4681 track.set_block_size (get_block_size());
4684 unblock_processing ();
4690 Session::gain_automation_buffer() const
4692 return ProcessThread::gain_automation_buffer ();
4696 Session::send_gain_automation_buffer() const
4698 return ProcessThread::send_gain_automation_buffer ();
4702 Session::pan_automation_buffer() const
4704 return ProcessThread::pan_automation_buffer ();
4708 Session::get_silent_buffers (ChanCount count)
4710 return ProcessThread::get_silent_buffers (count);
4714 Session::get_scratch_buffers (ChanCount count, bool silence)
4716 return ProcessThread::get_scratch_buffers (count, silence);
4720 Session::get_route_buffers (ChanCount count, bool silence)
4722 return ProcessThread::get_route_buffers (count, silence);
4727 Session::get_mix_buffers (ChanCount count)
4729 return ProcessThread::get_mix_buffers (count);
4733 Session::ntracks () const
4736 boost::shared_ptr<RouteList> r = routes.reader ();
4738 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4739 if (boost::dynamic_pointer_cast<Track> (*i)) {
4748 Session::nbusses () const
4751 boost::shared_ptr<RouteList> r = routes.reader ();
4753 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4754 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
4763 Session::add_automation_list(AutomationList *al)
4765 automation_lists[al->id()] = al;
4768 /** @return true if there is at least one record-enabled track, otherwise false */
4770 Session::have_rec_enabled_track () const
4772 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
4775 /** Update the state of our rec-enabled tracks flag */
4777 Session::update_have_rec_enabled_track ()
4779 boost::shared_ptr<RouteList> rl = routes.reader ();
4780 RouteList::iterator i = rl->begin();
4781 while (i != rl->end ()) {
4783 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4784 if (tr && tr->record_enabled ()) {
4791 int const old = g_atomic_int_get (&_have_rec_enabled_track);
4793 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4795 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4796 RecordStateChanged (); /* EMIT SIGNAL */
4801 Session::listen_position_changed ()
4803 boost::shared_ptr<RouteList> r = routes.reader ();
4805 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4806 (*i)->listen_position_changed ();
4811 Session::solo_control_mode_changed ()
4813 /* cancel all solo or all listen when solo control mode changes */
4816 set_solo (get_routes(), false);
4817 } else if (listening()) {
4818 set_listen (get_routes(), false);
4822 /** Called when a property of one of our route groups changes */
4824 Session::route_group_property_changed (RouteGroup* rg)
4826 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4829 /** Called when a route is added to one of our route groups */
4831 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4833 RouteAddedToRouteGroup (rg, r);
4836 /** Called when a route is removed from one of our route groups */
4838 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4840 RouteRemovedFromRouteGroup (rg, r);
4843 boost::shared_ptr<RouteList>
4844 Session::get_tracks () const
4846 boost::shared_ptr<RouteList> rl = routes.reader ();
4847 boost::shared_ptr<RouteList> tl (new RouteList);
4849 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
4850 if (boost::dynamic_pointer_cast<Track> (*r)) {
4851 if (!(*r)->is_auditioner()) {
4859 boost::shared_ptr<RouteList>
4860 Session::get_routes_with_regions_at (framepos_t const p) const
4862 boost::shared_ptr<RouteList> r = routes.reader ();
4863 boost::shared_ptr<RouteList> rl (new RouteList);
4865 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4866 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4871 boost::shared_ptr<Playlist> pl = tr->playlist ();
4876 if (pl->has_region_at (p)) {
4885 Session::goto_end ()
4887 if (_session_range_location) {
4888 request_locate (_session_range_location->end(), false);
4890 request_locate (0, false);
4895 Session::goto_start ()
4897 if (_session_range_location) {
4898 request_locate (_session_range_location->start(), false);
4900 request_locate (0, false);
4905 Session::current_start_frame () const
4907 return _session_range_location ? _session_range_location->start() : 0;
4911 Session::current_end_frame () const
4913 return _session_range_location ? _session_range_location->end() : 0;
4917 Session::add_session_range_location (framepos_t start, framepos_t end)
4919 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4920 _locations->add (_session_range_location);
4924 Session::step_edit_status_change (bool yn)
4930 send = (_step_editors == 0);
4935 send = (_step_editors == 1);
4938 if (_step_editors > 0) {
4944 StepEditStatusChange (val);
4950 Session::start_time_changed (framepos_t old)
4952 /* Update the auto loop range to match the session range
4953 (unless the auto loop range has been changed by the user)
4956 Location* s = _locations->session_range_location ();
4961 Location* l = _locations->auto_loop_location ();
4963 if (l && l->start() == old) {
4964 l->set_start (s->start(), true);
4969 Session::end_time_changed (framepos_t old)
4971 /* Update the auto loop range to match the session range
4972 (unless the auto loop range has been changed by the user)
4975 Location* s = _locations->session_range_location ();
4980 Location* l = _locations->auto_loop_location ();
4982 if (l && l->end() == old) {
4983 l->set_end (s->end(), true);
4987 std::vector<std::string>
4988 Session::source_search_path (DataType type) const
4992 if (session_dirs.size() == 1) {
4994 case DataType::AUDIO:
4995 sp.push_back (_session_dir->sound_path());
4997 case DataType::MIDI:
4998 sp.push_back (_session_dir->midi_path());
5002 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
5003 SessionDirectory sdir (i->path);
5005 case DataType::AUDIO:
5006 sp.push_back (sdir.sound_path());
5008 case DataType::MIDI:
5009 sp.push_back (sdir.midi_path());
5015 if (type == DataType::AUDIO) {
5016 const string sound_path_2X = _session_dir->sound_path_2X();
5017 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
5018 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
5019 sp.push_back (sound_path_2X);
5024 // now check the explicit (possibly user-specified) search path
5027 case DataType::AUDIO:
5028 sp += Searchpath(config.get_audio_search_path ());
5030 case DataType::MIDI:
5031 sp += Searchpath(config.get_midi_search_path ());
5039 Session::ensure_search_path_includes (const string& path, DataType type)
5048 case DataType::AUDIO:
5049 sp += Searchpath(config.get_audio_search_path ());
5051 case DataType::MIDI:
5052 sp += Searchpath (config.get_midi_search_path ());
5056 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
5057 /* No need to add this new directory if it has the same inode as
5058 an existing one; checking inode rather than name prevents duplicated
5059 directories when we are using symlinks.
5061 On Windows, I think we could just do if (*i == path) here.
5063 if (PBD::equivalent_paths (*i, path)) {
5071 case DataType::AUDIO:
5072 config.set_audio_search_path (sp.to_string());
5074 case DataType::MIDI:
5075 config.set_midi_search_path (sp.to_string());
5081 Session::remove_dir_from_search_path (const string& dir, DataType type)
5086 case DataType::AUDIO:
5087 sp = Searchpath(config.get_audio_search_path ());
5089 case DataType::MIDI:
5090 sp = Searchpath (config.get_midi_search_path ());
5097 case DataType::AUDIO:
5098 config.set_audio_search_path (sp.to_string());
5100 case DataType::MIDI:
5101 config.set_midi_search_path (sp.to_string());
5107 boost::shared_ptr<Speakers>
5108 Session::get_speakers()
5114 Session::unknown_processors () const
5118 boost::shared_ptr<RouteList> r = routes.reader ();
5119 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5120 list<string> t = (*i)->unknown_processors ();
5121 copy (t.begin(), t.end(), back_inserter (p));
5131 Session::update_latency (bool playback)
5133 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
5135 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
5139 boost::shared_ptr<RouteList> r = routes.reader ();
5140 framecnt_t max_latency = 0;
5143 /* reverse the list so that we work backwards from the last route to run to the first */
5144 RouteList* rl = routes.reader().get();
5145 r.reset (new RouteList (*rl));
5146 reverse (r->begin(), r->end());
5149 /* compute actual latency values for the given direction and store them all in per-port
5150 structures. this will also publish the same values (to JACK) so that computation of latency
5151 for routes can consistently use public latency values.
5154 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5155 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
5158 /* because we latency compensate playback, our published playback latencies should
5159 be the same for all output ports - all material played back by ardour has
5160 the same latency, whether its caused by plugins or by latency compensation. since
5161 these may differ from the values computed above, reset all playback port latencies
5165 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
5167 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5168 (*i)->set_public_port_latencies (max_latency, playback);
5173 post_playback_latency ();
5177 post_capture_latency ();
5180 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
5184 Session::post_playback_latency ()
5186 set_worst_playback_latency ();
5188 boost::shared_ptr<RouteList> r = routes.reader ();
5190 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5191 if (!(*i)->is_auditioner() && ((*i)->active())) {
5192 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
5196 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5197 (*i)->set_latency_compensation (_worst_track_latency);
5202 Session::post_capture_latency ()
5204 set_worst_capture_latency ();
5206 /* reflect any changes in capture latencies into capture offsets
5209 boost::shared_ptr<RouteList> rl = routes.reader();
5210 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5211 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5213 tr->set_capture_offset ();
5219 Session::initialize_latencies ()
5222 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5223 update_latency (false);
5224 update_latency (true);
5227 set_worst_io_latencies ();
5231 Session::set_worst_io_latencies ()
5233 set_worst_playback_latency ();
5234 set_worst_capture_latency ();
5238 Session::set_worst_playback_latency ()
5240 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5244 _worst_output_latency = 0;
5246 if (!_engine.connected()) {
5250 boost::shared_ptr<RouteList> r = routes.reader ();
5252 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5253 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
5256 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
5260 Session::set_worst_capture_latency ()
5262 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5266 _worst_input_latency = 0;
5268 if (!_engine.connected()) {
5272 boost::shared_ptr<RouteList> r = routes.reader ();
5274 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5275 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
5278 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
5282 Session::update_latency_compensation (bool force_whole_graph)
5284 bool some_track_latency_changed = false;
5286 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5290 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
5292 _worst_track_latency = 0;
5294 boost::shared_ptr<RouteList> r = routes.reader ();
5296 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5297 if (!(*i)->is_auditioner() && ((*i)->active())) {
5299 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
5300 some_track_latency_changed = true;
5302 _worst_track_latency = max (tl, _worst_track_latency);
5306 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
5307 (some_track_latency_changed ? "yes" : "no")));
5309 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
5311 if (some_track_latency_changed || force_whole_graph) {
5312 _engine.update_latencies ();
5316 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5317 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5321 tr->set_capture_offset ();
5326 Session::session_name_is_legal (const string& path)
5328 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
5330 for (int i = 0; illegal_chars[i]; ++i) {
5331 if (path.find (illegal_chars[i]) != string::npos) {
5332 return illegal_chars[i];
5340 Session::next_control_id () const
5344 /* the monitor bus remote ID is in a different
5345 * "namespace" than regular routes. its existence doesn't
5346 * affect normal (low) numbered routes.
5353 return nroutes() - subtract;
5357 Session::notify_remote_id_change ()
5359 if (deletion_in_progress()) {
5363 switch (Config->get_remote_model()) {
5365 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
5373 Session::sync_order_keys ()
5375 if (deletion_in_progress()) {
5379 /* tell everyone that something has happened to the sort keys
5380 and let them sync up with the change(s)
5381 this will give objects that manage the sort order keys the
5382 opportunity to keep them in sync if they wish to.
5385 DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
5387 reassign_track_numbers();
5389 Route::SyncOrderKeys (); /* EMIT SIGNAL */
5391 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
5395 Session::operation_in_progress (GQuark op) const
5397 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
5400 boost::shared_ptr<Port>
5401 Session::ltc_input_port () const
5403 return _ltc_input->nth (0);
5406 boost::shared_ptr<Port>
5407 Session::ltc_output_port () const
5409 return _ltc_output->nth (0);
5413 Session::reconnect_ltc_input ()
5417 string src = Config->get_ltc_source_port();
5419 _ltc_input->disconnect (this);
5421 if (src != _("None") && !src.empty()) {
5422 _ltc_input->nth (0)->connect (src);
5428 Session::reconnect_ltc_output ()
5433 string src = Config->get_ltc_sink_port();
5435 _ltc_output->disconnect (this);
5437 if (src != _("None") && !src.empty()) {
5438 _ltc_output->nth (0)->connect (src);