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 ();
303 /* load default session properties - if any */
308 if (load_state (_current_snapshot_name)) {
309 throw failed_constructor ();
312 /* try to get sample rate from XML state so that we
313 * can influence the SR if we set up the audio
318 const XMLProperty* prop;
319 if ((prop = state_tree->root()->property (X_("sample-rate"))) != 0) {
320 sr = atoi (prop->value());
324 if (ensure_engine (sr)) {
326 throw failed_constructor ();
330 if (post_engine_init ()) {
332 throw failed_constructor ();
335 store_recent_sessions (_name, _path);
337 bool was_dirty = dirty();
339 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
341 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
342 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
345 DirtyChanged (); /* EMIT SIGNAL */
348 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
349 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
353 /* hook us up to the engine since we are now completely constructed */
355 BootMessage (_("Connect to engine"));
357 _engine.set_session (this);
358 _engine.reset_timebase ();
360 BootMessage (_("Session loading complete"));
373 Session::ensure_engine (uint32_t desired_sample_rate)
375 if (_engine.current_backend() == 0) {
376 /* backend is unknown ... */
377 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
378 if (r.get_value_or (-1) != 0) {
381 } else if (_engine.setup_required()) {
382 /* backend is known, but setup is needed */
383 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
384 if (r.get_value_or (-1) != 0) {
387 } else if (!_engine.running()) {
388 if (_engine.start()) {
393 /* at this point the engine should be running
396 if (!_engine.running()) {
400 return immediately_post_engine ();
405 Session::immediately_post_engine ()
407 /* Do various initializations that should take place directly after we
408 * know that the engine is running, but before we either create a
409 * session or set state for an existing one.
412 if (how_many_dsp_threads () > 1) {
413 /* For now, only create the graph if we are using >1 DSP threads, as
414 it is a bit slower than the old code with 1 thread.
416 _process_graph.reset (new Graph (*this));
419 /* every time we reconnect, recompute worst case output latencies */
421 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
423 if (synced_to_engine()) {
424 _engine.transport_stop ();
427 if (config.get_jack_time_master()) {
428 _engine.transport_locate (_transport_frame);
432 BootMessage (_("Set up LTC"));
434 BootMessage (_("Set up Click"));
436 BootMessage (_("Set up standard connections"));
440 catch (failed_constructor& err) {
450 vector<void*> debug_pointers;
452 /* if we got to here, leaving pending capture state around
456 remove_pending_capture_state ();
458 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
460 /* disconnect from any and all signals that we are connected to */
464 _engine.remove_session ();
466 /* deregister all ports - there will be no process or any other
467 * callbacks from the engine any more.
470 Port::PortDrop (); /* EMIT SIGNAL */
474 /* clear history so that no references to objects are held any more */
478 /* clear state tree so that no references to objects are held any more */
482 /* reset dynamic state version back to default */
484 Stateful::loading_state_version = 0;
486 _butler->drop_references ();
490 delete midi_control_ui;
491 delete _all_route_group;
493 if (click_data != default_click) {
494 delete [] click_data;
497 if (click_emphasis_data != default_click_emphasis) {
498 delete [] click_emphasis_data;
503 /* need to remove auditioner before monitoring section
504 * otherwise it is re-connected */
507 /* drop references to routes held by the monitoring section
508 * specifically _monitor_out aux/listen references */
509 remove_monitor_section();
511 /* clear out any pending dead wood from RCU managed objects */
516 AudioDiskstream::free_working_buffers();
518 /* tell everyone who is still standing that we're about to die */
521 /* tell everyone to drop references and delete objects as we go */
523 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
524 RegionFactory::delete_all_regions ();
526 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
528 /* reset these three references to special routes before we do the usual route delete thing */
530 _master_out.reset ();
531 _monitor_out.reset ();
534 RCUWriter<RouteList> writer (routes);
535 boost::shared_ptr<RouteList> r = writer.get_copy ();
537 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
538 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
539 (*i)->drop_references ();
543 /* writer goes out of scope and updates master */
548 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
549 Glib::Threads::Mutex::Lock lm (source_lock);
550 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
551 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
552 i->second->drop_references ();
558 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
559 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
564 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
567 delete _scene_changer; _scene_changer = 0;
569 delete _mmc; _mmc = 0;
570 delete _midi_ports; _midi_ports = 0;
571 delete _locations; _locations = 0;
573 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
575 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
576 boost_debug_list_ptrs ();
581 Session::setup_ltc ()
585 _ltc_input.reset (new IO (*this, X_("LTC In"), IO::Input));
586 _ltc_output.reset (new IO (*this, X_("LTC Out"), IO::Output));
588 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC In"))) != 0) {
589 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
592 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
593 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
595 reconnect_ltc_input ();
598 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC Out"))) != 0) {
599 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
602 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
603 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
605 reconnect_ltc_output ();
608 /* fix up names of LTC ports because we don't want the normal
609 * IO style of NAME/TYPE-{in,out}N
612 _ltc_input->nth (0)->set_name (X_("LTC-in"));
613 _ltc_output->nth (0)->set_name (X_("LTC-out"));
617 Session::setup_click ()
620 _click_io.reset (new ClickIO (*this, X_("Click")));
621 _click_gain.reset (new Amp (*this));
622 _click_gain->activate ();
624 setup_click_state (state_tree->root());
626 setup_click_state (0);
631 Session::setup_click_state (const XMLNode* node)
633 const XMLNode* child = 0;
635 if (node && (child = find_named_node (*node, "Click")) != 0) {
637 /* existing state for Click */
640 if (Stateful::loading_state_version < 3000) {
641 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
643 const XMLNodeList& children (child->children());
644 XMLNodeList::const_iterator i = children.begin();
645 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
647 if (i != children.end()) {
648 c = _click_gain->set_state (**i, Stateful::loading_state_version);
654 _clicking = Config->get_clicking ();
658 error << _("could not setup Click I/O") << endmsg;
665 /* default state for Click: dual-mono to first 2 physical outputs */
668 _engine.get_physical_outputs (DataType::AUDIO, outs);
670 for (uint32_t physport = 0; physport < 2; ++physport) {
671 if (outs.size() > physport) {
672 if (_click_io->add_port (outs[physport], this)) {
673 // relax, even though its an error
678 if (_click_io->n_ports () > ChanCount::ZERO) {
679 _clicking = Config->get_clicking ();
685 Session::setup_bundles ()
687 vector<string> inputs[DataType::num_types];
688 vector<string> outputs[DataType::num_types];
689 for (uint32_t i = 0; i < DataType::num_types; ++i) {
690 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
691 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
694 /* Create a set of Bundle objects that map
695 to the physical I/O currently available. We create both
696 mono and stereo bundles, so that the common cases of mono
697 and stereo tracks get bundles to put in their mixer strip
698 in / out menus. There may be a nicer way of achieving that;
699 it doesn't really scale that well to higher channel counts
702 /* mono output bundles */
704 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
706 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
708 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
709 c->add_channel (_("mono"), DataType::AUDIO);
710 c->set_port (0, outputs[DataType::AUDIO][np]);
715 /* stereo output bundles */
717 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
718 if (np + 1 < outputs[DataType::AUDIO].size()) {
720 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
721 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
722 c->add_channel (_("L"), DataType::AUDIO);
723 c->set_port (0, outputs[DataType::AUDIO][np]);
724 c->add_channel (_("R"), DataType::AUDIO);
725 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
731 /* mono input bundles */
733 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
735 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
737 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
738 c->add_channel (_("mono"), DataType::AUDIO);
739 c->set_port (0, inputs[DataType::AUDIO][np]);
744 /* stereo input bundles */
746 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
747 if (np + 1 < inputs[DataType::AUDIO].size()) {
749 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
751 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
752 c->add_channel (_("L"), DataType::AUDIO);
753 c->set_port (0, inputs[DataType::AUDIO][np]);
754 c->add_channel (_("R"), DataType::AUDIO);
755 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
761 /* MIDI input bundles */
763 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
764 string n = inputs[DataType::MIDI][np];
765 boost::erase_first (n, X_("alsa_pcm:"));
767 boost::shared_ptr<Bundle> c (new Bundle (n, false));
768 c->add_channel ("", DataType::MIDI);
769 c->set_port (0, inputs[DataType::MIDI][np]);
773 /* MIDI output bundles */
775 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
776 string n = outputs[DataType::MIDI][np];
777 boost::erase_first (n, X_("alsa_pcm:"));
779 boost::shared_ptr<Bundle> c (new Bundle (n, true));
780 c->add_channel ("", DataType::MIDI);
781 c->set_port (0, outputs[DataType::MIDI][np]);
788 Session::auto_connect_master_bus ()
790 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
794 /* if requested auto-connect the outputs to the first N physical ports.
797 uint32_t limit = _master_out->n_outputs().n_total();
798 vector<string> outputs[DataType::num_types];
800 for (uint32_t i = 0; i < DataType::num_types; ++i) {
801 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
804 for (uint32_t n = 0; n < limit; ++n) {
805 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
807 if (outputs[p->type()].size() > n) {
808 connect_to = outputs[p->type()][n];
811 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
812 if (_master_out->output()->connect (p, connect_to, this)) {
813 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
822 Session::remove_monitor_section ()
828 /* force reversion to Solo-In-Place */
829 Config->set_solo_control_is_listen_control (false);
831 /* if we are auditioning, cancel it ... this is a workaround
832 to a problem (auditioning does not execute the process graph,
833 which is needed to remove routes when using >1 core for processing)
838 /* Hold process lock while doing this so that we don't hear bits and
839 * pieces of audio as we work on each route.
842 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
844 /* Connect tracks to monitor section. Note that in an
845 existing session, the internal sends will already exist, but we want the
846 routes to notice that they connect to the control out specifically.
850 boost::shared_ptr<RouteList> r = routes.reader ();
851 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
853 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
855 if ((*x)->is_monitor()) {
857 } else if ((*x)->is_master()) {
860 (*x)->remove_aux_or_listen (_monitor_out);
865 remove_route (_monitor_out);
866 auto_connect_master_bus ();
869 auditioner->connect ();
874 Session::add_monitor_section ()
878 if (_monitor_out || !_master_out) {
882 boost::shared_ptr<Route> r (new Route (*this, _("monitor"), Route::MonitorOut, DataType::AUDIO));
888 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
889 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
892 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
893 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
894 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
898 add_routes (rl, false, false, false);
900 assert (_monitor_out);
902 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
903 are undefined, at best.
906 uint32_t limit = _monitor_out->n_inputs().n_audio();
910 /* connect the inputs to the master bus outputs. this
911 * represents a separate data feed from the internal sends from
912 * each route. as of jan 2011, it allows the monitor section to
913 * conditionally ignore either the internal sends or the normal
914 * input feed, but we should really find a better way to do
918 _master_out->output()->disconnect (this);
920 for (uint32_t n = 0; n < limit; ++n) {
921 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
922 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
925 string connect_to = o->name();
926 if (_monitor_out->input()->connect (p, connect_to, this)) {
927 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
935 /* if monitor section is not connected, connect it to physical outs
938 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
940 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
942 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
945 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
947 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
948 Config->get_monitor_bus_preferred_bundle())
954 /* Monitor bus is audio only */
956 vector<string> outputs[DataType::num_types];
958 for (uint32_t i = 0; i < DataType::num_types; ++i) {
959 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
962 uint32_t mod = outputs[DataType::AUDIO].size();
963 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
967 for (uint32_t n = 0; n < limit; ++n) {
969 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
971 if (outputs[DataType::AUDIO].size() > (n % mod)) {
972 connect_to = outputs[DataType::AUDIO][n % mod];
975 if (!connect_to.empty()) {
976 if (_monitor_out->output()->connect (p, connect_to, this)) {
977 error << string_compose (
978 _("cannot connect control output %1 to %2"),
989 /* Hold process lock while doing this so that we don't hear bits and
990 * pieces of audio as we work on each route.
993 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
995 /* Connect tracks to monitor section. Note that in an
996 existing session, the internal sends will already exist, but we want the
997 routes to notice that they connect to the control out specifically.
1001 boost::shared_ptr<RouteList> rls = routes.reader ();
1003 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1005 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1007 if ((*x)->is_monitor()) {
1009 } else if ((*x)->is_master()) {
1012 (*x)->enable_monitor_send ();
1017 auditioner->connect ();
1022 Session::hookup_io ()
1024 /* stop graph reordering notifications from
1025 causing resorts, etc.
1028 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
1032 /* we delay creating the auditioner till now because
1033 it makes its own connections to ports.
1037 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
1039 throw failed_constructor ();
1041 a->use_new_diskstream ();
1045 catch (failed_constructor& err) {
1046 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
1050 /* load bundles, which we may have postponed earlier on */
1051 if (_bundle_xml_node) {
1052 load_bundles (*_bundle_xml_node);
1053 delete _bundle_xml_node;
1056 /* Tell all IO objects to connect themselves together */
1058 IO::enable_connecting ();
1060 /* Now tell all "floating" ports to connect to whatever
1061 they should be connected to.
1064 AudioEngine::instance()->reconnect_ports ();
1066 /* Anyone who cares about input state, wake up and do something */
1068 IOConnectionsComplete (); /* EMIT SIGNAL */
1070 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
1072 /* now handle the whole enchilada as if it was one
1073 graph reorder event.
1078 /* update the full solo state, which can't be
1079 correctly determined on a per-route basis, but
1080 needs the global overview that only the session
1084 update_route_solo_state ();
1088 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
1090 boost::shared_ptr<Track> track = wp.lock ();
1095 boost::shared_ptr<Playlist> playlist;
1097 if ((playlist = track->playlist()) != 0) {
1098 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
1099 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
1100 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
1105 Session::record_enabling_legal () const
1107 /* this used to be in here, but survey says.... we don't need to restrict it */
1108 // if (record_status() == Recording) {
1112 if (Config->get_all_safe()) {
1119 Session::set_track_monitor_input_status (bool yn)
1121 boost::shared_ptr<RouteList> rl = routes.reader ();
1122 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1123 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1124 if (tr && tr->record_enabled ()) {
1125 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1126 tr->request_input_monitoring (yn);
1132 Session::auto_punch_start_changed (Location* location)
1134 replace_event (SessionEvent::PunchIn, location->start());
1136 if (get_record_enabled() && config.get_punch_in()) {
1137 /* capture start has been changed, so save new pending state */
1138 save_state ("", true);
1143 Session::auto_punch_end_changed (Location* location)
1145 framepos_t when_to_stop = location->end();
1146 // when_to_stop += _worst_output_latency + _worst_input_latency;
1147 replace_event (SessionEvent::PunchOut, when_to_stop);
1151 Session::auto_punch_changed (Location* location)
1153 framepos_t when_to_stop = location->end();
1155 replace_event (SessionEvent::PunchIn, location->start());
1156 //when_to_stop += _worst_output_latency + _worst_input_latency;
1157 replace_event (SessionEvent::PunchOut, when_to_stop);
1160 /** @param loc A loop location.
1161 * @param pos Filled in with the start time of the required fade-out (in session frames).
1162 * @param length Filled in with the length of the required fade-out.
1165 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
1167 pos = max (loc->start(), loc->end() - 64);
1168 length = loc->end() - pos;
1172 Session::auto_loop_changed (Location* location)
1174 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1177 auto_loop_declick_range (location, dcp, dcl);
1178 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1180 if (transport_rolling() && play_loop) {
1183 // if (_transport_frame > location->end()) {
1185 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1186 // relocate to beginning of loop
1187 clear_events (SessionEvent::LocateRoll);
1189 request_locate (location->start(), true);
1192 else if (Config->get_seamless_loop() && !loop_changing) {
1194 // schedule a locate-roll to refill the diskstreams at the
1195 // previous loop end
1196 loop_changing = true;
1198 if (location->end() > last_loopend) {
1199 clear_events (SessionEvent::LocateRoll);
1200 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1207 last_loopend = location->end();
1211 Session::set_auto_punch_location (Location* location)
1215 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1216 punch_connections.drop_connections();
1217 existing->set_auto_punch (false, this);
1218 remove_event (existing->start(), SessionEvent::PunchIn);
1219 clear_events (SessionEvent::PunchOut);
1220 auto_punch_location_changed (0);
1225 if (location == 0) {
1229 if (location->end() <= location->start()) {
1230 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1234 punch_connections.drop_connections ();
1236 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
1237 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
1238 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
1240 location->set_auto_punch (true, this);
1242 auto_punch_changed (location);
1244 auto_punch_location_changed (location);
1248 Session::set_auto_loop_location (Location* location)
1252 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1253 loop_connections.drop_connections ();
1254 existing->set_auto_loop (false, this);
1255 remove_event (existing->end(), SessionEvent::AutoLoop);
1258 auto_loop_declick_range (existing, dcp, dcl);
1259 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1260 auto_loop_location_changed (0);
1265 if (location == 0) {
1269 if (location->end() <= location->start()) {
1270 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1274 last_loopend = location->end();
1276 loop_connections.drop_connections ();
1278 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1279 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1280 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1282 location->set_auto_loop (true, this);
1284 /* take care of our stuff first */
1286 auto_loop_changed (location);
1288 /* now tell everyone else */
1290 auto_loop_location_changed (location);
1294 Session::locations_added (Location *)
1300 Session::locations_changed ()
1302 _locations->apply (*this, &Session::handle_locations_changed);
1306 Session::handle_locations_changed (Locations::LocationList& locations)
1308 Locations::LocationList::iterator i;
1310 bool set_loop = false;
1311 bool set_punch = false;
1313 for (i = locations.begin(); i != locations.end(); ++i) {
1317 if (location->is_auto_punch()) {
1318 set_auto_punch_location (location);
1321 if (location->is_auto_loop()) {
1322 set_auto_loop_location (location);
1326 if (location->is_session_range()) {
1327 _session_range_location = location;
1332 set_auto_loop_location (0);
1335 set_auto_punch_location (0);
1342 Session::enable_record ()
1344 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1345 /* no recording at anything except normal speed */
1350 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1352 if (rs == Recording) {
1356 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1358 _last_record_location = _transport_frame;
1359 _mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1361 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1362 set_track_monitor_input_status (true);
1365 RecordStateChanged ();
1372 Session::disable_record (bool rt_context, bool force)
1376 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1378 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1379 g_atomic_int_set (&_record_status, Disabled);
1380 _mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1382 if (rs == Recording) {
1383 g_atomic_int_set (&_record_status, Enabled);
1387 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1388 set_track_monitor_input_status (false);
1391 RecordStateChanged (); /* emit signal */
1394 remove_pending_capture_state ();
1400 Session::step_back_from_record ()
1402 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1404 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1405 set_track_monitor_input_status (false);
1408 RecordStateChanged (); /* emit signal */
1413 Session::maybe_enable_record ()
1415 if (_step_editors > 0) {
1419 g_atomic_int_set (&_record_status, Enabled);
1421 /* This function is currently called from somewhere other than an RT thread.
1422 This save_state() call therefore doesn't impact anything. Doing it here
1423 means that we save pending state of which sources the next record will use,
1424 which gives us some chance of recovering from a crash during the record.
1427 save_state ("", true);
1429 if (_transport_speed) {
1430 if (!config.get_punch_in()) {
1434 _mmc->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1435 RecordStateChanged (); /* EMIT SIGNAL */
1442 Session::audible_frame () const
1448 /* the first of these two possible settings for "offset"
1449 mean that the audible frame is stationary until
1450 audio emerges from the latency compensation
1453 the second means that the audible frame is stationary
1454 until audio would emerge from a physical port
1455 in the absence of any plugin latency compensation
1458 offset = worst_playback_latency ();
1460 if (offset > current_block_size) {
1461 offset -= current_block_size;
1463 /* XXX is this correct? if we have no external
1464 physical connections and everything is internal
1465 then surely this is zero? still, how
1466 likely is that anyway?
1468 offset = current_block_size;
1471 if (synced_to_engine()) {
1472 tf = _engine.transport_frame();
1474 tf = _transport_frame;
1479 if (!non_realtime_work_pending()) {
1483 /* Check to see if we have passed the first guaranteed
1484 audible frame past our last start position. if not,
1485 return that last start point because in terms
1486 of audible frames, we have not moved yet.
1488 `Start position' in this context means the time we last
1489 either started, located, or changed transport direction.
1492 if (_transport_speed > 0.0f) {
1494 if (!play_loop || !have_looped) {
1495 if (tf < _last_roll_or_reversal_location + offset) {
1496 return _last_roll_or_reversal_location;
1504 } else if (_transport_speed < 0.0f) {
1506 /* XXX wot? no backward looping? */
1508 if (tf > _last_roll_or_reversal_location - offset) {
1509 return _last_roll_or_reversal_location;
1521 Session::set_frame_rate (framecnt_t frames_per_second)
1523 /** \fn void Session::set_frame_size(framecnt_t)
1524 the AudioEngine object that calls this guarantees
1525 that it will not be called while we are also in
1526 ::process(). Its fine to do things that block
1530 _base_frame_rate = frames_per_second;
1531 _nominal_frame_rate = frames_per_second;
1537 // XXX we need some equivalent to this, somehow
1538 // SndFileSource::setup_standard_crossfades (frames_per_second);
1542 /* XXX need to reset/reinstantiate all LADSPA plugins */
1546 Session::set_block_size (pframes_t nframes)
1548 /* the AudioEngine guarantees
1549 that it will not be called while we are also in
1550 ::process(). It is therefore fine to do things that block
1555 current_block_size = nframes;
1559 boost::shared_ptr<RouteList> r = routes.reader ();
1561 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1562 (*i)->set_block_size (nframes);
1565 boost::shared_ptr<RouteList> rl = routes.reader ();
1566 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1567 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1569 tr->set_block_size (nframes);
1573 set_worst_io_latencies ();
1579 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1581 boost::shared_ptr<Route> r2;
1583 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1584 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1588 /* make a copy of the existing list of routes that feed r1 */
1590 Route::FedBy existing (r1->fed_by());
1592 /* for each route that feeds r1, recurse, marking it as feeding
1596 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1597 if (!(r2 = i->r.lock ())) {
1598 /* (*i) went away, ignore it */
1602 /* r2 is a route that feeds r1 which somehow feeds base. mark
1603 base as being fed by r2
1606 rbase->add_fed_by (r2, i->sends_only);
1610 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1614 if (r1->feeds (r2) && r2->feeds (r1)) {
1618 /* now recurse, so that we can mark base as being fed by
1619 all routes that feed r2
1622 trace_terminal (r2, rbase);
1629 Session::resort_routes ()
1631 /* don't do anything here with signals emitted
1632 by Routes during initial setup or while we
1633 are being destroyed.
1636 if (_state_of_the_state & (InitialConnecting | Deletion)) {
1641 RCUWriter<RouteList> writer (routes);
1642 boost::shared_ptr<RouteList> r = writer.get_copy ();
1643 resort_routes_using (r);
1644 /* writer goes out of scope and forces update */
1648 boost::shared_ptr<RouteList> rl = routes.reader ();
1649 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1650 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1652 const Route::FedBy& fb ((*i)->fed_by());
1654 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1655 boost::shared_ptr<Route> sf = f->r.lock();
1657 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1665 /** This is called whenever we need to rebuild the graph of how we will process
1667 * @param r List of routes, in any order.
1671 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1673 /* We are going to build a directed graph of our routes;
1674 this is where the edges of that graph are put.
1679 /* Go through all routes doing two things:
1681 * 1. Collect the edges of the route graph. Each of these edges
1682 * is a pair of routes, one of which directly feeds the other
1683 * either by a JACK connection or by an internal send.
1685 * 2. Begin the process of making routes aware of which other
1686 * routes directly or indirectly feed them. This information
1687 * is used by the solo code.
1690 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1692 /* Clear out the route's list of direct or indirect feeds */
1693 (*i)->clear_fed_by ();
1695 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
1697 bool via_sends_only;
1699 /* See if this *j feeds *i according to the current state of the JACK
1700 connections and internal sends.
1702 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
1703 /* add the edge to the graph (part #1) */
1704 edges.add (*j, *i, via_sends_only);
1705 /* tell the route (for part #2) */
1706 (*i)->add_fed_by (*j, via_sends_only);
1711 /* Attempt a topological sort of the route graph */
1712 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
1714 if (sorted_routes) {
1715 /* We got a satisfactory topological sort, so there is no feedback;
1718 Note: the process graph rechain does not require a
1719 topologically-sorted list, but hey ho.
1721 if (_process_graph) {
1722 _process_graph->rechain (sorted_routes, edges);
1725 _current_route_graph = edges;
1727 /* Complete the building of the routes' lists of what directly
1728 or indirectly feeds them.
1730 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1731 trace_terminal (*i, *i);
1734 *r = *sorted_routes;
1737 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1738 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1739 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1740 (*i)->name(), (*i)->order_key ()));
1744 SuccessfulGraphSort (); /* EMIT SIGNAL */
1747 /* The topological sort failed, so we have a problem. Tell everyone
1748 and stick to the old graph; this will continue to be processed, so
1749 until the feedback is fixed, what is played back will not quite
1750 reflect what is actually connected. Note also that we do not
1751 do trace_terminal here, as it would fail due to an endless recursion,
1752 so the solo code will think that everything is still connected
1756 FeedbackDetected (); /* EMIT SIGNAL */
1761 /** Find a route name starting with \a base, maybe followed by the
1762 * lowest \a id. \a id will always be added if \a definitely_add_number
1763 * is true on entry; otherwise it will only be added if required
1764 * to make the name unique.
1766 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1767 * The available route name with the lowest ID will be used, and \a id
1768 * will be set to the ID.
1770 * \return false if a route name could not be found, and \a track_name
1771 * and \a id do not reflect a free route name.
1774 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1776 if (!definitely_add_number && route_by_name (base) == 0) {
1777 /* juse use the base */
1778 snprintf (name, name_len, "%s", base.c_str());
1783 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1785 if (route_by_name (name) == 0) {
1791 } while (id < (UINT_MAX-1));
1796 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
1798 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
1800 in = ChanCount::ZERO;
1801 out = ChanCount::ZERO;
1803 boost::shared_ptr<RouteList> r = routes.reader ();
1805 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1806 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1807 if (tr && !tr->is_auditioner()) {
1808 in += tr->n_inputs();
1809 out += tr->n_outputs();
1814 /** Caller must not hold process lock
1815 * @param name_template string to use for the start of the name, or "" to use "MIDI".
1816 * @param instrument plugin info for the instrument to insert pre-fader, if any
1818 list<boost::shared_ptr<MidiTrack> >
1819 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
1820 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1822 char track_name[32];
1823 uint32_t track_id = 0;
1825 RouteList new_routes;
1826 list<boost::shared_ptr<MidiTrack> > ret;
1828 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
1831 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1832 error << "cannot find name for new midi track" << endmsg;
1836 boost::shared_ptr<MidiTrack> track;
1839 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1841 if (track->init ()) {
1845 track->use_new_diskstream();
1847 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1848 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1851 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1852 if (track->input()->ensure_io (input, false, this)) {
1853 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
1857 if (track->output()->ensure_io (output, false, this)) {
1858 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
1863 track->non_realtime_input_change();
1866 route_group->add (track);
1869 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1871 if (Config->get_remote_model() == UserOrdered) {
1872 track->set_remote_control_id (next_control_id());
1875 new_routes.push_back (track);
1876 ret.push_back (track);
1879 catch (failed_constructor &err) {
1880 error << _("Session: could not create new midi track.") << endmsg;
1884 catch (AudioEngine::PortRegistrationFailure& pfe) {
1886 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;
1894 if (!new_routes.empty()) {
1895 StateProtector sp (this);
1896 add_routes (new_routes, true, true, true);
1899 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
1900 PluginPtr plugin = instrument->load (*this);
1901 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
1902 (*r)->add_processor (p, PreFader);
1912 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
1914 boost::shared_ptr<Route> midi_track (wmt.lock());
1920 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
1922 if (change.after.n_audio() <= change.before.n_audio()) {
1926 /* new audio ports: make sure the audio goes somewhere useful,
1927 unless the user has no-auto-connect selected.
1929 The existing ChanCounts don't matter for this call as they are only
1930 to do with matching input and output indices, and we are only changing
1936 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
1940 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1941 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1942 * @param output_start As \a input_start, but for outputs.
1945 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
1946 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
1948 if (!IO::connecting_legal) {
1952 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1958 /* If both inputs and outputs are auto-connected to physical ports,
1959 use the max of input and output offsets to ensure auto-connected
1960 port numbers always match up (e.g. the first audio input and the
1961 first audio output of the route will have the same physical
1962 port number). Otherwise just use the lowest input or output
1966 DEBUG_TRACE (DEBUG::Graph,
1967 string_compose("Auto-connect: existing in = %1 out = %2\n",
1968 existing_inputs, existing_outputs));
1970 const bool in_out_physical =
1971 (Config->get_input_auto_connect() & AutoConnectPhysical)
1972 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1975 const ChanCount in_offset = in_out_physical
1976 ? ChanCount::max(existing_inputs, existing_outputs)
1979 const ChanCount out_offset = in_out_physical
1980 ? ChanCount::max(existing_inputs, existing_outputs)
1983 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1984 vector<string> physinputs;
1985 vector<string> physoutputs;
1987 _engine.get_physical_outputs (*t, physoutputs);
1988 _engine.get_physical_inputs (*t, physinputs);
1990 if (!physinputs.empty() && connect_inputs) {
1991 uint32_t nphysical_in = physinputs.size();
1993 DEBUG_TRACE (DEBUG::Graph,
1994 string_compose("There are %1 physical inputs of type %2\n",
1997 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
2000 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
2001 DEBUG_TRACE (DEBUG::Graph,
2002 string_compose("Get index %1 + %2 % %3 = %4\n",
2003 in_offset.get(*t), i, nphysical_in,
2004 (in_offset.get(*t) + i) % nphysical_in));
2005 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
2008 DEBUG_TRACE (DEBUG::Graph,
2009 string_compose("Connect route %1 IN to %2\n",
2010 route->name(), port));
2012 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
2016 ChanCount one_added (*t, 1);
2017 existing_inputs += one_added;
2021 if (!physoutputs.empty()) {
2022 uint32_t nphysical_out = physoutputs.size();
2023 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
2026 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
2027 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
2028 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
2029 /* master bus is audio only */
2030 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
2031 port = _master_out->input()->ports().port(*t,
2032 i % _master_out->input()->n_ports().get(*t))->name();
2036 DEBUG_TRACE (DEBUG::Graph,
2037 string_compose("Connect route %1 OUT to %2\n",
2038 route->name(), port));
2040 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
2044 ChanCount one_added (*t, 1);
2045 existing_outputs += one_added;
2051 /** Caller must not hold process lock
2052 * @param name_template string to use for the start of the name, or "" to use "Audio".
2054 list< boost::shared_ptr<AudioTrack> >
2055 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
2056 uint32_t how_many, string name_template)
2058 char track_name[32];
2059 uint32_t track_id = 0;
2061 RouteList new_routes;
2062 list<boost::shared_ptr<AudioTrack> > ret;
2064 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
2067 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
2068 error << "cannot find name for new audio track" << endmsg;
2072 boost::shared_ptr<AudioTrack> track;
2075 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
2077 if (track->init ()) {
2081 track->use_new_diskstream();
2083 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2084 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2087 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2089 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2090 error << string_compose (
2091 _("cannot configure %1 in/%2 out configuration for new audio track"),
2092 input_channels, output_channels)
2097 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2098 error << string_compose (
2099 _("cannot configure %1 in/%2 out configuration for new audio track"),
2100 input_channels, output_channels)
2107 route_group->add (track);
2110 track->non_realtime_input_change();
2112 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2113 if (Config->get_remote_model() == UserOrdered) {
2114 track->set_remote_control_id (next_control_id());
2117 new_routes.push_back (track);
2118 ret.push_back (track);
2121 catch (failed_constructor &err) {
2122 error << _("Session: could not create new audio track.") << endmsg;
2126 catch (AudioEngine::PortRegistrationFailure& pfe) {
2128 error << pfe.what() << endmsg;
2136 if (!new_routes.empty()) {
2137 StateProtector sp (this);
2138 add_routes (new_routes, true, true, true);
2144 /** Caller must not hold process lock.
2145 * @param name_template string to use for the start of the name, or "" to use "Bus".
2148 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
2151 uint32_t bus_id = 0;
2155 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
2158 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
2159 error << "cannot find name for new audio bus" << endmsg;
2164 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
2170 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2171 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
2174 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2176 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2177 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2178 input_channels, output_channels)
2184 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2185 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2186 input_channels, output_channels)
2193 route_group->add (bus);
2195 if (Config->get_remote_model() == UserOrdered) {
2196 bus->set_remote_control_id (next_control_id());
2199 bus->add_internal_return ();
2201 ret.push_back (bus);
2207 catch (failed_constructor &err) {
2208 error << _("Session: could not create new audio route.") << endmsg;
2212 catch (AudioEngine::PortRegistrationFailure& pfe) {
2213 error << pfe.what() << endmsg;
2223 StateProtector sp (this);
2224 add_routes (ret, false, true, true); // autoconnect outputs only
2232 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base)
2235 uint32_t control_id;
2237 uint32_t number = 0;
2238 const uint32_t being_added = how_many;
2240 if (!tree.read (template_path.c_str())) {
2244 XMLNode* node = tree.root();
2246 IO::disable_connecting ();
2248 control_id = next_control_id ();
2252 XMLNode node_copy (*node);
2254 /* Remove IDs of everything so that new ones are used */
2255 node_copy.remove_property_recursively (X_("id"));
2260 if (!name_base.empty()) {
2262 /* if we're adding more than one routes, force
2263 * all the names of the new routes to be
2264 * numbered, via the final parameter.
2267 if (!find_route_name (name_base.c_str(), ++number, name, sizeof(name), (being_added > 1))) {
2268 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2274 string const route_name = node_copy.property(X_("name"))->value ();
2276 /* generate a new name by adding a number to the end of the template name */
2277 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2278 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2283 /* set this name in the XML description that we are about to use */
2284 Route::set_name_in_state (node_copy, name);
2286 /* trim bitslots from listen sends so that new ones are used */
2287 XMLNodeList children = node_copy.children ();
2288 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2289 if ((*i)->name() == X_("Processor")) {
2290 XMLProperty* role = (*i)->property (X_("role"));
2291 if (role && role->value() == X_("Listen")) {
2292 (*i)->remove_property (X_("bitslot"));
2297 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2300 error << _("Session: cannot create track/bus from template description") << endmsg;
2304 if (boost::dynamic_pointer_cast<Track>(route)) {
2305 /* force input/output change signals so that the new diskstream
2306 picks up the configuration of the route. During session
2307 loading this normally happens in a different way.
2310 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2312 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2313 change.after = route->input()->n_ports();
2314 route->input()->changed (change, this);
2315 change.after = route->output()->n_ports();
2316 route->output()->changed (change, this);
2319 route->set_remote_control_id (control_id);
2322 ret.push_back (route);
2325 catch (failed_constructor &err) {
2326 error << _("Session: could not create new route from template") << endmsg;
2330 catch (AudioEngine::PortRegistrationFailure& pfe) {
2331 error << pfe.what() << endmsg;
2340 StateProtector sp (this);
2341 add_routes (ret, true, true, true);
2342 IO::enable_connecting ();
2349 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
2352 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
2353 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
2356 error << _("Adding new tracks/busses failed") << endmsg;
2361 update_latency (true);
2362 update_latency (false);
2367 save_state (_current_snapshot_name);
2370 reassign_track_numbers();
2372 RouteAdded (new_routes); /* EMIT SIGNAL */
2376 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
2378 ChanCount existing_inputs;
2379 ChanCount existing_outputs;
2380 uint32_t order = next_control_id();
2382 if (_order_hint != 0) {
2383 order = _order_hint;
2387 count_existing_track_channels (existing_inputs, existing_outputs);
2390 RCUWriter<RouteList> writer (routes);
2391 boost::shared_ptr<RouteList> r = writer.get_copy ();
2392 r->insert (r->end(), new_routes.begin(), new_routes.end());
2394 /* if there is no control out and we're not in the middle of loading,
2395 resort the graph here. if there is a control out, we will resort
2396 toward the end of this method. if we are in the middle of loading,
2397 we will resort when done.
2400 if (!_monitor_out && IO::connecting_legal) {
2401 resort_routes_using (r);
2405 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2407 boost::weak_ptr<Route> wpr (*x);
2408 boost::shared_ptr<Route> r (*x);
2410 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2411 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2412 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2413 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2414 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2415 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2417 if (r->is_master()) {
2421 if (r->is_monitor()) {
2425 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2427 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2428 track_playlist_changed (boost::weak_ptr<Track> (tr));
2429 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2431 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2433 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2434 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2439 if (input_auto_connect || output_auto_connect) {
2440 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
2443 /* order keys are a GUI responsibility but we need to set up
2444 reasonable defaults because they also affect the remote control
2445 ID in most situations.
2448 if (!r->has_order_key ()) {
2449 if (r->is_auditioner()) {
2450 /* use an arbitrarily high value */
2451 r->set_order_key (UINT_MAX);
2453 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
2454 r->set_order_key (order);
2462 if (_monitor_out && IO::connecting_legal) {
2463 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
2465 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2466 if ((*x)->is_monitor()) {
2468 } else if ((*x)->is_master()) {
2471 (*x)->enable_monitor_send ();
2478 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2480 boost::shared_ptr<RouteList> r = routes.reader ();
2481 boost::shared_ptr<Send> s;
2483 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2484 if ((s = (*i)->internal_send_for (dest)) != 0) {
2485 s->amp()->gain_control()->set_value (0.0);
2491 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2493 boost::shared_ptr<RouteList> r = routes.reader ();
2494 boost::shared_ptr<Send> s;
2496 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2497 if ((s = (*i)->internal_send_for (dest)) != 0) {
2498 s->amp()->gain_control()->set_value (1.0);
2504 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2506 boost::shared_ptr<RouteList> r = routes.reader ();
2507 boost::shared_ptr<Send> s;
2509 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2510 if ((s = (*i)->internal_send_for (dest)) != 0) {
2511 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2516 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2518 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2520 boost::shared_ptr<RouteList> r = routes.reader ();
2521 boost::shared_ptr<RouteList> t (new RouteList);
2523 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2524 /* no MIDI sends because there are no MIDI busses yet */
2525 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2530 add_internal_sends (dest, p, t);
2534 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2536 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2537 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
2542 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
2544 add_internal_send (dest, sender->before_processor_for_index (index), sender);
2548 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
2550 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
2554 if (!dest->internal_return()) {
2555 dest->add_internal_return ();
2558 sender->add_aux_send (dest, before);
2564 Session::remove_route (boost::shared_ptr<Route> route)
2566 if (route == _master_out) {
2570 route->set_solo (false, this);
2573 RCUWriter<RouteList> writer (routes);
2574 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2578 /* deleting the master out seems like a dumb
2579 idea, but its more of a UI policy issue
2583 if (route == _master_out) {
2584 _master_out = boost::shared_ptr<Route> ();
2587 if (route == _monitor_out) {
2588 _monitor_out.reset ();
2591 /* writer goes out of scope, forces route list update */
2594 update_route_solo_state ();
2596 // We need to disconnect the route's inputs and outputs
2598 route->input()->disconnect (0);
2599 route->output()->disconnect (0);
2601 /* if the route had internal sends sending to it, remove them */
2602 if (route->internal_return()) {
2604 boost::shared_ptr<RouteList> r = routes.reader ();
2605 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2606 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2608 (*i)->remove_processor (s);
2613 /* if the monitoring section had a pointer to this route, remove it */
2614 if (_monitor_out && !route->is_master() && !route->is_monitor()) {
2615 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2616 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
2617 route->remove_aux_or_listen (_monitor_out);
2620 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2621 if (mt && mt->step_editing()) {
2622 if (_step_editors > 0) {
2627 update_latency_compensation ();
2630 /* Re-sort routes to remove the graph's current references to the one that is
2631 * going away, then flush old references out of the graph.
2635 if (_process_graph) {
2636 _process_graph->clear_other_chain ();
2639 /* get rid of it from the dead wood collection in the route list manager */
2641 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2645 /* try to cause everyone to drop their references */
2647 route->drop_references ();
2649 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2651 /* save the new state of the world */
2653 if (save_state (_current_snapshot_name)) {
2654 save_history (_current_snapshot_name);
2656 reassign_track_numbers();
2660 Session::route_mute_changed (void* /*src*/)
2666 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2668 boost::shared_ptr<Route> route = wpr.lock();
2670 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2674 if (route->listening_via_monitor ()) {
2676 if (Config->get_exclusive_solo()) {
2677 /* new listen: disable all other listen */
2678 boost::shared_ptr<RouteList> r = routes.reader ();
2679 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2680 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
2683 (*i)->set_listen (false, this);
2689 } else if (_listen_cnt > 0) {
2694 update_route_solo_state ();
2697 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2699 boost::shared_ptr<Route> route = wpr.lock ();
2702 /* should not happen */
2703 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2707 bool send_changed = false;
2709 if (route->solo_isolated()) {
2710 if (_solo_isolated_cnt == 0) {
2711 send_changed = true;
2713 _solo_isolated_cnt++;
2714 } else if (_solo_isolated_cnt > 0) {
2715 _solo_isolated_cnt--;
2716 if (_solo_isolated_cnt == 0) {
2717 send_changed = true;
2722 IsolatedChanged (); /* EMIT SIGNAL */
2727 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2729 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
2731 if (!self_solo_change) {
2732 // session doesn't care about changes to soloed-by-others
2736 if (solo_update_disabled) {
2738 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
2742 boost::shared_ptr<Route> route = wpr.lock ();
2745 boost::shared_ptr<RouteList> r = routes.reader ();
2748 if (route->self_soloed()) {
2754 RouteGroup* rg = route->route_group ();
2755 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
2757 if (delta == 1 && Config->get_exclusive_solo()) {
2759 /* new solo: disable all other solos, but not the group if its solo-enabled */
2761 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2762 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
2763 (leave_group_alone && ((*i)->route_group() == rg))) {
2766 (*i)->set_solo (false, this);
2770 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
2772 solo_update_disabled = true;
2774 RouteList uninvolved;
2776 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
2778 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2779 bool via_sends_only;
2780 bool in_signal_flow;
2782 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
2783 (leave_group_alone && ((*i)->route_group() == rg))) {
2787 in_signal_flow = false;
2789 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
2791 if ((*i)->feeds (route, &via_sends_only)) {
2792 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
2793 if (!via_sends_only) {
2794 if (!route->soloed_by_others_upstream()) {
2795 (*i)->mod_solo_by_others_downstream (delta);
2798 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
2800 in_signal_flow = true;
2802 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
2805 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
2807 if (route->feeds (*i, &via_sends_only)) {
2808 /* propagate solo upstream only if routing other than
2809 sends is involved, but do consider the other route
2810 (*i) to be part of the signal flow even if only
2813 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
2817 route->soloed_by_others_downstream(),
2818 route->soloed_by_others_upstream()));
2819 if (!via_sends_only) {
2820 if (!route->soloed_by_others_downstream()) {
2821 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
2822 (*i)->mod_solo_by_others_upstream (delta);
2824 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
2827 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
2829 in_signal_flow = true;
2831 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
2834 if (!in_signal_flow) {
2835 uninvolved.push_back (*i);
2839 solo_update_disabled = false;
2840 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
2842 update_route_solo_state (r);
2844 /* now notify that the mute state of the routes not involved in the signal
2845 pathway of the just-solo-changed route may have altered.
2848 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2849 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
2850 (*i)->mute_changed (this);
2853 SoloChanged (); /* EMIT SIGNAL */
2858 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2860 /* now figure out if anything that matters is soloed (or is "listening")*/
2862 bool something_soloed = false;
2863 uint32_t listeners = 0;
2864 uint32_t isolated = 0;
2867 r = routes.reader();
2870 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2871 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
2872 something_soloed = true;
2875 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
2876 if (Config->get_solo_control_is_listen_control()) {
2879 (*i)->set_listen (false, this);
2883 if ((*i)->solo_isolated()) {
2888 if (something_soloed != _non_soloed_outs_muted) {
2889 _non_soloed_outs_muted = something_soloed;
2890 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2893 _listen_cnt = listeners;
2895 if (isolated != _solo_isolated_cnt) {
2896 _solo_isolated_cnt = isolated;
2897 IsolatedChanged (); /* EMIT SIGNAL */
2900 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
2901 something_soloed, listeners, isolated));
2904 boost::shared_ptr<RouteList>
2905 Session::get_routes_with_internal_returns() const
2907 boost::shared_ptr<RouteList> r = routes.reader ();
2908 boost::shared_ptr<RouteList> rl (new RouteList);
2910 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2911 if ((*i)->internal_return ()) {
2919 Session::io_name_is_legal (const std::string& name)
2921 boost::shared_ptr<RouteList> r = routes.reader ();
2923 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2924 if ((*i)->name() == name) {
2928 if ((*i)->has_io_processor_named (name)) {
2937 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
2940 vector<string> connections;
2942 /* if we are passed only a single route and we're not told to turn
2943 * others off, then just do the simple thing.
2946 if (flip_others == false && rl->size() == 1) {
2947 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
2949 mt->set_input_active (onoff);
2954 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
2956 PortSet& ps ((*rt)->input()->ports());
2958 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
2959 p->get_connections (connections);
2962 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
2963 routes_using_input_from (*s, rl2);
2966 /* scan all relevant routes to see if others are on or off */
2968 bool others_are_already_on = false;
2970 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
2972 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2978 if ((*r) != (*rt)) {
2979 if (mt->input_active()) {
2980 others_are_already_on = true;
2983 /* this one needs changing */
2984 mt->set_input_active (onoff);
2990 /* globally reverse other routes */
2992 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
2993 if ((*r) != (*rt)) {
2994 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2996 mt->set_input_active (!others_are_already_on);
3005 Session::routes_using_input_from (const string& str, RouteList& rl)
3007 boost::shared_ptr<RouteList> r = routes.reader();
3009 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3010 if ((*i)->input()->connected_to (str)) {
3016 boost::shared_ptr<Route>
3017 Session::route_by_name (string name)
3019 boost::shared_ptr<RouteList> r = routes.reader ();
3021 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3022 if ((*i)->name() == name) {
3027 return boost::shared_ptr<Route> ((Route*) 0);
3030 boost::shared_ptr<Route>
3031 Session::route_by_id (PBD::ID id)
3033 boost::shared_ptr<RouteList> r = routes.reader ();
3035 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3036 if ((*i)->id() == id) {
3041 return boost::shared_ptr<Route> ((Route*) 0);
3044 boost::shared_ptr<Track>
3045 Session::track_by_diskstream_id (PBD::ID id)
3047 boost::shared_ptr<RouteList> r = routes.reader ();
3049 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3050 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3051 if (t && t->using_diskstream_id (id)) {
3056 return boost::shared_ptr<Track> ();
3059 boost::shared_ptr<Route>
3060 Session::route_by_remote_id (uint32_t id)
3062 boost::shared_ptr<RouteList> r = routes.reader ();
3064 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3065 if ((*i)->remote_control_id() == id) {
3070 return boost::shared_ptr<Route> ((Route*) 0);
3075 Session::reassign_track_numbers ()
3079 RouteList r (*(routes.reader ()));
3080 SignalOrderRouteSorter sorter;
3083 StateProtector sp (this);
3085 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3086 if (boost::dynamic_pointer_cast<Track> (*i)) {
3087 (*i)->set_track_number(++tn);
3089 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
3090 (*i)->set_track_number(--bn);
3093 const uint32_t decimals = ceilf (log10f (tn + 1));
3094 const bool decimals_changed = _track_number_decimals != decimals;
3095 _track_number_decimals = decimals;
3097 if (decimals_changed && config.get_track_name_number ()) {
3098 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3099 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3101 t->resync_track_name();
3104 // trigger GUI re-layout
3105 config.ParameterChanged("track-name-number");
3110 Session::playlist_region_added (boost::weak_ptr<Region> w)
3112 boost::shared_ptr<Region> r = w.lock ();
3117 /* These are the operations that are currently in progress... */
3118 list<GQuark> curr = _current_trans_quarks;
3121 /* ...and these are the operations during which we want to update
3122 the session range location markers.
3125 ops.push_back (Operations::capture);
3126 ops.push_back (Operations::paste);
3127 ops.push_back (Operations::duplicate_region);
3128 ops.push_back (Operations::insert_file);
3129 ops.push_back (Operations::insert_region);
3130 ops.push_back (Operations::drag_region_brush);
3131 ops.push_back (Operations::region_drag);
3132 ops.push_back (Operations::selection_grab);
3133 ops.push_back (Operations::region_fill);
3134 ops.push_back (Operations::fill_selection);
3135 ops.push_back (Operations::create_region);
3136 ops.push_back (Operations::region_copy);
3137 ops.push_back (Operations::fixed_time_region_copy);
3140 /* See if any of the current operations match the ones that we want */
3142 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
3144 /* If so, update the session range markers */
3146 maybe_update_session_range (r->position (), r->last_frame ());
3150 /** Update the session range markers if a is before the current start or
3151 * b is after the current end.
3154 Session::maybe_update_session_range (framepos_t a, framepos_t b)
3156 if (_state_of_the_state & Loading) {
3160 if (_session_range_location == 0) {
3162 add_session_range_location (a, b);
3166 if (a < _session_range_location->start()) {
3167 _session_range_location->set_start (a);
3170 if (b > _session_range_location->end()) {
3171 _session_range_location->set_end (b);
3177 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
3179 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3180 maybe_update_session_range (i->to, i->to + i->length);
3185 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
3187 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3188 maybe_update_session_range (i->from, i->to);
3192 /* Region management */
3194 boost::shared_ptr<Region>
3195 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
3197 const RegionFactory::RegionMap& regions (RegionFactory::regions());
3198 RegionFactory::RegionMap::const_iterator i;
3199 boost::shared_ptr<Region> region;
3201 Glib::Threads::Mutex::Lock lm (region_lock);
3203 for (i = regions.begin(); i != regions.end(); ++i) {
3207 if (region->whole_file()) {
3209 if (child->source_equivalent (region)) {
3215 return boost::shared_ptr<Region> ();
3219 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
3221 set<boost::shared_ptr<Region> > relevant_regions;
3223 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
3224 RegionFactory::get_regions_using_source (*s, relevant_regions);
3227 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
3228 set<boost::shared_ptr<Region> >::iterator tmp;
3233 playlists->destroy_region (*r);
3234 RegionFactory::map_remove (*r);
3236 (*r)->drop_sources ();
3237 (*r)->drop_references ();
3239 relevant_regions.erase (r);
3244 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
3247 Glib::Threads::Mutex::Lock ls (source_lock);
3248 /* remove from the main source list */
3249 sources.erase ((*s)->id());
3252 (*s)->mark_for_remove ();
3253 (*s)->drop_references ();
3262 Session::remove_last_capture ()
3264 list<boost::shared_ptr<Source> > srcs;
3266 boost::shared_ptr<RouteList> rl = routes.reader ();
3267 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3268 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3273 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
3276 srcs.insert (srcs.end(), l.begin(), l.end());
3281 destroy_sources (srcs);
3283 save_state (_current_snapshot_name);
3288 /* Source Management */
3291 Session::add_source (boost::shared_ptr<Source> source)
3293 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
3294 pair<SourceMap::iterator,bool> result;
3296 entry.first = source->id();
3297 entry.second = source;
3300 Glib::Threads::Mutex::Lock lm (source_lock);
3301 result = sources.insert (entry);
3304 if (result.second) {
3306 /* yay, new source */
3308 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
3311 if (!fs->within_session()) {
3312 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
3318 boost::shared_ptr<AudioFileSource> afs;
3320 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
3321 if (Config->get_auto_analyse_audio()) {
3322 Analyser::queue_source_for_analysis (source, false);
3326 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
3331 Session::remove_source (boost::weak_ptr<Source> src)
3333 if (_state_of_the_state & Deletion) {
3337 SourceMap::iterator i;
3338 boost::shared_ptr<Source> source = src.lock();
3345 Glib::Threads::Mutex::Lock lm (source_lock);
3347 if ((i = sources.find (source->id())) != sources.end()) {
3352 if (!(_state_of_the_state & InCleanup)) {
3354 /* save state so we don't end up with a session file
3355 referring to non-existent sources.
3358 save_state (_current_snapshot_name);
3362 boost::shared_ptr<Source>
3363 Session::source_by_id (const PBD::ID& id)
3365 Glib::Threads::Mutex::Lock lm (source_lock);
3366 SourceMap::iterator i;
3367 boost::shared_ptr<Source> source;
3369 if ((i = sources.find (id)) != sources.end()) {
3376 boost::shared_ptr<AudioFileSource>
3377 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
3379 /* Restricted to audio files because only audio sources have channel
3383 Glib::Threads::Mutex::Lock lm (source_lock);
3385 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
3386 boost::shared_ptr<AudioFileSource> afs
3387 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
3389 if (afs && afs->path() == path && chn == afs->channel()) {
3394 return boost::shared_ptr<AudioFileSource>();
3397 boost::shared_ptr<MidiSource>
3398 Session::midi_source_by_path (const std::string& path) const
3400 /* Restricted to MIDI files because audio sources require a channel
3401 for unique identification, in addition to a path.
3404 Glib::Threads::Mutex::Lock lm (source_lock);
3406 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
3407 boost::shared_ptr<MidiSource> ms
3408 = boost::dynamic_pointer_cast<MidiSource>(s->second);
3409 boost::shared_ptr<FileSource> fs
3410 = boost::dynamic_pointer_cast<FileSource>(s->second);
3412 if (ms && fs && fs->path() == path) {
3417 return boost::shared_ptr<MidiSource>();
3421 Session::count_sources_by_origin (const string& path)
3424 Glib::Threads::Mutex::Lock lm (source_lock);
3426 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3427 boost::shared_ptr<FileSource> fs
3428 = boost::dynamic_pointer_cast<FileSource>(i->second);
3430 if (fs && fs->origin() == path) {
3438 /** Return the full path (in some session directory) for a new within-session source.
3439 * \a name must be a session-unique name that does not contain slashes
3440 * (e.g. as returned by new_*_source_name)
3443 Session::new_source_path_from_name (DataType type, const string& name)
3445 assert(name.find("/") == string::npos);
3447 SessionDirectory sdir(get_best_session_directory_for_new_source());
3450 if (type == DataType::AUDIO) {
3451 p = sdir.sound_path();
3452 } else if (type == DataType::MIDI) {
3453 p = sdir.midi_path();
3455 error << "Unknown source type, unable to create file path" << endmsg;
3459 return Glib::build_filename (p, name);
3463 Session::peak_path (string base) const
3465 return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
3468 /** Return a unique name based on \a base for a new internal audio source */
3470 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
3473 char buf[PATH_MAX+1];
3474 const uint32_t limit = 10000;
3476 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3479 legalized = legalize_for_path (base);
3481 // Find a "version" of the base name that doesn't exist in any of the possible directories.
3482 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3484 vector<space_and_path>::iterator i;
3485 uint32_t existing = 0;
3487 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3492 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3493 cnt, legalized.c_str(), ext.c_str());
3494 } else if (nchan == 2) {
3496 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
3497 cnt, legalized.c_str(), ext.c_str());
3499 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
3500 cnt, legalized.c_str(), ext.c_str());
3502 } else if (nchan < 26) {
3503 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
3504 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
3506 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3507 cnt, legalized.c_str(), ext.c_str());
3513 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3514 } else if (nchan == 2) {
3516 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
3518 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
3520 } else if (nchan < 26) {
3521 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
3523 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3527 SessionDirectory sdir((*i).path);
3529 string spath = sdir.sound_path();
3531 /* note that we search *without* the extension so that
3532 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3533 in the event that this new name is required for
3534 a file format change.
3537 if (matching_unsuffixed_filename_exists_in (spath, buf)) {
3542 /* it is possible that we have the path already
3543 * assigned to a source that has not yet been written
3544 * (ie. the write source for a diskstream). we have to
3545 * check this in order to make sure that our candidate
3546 * path isn't used again, because that can lead to
3547 * two Sources point to the same file with different
3548 * notions of their removability.
3551 string possible_path = Glib::build_filename (spath, buf);
3553 if (audio_source_by_path_and_channel (possible_path, chan)) {
3559 if (existing == 0) {
3564 error << string_compose(
3565 _("There are already %1 recordings for %2, which I consider too many."),
3566 limit, base) << endmsg;
3568 throw failed_constructor();
3572 return Glib::path_get_basename (buf);
3575 /** Create a new within-session audio source */
3576 boost::shared_ptr<AudioFileSource>
3577 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
3579 const string name = new_audio_source_name (n, n_chans, chan, destructive);
3580 const string path = new_source_path_from_name(DataType::AUDIO, name);
3582 return boost::dynamic_pointer_cast<AudioFileSource> (
3583 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
3586 /** Return a unique name based on \a owner_name for a new internal MIDI source */
3588 Session::new_midi_source_name (const string& owner_name)
3591 char buf[PATH_MAX+1];
3592 const uint32_t limit = 10000;
3594 string possible_name;
3597 legalized = legalize_for_path (owner_name);
3599 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3601 for (cnt = 1; cnt <= limit; ++cnt) {
3603 vector<space_and_path>::iterator i;
3604 uint32_t existing = 0;
3606 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3608 SessionDirectory sdir((*i).path);
3610 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
3611 possible_name = buf;
3613 std::string possible_path = Glib::build_filename (sdir.midi_path(), possible_name);
3615 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
3619 if (midi_source_by_path (possible_path)) {
3624 if (existing == 0) {
3629 error << string_compose(
3630 _("There are already %1 recordings for %2, which I consider too many."),
3631 limit, owner_name) << endmsg;
3633 throw failed_constructor();
3637 return possible_name;
3641 /** Create a new within-session MIDI source */
3642 boost::shared_ptr<MidiSource>
3643 Session::create_midi_source_for_session (string const & basic_name)
3648 name = new_midi_source_name (basic_name);
3651 const string path = new_source_path_from_name (DataType::MIDI, name);
3653 return boost::dynamic_pointer_cast<SMFSource> (
3654 SourceFactory::createWritable (
3655 DataType::MIDI, *this, path, false, frame_rate()));
3658 /** Create a new within-session MIDI source */
3659 boost::shared_ptr<MidiSource>
3660 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
3662 /* the caller passes in the track the source will be used in,
3663 so that we can keep the numbering sane.
3665 Rationale: a track with the name "Foo" that has had N
3666 captures carried out so far will ALREADY have a write source
3667 named "Foo-N+1.mid" waiting to be used for the next capture.
3669 If we call new_midi_source_name() we will get "Foo-N+2". But
3670 there is no region corresponding to "Foo-N+1", so when
3671 "Foo-N+2" appears in the track, the gap presents the user
3672 with odd behaviour - why did it skip past Foo-N+1?
3674 We could explain this to the user in some odd way, but
3675 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
3678 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
3681 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
3683 std::string name = track->steal_write_source_name ();
3686 return boost::shared_ptr<MidiSource>();
3689 const string path = new_source_path_from_name (DataType::MIDI, name);
3691 return boost::dynamic_pointer_cast<SMFSource> (
3692 SourceFactory::createWritable (
3693 DataType::MIDI, *this, path, false, frame_rate()));
3698 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3700 if (playlist->hidden()) {
3704 playlists->add (playlist);
3707 playlist->release();
3714 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3716 if (_state_of_the_state & Deletion) {
3720 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3726 playlists->remove (playlist);
3732 Session::set_audition (boost::shared_ptr<Region> r)
3734 pending_audition_region = r;
3735 add_post_transport_work (PostTransportAudition);
3736 _butler->schedule_transport_work ();
3740 Session::audition_playlist ()
3742 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3743 ev->region.reset ();
3748 Session::non_realtime_set_audition ()
3750 assert (pending_audition_region);
3751 auditioner->audition_region (pending_audition_region);
3752 pending_audition_region.reset ();
3753 AuditionActive (true); /* EMIT SIGNAL */
3757 Session::audition_region (boost::shared_ptr<Region> r)
3759 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3765 Session::cancel_audition ()
3770 if (auditioner->auditioning()) {
3771 auditioner->cancel_audition ();
3772 AuditionActive (false); /* EMIT SIGNAL */
3777 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3779 if (a->is_monitor()) {
3782 if (b->is_monitor()) {
3785 return a->order_key () < b->order_key ();
3789 Session::is_auditioning () const
3791 /* can be called before we have an auditioner object */
3793 return auditioner->auditioning();
3800 Session::graph_reordered ()
3802 /* don't do this stuff if we are setting up connections
3803 from a set_state() call or creating new tracks. Ditto for deletion.
3806 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
3810 /* every track/bus asked for this to be handled but it was deferred because
3811 we were connecting. do it now.
3814 request_input_change_handling ();
3818 /* force all diskstreams to update their capture offset values to
3819 reflect any changes in latencies within the graph.
3822 boost::shared_ptr<RouteList> rl = routes.reader ();
3823 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3824 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3826 tr->set_capture_offset ();
3831 /** @return Number of frames that there is disk space available to write,
3834 boost::optional<framecnt_t>
3835 Session::available_capture_duration ()
3837 Glib::Threads::Mutex::Lock lm (space_lock);
3839 if (_total_free_4k_blocks_uncertain) {
3840 return boost::optional<framecnt_t> ();
3843 float sample_bytes_on_disk = 4.0; // keep gcc happy
3845 switch (config.get_native_file_data_format()) {
3847 sample_bytes_on_disk = 4.0;
3851 sample_bytes_on_disk = 3.0;
3855 sample_bytes_on_disk = 2.0;
3859 /* impossible, but keep some gcc versions happy */
3860 fatal << string_compose (_("programming error: %1"),
3861 X_("illegal native file data format"))
3866 double scale = 4096.0 / sample_bytes_on_disk;
3868 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3869 return max_framecnt;
3872 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3876 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3879 RCUWriter<BundleList> writer (_bundles);
3880 boost::shared_ptr<BundleList> b = writer.get_copy ();
3881 b->push_back (bundle);
3884 BundleAdded (bundle); /* EMIT SIGNAL */
3890 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3892 bool removed = false;
3895 RCUWriter<BundleList> writer (_bundles);
3896 boost::shared_ptr<BundleList> b = writer.get_copy ();
3897 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3899 if (i != b->end()) {
3906 BundleRemoved (bundle); /* EMIT SIGNAL */
3912 boost::shared_ptr<Bundle>
3913 Session::bundle_by_name (string name) const
3915 boost::shared_ptr<BundleList> b = _bundles.reader ();
3917 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3918 if ((*i)->name() == name) {
3923 return boost::shared_ptr<Bundle> ();
3927 Session::tempo_map_changed (const PropertyChange&)
3931 playlists->update_after_tempo_map_change ();
3933 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3939 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3941 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3942 (*i)->recompute_frames_from_bbt ();
3946 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3947 * the given count with the current block size.
3950 Session::ensure_buffers (ChanCount howmany)
3952 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
3956 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3958 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3959 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3964 Session::next_insert_id ()
3966 /* this doesn't really loop forever. just think about it */
3969 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3970 if (!insert_bitset[n]) {
3971 insert_bitset[n] = true;
3977 /* none available, so resize and try again */
3979 insert_bitset.resize (insert_bitset.size() + 16, false);
3984 Session::next_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 < send_bitset.size(); ++n) {
3990 if (!send_bitset[n]) {
3991 send_bitset[n] = true;
3997 /* none available, so resize and try again */
3999 send_bitset.resize (send_bitset.size() + 16, false);
4004 Session::next_aux_send_id ()
4006 /* this doesn't really loop forever. just think about it */
4009 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
4010 if (!aux_send_bitset[n]) {
4011 aux_send_bitset[n] = true;
4017 /* none available, so resize and try again */
4019 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
4024 Session::next_return_id ()
4026 /* this doesn't really loop forever. just think about it */
4029 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
4030 if (!return_bitset[n]) {
4031 return_bitset[n] = true;
4037 /* none available, so resize and try again */
4039 return_bitset.resize (return_bitset.size() + 16, false);
4044 Session::mark_send_id (uint32_t id)
4046 if (id >= send_bitset.size()) {
4047 send_bitset.resize (id+16, false);
4049 if (send_bitset[id]) {
4050 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
4052 send_bitset[id] = true;
4056 Session::mark_aux_send_id (uint32_t id)
4058 if (id >= aux_send_bitset.size()) {
4059 aux_send_bitset.resize (id+16, false);
4061 if (aux_send_bitset[id]) {
4062 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
4064 aux_send_bitset[id] = true;
4068 Session::mark_return_id (uint32_t id)
4070 if (id >= return_bitset.size()) {
4071 return_bitset.resize (id+16, false);
4073 if (return_bitset[id]) {
4074 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
4076 return_bitset[id] = true;
4080 Session::mark_insert_id (uint32_t id)
4082 if (id >= insert_bitset.size()) {
4083 insert_bitset.resize (id+16, false);
4085 if (insert_bitset[id]) {
4086 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
4088 insert_bitset[id] = true;
4092 Session::unmark_send_id (uint32_t id)
4094 if (id < send_bitset.size()) {
4095 send_bitset[id] = false;
4100 Session::unmark_aux_send_id (uint32_t id)
4102 if (id < aux_send_bitset.size()) {
4103 aux_send_bitset[id] = false;
4108 Session::unmark_return_id (uint32_t id)
4110 if (id < return_bitset.size()) {
4111 return_bitset[id] = false;
4116 Session::unmark_insert_id (uint32_t id)
4118 if (id < insert_bitset.size()) {
4119 insert_bitset[id] = false;
4124 Session::reset_native_file_format ()
4126 boost::shared_ptr<RouteList> rl = routes.reader ();
4127 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4128 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4130 /* don't save state as we do this, there's no point
4133 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
4134 tr->reset_write_sources (false);
4135 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
4141 Session::route_name_unique (string n) const
4143 boost::shared_ptr<RouteList> r = routes.reader ();
4145 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4146 if ((*i)->name() == n) {
4155 Session::route_name_internal (string n) const
4157 if (auditioner && auditioner->name() == n) {
4161 if (_click_io && _click_io->name() == n) {
4169 Session::freeze_all (InterThreadInfo& itt)
4171 boost::shared_ptr<RouteList> r = routes.reader ();
4173 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4175 boost::shared_ptr<Track> t;
4177 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
4178 /* XXX this is wrong because itt.progress will keep returning to zero at the start
4188 boost::shared_ptr<Region>
4189 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
4190 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
4191 InterThreadInfo& itt,
4192 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
4193 bool for_export, bool for_freeze)
4195 boost::shared_ptr<Region> result;
4196 boost::shared_ptr<Playlist> playlist;
4197 boost::shared_ptr<AudioFileSource> fsource;
4199 ChanCount diskstream_channels (track.n_channels());
4200 framepos_t position;
4201 framecnt_t this_chunk;
4203 framepos_t latency_skip;
4205 SessionDirectory sdir(get_best_session_directory_for_new_source ());
4206 const string sound_dir = sdir.sound_path();
4207 framepos_t len = end - start;
4208 bool need_block_size_reset = false;
4210 ChanCount const max_proc = track.max_processor_streams ();
4211 string legal_playlist_name;
4212 string possible_path;
4215 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
4216 end, start) << endmsg;
4220 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
4221 include_endpoint, for_export, for_freeze);
4223 if (diskstream_channels.n_audio() < 1) {
4224 error << _("Cannot write a range with no audio.") << endmsg;
4228 // block all process callback handling
4230 block_processing ();
4233 // synchronize with AudioEngine::process_callback()
4234 // make sure processing is not currently running
4235 // and processing_blocked() is honored before
4236 // acquiring thread buffers
4237 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
4240 _bounce_processing_active = true;
4242 /* call tree *MUST* hold route_lock */
4244 if ((playlist = track.playlist()) == 0) {
4248 legal_playlist_name = legalize_for_path (playlist->name());
4250 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4252 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
4254 for (x = 0; x < 99999; ++x) {
4255 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()));
4256 if (!Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
4262 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
4267 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
4268 SourceFactory::createWritable (DataType::AUDIO, *this, possible_path, false, frame_rate()));
4271 catch (failed_constructor& err) {
4272 error << string_compose (_("cannot create new audio file \"%1\" for %2"), possible_path, track.name()) << endmsg;
4276 srcs.push_back (fsource);
4279 /* tell redirects that care that we are about to use a much larger
4280 * blocksize. this will flush all plugins too, so that they are ready
4281 * to be used for this process.
4284 need_block_size_reset = true;
4285 track.set_block_size (bounce_chunk_size);
4286 _engine.main_thread()->get_buffers ();
4290 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
4292 /* create a set of reasonably-sized buffers */
4293 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4294 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
4296 buffers.set_count (max_proc);
4298 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4299 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4301 afs->prepare_for_peakfile_writes ();
4304 while (to_do && !itt.cancel) {
4306 this_chunk = min (to_do, bounce_chunk_size);
4308 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
4312 start += this_chunk;
4313 to_do -= this_chunk;
4314 itt.progress = (float) (1.0 - ((double) to_do / len));
4316 if (latency_skip >= bounce_chunk_size) {
4317 latency_skip -= bounce_chunk_size;
4321 const framecnt_t current_chunk = this_chunk - latency_skip;
4324 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4325 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4328 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
4336 /* post-roll, pick up delayed processor output */
4337 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
4339 while (latency_skip && !itt.cancel) {
4340 this_chunk = min (latency_skip, bounce_chunk_size);
4341 latency_skip -= this_chunk;
4343 buffers.silence (this_chunk, 0);
4344 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
4347 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4348 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4351 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
4363 xnow = localtime (&now);
4365 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
4366 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4369 afs->update_header (position, *xnow, now);
4370 afs->flush_header ();
4374 /* construct a region to represent the bounced material */
4378 plist.add (Properties::start, 0);
4379 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4380 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4382 result = RegionFactory::create (srcs, plist);
4388 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4389 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4392 afs->mark_for_remove ();
4395 (*src)->drop_references ();
4399 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4400 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4403 afs->done_with_peakfile_writes ();
4407 _bounce_processing_active = false;
4409 if (need_block_size_reset) {
4410 _engine.main_thread()->drop_buffers ();
4411 track.set_block_size (get_block_size());
4414 unblock_processing ();
4420 Session::gain_automation_buffer() const
4422 return ProcessThread::gain_automation_buffer ();
4426 Session::send_gain_automation_buffer() const
4428 return ProcessThread::send_gain_automation_buffer ();
4432 Session::pan_automation_buffer() const
4434 return ProcessThread::pan_automation_buffer ();
4438 Session::get_silent_buffers (ChanCount count)
4440 return ProcessThread::get_silent_buffers (count);
4444 Session::get_scratch_buffers (ChanCount count, bool silence)
4446 return ProcessThread::get_scratch_buffers (count, silence);
4450 Session::get_route_buffers (ChanCount count, bool silence)
4452 return ProcessThread::get_route_buffers (count, silence);
4457 Session::get_mix_buffers (ChanCount count)
4459 return ProcessThread::get_mix_buffers (count);
4463 Session::ntracks () const
4466 boost::shared_ptr<RouteList> r = routes.reader ();
4468 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4469 if (boost::dynamic_pointer_cast<Track> (*i)) {
4478 Session::nbusses () const
4481 boost::shared_ptr<RouteList> r = routes.reader ();
4483 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4484 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
4493 Session::add_automation_list(AutomationList *al)
4495 automation_lists[al->id()] = al;
4498 /** @return true if there is at least one record-enabled track, otherwise false */
4500 Session::have_rec_enabled_track () const
4502 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
4505 /** Update the state of our rec-enabled tracks flag */
4507 Session::update_have_rec_enabled_track ()
4509 boost::shared_ptr<RouteList> rl = routes.reader ();
4510 RouteList::iterator i = rl->begin();
4511 while (i != rl->end ()) {
4513 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4514 if (tr && tr->record_enabled ()) {
4521 int const old = g_atomic_int_get (&_have_rec_enabled_track);
4523 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4525 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4526 RecordStateChanged (); /* EMIT SIGNAL */
4531 Session::listen_position_changed ()
4533 boost::shared_ptr<RouteList> r = routes.reader ();
4535 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4536 (*i)->listen_position_changed ();
4541 Session::solo_control_mode_changed ()
4543 /* cancel all solo or all listen when solo control mode changes */
4546 set_solo (get_routes(), false);
4547 } else if (listening()) {
4548 set_listen (get_routes(), false);
4552 /** Called when a property of one of our route groups changes */
4554 Session::route_group_property_changed (RouteGroup* rg)
4556 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4559 /** Called when a route is added to one of our route groups */
4561 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4563 RouteAddedToRouteGroup (rg, r);
4566 /** Called when a route is removed from one of our route groups */
4568 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4570 RouteRemovedFromRouteGroup (rg, r);
4573 boost::shared_ptr<RouteList>
4574 Session::get_routes_with_regions_at (framepos_t const p) const
4576 boost::shared_ptr<RouteList> r = routes.reader ();
4577 boost::shared_ptr<RouteList> rl (new RouteList);
4579 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4580 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4585 boost::shared_ptr<Playlist> pl = tr->playlist ();
4590 if (pl->has_region_at (p)) {
4599 Session::goto_end ()
4601 if (_session_range_location) {
4602 request_locate (_session_range_location->end(), false);
4604 request_locate (0, false);
4609 Session::goto_start ()
4611 if (_session_range_location) {
4612 request_locate (_session_range_location->start(), false);
4614 request_locate (0, false);
4619 Session::current_start_frame () const
4621 return _session_range_location ? _session_range_location->start() : 0;
4625 Session::current_end_frame () const
4627 return _session_range_location ? _session_range_location->end() : 0;
4631 Session::add_session_range_location (framepos_t start, framepos_t end)
4633 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4634 _locations->add (_session_range_location);
4638 Session::step_edit_status_change (bool yn)
4644 send = (_step_editors == 0);
4649 send = (_step_editors == 1);
4652 if (_step_editors > 0) {
4658 StepEditStatusChange (val);
4664 Session::start_time_changed (framepos_t old)
4666 /* Update the auto loop range to match the session range
4667 (unless the auto loop range has been changed by the user)
4670 Location* s = _locations->session_range_location ();
4675 Location* l = _locations->auto_loop_location ();
4677 if (l && l->start() == old) {
4678 l->set_start (s->start(), true);
4683 Session::end_time_changed (framepos_t old)
4685 /* Update the auto loop range to match the session range
4686 (unless the auto loop range has been changed by the user)
4689 Location* s = _locations->session_range_location ();
4694 Location* l = _locations->auto_loop_location ();
4696 if (l && l->end() == old) {
4697 l->set_end (s->end(), true);
4701 std::vector<std::string>
4702 Session::source_search_path (DataType type) const
4706 if (session_dirs.size() == 1) {
4708 case DataType::AUDIO:
4709 sp.push_back (_session_dir->sound_path());
4711 case DataType::MIDI:
4712 sp.push_back (_session_dir->midi_path());
4716 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4717 SessionDirectory sdir (i->path);
4719 case DataType::AUDIO:
4720 sp.push_back (sdir.sound_path());
4722 case DataType::MIDI:
4723 sp.push_back (sdir.midi_path());
4729 if (type == DataType::AUDIO) {
4730 const string sound_path_2X = _session_dir->sound_path_2X();
4731 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
4732 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
4733 sp.push_back (sound_path_2X);
4738 // now check the explicit (possibly user-specified) search path
4741 case DataType::AUDIO:
4742 sp += Searchpath(config.get_audio_search_path ());
4744 case DataType::MIDI:
4745 sp += Searchpath(config.get_midi_search_path ());
4753 Session::ensure_search_path_includes (const string& path, DataType type)
4762 case DataType::AUDIO:
4763 sp += Searchpath(config.get_audio_search_path ());
4765 case DataType::MIDI:
4766 sp += Searchpath (config.get_midi_search_path ());
4770 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
4771 /* No need to add this new directory if it has the same inode as
4772 an existing one; checking inode rather than name prevents duplicated
4773 directories when we are using symlinks.
4775 On Windows, I think we could just do if (*i == path) here.
4777 if (PBD::equivalent_paths (*i, path)) {
4785 case DataType::AUDIO:
4786 config.set_audio_search_path (sp.to_string());
4788 case DataType::MIDI:
4789 config.set_midi_search_path (sp.to_string());
4794 boost::shared_ptr<Speakers>
4795 Session::get_speakers()
4801 Session::unknown_processors () const
4805 boost::shared_ptr<RouteList> r = routes.reader ();
4806 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4807 list<string> t = (*i)->unknown_processors ();
4808 copy (t.begin(), t.end(), back_inserter (p));
4818 Session::update_latency (bool playback)
4820 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
4822 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
4826 boost::shared_ptr<RouteList> r = routes.reader ();
4827 framecnt_t max_latency = 0;
4830 /* reverse the list so that we work backwards from the last route to run to the first */
4831 RouteList* rl = routes.reader().get();
4832 r.reset (new RouteList (*rl));
4833 reverse (r->begin(), r->end());
4836 /* compute actual latency values for the given direction and store them all in per-port
4837 structures. this will also publish the same values (to JACK) so that computation of latency
4838 for routes can consistently use public latency values.
4841 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4842 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
4845 /* because we latency compensate playback, our published playback latencies should
4846 be the same for all output ports - all material played back by ardour has
4847 the same latency, whether its caused by plugins or by latency compensation. since
4848 these may differ from the values computed above, reset all playback port latencies
4852 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
4854 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4855 (*i)->set_public_port_latencies (max_latency, playback);
4860 post_playback_latency ();
4864 post_capture_latency ();
4867 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
4871 Session::post_playback_latency ()
4873 set_worst_playback_latency ();
4875 boost::shared_ptr<RouteList> r = routes.reader ();
4877 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4878 if (!(*i)->is_auditioner() && ((*i)->active())) {
4879 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
4883 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4884 (*i)->set_latency_compensation (_worst_track_latency);
4889 Session::post_capture_latency ()
4891 set_worst_capture_latency ();
4893 /* reflect any changes in capture latencies into capture offsets
4896 boost::shared_ptr<RouteList> rl = routes.reader();
4897 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4898 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4900 tr->set_capture_offset ();
4906 Session::initialize_latencies ()
4909 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
4910 update_latency (false);
4911 update_latency (true);
4914 set_worst_io_latencies ();
4918 Session::set_worst_io_latencies ()
4920 set_worst_playback_latency ();
4921 set_worst_capture_latency ();
4925 Session::set_worst_playback_latency ()
4927 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4931 _worst_output_latency = 0;
4933 if (!_engine.connected()) {
4937 boost::shared_ptr<RouteList> r = routes.reader ();
4939 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4940 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
4943 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
4947 Session::set_worst_capture_latency ()
4949 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4953 _worst_input_latency = 0;
4955 if (!_engine.connected()) {
4959 boost::shared_ptr<RouteList> r = routes.reader ();
4961 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4962 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
4965 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
4969 Session::update_latency_compensation (bool force_whole_graph)
4971 bool some_track_latency_changed = false;
4973 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4977 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
4979 _worst_track_latency = 0;
4981 boost::shared_ptr<RouteList> r = routes.reader ();
4983 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4984 if (!(*i)->is_auditioner() && ((*i)->active())) {
4986 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
4987 some_track_latency_changed = true;
4989 _worst_track_latency = max (tl, _worst_track_latency);
4993 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
4994 (some_track_latency_changed ? "yes" : "no")));
4996 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
4998 if (some_track_latency_changed || force_whole_graph) {
4999 _engine.update_latencies ();
5003 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5004 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5008 tr->set_capture_offset ();
5013 Session::session_name_is_legal (const string& path)
5015 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
5017 for (int i = 0; illegal_chars[i]; ++i) {
5018 if (path.find (illegal_chars[i]) != string::npos) {
5019 return illegal_chars[i];
5027 Session::next_control_id () const
5031 /* the monitor bus remote ID is in a different
5032 * "namespace" than regular routes. its existence doesn't
5033 * affect normal (low) numbered routes.
5040 return nroutes() - subtract;
5044 Session::notify_remote_id_change ()
5046 if (deletion_in_progress()) {
5050 switch (Config->get_remote_model()) {
5052 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
5060 Session::sync_order_keys ()
5062 if (deletion_in_progress()) {
5066 /* tell everyone that something has happened to the sort keys
5067 and let them sync up with the change(s)
5068 this will give objects that manage the sort order keys the
5069 opportunity to keep them in sync if they wish to.
5072 DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
5074 reassign_track_numbers();
5076 Route::SyncOrderKeys (); /* EMIT SIGNAL */
5078 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
5082 Session::operation_in_progress (GQuark op) const
5084 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
5087 boost::shared_ptr<Port>
5088 Session::ltc_input_port () const
5090 return _ltc_input->nth (0);
5093 boost::shared_ptr<Port>
5094 Session::ltc_output_port () const
5096 return _ltc_output->nth (0);
5100 Session::reconnect_ltc_input ()
5104 string src = Config->get_ltc_source_port();
5106 _ltc_input->disconnect (this);
5108 if (src != _("None") && !src.empty()) {
5109 _ltc_input->nth (0)->connect (src);
5115 Session::reconnect_ltc_output ()
5120 string src = Config->get_ltc_sink_port();
5122 _ltc_output->disconnect (this);
5124 if (src != _("None") && !src.empty()) {
5125 _ltc_output->nth (0)->connect (src);