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/error.h"
40 #include "pbd/boost_debug.h"
41 #include "pbd/stl_delete.h"
42 #include "pbd/basename.h"
43 #include "pbd/stacktrace.h"
44 #include "pbd/file_utils.h"
45 #include "pbd/convert.h"
46 #include "pbd/unwind.h"
47 #include "pbd/search_path.h"
49 #include "ardour/amp.h"
50 #include "ardour/analyser.h"
51 #include "ardour/async_midi_port.h"
52 #include "ardour/audio_buffer.h"
53 #include "ardour/audio_diskstream.h"
54 #include "ardour/audio_port.h"
55 #include "ardour/audio_track.h"
56 #include "ardour/audioengine.h"
57 #include "ardour/audiofilesource.h"
58 #include "ardour/auditioner.h"
59 #include "ardour/buffer_manager.h"
60 #include "ardour/buffer_set.h"
61 #include "ardour/bundle.h"
62 #include "ardour/butler.h"
63 #include "ardour/click.h"
64 #include "ardour/control_protocol_manager.h"
65 #include "ardour/data_type.h"
66 #include "ardour/debug.h"
67 #include "ardour/filename_extensions.h"
68 #include "ardour/graph.h"
69 #include "ardour/midiport_manager.h"
70 #include "ardour/scene_changer.h"
71 #include "ardour/midi_track.h"
72 #include "ardour/midi_ui.h"
73 #include "ardour/operations.h"
74 #include "ardour/playlist.h"
75 #include "ardour/plugin.h"
76 #include "ardour/plugin_insert.h"
77 #include "ardour/process_thread.h"
78 #include "ardour/rc_configuration.h"
79 #include "ardour/recent_sessions.h"
80 #include "ardour/region.h"
81 #include "ardour/region_factory.h"
82 #include "ardour/route_graph.h"
83 #include "ardour/route_group.h"
84 #include "ardour/route_sorters.h"
85 #include "ardour/send.h"
86 #include "ardour/session.h"
87 #include "ardour/session_directory.h"
88 #include "ardour/session_playlists.h"
89 #include "ardour/smf_source.h"
90 #include "ardour/source_factory.h"
91 #include "ardour/speakers.h"
92 #include "ardour/track.h"
93 #include "ardour/utils.h"
95 #include "midi++/port.h"
96 #include "midi++/mmc.h"
107 using namespace ARDOUR;
110 bool Session::_disable_all_loaded_plugins = false;
112 PBD::Signal1<int,uint32_t> Session::AudioEngineSetupRequired;
113 PBD::Signal1<void,std::string> Session::Dialog;
114 PBD::Signal0<int> Session::AskAboutPendingState;
115 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
116 PBD::Signal0<void> Session::SendFeedback;
117 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
119 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
120 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
121 PBD::Signal2<void,std::string, std::string> Session::Exported;
122 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
123 PBD::Signal0<void> Session::Quit;
124 PBD::Signal0<void> Session::FeedbackDetected;
125 PBD::Signal0<void> Session::SuccessfulGraphSort;
126 PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
128 const framecnt_t Session::bounce_chunk_size = 65536;
129 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
130 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
132 /** @param snapshot_name Snapshot name, without .ardour suffix */
133 Session::Session (AudioEngine &eng,
134 const string& fullpath,
135 const string& snapshot_name,
136 BusProfile* bus_profile,
138 : playlists (new SessionPlaylists)
140 , process_function (&Session::process_with_events)
141 , _bounce_processing_active (false)
142 , waiting_for_sync_offset (false)
143 , _base_frame_rate (0)
144 , _current_frame_rate (0)
145 , _nominal_frame_rate (0)
146 , transport_sub_state (0)
147 , _record_status (Disabled)
148 , _transport_frame (0)
149 , _session_range_location (0)
152 , _transport_speed (0)
153 , _default_transport_speed (1.0)
154 , _last_transport_speed (0)
155 , _target_transport_speed (0.0)
156 , auto_play_legal (false)
157 , _last_slave_transport_frame (0)
158 , maximum_output_latency (0)
159 , _requested_return_frame (-1)
160 , current_block_size (0)
161 , _worst_output_latency (0)
162 , _worst_input_latency (0)
163 , _worst_track_latency (0)
164 , _have_captured (false)
167 , _non_soloed_outs_muted (false)
169 , _solo_isolated_cnt (0)
171 , _was_seamless (Config->get_seamless_loop ())
172 , _under_nsm_control (false)
173 , delta_accumulator_cnt (0)
174 , average_slave_delta (1800) // !!! why 1800 ???
176 , have_first_delta_accumulator (false)
177 , _slave_state (Stopped)
178 , post_export_sync (false)
179 , post_export_position (0)
181 , _export_started (false)
182 , _export_rolling (false)
183 , _pre_export_mmc_enabled (false)
184 , _name (snapshot_name)
186 , _send_qf_mtc (false)
187 , _pframes_since_last_mtc (0)
188 , session_midi_feedback (0)
190 , loop_changing (false)
192 , _session_dir (new SessionDirectory (fullpath))
193 , _current_snapshot_name (snapshot_name)
195 , state_was_pending (false)
196 , _state_of_the_state (StateOfTheState(CannotSave|InitialConnecting|Loading))
198 , _save_queued (false)
199 , _last_roll_location (0)
200 , _last_roll_or_reversal_location (0)
201 , _last_record_location (0)
202 , pending_locate_roll (false)
203 , pending_locate_frame (0)
204 , pending_locate_flush (false)
205 , pending_abort (false)
206 , pending_auto_loop (false)
207 , _butler (new Butler (*this))
208 , _post_transport_work (0)
209 , cumulative_rf_motion (0)
211 , _locations (new Locations (*this))
213 , outbound_mtc_timecode_frame (0)
214 , next_quarter_frame_to_send (-1)
215 , _frames_per_timecode_frame (0)
216 , _frames_per_hour (0)
217 , _timecode_frames_per_hour (0)
218 , last_timecode_valid (false)
219 , last_timecode_when (0)
220 , _send_timecode_update (false)
232 , ltc_timecode_offset (0)
233 , ltc_timecode_negative_offset (false)
234 , midi_control_ui (0)
236 , _all_route_group (new RouteGroup (*this, "all"))
237 , routes (new RouteList)
238 , _adding_routes_in_progress (false)
239 , destructive_index (0)
240 , _track_number_decimals(1)
241 , solo_update_disabled (false)
242 , default_fade_steepness (0)
243 , default_fade_msecs (0)
244 , _total_free_4k_blocks (0)
245 , _total_free_4k_blocks_uncertain (false)
246 , no_questions_about_missing_files (false)
249 , _bundles (new BundleList)
250 , _bundle_xml_node (0)
254 , click_emphasis_data (0)
256 , click_emphasis_length (0)
257 , _clicks_cleared (0)
258 , _play_range (false)
260 , first_file_data_format_reset (true)
261 , first_file_header_format_reset (true)
262 , have_looped (false)
263 , _have_rec_enabled_track (false)
265 , _suspend_timecode_transmission (0)
266 , _speakers (new Speakers)
268 , ignore_route_processor_changes (false)
275 pre_engine_init (fullpath);
278 if (ensure_engine (sr)) {
280 throw failed_constructor ();
283 if (create (mix_template, bus_profile)) {
285 throw failed_constructor ();
288 /* if a mix template was provided, then ::create() will
289 * have copied it into the session and we need to load it
290 * so that we have the state ready for ::set_state()
291 * after the engine is started.
293 * Note that we do NOT try to get the sample rate from
294 * the template at this time, though doing so would
295 * be easy if we decided this was an appropriate part
299 if (!mix_template.empty() && load_state (_current_snapshot_name)) {
300 throw failed_constructor ();
305 if (load_state (_current_snapshot_name)) {
306 throw failed_constructor ();
309 /* try to get sample rate from XML state so that we
310 * can influence the SR if we set up the audio
315 const XMLProperty* prop;
316 if ((prop = state_tree->root()->property (X_("sample-rate"))) != 0) {
317 sr = atoi (prop->value());
321 if (ensure_engine (sr)) {
323 throw failed_constructor ();
327 if (post_engine_init ()) {
329 throw failed_constructor ();
332 store_recent_sessions (_name, _path);
334 bool was_dirty = dirty();
336 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
338 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
339 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
342 DirtyChanged (); /* EMIT SIGNAL */
345 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
346 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
350 /* hook us up to the engine since we are now completely constructed */
352 BootMessage (_("Connect to engine"));
354 _engine.set_session (this);
355 _engine.reset_timebase ();
357 BootMessage (_("Session loading complete"));
370 Session::ensure_engine (uint32_t desired_sample_rate)
372 if (_engine.current_backend() == 0) {
373 /* backend is unknown ... */
374 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
375 if (r.get_value_or (-1) != 0) {
378 } else if (_engine.setup_required()) {
379 /* backend is known, but setup is needed */
380 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
381 if (r.get_value_or (-1) != 0) {
384 } else if (!_engine.running()) {
385 if (_engine.start()) {
390 /* at this point the engine should be running
393 if (!_engine.running()) {
397 return immediately_post_engine ();
402 Session::immediately_post_engine ()
404 /* Do various initializations that should take place directly after we
405 * know that the engine is running, but before we either create a
406 * session or set state for an existing one.
409 if (how_many_dsp_threads () > 1) {
410 /* For now, only create the graph if we are using >1 DSP threads, as
411 it is a bit slower than the old code with 1 thread.
413 _process_graph.reset (new Graph (*this));
416 /* every time we reconnect, recompute worst case output latencies */
418 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
420 if (synced_to_engine()) {
421 _engine.transport_stop ();
424 if (config.get_jack_time_master()) {
425 _engine.transport_locate (_transport_frame);
429 BootMessage (_("Set up LTC"));
431 BootMessage (_("Set up Click"));
433 BootMessage (_("Set up standard connections"));
437 catch (failed_constructor& err) {
447 vector<void*> debug_pointers;
449 /* if we got to here, leaving pending capture state around
453 remove_pending_capture_state ();
455 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
457 /* disconnect from any and all signals that we are connected to */
461 _engine.remove_session ();
463 /* deregister all ports - there will be no process or any other
464 * callbacks from the engine any more.
467 Port::PortDrop (); /* EMIT SIGNAL */
471 /* clear history so that no references to objects are held any more */
475 /* clear state tree so that no references to objects are held any more */
479 /* reset dynamic state version back to default */
481 Stateful::loading_state_version = 0;
483 _butler->drop_references ();
487 delete midi_control_ui;
488 delete _all_route_group;
490 if (click_data != default_click) {
491 delete [] click_data;
494 if (click_emphasis_data != default_click_emphasis) {
495 delete [] click_emphasis_data;
500 /* clear out any pending dead wood from RCU managed objects */
505 AudioDiskstream::free_working_buffers();
507 /* tell everyone who is still standing that we're about to die */
510 /* tell everyone to drop references and delete objects as we go */
512 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
513 RegionFactory::delete_all_regions ();
515 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
517 /* reset these three references to special routes before we do the usual route delete thing */
520 _master_out.reset ();
521 _monitor_out.reset ();
524 RCUWriter<RouteList> writer (routes);
525 boost::shared_ptr<RouteList> r = writer.get_copy ();
527 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
528 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
529 (*i)->drop_references ();
533 /* writer goes out of scope and updates master */
538 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
539 Glib::Threads::Mutex::Lock lm (source_lock);
540 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
541 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
542 i->second->drop_references ();
548 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
549 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
554 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
557 delete _scene_changer; _scene_changer = 0;
559 delete _mmc; _mmc = 0;
560 delete _midi_ports; _midi_ports = 0;
561 delete _locations; _locations = 0;
563 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
565 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
566 boost_debug_list_ptrs ();
571 Session::setup_ltc ()
575 _ltc_input.reset (new IO (*this, X_("LTC In"), IO::Input));
576 _ltc_output.reset (new IO (*this, X_("LTC Out"), IO::Output));
578 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC In"))) != 0) {
579 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
582 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
583 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
585 reconnect_ltc_input ();
588 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC Out"))) != 0) {
589 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
592 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
593 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
595 reconnect_ltc_output ();
598 /* fix up names of LTC ports because we don't want the normal
599 * IO style of NAME/TYPE-{in,out}N
602 _ltc_input->nth (0)->set_name (X_("LTC-in"));
603 _ltc_output->nth (0)->set_name (X_("LTC-out"));
607 Session::setup_click ()
610 _click_io.reset (new ClickIO (*this, X_("Click")));
611 _click_gain.reset (new Amp (*this));
612 _click_gain->activate ();
614 setup_click_state (state_tree->root());
616 setup_click_state (0);
621 Session::setup_click_state (const XMLNode* node)
623 const XMLNode* child = 0;
625 if (node && (child = find_named_node (*node, "Click")) != 0) {
627 /* existing state for Click */
630 if (Stateful::loading_state_version < 3000) {
631 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
633 const XMLNodeList& children (child->children());
634 XMLNodeList::const_iterator i = children.begin();
635 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
637 if (i != children.end()) {
638 c = _click_gain->set_state (**i, Stateful::loading_state_version);
644 _clicking = Config->get_clicking ();
648 error << _("could not setup Click I/O") << endmsg;
655 /* default state for Click: dual-mono to first 2 physical outputs */
658 _engine.get_physical_outputs (DataType::AUDIO, outs);
660 for (uint32_t physport = 0; physport < 2; ++physport) {
661 if (outs.size() > physport) {
662 if (_click_io->add_port (outs[physport], this)) {
663 // relax, even though its an error
668 if (_click_io->n_ports () > ChanCount::ZERO) {
669 _clicking = Config->get_clicking ();
675 Session::setup_bundles ()
677 vector<string> inputs[DataType::num_types];
678 vector<string> outputs[DataType::num_types];
679 for (uint32_t i = 0; i < DataType::num_types; ++i) {
680 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
681 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
684 /* Create a set of Bundle objects that map
685 to the physical I/O currently available. We create both
686 mono and stereo bundles, so that the common cases of mono
687 and stereo tracks get bundles to put in their mixer strip
688 in / out menus. There may be a nicer way of achieving that;
689 it doesn't really scale that well to higher channel counts
692 /* mono output bundles */
694 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
696 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
698 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
699 c->add_channel (_("mono"), DataType::AUDIO);
700 c->set_port (0, outputs[DataType::AUDIO][np]);
705 /* stereo output bundles */
707 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
708 if (np + 1 < outputs[DataType::AUDIO].size()) {
710 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
711 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
712 c->add_channel (_("L"), DataType::AUDIO);
713 c->set_port (0, outputs[DataType::AUDIO][np]);
714 c->add_channel (_("R"), DataType::AUDIO);
715 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
721 /* mono input bundles */
723 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
725 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
727 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
728 c->add_channel (_("mono"), DataType::AUDIO);
729 c->set_port (0, inputs[DataType::AUDIO][np]);
734 /* stereo input bundles */
736 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
737 if (np + 1 < inputs[DataType::AUDIO].size()) {
739 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
741 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
742 c->add_channel (_("L"), DataType::AUDIO);
743 c->set_port (0, inputs[DataType::AUDIO][np]);
744 c->add_channel (_("R"), DataType::AUDIO);
745 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
751 /* MIDI input bundles */
753 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
754 string n = inputs[DataType::MIDI][np];
755 boost::erase_first (n, X_("alsa_pcm:"));
757 boost::shared_ptr<Bundle> c (new Bundle (n, false));
758 c->add_channel ("", DataType::MIDI);
759 c->set_port (0, inputs[DataType::MIDI][np]);
763 /* MIDI output bundles */
765 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
766 string n = outputs[DataType::MIDI][np];
767 boost::erase_first (n, X_("alsa_pcm:"));
769 boost::shared_ptr<Bundle> c (new Bundle (n, true));
770 c->add_channel ("", DataType::MIDI);
771 c->set_port (0, outputs[DataType::MIDI][np]);
778 Session::auto_connect_master_bus ()
780 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
784 /* if requested auto-connect the outputs to the first N physical ports.
787 uint32_t limit = _master_out->n_outputs().n_total();
788 vector<string> outputs[DataType::num_types];
790 for (uint32_t i = 0; i < DataType::num_types; ++i) {
791 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
794 for (uint32_t n = 0; n < limit; ++n) {
795 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
797 if (outputs[p->type()].size() > n) {
798 connect_to = outputs[p->type()][n];
801 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
802 if (_master_out->output()->connect (p, connect_to, this)) {
803 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
812 Session::remove_monitor_section ()
818 /* force reversion to Solo-In-Place */
819 Config->set_solo_control_is_listen_control (false);
821 /* if we are auditioning, cancel it ... this is a workaround
822 to a problem (auditioning does not execute the process graph,
823 which is needed to remove routes when using >1 core for processing)
828 /* Hold process lock while doing this so that we don't hear bits and
829 * pieces of audio as we work on each route.
832 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
834 /* Connect tracks to monitor section. Note that in an
835 existing session, the internal sends will already exist, but we want the
836 routes to notice that they connect to the control out specifically.
840 boost::shared_ptr<RouteList> r = routes.reader ();
841 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
843 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
845 if ((*x)->is_monitor()) {
847 } else if ((*x)->is_master()) {
850 (*x)->remove_aux_or_listen (_monitor_out);
855 remove_route (_monitor_out);
856 auto_connect_master_bus ();
859 auditioner->connect ();
864 Session::add_monitor_section ()
868 if (_monitor_out || !_master_out) {
872 boost::shared_ptr<Route> r (new Route (*this, _("monitor"), Route::MonitorOut, DataType::AUDIO));
878 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
879 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
882 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
883 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
884 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
888 add_routes (rl, false, false, false);
890 assert (_monitor_out);
892 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
893 are undefined, at best.
896 uint32_t limit = _monitor_out->n_inputs().n_audio();
900 /* connect the inputs to the master bus outputs. this
901 * represents a separate data feed from the internal sends from
902 * each route. as of jan 2011, it allows the monitor section to
903 * conditionally ignore either the internal sends or the normal
904 * input feed, but we should really find a better way to do
908 _master_out->output()->disconnect (this);
910 for (uint32_t n = 0; n < limit; ++n) {
911 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
912 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
915 string connect_to = o->name();
916 if (_monitor_out->input()->connect (p, connect_to, this)) {
917 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
925 /* if monitor section is not connected, connect it to physical outs
928 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
930 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
932 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
935 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
937 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
938 Config->get_monitor_bus_preferred_bundle())
944 /* Monitor bus is audio only */
946 vector<string> outputs[DataType::num_types];
948 for (uint32_t i = 0; i < DataType::num_types; ++i) {
949 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
952 uint32_t mod = outputs[DataType::AUDIO].size();
953 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
957 for (uint32_t n = 0; n < limit; ++n) {
959 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
961 if (outputs[DataType::AUDIO].size() > (n % mod)) {
962 connect_to = outputs[DataType::AUDIO][n % mod];
965 if (!connect_to.empty()) {
966 if (_monitor_out->output()->connect (p, connect_to, this)) {
967 error << string_compose (
968 _("cannot connect control output %1 to %2"),
979 /* Hold process lock while doing this so that we don't hear bits and
980 * pieces of audio as we work on each route.
983 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
985 /* Connect tracks to monitor section. Note that in an
986 existing session, the internal sends will already exist, but we want the
987 routes to notice that they connect to the control out specifically.
991 boost::shared_ptr<RouteList> rls = routes.reader ();
993 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
995 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
997 if ((*x)->is_monitor()) {
999 } else if ((*x)->is_master()) {
1002 (*x)->enable_monitor_send ();
1007 auditioner->connect ();
1012 Session::hookup_io ()
1014 /* stop graph reordering notifications from
1015 causing resorts, etc.
1018 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
1022 /* we delay creating the auditioner till now because
1023 it makes its own connections to ports.
1027 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
1029 throw failed_constructor ();
1031 a->use_new_diskstream ();
1035 catch (failed_constructor& err) {
1036 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
1040 /* load bundles, which we may have postponed earlier on */
1041 if (_bundle_xml_node) {
1042 load_bundles (*_bundle_xml_node);
1043 delete _bundle_xml_node;
1046 /* Tell all IO objects to connect themselves together */
1048 IO::enable_connecting ();
1050 /* Now tell all "floating" ports to connect to whatever
1051 they should be connected to.
1054 AudioEngine::instance()->reconnect_ports ();
1056 /* Anyone who cares about input state, wake up and do something */
1058 IOConnectionsComplete (); /* EMIT SIGNAL */
1060 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
1062 /* now handle the whole enchilada as if it was one
1063 graph reorder event.
1068 /* update the full solo state, which can't be
1069 correctly determined on a per-route basis, but
1070 needs the global overview that only the session
1074 update_route_solo_state ();
1078 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
1080 boost::shared_ptr<Track> track = wp.lock ();
1085 boost::shared_ptr<Playlist> playlist;
1087 if ((playlist = track->playlist()) != 0) {
1088 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
1089 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
1090 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
1095 Session::record_enabling_legal () const
1097 /* this used to be in here, but survey says.... we don't need to restrict it */
1098 // if (record_status() == Recording) {
1102 if (Config->get_all_safe()) {
1109 Session::set_track_monitor_input_status (bool yn)
1111 boost::shared_ptr<RouteList> rl = routes.reader ();
1112 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1113 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1114 if (tr && tr->record_enabled ()) {
1115 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1116 tr->request_input_monitoring (yn);
1122 Session::auto_punch_start_changed (Location* location)
1124 replace_event (SessionEvent::PunchIn, location->start());
1126 if (get_record_enabled() && config.get_punch_in()) {
1127 /* capture start has been changed, so save new pending state */
1128 save_state ("", true);
1133 Session::auto_punch_end_changed (Location* location)
1135 framepos_t when_to_stop = location->end();
1136 // when_to_stop += _worst_output_latency + _worst_input_latency;
1137 replace_event (SessionEvent::PunchOut, when_to_stop);
1141 Session::auto_punch_changed (Location* location)
1143 framepos_t when_to_stop = location->end();
1145 replace_event (SessionEvent::PunchIn, location->start());
1146 //when_to_stop += _worst_output_latency + _worst_input_latency;
1147 replace_event (SessionEvent::PunchOut, when_to_stop);
1150 /** @param loc A loop location.
1151 * @param pos Filled in with the start time of the required fade-out (in session frames).
1152 * @param length Filled in with the length of the required fade-out.
1155 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
1157 pos = max (loc->start(), loc->end() - 64);
1158 length = loc->end() - pos;
1162 Session::auto_loop_changed (Location* location)
1164 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1167 auto_loop_declick_range (location, dcp, dcl);
1168 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1170 if (transport_rolling() && play_loop) {
1173 // if (_transport_frame > location->end()) {
1175 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1176 // relocate to beginning of loop
1177 clear_events (SessionEvent::LocateRoll);
1179 request_locate (location->start(), true);
1182 else if (Config->get_seamless_loop() && !loop_changing) {
1184 // schedule a locate-roll to refill the diskstreams at the
1185 // previous loop end
1186 loop_changing = true;
1188 if (location->end() > last_loopend) {
1189 clear_events (SessionEvent::LocateRoll);
1190 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1197 last_loopend = location->end();
1201 Session::set_auto_punch_location (Location* location)
1205 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1206 punch_connections.drop_connections();
1207 existing->set_auto_punch (false, this);
1208 remove_event (existing->start(), SessionEvent::PunchIn);
1209 clear_events (SessionEvent::PunchOut);
1210 auto_punch_location_changed (0);
1215 if (location == 0) {
1219 if (location->end() <= location->start()) {
1220 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1224 punch_connections.drop_connections ();
1226 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
1227 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
1228 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
1230 location->set_auto_punch (true, this);
1232 auto_punch_changed (location);
1234 auto_punch_location_changed (location);
1238 Session::set_auto_loop_location (Location* location)
1242 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1243 loop_connections.drop_connections ();
1244 existing->set_auto_loop (false, this);
1245 remove_event (existing->end(), SessionEvent::AutoLoop);
1248 auto_loop_declick_range (existing, dcp, dcl);
1249 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1250 auto_loop_location_changed (0);
1255 if (location == 0) {
1259 if (location->end() <= location->start()) {
1260 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1264 last_loopend = location->end();
1266 loop_connections.drop_connections ();
1268 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1269 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1270 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1272 location->set_auto_loop (true, this);
1274 /* take care of our stuff first */
1276 auto_loop_changed (location);
1278 /* now tell everyone else */
1280 auto_loop_location_changed (location);
1284 Session::locations_added (Location *)
1290 Session::locations_changed ()
1292 _locations->apply (*this, &Session::handle_locations_changed);
1296 Session::handle_locations_changed (Locations::LocationList& locations)
1298 Locations::LocationList::iterator i;
1300 bool set_loop = false;
1301 bool set_punch = false;
1303 for (i = locations.begin(); i != locations.end(); ++i) {
1307 if (location->is_auto_punch()) {
1308 set_auto_punch_location (location);
1311 if (location->is_auto_loop()) {
1312 set_auto_loop_location (location);
1316 if (location->is_session_range()) {
1317 _session_range_location = location;
1322 set_auto_loop_location (0);
1325 set_auto_punch_location (0);
1332 Session::enable_record ()
1334 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1335 /* no recording at anything except normal speed */
1340 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1342 if (rs == Recording) {
1346 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1348 _last_record_location = _transport_frame;
1349 _mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1351 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1352 set_track_monitor_input_status (true);
1355 RecordStateChanged ();
1362 Session::disable_record (bool rt_context, bool force)
1366 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1368 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1369 g_atomic_int_set (&_record_status, Disabled);
1370 _mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1372 if (rs == Recording) {
1373 g_atomic_int_set (&_record_status, Enabled);
1377 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1378 set_track_monitor_input_status (false);
1381 RecordStateChanged (); /* emit signal */
1384 remove_pending_capture_state ();
1390 Session::step_back_from_record ()
1392 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1394 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1395 set_track_monitor_input_status (false);
1398 RecordStateChanged (); /* emit signal */
1403 Session::maybe_enable_record ()
1405 if (_step_editors > 0) {
1409 g_atomic_int_set (&_record_status, Enabled);
1411 /* This function is currently called from somewhere other than an RT thread.
1412 This save_state() call therefore doesn't impact anything. Doing it here
1413 means that we save pending state of which sources the next record will use,
1414 which gives us some chance of recovering from a crash during the record.
1417 save_state ("", true);
1419 if (_transport_speed) {
1420 if (!config.get_punch_in()) {
1424 _mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1425 RecordStateChanged (); /* EMIT SIGNAL */
1432 Session::audible_frame () const
1438 /* the first of these two possible settings for "offset"
1439 mean that the audible frame is stationary until
1440 audio emerges from the latency compensation
1443 the second means that the audible frame is stationary
1444 until audio would emerge from a physical port
1445 in the absence of any plugin latency compensation
1448 offset = worst_playback_latency ();
1450 if (offset > current_block_size) {
1451 offset -= current_block_size;
1453 /* XXX is this correct? if we have no external
1454 physical connections and everything is internal
1455 then surely this is zero? still, how
1456 likely is that anyway?
1458 offset = current_block_size;
1461 if (synced_to_engine()) {
1462 tf = _engine.transport_frame();
1464 tf = _transport_frame;
1469 if (!non_realtime_work_pending()) {
1473 /* Check to see if we have passed the first guaranteed
1474 audible frame past our last start position. if not,
1475 return that last start point because in terms
1476 of audible frames, we have not moved yet.
1478 `Start position' in this context means the time we last
1479 either started, located, or changed transport direction.
1482 if (_transport_speed > 0.0f) {
1484 if (!play_loop || !have_looped) {
1485 if (tf < _last_roll_or_reversal_location + offset) {
1486 return _last_roll_or_reversal_location;
1494 } else if (_transport_speed < 0.0f) {
1496 /* XXX wot? no backward looping? */
1498 if (tf > _last_roll_or_reversal_location - offset) {
1499 return _last_roll_or_reversal_location;
1511 Session::set_frame_rate (framecnt_t frames_per_second)
1513 /** \fn void Session::set_frame_size(framecnt_t)
1514 the AudioEngine object that calls this guarantees
1515 that it will not be called while we are also in
1516 ::process(). Its fine to do things that block
1520 _base_frame_rate = frames_per_second;
1521 _nominal_frame_rate = frames_per_second;
1527 // XXX we need some equivalent to this, somehow
1528 // SndFileSource::setup_standard_crossfades (frames_per_second);
1532 /* XXX need to reset/reinstantiate all LADSPA plugins */
1536 Session::set_block_size (pframes_t nframes)
1538 /* the AudioEngine guarantees
1539 that it will not be called while we are also in
1540 ::process(). It is therefore fine to do things that block
1545 current_block_size = nframes;
1549 boost::shared_ptr<RouteList> r = routes.reader ();
1551 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1552 (*i)->set_block_size (nframes);
1555 boost::shared_ptr<RouteList> rl = routes.reader ();
1556 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1557 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1559 tr->set_block_size (nframes);
1563 set_worst_io_latencies ();
1569 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1571 boost::shared_ptr<Route> r2;
1573 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1574 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1578 /* make a copy of the existing list of routes that feed r1 */
1580 Route::FedBy existing (r1->fed_by());
1582 /* for each route that feeds r1, recurse, marking it as feeding
1586 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1587 if (!(r2 = i->r.lock ())) {
1588 /* (*i) went away, ignore it */
1592 /* r2 is a route that feeds r1 which somehow feeds base. mark
1593 base as being fed by r2
1596 rbase->add_fed_by (r2, i->sends_only);
1600 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1604 if (r1->feeds (r2) && r2->feeds (r1)) {
1608 /* now recurse, so that we can mark base as being fed by
1609 all routes that feed r2
1612 trace_terminal (r2, rbase);
1619 Session::resort_routes ()
1621 /* don't do anything here with signals emitted
1622 by Routes during initial setup or while we
1623 are being destroyed.
1626 if (_state_of_the_state & (InitialConnecting | Deletion)) {
1631 RCUWriter<RouteList> writer (routes);
1632 boost::shared_ptr<RouteList> r = writer.get_copy ();
1633 resort_routes_using (r);
1634 /* writer goes out of scope and forces update */
1638 boost::shared_ptr<RouteList> rl = routes.reader ();
1639 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1640 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1642 const Route::FedBy& fb ((*i)->fed_by());
1644 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1645 boost::shared_ptr<Route> sf = f->r.lock();
1647 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1655 /** This is called whenever we need to rebuild the graph of how we will process
1657 * @param r List of routes, in any order.
1661 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1663 /* We are going to build a directed graph of our routes;
1664 this is where the edges of that graph are put.
1669 /* Go through all routes doing two things:
1671 * 1. Collect the edges of the route graph. Each of these edges
1672 * is a pair of routes, one of which directly feeds the other
1673 * either by a JACK connection or by an internal send.
1675 * 2. Begin the process of making routes aware of which other
1676 * routes directly or indirectly feed them. This information
1677 * is used by the solo code.
1680 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1682 /* Clear out the route's list of direct or indirect feeds */
1683 (*i)->clear_fed_by ();
1685 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
1687 bool via_sends_only;
1689 /* See if this *j feeds *i according to the current state of the JACK
1690 connections and internal sends.
1692 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
1693 /* add the edge to the graph (part #1) */
1694 edges.add (*j, *i, via_sends_only);
1695 /* tell the route (for part #2) */
1696 (*i)->add_fed_by (*j, via_sends_only);
1701 /* Attempt a topological sort of the route graph */
1702 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
1704 if (sorted_routes) {
1705 /* We got a satisfactory topological sort, so there is no feedback;
1708 Note: the process graph rechain does not require a
1709 topologically-sorted list, but hey ho.
1711 if (_process_graph) {
1712 _process_graph->rechain (sorted_routes, edges);
1715 _current_route_graph = edges;
1717 /* Complete the building of the routes' lists of what directly
1718 or indirectly feeds them.
1720 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1721 trace_terminal (*i, *i);
1724 *r = *sorted_routes;
1727 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1728 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1729 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1730 (*i)->name(), (*i)->order_key ()));
1734 SuccessfulGraphSort (); /* EMIT SIGNAL */
1737 /* The topological sort failed, so we have a problem. Tell everyone
1738 and stick to the old graph; this will continue to be processed, so
1739 until the feedback is fixed, what is played back will not quite
1740 reflect what is actually connected. Note also that we do not
1741 do trace_terminal here, as it would fail due to an endless recursion,
1742 so the solo code will think that everything is still connected
1746 FeedbackDetected (); /* EMIT SIGNAL */
1751 /** Find a route name starting with \a base, maybe followed by the
1752 * lowest \a id. \a id will always be added if \a definitely_add_number
1753 * is true on entry; otherwise it will only be added if required
1754 * to make the name unique.
1756 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1757 * The available route name with the lowest ID will be used, and \a id
1758 * will be set to the ID.
1760 * \return false if a route name could not be found, and \a track_name
1761 * and \a id do not reflect a free route name.
1764 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1766 if (!definitely_add_number && route_by_name (base) == 0) {
1767 /* juse use the base */
1768 snprintf (name, name_len, "%s", base.c_str());
1773 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1775 if (route_by_name (name) == 0) {
1781 } while (id < (UINT_MAX-1));
1786 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
1788 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
1790 in = ChanCount::ZERO;
1791 out = ChanCount::ZERO;
1793 boost::shared_ptr<RouteList> r = routes.reader ();
1795 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1796 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1797 if (tr && !tr->is_auditioner()) {
1798 in += tr->n_inputs();
1799 out += tr->n_outputs();
1804 /** Caller must not hold process lock
1805 * @param name_template string to use for the start of the name, or "" to use "MIDI".
1806 * @param instrument plugin info for the instrument to insert pre-fader, if any
1808 list<boost::shared_ptr<MidiTrack> >
1809 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
1810 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1812 char track_name[32];
1813 uint32_t track_id = 0;
1815 RouteList new_routes;
1816 list<boost::shared_ptr<MidiTrack> > ret;
1818 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
1821 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1822 error << "cannot find name for new midi track" << endmsg;
1826 boost::shared_ptr<MidiTrack> track;
1829 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1831 if (track->init ()) {
1835 track->use_new_diskstream();
1837 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1838 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1841 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1842 if (track->input()->ensure_io (input, false, this)) {
1843 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
1847 if (track->output()->ensure_io (output, false, this)) {
1848 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
1853 track->non_realtime_input_change();
1856 route_group->add (track);
1859 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1861 if (Config->get_remote_model() == UserOrdered) {
1862 track->set_remote_control_id (next_control_id());
1865 new_routes.push_back (track);
1866 ret.push_back (track);
1869 catch (failed_constructor &err) {
1870 error << _("Session: could not create new midi track.") << endmsg;
1874 catch (AudioEngine::PortRegistrationFailure& pfe) {
1876 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;
1884 if (!new_routes.empty()) {
1885 StateProtector sp (this);
1886 add_routes (new_routes, true, true, true);
1889 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
1890 PluginPtr plugin = instrument->load (*this);
1891 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
1892 (*r)->add_processor (p, PreFader);
1902 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
1904 boost::shared_ptr<Route> midi_track (wmt.lock());
1910 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
1912 if (change.after.n_audio() <= change.before.n_audio()) {
1916 /* new audio ports: make sure the audio goes somewhere useful,
1917 unless the user has no-auto-connect selected.
1919 The existing ChanCounts don't matter for this call as they are only
1920 to do with matching input and output indices, and we are only changing
1926 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
1930 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1931 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1932 * @param output_start As \a input_start, but for outputs.
1935 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
1936 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
1938 if (!IO::connecting_legal) {
1942 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1948 /* If both inputs and outputs are auto-connected to physical ports,
1949 use the max of input and output offsets to ensure auto-connected
1950 port numbers always match up (e.g. the first audio input and the
1951 first audio output of the route will have the same physical
1952 port number). Otherwise just use the lowest input or output
1956 DEBUG_TRACE (DEBUG::Graph,
1957 string_compose("Auto-connect: existing in = %1 out = %2\n",
1958 existing_inputs, existing_outputs));
1960 const bool in_out_physical =
1961 (Config->get_input_auto_connect() & AutoConnectPhysical)
1962 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1965 const ChanCount in_offset = in_out_physical
1966 ? ChanCount::max(existing_inputs, existing_outputs)
1969 const ChanCount out_offset = in_out_physical
1970 ? ChanCount::max(existing_inputs, existing_outputs)
1973 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1974 vector<string> physinputs;
1975 vector<string> physoutputs;
1977 _engine.get_physical_outputs (*t, physoutputs);
1978 _engine.get_physical_inputs (*t, physinputs);
1980 if (!physinputs.empty() && connect_inputs) {
1981 uint32_t nphysical_in = physinputs.size();
1983 DEBUG_TRACE (DEBUG::Graph,
1984 string_compose("There are %1 physical inputs of type %2\n",
1987 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1990 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1991 DEBUG_TRACE (DEBUG::Graph,
1992 string_compose("Get index %1 + %2 % %3 = %4\n",
1993 in_offset.get(*t), i, nphysical_in,
1994 (in_offset.get(*t) + i) % nphysical_in));
1995 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1998 DEBUG_TRACE (DEBUG::Graph,
1999 string_compose("Connect route %1 IN to %2\n",
2000 route->name(), port));
2002 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
2006 ChanCount one_added (*t, 1);
2007 existing_inputs += one_added;
2011 if (!physoutputs.empty()) {
2012 uint32_t nphysical_out = physoutputs.size();
2013 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
2016 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
2017 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
2018 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
2019 /* master bus is audio only */
2020 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
2021 port = _master_out->input()->ports().port(*t,
2022 i % _master_out->input()->n_ports().get(*t))->name();
2026 DEBUG_TRACE (DEBUG::Graph,
2027 string_compose("Connect route %1 OUT to %2\n",
2028 route->name(), port));
2030 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
2034 ChanCount one_added (*t, 1);
2035 existing_outputs += one_added;
2041 /** Caller must not hold process lock
2042 * @param name_template string to use for the start of the name, or "" to use "Audio".
2044 list< boost::shared_ptr<AudioTrack> >
2045 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
2046 uint32_t how_many, string name_template)
2048 char track_name[32];
2049 uint32_t track_id = 0;
2051 RouteList new_routes;
2052 list<boost::shared_ptr<AudioTrack> > ret;
2054 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
2057 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
2058 error << "cannot find name for new audio track" << endmsg;
2062 boost::shared_ptr<AudioTrack> track;
2065 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
2067 if (track->init ()) {
2071 track->use_new_diskstream();
2073 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2074 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2077 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2079 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2080 error << string_compose (
2081 _("cannot configure %1 in/%2 out configuration for new audio track"),
2082 input_channels, output_channels)
2087 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2088 error << string_compose (
2089 _("cannot configure %1 in/%2 out configuration for new audio track"),
2090 input_channels, output_channels)
2097 route_group->add (track);
2100 track->non_realtime_input_change();
2102 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2103 if (Config->get_remote_model() == UserOrdered) {
2104 track->set_remote_control_id (next_control_id());
2107 new_routes.push_back (track);
2108 ret.push_back (track);
2111 catch (failed_constructor &err) {
2112 error << _("Session: could not create new audio track.") << endmsg;
2116 catch (AudioEngine::PortRegistrationFailure& pfe) {
2118 error << pfe.what() << endmsg;
2126 if (!new_routes.empty()) {
2127 StateProtector sp (this);
2128 add_routes (new_routes, true, true, true);
2134 /** Caller must not hold process lock.
2135 * @param name_template string to use for the start of the name, or "" to use "Bus".
2138 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
2141 uint32_t bus_id = 0;
2145 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
2148 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
2149 error << "cannot find name for new audio bus" << endmsg;
2154 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
2160 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2161 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
2164 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2166 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2167 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2168 input_channels, output_channels)
2174 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2175 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2176 input_channels, output_channels)
2183 route_group->add (bus);
2185 if (Config->get_remote_model() == UserOrdered) {
2186 bus->set_remote_control_id (next_control_id());
2189 bus->add_internal_return ();
2191 ret.push_back (bus);
2197 catch (failed_constructor &err) {
2198 error << _("Session: could not create new audio route.") << endmsg;
2202 catch (AudioEngine::PortRegistrationFailure& pfe) {
2203 error << pfe.what() << endmsg;
2213 StateProtector sp (this);
2214 add_routes (ret, false, true, true); // autoconnect outputs only
2222 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base)
2225 uint32_t control_id;
2227 uint32_t number = 0;
2228 const uint32_t being_added = how_many;
2230 if (!tree.read (template_path.c_str())) {
2234 XMLNode* node = tree.root();
2236 IO::disable_connecting ();
2238 control_id = next_control_id ();
2242 XMLNode node_copy (*node);
2244 /* Remove IDs of everything so that new ones are used */
2245 node_copy.remove_property_recursively (X_("id"));
2250 if (!name_base.empty()) {
2252 /* if we're adding more than one routes, force
2253 * all the names of the new routes to be
2254 * numbered, via the final parameter.
2257 if (!find_route_name (name_base.c_str(), ++number, name, sizeof(name), (being_added > 1))) {
2258 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2264 string const route_name = node_copy.property(X_("name"))->value ();
2266 /* generate a new name by adding a number to the end of the template name */
2267 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2268 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2273 /* set this name in the XML description that we are about to use */
2274 Route::set_name_in_state (node_copy, name);
2276 /* trim bitslots from listen sends so that new ones are used */
2277 XMLNodeList children = node_copy.children ();
2278 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2279 if ((*i)->name() == X_("Processor")) {
2280 XMLProperty* role = (*i)->property (X_("role"));
2281 if (role && role->value() == X_("Listen")) {
2282 (*i)->remove_property (X_("bitslot"));
2287 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2290 error << _("Session: cannot create track/bus from template description") << endmsg;
2294 if (boost::dynamic_pointer_cast<Track>(route)) {
2295 /* force input/output change signals so that the new diskstream
2296 picks up the configuration of the route. During session
2297 loading this normally happens in a different way.
2300 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2302 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2303 change.after = route->input()->n_ports();
2304 route->input()->changed (change, this);
2305 change.after = route->output()->n_ports();
2306 route->output()->changed (change, this);
2309 route->set_remote_control_id (control_id);
2312 ret.push_back (route);
2315 catch (failed_constructor &err) {
2316 error << _("Session: could not create new route from template") << endmsg;
2320 catch (AudioEngine::PortRegistrationFailure& pfe) {
2321 error << pfe.what() << endmsg;
2330 StateProtector sp (this);
2331 add_routes (ret, true, true, true);
2332 IO::enable_connecting ();
2339 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
2342 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
2343 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
2346 error << _("Adding new tracks/busses failed") << endmsg;
2351 update_latency (true);
2352 update_latency (false);
2357 save_state (_current_snapshot_name);
2360 reassign_track_numbers();
2362 RouteAdded (new_routes); /* EMIT SIGNAL */
2366 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
2368 ChanCount existing_inputs;
2369 ChanCount existing_outputs;
2370 uint32_t order = next_control_id();
2372 if (_order_hint != 0) {
2373 order = _order_hint;
2377 count_existing_track_channels (existing_inputs, existing_outputs);
2380 RCUWriter<RouteList> writer (routes);
2381 boost::shared_ptr<RouteList> r = writer.get_copy ();
2382 r->insert (r->end(), new_routes.begin(), new_routes.end());
2384 /* if there is no control out and we're not in the middle of loading,
2385 resort the graph here. if there is a control out, we will resort
2386 toward the end of this method. if we are in the middle of loading,
2387 we will resort when done.
2390 if (!_monitor_out && IO::connecting_legal) {
2391 resort_routes_using (r);
2395 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2397 boost::weak_ptr<Route> wpr (*x);
2398 boost::shared_ptr<Route> r (*x);
2400 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2401 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2402 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2403 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2404 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2405 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2407 if (r->is_master()) {
2411 if (r->is_monitor()) {
2415 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2417 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2418 track_playlist_changed (boost::weak_ptr<Track> (tr));
2419 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2421 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2423 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2424 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2429 if (input_auto_connect || output_auto_connect) {
2430 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
2433 /* order keys are a GUI responsibility but we need to set up
2434 reasonable defaults because they also affect the remote control
2435 ID in most situations.
2438 if (!r->has_order_key ()) {
2439 if (r->is_auditioner()) {
2440 /* use an arbitrarily high value */
2441 r->set_order_key (UINT_MAX);
2443 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
2444 r->set_order_key (order);
2452 if (_monitor_out && IO::connecting_legal) {
2453 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
2455 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2456 if ((*x)->is_monitor()) {
2458 } else if ((*x)->is_master()) {
2461 (*x)->enable_monitor_send ();
2468 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2470 boost::shared_ptr<RouteList> r = routes.reader ();
2471 boost::shared_ptr<Send> s;
2473 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2474 if ((s = (*i)->internal_send_for (dest)) != 0) {
2475 s->amp()->gain_control()->set_value (0.0);
2481 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2483 boost::shared_ptr<RouteList> r = routes.reader ();
2484 boost::shared_ptr<Send> s;
2486 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2487 if ((s = (*i)->internal_send_for (dest)) != 0) {
2488 s->amp()->gain_control()->set_value (1.0);
2494 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2496 boost::shared_ptr<RouteList> r = routes.reader ();
2497 boost::shared_ptr<Send> s;
2499 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2500 if ((s = (*i)->internal_send_for (dest)) != 0) {
2501 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2506 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2508 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2510 boost::shared_ptr<RouteList> r = routes.reader ();
2511 boost::shared_ptr<RouteList> t (new RouteList);
2513 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2514 /* no MIDI sends because there are no MIDI busses yet */
2515 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2520 add_internal_sends (dest, p, t);
2524 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2526 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2527 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
2532 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
2534 add_internal_send (dest, sender->before_processor_for_index (index), sender);
2538 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
2540 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
2544 if (!dest->internal_return()) {
2545 dest->add_internal_return ();
2548 sender->add_aux_send (dest, before);
2554 Session::remove_route (boost::shared_ptr<Route> route)
2556 if (route == _master_out) {
2560 route->set_solo (false, this);
2563 RCUWriter<RouteList> writer (routes);
2564 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2568 /* deleting the master out seems like a dumb
2569 idea, but its more of a UI policy issue
2573 if (route == _master_out) {
2574 _master_out = boost::shared_ptr<Route> ();
2577 if (route == _monitor_out) {
2578 _monitor_out.reset ();
2581 /* writer goes out of scope, forces route list update */
2584 update_route_solo_state ();
2586 // We need to disconnect the route's inputs and outputs
2588 route->input()->disconnect (0);
2589 route->output()->disconnect (0);
2591 /* if the route had internal sends sending to it, remove them */
2592 if (route->internal_return()) {
2594 boost::shared_ptr<RouteList> r = routes.reader ();
2595 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2596 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2598 (*i)->remove_processor (s);
2603 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2604 if (mt && mt->step_editing()) {
2605 if (_step_editors > 0) {
2610 update_latency_compensation ();
2613 /* Re-sort routes to remove the graph's current references to the one that is
2614 * going away, then flush old references out of the graph.
2618 if (_process_graph) {
2619 _process_graph->clear_other_chain ();
2622 /* get rid of it from the dead wood collection in the route list manager */
2624 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2628 /* try to cause everyone to drop their references */
2630 route->drop_references ();
2632 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2634 /* save the new state of the world */
2636 if (save_state (_current_snapshot_name)) {
2637 save_history (_current_snapshot_name);
2639 reassign_track_numbers();
2643 Session::route_mute_changed (void* /*src*/)
2649 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2651 boost::shared_ptr<Route> route = wpr.lock();
2653 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2657 if (route->listening_via_monitor ()) {
2659 if (Config->get_exclusive_solo()) {
2660 /* new listen: disable all other listen */
2661 boost::shared_ptr<RouteList> r = routes.reader ();
2662 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2663 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
2666 (*i)->set_listen (false, this);
2672 } else if (_listen_cnt > 0) {
2677 update_route_solo_state ();
2680 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2682 boost::shared_ptr<Route> route = wpr.lock ();
2685 /* should not happen */
2686 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2690 bool send_changed = false;
2692 if (route->solo_isolated()) {
2693 if (_solo_isolated_cnt == 0) {
2694 send_changed = true;
2696 _solo_isolated_cnt++;
2697 } else if (_solo_isolated_cnt > 0) {
2698 _solo_isolated_cnt--;
2699 if (_solo_isolated_cnt == 0) {
2700 send_changed = true;
2705 IsolatedChanged (); /* EMIT SIGNAL */
2710 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2712 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
2714 if (!self_solo_change) {
2715 // session doesn't care about changes to soloed-by-others
2719 if (solo_update_disabled) {
2721 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
2725 boost::shared_ptr<Route> route = wpr.lock ();
2728 boost::shared_ptr<RouteList> r = routes.reader ();
2731 if (route->self_soloed()) {
2737 RouteGroup* rg = route->route_group ();
2738 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
2740 if (delta == 1 && Config->get_exclusive_solo()) {
2742 /* new solo: disable all other solos, but not the group if its solo-enabled */
2744 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2745 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
2746 (leave_group_alone && ((*i)->route_group() == rg))) {
2749 (*i)->set_solo (false, this);
2753 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
2755 solo_update_disabled = true;
2757 RouteList uninvolved;
2759 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
2761 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2762 bool via_sends_only;
2763 bool in_signal_flow;
2765 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
2766 (leave_group_alone && ((*i)->route_group() == rg))) {
2770 in_signal_flow = false;
2772 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
2774 if ((*i)->feeds (route, &via_sends_only)) {
2775 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
2776 if (!via_sends_only) {
2777 if (!route->soloed_by_others_upstream()) {
2778 (*i)->mod_solo_by_others_downstream (delta);
2781 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
2783 in_signal_flow = true;
2785 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
2788 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
2790 if (route->feeds (*i, &via_sends_only)) {
2791 /* propagate solo upstream only if routing other than
2792 sends is involved, but do consider the other route
2793 (*i) to be part of the signal flow even if only
2796 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
2800 route->soloed_by_others_downstream(),
2801 route->soloed_by_others_upstream()));
2802 if (!via_sends_only) {
2803 if (!route->soloed_by_others_downstream()) {
2804 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
2805 (*i)->mod_solo_by_others_upstream (delta);
2807 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
2810 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
2812 in_signal_flow = true;
2814 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
2817 if (!in_signal_flow) {
2818 uninvolved.push_back (*i);
2822 solo_update_disabled = false;
2823 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
2825 update_route_solo_state (r);
2827 /* now notify that the mute state of the routes not involved in the signal
2828 pathway of the just-solo-changed route may have altered.
2831 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2832 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
2833 (*i)->mute_changed (this);
2836 SoloChanged (); /* EMIT SIGNAL */
2841 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2843 /* now figure out if anything that matters is soloed (or is "listening")*/
2845 bool something_soloed = false;
2846 uint32_t listeners = 0;
2847 uint32_t isolated = 0;
2850 r = routes.reader();
2853 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2854 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
2855 something_soloed = true;
2858 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
2859 if (Config->get_solo_control_is_listen_control()) {
2862 (*i)->set_listen (false, this);
2866 if ((*i)->solo_isolated()) {
2871 if (something_soloed != _non_soloed_outs_muted) {
2872 _non_soloed_outs_muted = something_soloed;
2873 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2876 _listen_cnt = listeners;
2878 if (isolated != _solo_isolated_cnt) {
2879 _solo_isolated_cnt = isolated;
2880 IsolatedChanged (); /* EMIT SIGNAL */
2883 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
2884 something_soloed, listeners, isolated));
2887 boost::shared_ptr<RouteList>
2888 Session::get_routes_with_internal_returns() const
2890 boost::shared_ptr<RouteList> r = routes.reader ();
2891 boost::shared_ptr<RouteList> rl (new RouteList);
2893 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2894 if ((*i)->internal_return ()) {
2902 Session::io_name_is_legal (const std::string& name)
2904 boost::shared_ptr<RouteList> r = routes.reader ();
2906 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2907 if ((*i)->name() == name) {
2911 if ((*i)->has_io_processor_named (name)) {
2920 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
2923 vector<string> connections;
2925 /* if we are passed only a single route and we're not told to turn
2926 * others off, then just do the simple thing.
2929 if (flip_others == false && rl->size() == 1) {
2930 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
2932 mt->set_input_active (onoff);
2937 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
2939 PortSet& ps ((*rt)->input()->ports());
2941 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
2942 p->get_connections (connections);
2945 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
2946 routes_using_input_from (*s, rl2);
2949 /* scan all relevant routes to see if others are on or off */
2951 bool others_are_already_on = false;
2953 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
2955 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2961 if ((*r) != (*rt)) {
2962 if (mt->input_active()) {
2963 others_are_already_on = true;
2966 /* this one needs changing */
2967 mt->set_input_active (onoff);
2973 /* globally reverse other routes */
2975 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
2976 if ((*r) != (*rt)) {
2977 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2979 mt->set_input_active (!others_are_already_on);
2988 Session::routes_using_input_from (const string& str, RouteList& rl)
2990 boost::shared_ptr<RouteList> r = routes.reader();
2992 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2993 if ((*i)->input()->connected_to (str)) {
2999 boost::shared_ptr<Route>
3000 Session::route_by_name (string name)
3002 boost::shared_ptr<RouteList> r = routes.reader ();
3004 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3005 if ((*i)->name() == name) {
3010 return boost::shared_ptr<Route> ((Route*) 0);
3013 boost::shared_ptr<Route>
3014 Session::route_by_id (PBD::ID id)
3016 boost::shared_ptr<RouteList> r = routes.reader ();
3018 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3019 if ((*i)->id() == id) {
3024 return boost::shared_ptr<Route> ((Route*) 0);
3027 boost::shared_ptr<Track>
3028 Session::track_by_diskstream_id (PBD::ID id)
3030 boost::shared_ptr<RouteList> r = routes.reader ();
3032 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3033 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3034 if (t && t->using_diskstream_id (id)) {
3039 return boost::shared_ptr<Track> ();
3042 boost::shared_ptr<Route>
3043 Session::route_by_remote_id (uint32_t id)
3045 boost::shared_ptr<RouteList> r = routes.reader ();
3047 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3048 if ((*i)->remote_control_id() == id) {
3053 return boost::shared_ptr<Route> ((Route*) 0);
3058 Session::reassign_track_numbers ()
3062 RouteList r (*(routes.reader ()));
3063 SignalOrderRouteSorter sorter;
3066 StateProtector sp (this);
3068 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3069 if (boost::dynamic_pointer_cast<Track> (*i)) {
3070 (*i)->set_track_number(++tn);
3072 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
3073 (*i)->set_track_number(--bn);
3076 const uint32_t decimals = ceilf (log10f (tn + 1));
3077 const bool decimals_changed = _track_number_decimals != decimals;
3078 _track_number_decimals = decimals;
3080 if (decimals_changed && config.get_track_name_number ()) {
3081 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3082 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3084 t->resync_track_name();
3087 // trigger GUI re-layout
3088 config.ParameterChanged("track-name-number");
3093 Session::playlist_region_added (boost::weak_ptr<Region> w)
3095 boost::shared_ptr<Region> r = w.lock ();
3100 /* These are the operations that are currently in progress... */
3101 list<GQuark> curr = _current_trans_quarks;
3104 /* ...and these are the operations during which we want to update
3105 the session range location markers.
3108 ops.push_back (Operations::capture);
3109 ops.push_back (Operations::paste);
3110 ops.push_back (Operations::duplicate_region);
3111 ops.push_back (Operations::insert_file);
3112 ops.push_back (Operations::insert_region);
3113 ops.push_back (Operations::drag_region_brush);
3114 ops.push_back (Operations::region_drag);
3115 ops.push_back (Operations::selection_grab);
3116 ops.push_back (Operations::region_fill);
3117 ops.push_back (Operations::fill_selection);
3118 ops.push_back (Operations::create_region);
3119 ops.push_back (Operations::region_copy);
3120 ops.push_back (Operations::fixed_time_region_copy);
3123 /* See if any of the current operations match the ones that we want */
3125 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
3127 /* If so, update the session range markers */
3129 maybe_update_session_range (r->position (), r->last_frame ());
3133 /** Update the session range markers if a is before the current start or
3134 * b is after the current end.
3137 Session::maybe_update_session_range (framepos_t a, framepos_t b)
3139 if (_state_of_the_state & Loading) {
3143 if (_session_range_location == 0) {
3145 add_session_range_location (a, b);
3149 if (a < _session_range_location->start()) {
3150 _session_range_location->set_start (a);
3153 if (b > _session_range_location->end()) {
3154 _session_range_location->set_end (b);
3160 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
3162 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3163 maybe_update_session_range (i->to, i->to + i->length);
3168 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
3170 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3171 maybe_update_session_range (i->from, i->to);
3175 /* Region management */
3177 boost::shared_ptr<Region>
3178 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
3180 const RegionFactory::RegionMap& regions (RegionFactory::regions());
3181 RegionFactory::RegionMap::const_iterator i;
3182 boost::shared_ptr<Region> region;
3184 Glib::Threads::Mutex::Lock lm (region_lock);
3186 for (i = regions.begin(); i != regions.end(); ++i) {
3190 if (region->whole_file()) {
3192 if (child->source_equivalent (region)) {
3198 return boost::shared_ptr<Region> ();
3202 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
3204 set<boost::shared_ptr<Region> > relevant_regions;
3206 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
3207 RegionFactory::get_regions_using_source (*s, relevant_regions);
3210 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
3211 set<boost::shared_ptr<Region> >::iterator tmp;
3216 playlists->destroy_region (*r);
3217 RegionFactory::map_remove (*r);
3219 (*r)->drop_sources ();
3220 (*r)->drop_references ();
3222 relevant_regions.erase (r);
3227 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
3230 Glib::Threads::Mutex::Lock ls (source_lock);
3231 /* remove from the main source list */
3232 sources.erase ((*s)->id());
3235 (*s)->mark_for_remove ();
3236 (*s)->drop_references ();
3245 Session::remove_last_capture ()
3247 list<boost::shared_ptr<Source> > srcs;
3249 boost::shared_ptr<RouteList> rl = routes.reader ();
3250 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3251 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3256 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
3259 srcs.insert (srcs.end(), l.begin(), l.end());
3264 destroy_sources (srcs);
3266 save_state (_current_snapshot_name);
3271 /* Source Management */
3274 Session::add_source (boost::shared_ptr<Source> source)
3276 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
3277 pair<SourceMap::iterator,bool> result;
3279 entry.first = source->id();
3280 entry.second = source;
3283 Glib::Threads::Mutex::Lock lm (source_lock);
3284 result = sources.insert (entry);
3287 if (result.second) {
3289 /* yay, new source */
3291 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
3294 if (!fs->within_session()) {
3295 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
3301 boost::shared_ptr<AudioFileSource> afs;
3303 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
3304 if (Config->get_auto_analyse_audio()) {
3305 Analyser::queue_source_for_analysis (source, false);
3309 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
3314 Session::remove_source (boost::weak_ptr<Source> src)
3316 if (_state_of_the_state & Deletion) {
3320 SourceMap::iterator i;
3321 boost::shared_ptr<Source> source = src.lock();
3328 Glib::Threads::Mutex::Lock lm (source_lock);
3330 if ((i = sources.find (source->id())) != sources.end()) {
3335 if (!(_state_of_the_state & InCleanup)) {
3337 /* save state so we don't end up with a session file
3338 referring to non-existent sources.
3341 save_state (_current_snapshot_name);
3345 boost::shared_ptr<Source>
3346 Session::source_by_id (const PBD::ID& id)
3348 Glib::Threads::Mutex::Lock lm (source_lock);
3349 SourceMap::iterator i;
3350 boost::shared_ptr<Source> source;
3352 if ((i = sources.find (id)) != sources.end()) {
3359 boost::shared_ptr<AudioFileSource>
3360 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
3362 /* Restricted to audio files because only audio sources have channel
3366 Glib::Threads::Mutex::Lock lm (source_lock);
3368 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
3369 boost::shared_ptr<AudioFileSource> afs
3370 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
3372 if (afs && afs->path() == path && chn == afs->channel()) {
3377 return boost::shared_ptr<AudioFileSource>();
3380 boost::shared_ptr<MidiSource>
3381 Session::midi_source_by_path (const std::string& path) const
3383 /* Restricted to MIDI files because audio sources require a channel
3384 for unique identification, in addition to a path.
3387 Glib::Threads::Mutex::Lock lm (source_lock);
3389 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
3390 boost::shared_ptr<MidiSource> ms
3391 = boost::dynamic_pointer_cast<MidiSource>(s->second);
3392 boost::shared_ptr<FileSource> fs
3393 = boost::dynamic_pointer_cast<FileSource>(s->second);
3395 if (ms && fs && fs->path() == path) {
3400 return boost::shared_ptr<MidiSource>();
3404 Session::count_sources_by_origin (const string& path)
3407 Glib::Threads::Mutex::Lock lm (source_lock);
3409 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3410 boost::shared_ptr<FileSource> fs
3411 = boost::dynamic_pointer_cast<FileSource>(i->second);
3413 if (fs && fs->origin() == path) {
3421 /** Return the full path (in some session directory) for a new within-session source.
3422 * \a name must be a session-unique name that does not contain slashes
3423 * (e.g. as returned by new_*_source_name)
3426 Session::new_source_path_from_name (DataType type, const string& name)
3428 assert(name.find("/") == string::npos);
3430 SessionDirectory sdir(get_best_session_directory_for_new_source());
3433 if (type == DataType::AUDIO) {
3434 p = sdir.sound_path();
3435 } else if (type == DataType::MIDI) {
3436 p = sdir.midi_path();
3438 error << "Unknown source type, unable to create file path" << endmsg;
3442 return Glib::build_filename (p, name);
3446 Session::peak_path (string base) const
3448 return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
3451 /** Return a unique name based on \a base for a new internal audio source */
3453 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
3456 char buf[PATH_MAX+1];
3457 const uint32_t limit = 10000;
3459 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3462 legalized = legalize_for_path (base);
3464 // Find a "version" of the base name that doesn't exist in any of the possible directories.
3465 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3467 vector<space_and_path>::iterator i;
3468 uint32_t existing = 0;
3470 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3475 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3476 cnt, legalized.c_str(), ext.c_str());
3477 } else if (nchan == 2) {
3479 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
3480 cnt, legalized.c_str(), ext.c_str());
3482 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
3483 cnt, legalized.c_str(), ext.c_str());
3485 } else if (nchan < 26) {
3486 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
3487 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
3489 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3490 cnt, legalized.c_str(), ext.c_str());
3496 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3497 } else if (nchan == 2) {
3499 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
3501 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
3503 } else if (nchan < 26) {
3504 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
3506 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3510 SessionDirectory sdir((*i).path);
3512 string spath = sdir.sound_path();
3514 /* note that we search *without* the extension so that
3515 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3516 in the event that this new name is required for
3517 a file format change.
3520 if (matching_unsuffixed_filename_exists_in (spath, buf)) {
3525 /* it is possible that we have the path already
3526 * assigned to a source that has not yet been written
3527 * (ie. the write source for a diskstream). we have to
3528 * check this in order to make sure that our candidate
3529 * path isn't used again, because that can lead to
3530 * two Sources point to the same file with different
3531 * notions of their removability.
3534 string possible_path = Glib::build_filename (spath, buf);
3536 if (audio_source_by_path_and_channel (possible_path, chan)) {
3542 if (existing == 0) {
3547 error << string_compose(
3548 _("There are already %1 recordings for %2, which I consider too many."),
3549 limit, base) << endmsg;
3551 throw failed_constructor();
3555 return Glib::path_get_basename (buf);
3558 /** Create a new within-session audio source */
3559 boost::shared_ptr<AudioFileSource>
3560 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
3562 const string name = new_audio_source_name (n, n_chans, chan, destructive);
3563 const string path = new_source_path_from_name(DataType::AUDIO, name);
3565 return boost::dynamic_pointer_cast<AudioFileSource> (
3566 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
3569 /** Return a unique name based on \a owner_name for a new internal MIDI source */
3571 Session::new_midi_source_name (const string& owner_name)
3574 char buf[PATH_MAX+1];
3575 const uint32_t limit = 10000;
3577 string possible_name;
3580 legalized = legalize_for_path (owner_name);
3582 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3584 for (cnt = 1; cnt <= limit; ++cnt) {
3586 vector<space_and_path>::iterator i;
3587 uint32_t existing = 0;
3589 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3591 SessionDirectory sdir((*i).path);
3593 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
3594 possible_name = buf;
3596 std::string possible_path = Glib::build_filename (sdir.midi_path(), possible_name);
3598 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
3602 if (midi_source_by_path (possible_path)) {
3607 if (existing == 0) {
3612 error << string_compose(
3613 _("There are already %1 recordings for %2, which I consider too many."),
3614 limit, owner_name) << endmsg;
3616 throw failed_constructor();
3620 return possible_name;
3624 /** Create a new within-session MIDI source */
3625 boost::shared_ptr<MidiSource>
3626 Session::create_midi_source_for_session (string const & basic_name)
3631 name = new_midi_source_name (basic_name);
3634 const string path = new_source_path_from_name (DataType::MIDI, name);
3636 return boost::dynamic_pointer_cast<SMFSource> (
3637 SourceFactory::createWritable (
3638 DataType::MIDI, *this, path, false, frame_rate()));
3641 /** Create a new within-session MIDI source */
3642 boost::shared_ptr<MidiSource>
3643 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
3645 /* the caller passes in the track the source will be used in,
3646 so that we can keep the numbering sane.
3648 Rationale: a track with the name "Foo" that has had N
3649 captures carried out so far will ALREADY have a write source
3650 named "Foo-N+1.mid" waiting to be used for the next capture.
3652 If we call new_midi_source_name() we will get "Foo-N+2". But
3653 there is no region corresponding to "Foo-N+1", so when
3654 "Foo-N+2" appears in the track, the gap presents the user
3655 with odd behaviour - why did it skip past Foo-N+1?
3657 We could explain this to the user in some odd way, but
3658 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
3661 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
3664 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
3666 std::string name = track->steal_write_source_name ();
3669 return boost::shared_ptr<MidiSource>();
3672 const string path = new_source_path_from_name (DataType::MIDI, name);
3674 return boost::dynamic_pointer_cast<SMFSource> (
3675 SourceFactory::createWritable (
3676 DataType::MIDI, *this, path, false, frame_rate()));
3681 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3683 if (playlist->hidden()) {
3687 playlists->add (playlist);
3690 playlist->release();
3697 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3699 if (_state_of_the_state & Deletion) {
3703 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3709 playlists->remove (playlist);
3715 Session::set_audition (boost::shared_ptr<Region> r)
3717 pending_audition_region = r;
3718 add_post_transport_work (PostTransportAudition);
3719 _butler->schedule_transport_work ();
3723 Session::audition_playlist ()
3725 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3726 ev->region.reset ();
3731 Session::non_realtime_set_audition ()
3733 assert (pending_audition_region);
3734 auditioner->audition_region (pending_audition_region);
3735 pending_audition_region.reset ();
3736 AuditionActive (true); /* EMIT SIGNAL */
3740 Session::audition_region (boost::shared_ptr<Region> r)
3742 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3748 Session::cancel_audition ()
3750 if (auditioner->auditioning()) {
3751 auditioner->cancel_audition ();
3752 AuditionActive (false); /* EMIT SIGNAL */
3757 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3759 if (a->is_monitor()) {
3762 if (b->is_monitor()) {
3765 return a->order_key () < b->order_key ();
3769 Session::is_auditioning () const
3771 /* can be called before we have an auditioner object */
3773 return auditioner->auditioning();
3780 Session::graph_reordered ()
3782 /* don't do this stuff if we are setting up connections
3783 from a set_state() call or creating new tracks. Ditto for deletion.
3786 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
3790 /* every track/bus asked for this to be handled but it was deferred because
3791 we were connecting. do it now.
3794 request_input_change_handling ();
3798 /* force all diskstreams to update their capture offset values to
3799 reflect any changes in latencies within the graph.
3802 boost::shared_ptr<RouteList> rl = routes.reader ();
3803 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3804 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3806 tr->set_capture_offset ();
3811 /** @return Number of frames that there is disk space available to write,
3814 boost::optional<framecnt_t>
3815 Session::available_capture_duration ()
3817 Glib::Threads::Mutex::Lock lm (space_lock);
3819 if (_total_free_4k_blocks_uncertain) {
3820 return boost::optional<framecnt_t> ();
3823 float sample_bytes_on_disk = 4.0; // keep gcc happy
3825 switch (config.get_native_file_data_format()) {
3827 sample_bytes_on_disk = 4.0;
3831 sample_bytes_on_disk = 3.0;
3835 sample_bytes_on_disk = 2.0;
3839 /* impossible, but keep some gcc versions happy */
3840 fatal << string_compose (_("programming error: %1"),
3841 X_("illegal native file data format"))
3846 double scale = 4096.0 / sample_bytes_on_disk;
3848 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3849 return max_framecnt;
3852 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3856 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3859 RCUWriter<BundleList> writer (_bundles);
3860 boost::shared_ptr<BundleList> b = writer.get_copy ();
3861 b->push_back (bundle);
3864 BundleAdded (bundle); /* EMIT SIGNAL */
3870 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3872 bool removed = false;
3875 RCUWriter<BundleList> writer (_bundles);
3876 boost::shared_ptr<BundleList> b = writer.get_copy ();
3877 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3879 if (i != b->end()) {
3886 BundleRemoved (bundle); /* EMIT SIGNAL */
3892 boost::shared_ptr<Bundle>
3893 Session::bundle_by_name (string name) const
3895 boost::shared_ptr<BundleList> b = _bundles.reader ();
3897 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3898 if ((*i)->name() == name) {
3903 return boost::shared_ptr<Bundle> ();
3907 Session::tempo_map_changed (const PropertyChange&)
3911 playlists->update_after_tempo_map_change ();
3913 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3919 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3921 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3922 (*i)->recompute_frames_from_bbt ();
3926 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3927 * the given count with the current block size.
3930 Session::ensure_buffers (ChanCount howmany)
3932 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
3936 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3938 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3939 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3944 Session::next_insert_id ()
3946 /* this doesn't really loop forever. just think about it */
3949 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3950 if (!insert_bitset[n]) {
3951 insert_bitset[n] = true;
3957 /* none available, so resize and try again */
3959 insert_bitset.resize (insert_bitset.size() + 16, false);
3964 Session::next_send_id ()
3966 /* this doesn't really loop forever. just think about it */
3969 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3970 if (!send_bitset[n]) {
3971 send_bitset[n] = true;
3977 /* none available, so resize and try again */
3979 send_bitset.resize (send_bitset.size() + 16, false);
3984 Session::next_aux_send_id ()
3986 /* this doesn't really loop forever. just think about it */
3989 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
3990 if (!aux_send_bitset[n]) {
3991 aux_send_bitset[n] = true;
3997 /* none available, so resize and try again */
3999 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
4004 Session::next_return_id ()
4006 /* this doesn't really loop forever. just think about it */
4009 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
4010 if (!return_bitset[n]) {
4011 return_bitset[n] = true;
4017 /* none available, so resize and try again */
4019 return_bitset.resize (return_bitset.size() + 16, false);
4024 Session::mark_send_id (uint32_t id)
4026 if (id >= send_bitset.size()) {
4027 send_bitset.resize (id+16, false);
4029 if (send_bitset[id]) {
4030 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
4032 send_bitset[id] = true;
4036 Session::mark_aux_send_id (uint32_t id)
4038 if (id >= aux_send_bitset.size()) {
4039 aux_send_bitset.resize (id+16, false);
4041 if (aux_send_bitset[id]) {
4042 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
4044 aux_send_bitset[id] = true;
4048 Session::mark_return_id (uint32_t id)
4050 if (id >= return_bitset.size()) {
4051 return_bitset.resize (id+16, false);
4053 if (return_bitset[id]) {
4054 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
4056 return_bitset[id] = true;
4060 Session::mark_insert_id (uint32_t id)
4062 if (id >= insert_bitset.size()) {
4063 insert_bitset.resize (id+16, false);
4065 if (insert_bitset[id]) {
4066 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
4068 insert_bitset[id] = true;
4072 Session::unmark_send_id (uint32_t id)
4074 if (id < send_bitset.size()) {
4075 send_bitset[id] = false;
4080 Session::unmark_aux_send_id (uint32_t id)
4082 if (id < aux_send_bitset.size()) {
4083 aux_send_bitset[id] = false;
4088 Session::unmark_return_id (uint32_t id)
4090 if (id < return_bitset.size()) {
4091 return_bitset[id] = false;
4096 Session::unmark_insert_id (uint32_t id)
4098 if (id < insert_bitset.size()) {
4099 insert_bitset[id] = false;
4104 Session::reset_native_file_format ()
4106 boost::shared_ptr<RouteList> rl = routes.reader ();
4107 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4108 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4110 /* don't save state as we do this, there's no point
4113 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
4114 tr->reset_write_sources (false);
4115 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
4121 Session::route_name_unique (string n) const
4123 boost::shared_ptr<RouteList> r = routes.reader ();
4125 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4126 if ((*i)->name() == n) {
4135 Session::route_name_internal (string n) const
4137 if (auditioner && auditioner->name() == n) {
4141 if (_click_io && _click_io->name() == n) {
4149 Session::freeze_all (InterThreadInfo& itt)
4151 boost::shared_ptr<RouteList> r = routes.reader ();
4153 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4155 boost::shared_ptr<Track> t;
4157 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
4158 /* XXX this is wrong because itt.progress will keep returning to zero at the start
4168 boost::shared_ptr<Region>
4169 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
4170 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
4171 InterThreadInfo& itt,
4172 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
4173 bool for_export, bool for_freeze)
4175 boost::shared_ptr<Region> result;
4176 boost::shared_ptr<Playlist> playlist;
4177 boost::shared_ptr<AudioFileSource> fsource;
4179 ChanCount diskstream_channels (track.n_channels());
4180 framepos_t position;
4181 framecnt_t this_chunk;
4183 framepos_t latency_skip;
4185 SessionDirectory sdir(get_best_session_directory_for_new_source ());
4186 const string sound_dir = sdir.sound_path();
4187 framepos_t len = end - start;
4188 bool need_block_size_reset = false;
4190 ChanCount const max_proc = track.max_processor_streams ();
4191 string legal_playlist_name;
4192 string possible_path;
4195 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
4196 end, start) << endmsg;
4200 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
4201 include_endpoint, for_export, for_freeze);
4203 if (diskstream_channels.n_audio() < 1) {
4204 error << _("Cannot write a range with no audio.") << endmsg;
4208 // block all process callback handling
4210 block_processing ();
4213 // synchronize with AudioEngine::process_callback()
4214 // make sure processing is not currently running
4215 // and processing_blocked() is honored before
4216 // acquiring thread buffers
4217 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
4220 _bounce_processing_active = true;
4222 /* call tree *MUST* hold route_lock */
4224 if ((playlist = track.playlist()) == 0) {
4228 legal_playlist_name = legalize_for_path (playlist->name());
4230 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4232 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
4234 for (x = 0; x < 99999; ++x) {
4235 possible_path = Glib::build_filename (sound_dir, string_compose ("%1-%2-bounce-%3%4", legal_playlist_name.c_str(), chan_n, x+1, ext.c_str()));
4236 if (!Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
4242 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
4247 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
4248 SourceFactory::createWritable (DataType::AUDIO, *this, possible_path, false, frame_rate()));
4251 catch (failed_constructor& err) {
4252 error << string_compose (_("cannot create new audio file \"%1\" for %2"), possible_path, track.name()) << endmsg;
4256 srcs.push_back (fsource);
4259 /* tell redirects that care that we are about to use a much larger
4260 * blocksize. this will flush all plugins too, so that they are ready
4261 * to be used for this process.
4264 need_block_size_reset = true;
4265 track.set_block_size (bounce_chunk_size);
4266 _engine.main_thread()->get_buffers ();
4270 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
4272 /* create a set of reasonably-sized buffers */
4273 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4274 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
4276 buffers.set_count (max_proc);
4278 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4279 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4281 afs->prepare_for_peakfile_writes ();
4284 while (to_do && !itt.cancel) {
4286 this_chunk = min (to_do, bounce_chunk_size);
4288 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
4292 start += this_chunk;
4293 to_do -= this_chunk;
4294 itt.progress = (float) (1.0 - ((double) to_do / len));
4296 if (latency_skip >= bounce_chunk_size) {
4297 latency_skip -= bounce_chunk_size;
4301 const framecnt_t current_chunk = this_chunk - latency_skip;
4304 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4305 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4308 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
4316 /* post-roll, pick up delayed processor output */
4317 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
4319 while (latency_skip && !itt.cancel) {
4320 this_chunk = min (latency_skip, bounce_chunk_size);
4321 latency_skip -= this_chunk;
4323 buffers.silence (this_chunk, 0);
4324 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
4327 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4328 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4331 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
4343 xnow = localtime (&now);
4345 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
4346 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4349 afs->update_header (position, *xnow, now);
4350 afs->flush_header ();
4354 /* construct a region to represent the bounced material */
4358 plist.add (Properties::start, 0);
4359 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4360 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4362 result = RegionFactory::create (srcs, plist);
4368 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4369 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4372 afs->mark_for_remove ();
4375 (*src)->drop_references ();
4379 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4380 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4383 afs->done_with_peakfile_writes ();
4387 _bounce_processing_active = false;
4389 if (need_block_size_reset) {
4390 _engine.main_thread()->drop_buffers ();
4391 track.set_block_size (get_block_size());
4394 unblock_processing ();
4400 Session::gain_automation_buffer() const
4402 return ProcessThread::gain_automation_buffer ();
4406 Session::send_gain_automation_buffer() const
4408 return ProcessThread::send_gain_automation_buffer ();
4412 Session::pan_automation_buffer() const
4414 return ProcessThread::pan_automation_buffer ();
4418 Session::get_silent_buffers (ChanCount count)
4420 return ProcessThread::get_silent_buffers (count);
4424 Session::get_scratch_buffers (ChanCount count, bool silence)
4426 return ProcessThread::get_scratch_buffers (count, silence);
4430 Session::get_route_buffers (ChanCount count, bool silence)
4432 return ProcessThread::get_route_buffers (count, silence);
4437 Session::get_mix_buffers (ChanCount count)
4439 return ProcessThread::get_mix_buffers (count);
4443 Session::ntracks () const
4446 boost::shared_ptr<RouteList> r = routes.reader ();
4448 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4449 if (boost::dynamic_pointer_cast<Track> (*i)) {
4458 Session::nbusses () const
4461 boost::shared_ptr<RouteList> r = routes.reader ();
4463 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4464 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
4473 Session::add_automation_list(AutomationList *al)
4475 automation_lists[al->id()] = al;
4478 /** @return true if there is at least one record-enabled track, otherwise false */
4480 Session::have_rec_enabled_track () const
4482 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
4485 /** Update the state of our rec-enabled tracks flag */
4487 Session::update_have_rec_enabled_track ()
4489 boost::shared_ptr<RouteList> rl = routes.reader ();
4490 RouteList::iterator i = rl->begin();
4491 while (i != rl->end ()) {
4493 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4494 if (tr && tr->record_enabled ()) {
4501 int const old = g_atomic_int_get (&_have_rec_enabled_track);
4503 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4505 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4506 RecordStateChanged (); /* EMIT SIGNAL */
4511 Session::listen_position_changed ()
4513 boost::shared_ptr<RouteList> r = routes.reader ();
4515 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4516 (*i)->listen_position_changed ();
4521 Session::solo_control_mode_changed ()
4523 /* cancel all solo or all listen when solo control mode changes */
4526 set_solo (get_routes(), false);
4527 } else if (listening()) {
4528 set_listen (get_routes(), false);
4532 /** Called when a property of one of our route groups changes */
4534 Session::route_group_property_changed (RouteGroup* rg)
4536 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4539 /** Called when a route is added to one of our route groups */
4541 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4543 RouteAddedToRouteGroup (rg, r);
4546 /** Called when a route is removed from one of our route groups */
4548 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4550 RouteRemovedFromRouteGroup (rg, r);
4553 boost::shared_ptr<RouteList>
4554 Session::get_routes_with_regions_at (framepos_t const p) const
4556 boost::shared_ptr<RouteList> r = routes.reader ();
4557 boost::shared_ptr<RouteList> rl (new RouteList);
4559 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4560 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4565 boost::shared_ptr<Playlist> pl = tr->playlist ();
4570 if (pl->has_region_at (p)) {
4579 Session::goto_end ()
4581 if (_session_range_location) {
4582 request_locate (_session_range_location->end(), false);
4584 request_locate (0, false);
4589 Session::goto_start ()
4591 if (_session_range_location) {
4592 request_locate (_session_range_location->start(), false);
4594 request_locate (0, false);
4599 Session::current_start_frame () const
4601 return _session_range_location ? _session_range_location->start() : 0;
4605 Session::current_end_frame () const
4607 return _session_range_location ? _session_range_location->end() : 0;
4611 Session::add_session_range_location (framepos_t start, framepos_t end)
4613 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4614 _locations->add (_session_range_location);
4618 Session::step_edit_status_change (bool yn)
4624 send = (_step_editors == 0);
4629 send = (_step_editors == 1);
4632 if (_step_editors > 0) {
4638 StepEditStatusChange (val);
4644 Session::start_time_changed (framepos_t old)
4646 /* Update the auto loop range to match the session range
4647 (unless the auto loop range has been changed by the user)
4650 Location* s = _locations->session_range_location ();
4655 Location* l = _locations->auto_loop_location ();
4657 if (l && l->start() == old) {
4658 l->set_start (s->start(), true);
4663 Session::end_time_changed (framepos_t old)
4665 /* Update the auto loop range to match the session range
4666 (unless the auto loop range has been changed by the user)
4669 Location* s = _locations->session_range_location ();
4674 Location* l = _locations->auto_loop_location ();
4676 if (l && l->end() == old) {
4677 l->set_end (s->end(), true);
4681 std::vector<std::string>
4682 Session::source_search_path (DataType type) const
4686 if (session_dirs.size() == 1) {
4688 case DataType::AUDIO:
4689 sp.push_back (_session_dir->sound_path());
4691 case DataType::MIDI:
4692 sp.push_back (_session_dir->midi_path());
4696 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4697 SessionDirectory sdir (i->path);
4699 case DataType::AUDIO:
4700 sp.push_back (sdir.sound_path());
4702 case DataType::MIDI:
4703 sp.push_back (sdir.midi_path());
4709 if (type == DataType::AUDIO) {
4710 const string sound_path_2X = _session_dir->sound_path_2X();
4711 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
4712 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
4713 sp.push_back (sound_path_2X);
4718 // now check the explicit (possibly user-specified) search path
4721 case DataType::AUDIO:
4722 sp += Searchpath(config.get_audio_search_path ());
4724 case DataType::MIDI:
4725 sp += Searchpath(config.get_midi_search_path ());
4733 Session::ensure_search_path_includes (const string& path, DataType type)
4742 case DataType::AUDIO:
4743 sp += Searchpath(config.get_audio_search_path ());
4745 case DataType::MIDI:
4746 sp += Searchpath (config.get_midi_search_path ());
4750 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
4751 /* No need to add this new directory if it has the same inode as
4752 an existing one; checking inode rather than name prevents duplicated
4753 directories when we are using symlinks.
4755 On Windows, I think we could just do if (*i == path) here.
4757 if (PBD::equivalent_paths (*i, path)) {
4765 case DataType::AUDIO:
4766 config.set_audio_search_path (sp.to_string());
4768 case DataType::MIDI:
4769 config.set_midi_search_path (sp.to_string());
4774 boost::shared_ptr<Speakers>
4775 Session::get_speakers()
4781 Session::unknown_processors () const
4785 boost::shared_ptr<RouteList> r = routes.reader ();
4786 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4787 list<string> t = (*i)->unknown_processors ();
4788 copy (t.begin(), t.end(), back_inserter (p));
4798 Session::update_latency (bool playback)
4800 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
4802 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
4806 boost::shared_ptr<RouteList> r = routes.reader ();
4807 framecnt_t max_latency = 0;
4810 /* reverse the list so that we work backwards from the last route to run to the first */
4811 RouteList* rl = routes.reader().get();
4812 r.reset (new RouteList (*rl));
4813 reverse (r->begin(), r->end());
4816 /* compute actual latency values for the given direction and store them all in per-port
4817 structures. this will also publish the same values (to JACK) so that computation of latency
4818 for routes can consistently use public latency values.
4821 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4822 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
4825 /* because we latency compensate playback, our published playback latencies should
4826 be the same for all output ports - all material played back by ardour has
4827 the same latency, whether its caused by plugins or by latency compensation. since
4828 these may differ from the values computed above, reset all playback port latencies
4832 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
4834 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4835 (*i)->set_public_port_latencies (max_latency, playback);
4840 post_playback_latency ();
4844 post_capture_latency ();
4847 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
4851 Session::post_playback_latency ()
4853 set_worst_playback_latency ();
4855 boost::shared_ptr<RouteList> r = routes.reader ();
4857 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4858 if (!(*i)->is_auditioner() && ((*i)->active())) {
4859 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
4863 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4864 (*i)->set_latency_compensation (_worst_track_latency);
4869 Session::post_capture_latency ()
4871 set_worst_capture_latency ();
4873 /* reflect any changes in capture latencies into capture offsets
4876 boost::shared_ptr<RouteList> rl = routes.reader();
4877 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4878 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4880 tr->set_capture_offset ();
4886 Session::initialize_latencies ()
4889 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
4890 update_latency (false);
4891 update_latency (true);
4894 set_worst_io_latencies ();
4898 Session::set_worst_io_latencies ()
4900 set_worst_playback_latency ();
4901 set_worst_capture_latency ();
4905 Session::set_worst_playback_latency ()
4907 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4911 _worst_output_latency = 0;
4913 if (!_engine.connected()) {
4917 boost::shared_ptr<RouteList> r = routes.reader ();
4919 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4920 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
4923 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
4927 Session::set_worst_capture_latency ()
4929 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4933 _worst_input_latency = 0;
4935 if (!_engine.connected()) {
4939 boost::shared_ptr<RouteList> r = routes.reader ();
4941 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4942 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
4945 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
4949 Session::update_latency_compensation (bool force_whole_graph)
4951 bool some_track_latency_changed = false;
4953 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4957 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
4959 _worst_track_latency = 0;
4961 boost::shared_ptr<RouteList> r = routes.reader ();
4963 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4964 if (!(*i)->is_auditioner() && ((*i)->active())) {
4966 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
4967 some_track_latency_changed = true;
4969 _worst_track_latency = max (tl, _worst_track_latency);
4973 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
4974 (some_track_latency_changed ? "yes" : "no")));
4976 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
4978 if (some_track_latency_changed || force_whole_graph) {
4979 _engine.update_latencies ();
4983 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4984 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4988 tr->set_capture_offset ();
4993 Session::session_name_is_legal (const string& path)
4995 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
4997 for (int i = 0; illegal_chars[i]; ++i) {
4998 if (path.find (illegal_chars[i]) != string::npos) {
4999 return illegal_chars[i];
5007 Session::next_control_id () const
5011 /* the monitor bus remote ID is in a different
5012 * "namespace" than regular routes. its existence doesn't
5013 * affect normal (low) numbered routes.
5020 return nroutes() - subtract;
5024 Session::notify_remote_id_change ()
5026 if (deletion_in_progress()) {
5030 switch (Config->get_remote_model()) {
5032 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
5040 Session::sync_order_keys ()
5042 if (deletion_in_progress()) {
5046 /* tell everyone that something has happened to the sort keys
5047 and let them sync up with the change(s)
5048 this will give objects that manage the sort order keys the
5049 opportunity to keep them in sync if they wish to.
5052 DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
5054 reassign_track_numbers();
5056 Route::SyncOrderKeys (); /* EMIT SIGNAL */
5058 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
5062 Session::operation_in_progress (GQuark op) const
5064 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
5067 boost::shared_ptr<Port>
5068 Session::ltc_input_port () const
5070 return _ltc_input->nth (0);
5073 boost::shared_ptr<Port>
5074 Session::ltc_output_port () const
5076 return _ltc_output->nth (0);
5080 Session::reconnect_ltc_input ()
5084 string src = Config->get_ltc_source_port();
5086 _ltc_input->disconnect (this);
5088 if (src != _("None") && !src.empty()) {
5089 _ltc_input->nth (0)->connect (src);
5095 Session::reconnect_ltc_output ()
5100 string src = Config->get_ltc_sink_port();
5102 _ltc_output->disconnect (this);
5104 if (src != _("None") && !src.empty()) {
5105 _ltc_output->nth (0)->connect (src);