2 Copyright (C) 1999-2010 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #include <cstdio> /* sprintf(3) ... grrr */
33 #include <glibmm/threads.h>
34 #include <glibmm/miscutils.h>
35 #include <glibmm/fileutils.h>
37 #include <boost/algorithm/string/erase.hpp>
39 #include "pbd/basename.h"
40 #include "pbd/boost_debug.h"
41 #include "pbd/convert.h"
42 #include "pbd/convert.h"
43 #include "pbd/error.h"
44 #include "pbd/file_utils.h"
46 #include "pbd/search_path.h"
47 #include "pbd/stacktrace.h"
48 #include "pbd/stl_delete.h"
49 #include "pbd/unwind.h"
51 #include "ardour/amp.h"
52 #include "ardour/analyser.h"
53 #include "ardour/async_midi_port.h"
54 #include "ardour/audio_buffer.h"
55 #include "ardour/audio_diskstream.h"
56 #include "ardour/audio_port.h"
57 #include "ardour/audio_track.h"
58 #include "ardour/audioengine.h"
59 #include "ardour/audiofilesource.h"
60 #include "ardour/auditioner.h"
61 #include "ardour/buffer_manager.h"
62 #include "ardour/buffer_set.h"
63 #include "ardour/bundle.h"
64 #include "ardour/butler.h"
65 #include "ardour/click.h"
66 #include "ardour/control_protocol_manager.h"
67 #include "ardour/data_type.h"
68 #include "ardour/debug.h"
69 #include "ardour/filename_extensions.h"
70 #include "ardour/graph.h"
71 #include "ardour/midiport_manager.h"
72 #include "ardour/scene_changer.h"
73 #include "ardour/midi_track.h"
74 #include "ardour/midi_ui.h"
75 #include "ardour/operations.h"
76 #include "ardour/playlist.h"
77 #include "ardour/plugin.h"
78 #include "ardour/plugin_insert.h"
79 #include "ardour/process_thread.h"
80 #include "ardour/rc_configuration.h"
81 #include "ardour/recent_sessions.h"
82 #include "ardour/region.h"
83 #include "ardour/region_factory.h"
84 #include "ardour/route_graph.h"
85 #include "ardour/route_group.h"
86 #include "ardour/route_sorters.h"
87 #include "ardour/send.h"
88 #include "ardour/session.h"
89 #include "ardour/session_directory.h"
90 #include "ardour/session_playlists.h"
91 #include "ardour/smf_source.h"
92 #include "ardour/source_factory.h"
93 #include "ardour/speakers.h"
94 #include "ardour/tempo.h"
95 #include "ardour/track.h"
96 #include "ardour/user_bundle.h"
97 #include "ardour/utils.h"
99 #include "midi++/port.h"
100 #include "midi++/mmc.h"
111 using namespace ARDOUR;
114 bool Session::_disable_all_loaded_plugins = false;
116 PBD::Signal1<int,uint32_t> Session::AudioEngineSetupRequired;
117 PBD::Signal1<void,std::string> Session::Dialog;
118 PBD::Signal0<int> Session::AskAboutPendingState;
119 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
120 PBD::Signal0<void> Session::SendFeedback;
121 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
123 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
124 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
125 PBD::Signal2<void,std::string, std::string> Session::Exported;
126 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
127 PBD::Signal0<void> Session::Quit;
128 PBD::Signal0<void> Session::FeedbackDetected;
129 PBD::Signal0<void> Session::SuccessfulGraphSort;
130 PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
132 const framecnt_t Session::bounce_chunk_size = 65536;
133 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
134 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
136 /** @param snapshot_name Snapshot name, without .ardour suffix */
137 Session::Session (AudioEngine &eng,
138 const string& fullpath,
139 const string& snapshot_name,
140 BusProfile* bus_profile,
142 : playlists (new SessionPlaylists)
144 , process_function (&Session::process_with_events)
145 , _bounce_processing_active (false)
146 , waiting_for_sync_offset (false)
147 , _base_frame_rate (0)
148 , _current_frame_rate (0)
149 , _nominal_frame_rate (0)
150 , transport_sub_state (0)
151 , _record_status (Disabled)
152 , _transport_frame (0)
153 , _session_range_location (0)
156 , _transport_speed (0)
157 , _default_transport_speed (1.0)
158 , _last_transport_speed (0)
159 , _target_transport_speed (0.0)
160 , auto_play_legal (false)
161 , _last_slave_transport_frame (0)
162 , maximum_output_latency (0)
163 , _requested_return_frame (-1)
164 , current_block_size (0)
165 , _worst_output_latency (0)
166 , _worst_input_latency (0)
167 , _worst_track_latency (0)
168 , _have_captured (false)
169 , _non_soloed_outs_muted (false)
171 , _solo_isolated_cnt (0)
173 , _was_seamless (Config->get_seamless_loop ())
174 , _under_nsm_control (false)
175 , delta_accumulator_cnt (0)
176 , average_slave_delta (1800) // !!! why 1800 ???
178 , have_first_delta_accumulator (false)
179 , _slave_state (Stopped)
180 , post_export_sync (false)
181 , post_export_position (0)
183 , _export_started (false)
184 , _export_rolling (false)
185 , _pre_export_mmc_enabled (false)
186 , _name (snapshot_name)
188 , _send_qf_mtc (false)
189 , _pframes_since_last_mtc (0)
190 , session_midi_feedback (0)
192 , loop_changing (false)
194 , _session_dir (new SessionDirectory (fullpath))
195 , _current_snapshot_name (snapshot_name)
197 , state_was_pending (false)
198 , _state_of_the_state (StateOfTheState(CannotSave|InitialConnecting|Loading))
200 , _save_queued (false)
201 , _last_roll_location (0)
202 , _last_roll_or_reversal_location (0)
203 , _last_record_location (0)
204 , pending_locate_roll (false)
205 , pending_locate_frame (0)
206 , pending_locate_flush (false)
207 , pending_abort (false)
208 , pending_auto_loop (false)
209 , _butler (new Butler (*this))
210 , _post_transport_work (0)
211 , cumulative_rf_motion (0)
213 , _locations (new Locations (*this))
214 , _ignore_skips_updates (false)
216 , outbound_mtc_timecode_frame (0)
217 , next_quarter_frame_to_send (-1)
218 , _frames_per_timecode_frame (0)
219 , _frames_per_hour (0)
220 , _timecode_frames_per_hour (0)
221 , last_timecode_valid (false)
222 , last_timecode_when (0)
223 , _send_timecode_update (false)
235 , ltc_timecode_offset (0)
236 , ltc_timecode_negative_offset (false)
237 , midi_control_ui (0)
239 , _all_route_group (new RouteGroup (*this, "all"))
240 , routes (new RouteList)
241 , _adding_routes_in_progress (false)
242 , destructive_index (0)
243 , _track_number_decimals(1)
244 , solo_update_disabled (false)
245 , default_fade_steepness (0)
246 , default_fade_msecs (0)
247 , _total_free_4k_blocks (0)
248 , _total_free_4k_blocks_uncertain (false)
249 , no_questions_about_missing_files (false)
252 , _bundles (new BundleList)
253 , _bundle_xml_node (0)
257 , click_emphasis_data (0)
259 , click_emphasis_length (0)
260 , _clicks_cleared (0)
261 , _play_range (false)
263 , first_file_data_format_reset (true)
264 , first_file_header_format_reset (true)
265 , have_looped (false)
266 , _have_rec_enabled_track (false)
268 , _suspend_timecode_transmission (0)
269 , _speakers (new Speakers)
271 , ignore_route_processor_changes (false)
278 pre_engine_init (fullpath);
281 if (ensure_engine (sr)) {
283 throw failed_constructor ();
286 if (create (mix_template, bus_profile)) {
288 throw failed_constructor ();
291 /* if a mix template was provided, then ::create() will
292 * have copied it into the session and we need to load it
293 * so that we have the state ready for ::set_state()
294 * after the engine is started.
296 * Note that we do NOT try to get the sample rate from
297 * the template at this time, though doing so would
298 * be easy if we decided this was an appropriate part
302 if (!mix_template.empty() && load_state (_current_snapshot_name)) {
303 throw failed_constructor ();
306 /* load default session properties - if any */
311 if (load_state (_current_snapshot_name)) {
312 throw failed_constructor ();
315 /* try to get sample rate from XML state so that we
316 * can influence the SR if we set up the audio
321 const XMLProperty* prop;
322 if ((prop = state_tree->root()->property (X_("sample-rate"))) != 0) {
323 sr = atoi (prop->value());
327 if (ensure_engine (sr)) {
329 throw failed_constructor ();
333 if (post_engine_init ()) {
335 throw failed_constructor ();
338 store_recent_sessions (_name, _path);
340 bool was_dirty = dirty();
342 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
344 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
345 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
348 DirtyChanged (); /* EMIT SIGNAL */
351 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
352 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
356 /* hook us up to the engine since we are now completely constructed */
358 BootMessage (_("Connect to engine"));
360 _engine.set_session (this);
361 _engine.reset_timebase ();
363 BootMessage (_("Session loading complete"));
376 Session::ensure_engine (uint32_t desired_sample_rate)
378 if (_engine.current_backend() == 0) {
379 /* backend is unknown ... */
380 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
381 if (r.get_value_or (-1) != 0) {
384 } else if (_engine.setup_required()) {
385 /* backend is known, but setup is needed */
386 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
387 if (r.get_value_or (-1) != 0) {
390 } else if (!_engine.running()) {
391 if (_engine.start()) {
396 /* at this point the engine should be running
399 if (!_engine.running()) {
403 return immediately_post_engine ();
408 Session::immediately_post_engine ()
410 /* Do various initializations that should take place directly after we
411 * know that the engine is running, but before we either create a
412 * session or set state for an existing one.
415 if (how_many_dsp_threads () > 1) {
416 /* For now, only create the graph if we are using >1 DSP threads, as
417 it is a bit slower than the old code with 1 thread.
419 _process_graph.reset (new Graph (*this));
422 /* every time we reconnect, recompute worst case output latencies */
424 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
426 if (synced_to_engine()) {
427 _engine.transport_stop ();
430 if (config.get_jack_time_master()) {
431 _engine.transport_locate (_transport_frame);
435 BootMessage (_("Set up LTC"));
437 BootMessage (_("Set up Click"));
439 BootMessage (_("Set up standard connections"));
443 catch (failed_constructor& err) {
447 /* TODO, connect in different thread. (PortRegisteredOrUnregistered may be in RT context)
449 _engine.PortRegisteredOrUnregistered.connect_same_thread (*this, boost::bind (&Session::setup_bundles, this));
457 vector<void*> debug_pointers;
459 /* if we got to here, leaving pending capture state around
463 remove_pending_capture_state ();
465 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
467 /* disconnect from any and all signals that we are connected to */
471 _engine.remove_session ();
473 /* deregister all ports - there will be no process or any other
474 * callbacks from the engine any more.
477 Port::PortDrop (); /* EMIT SIGNAL */
481 /* clear history so that no references to objects are held any more */
485 /* clear state tree so that no references to objects are held any more */
490 /* reset dynamic state version back to default */
492 Stateful::loading_state_version = 0;
494 _butler->drop_references ();
498 delete _all_route_group;
500 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
501 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
505 if (click_data != default_click) {
506 delete [] click_data;
509 if (click_emphasis_data != default_click_emphasis) {
510 delete [] click_emphasis_data;
515 /* need to remove auditioner before monitoring section
516 * otherwise it is re-connected */
519 /* drop references to routes held by the monitoring section
520 * specifically _monitor_out aux/listen references */
521 remove_monitor_section();
523 /* clear out any pending dead wood from RCU managed objects */
528 AudioDiskstream::free_working_buffers();
530 /* tell everyone who is still standing that we're about to die */
533 /* tell everyone to drop references and delete objects as we go */
535 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
536 RegionFactory::delete_all_regions ();
538 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
540 /* reset these three references to special routes before we do the usual route delete thing */
542 _master_out.reset ();
543 _monitor_out.reset ();
546 RCUWriter<RouteList> writer (routes);
547 boost::shared_ptr<RouteList> r = writer.get_copy ();
549 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
550 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
551 (*i)->drop_references ();
555 /* writer goes out of scope and updates master */
560 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
561 Glib::Threads::Mutex::Lock lm (source_lock);
562 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
563 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
564 i->second->drop_references ();
570 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
573 delete _scene_changer; _scene_changer = 0;
574 delete midi_control_ui; midi_control_ui = 0;
576 delete _mmc; _mmc = 0;
577 delete _midi_ports; _midi_ports = 0;
578 delete _locations; _locations = 0;
582 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
584 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
585 boost_debug_list_ptrs ();
590 Session::setup_ltc ()
594 _ltc_input.reset (new IO (*this, X_("LTC In"), IO::Input));
595 _ltc_output.reset (new IO (*this, X_("LTC Out"), IO::Output));
597 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC In"))) != 0) {
598 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
601 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
602 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
604 reconnect_ltc_input ();
607 if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC Out"))) != 0) {
608 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
611 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
612 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
614 reconnect_ltc_output ();
617 /* fix up names of LTC ports because we don't want the normal
618 * IO style of NAME/TYPE-{in,out}N
621 _ltc_input->nth (0)->set_name (X_("LTC-in"));
622 _ltc_output->nth (0)->set_name (X_("LTC-out"));
626 Session::setup_click ()
629 _click_io.reset (new ClickIO (*this, X_("Click")));
630 _click_gain.reset (new Amp (*this));
631 _click_gain->activate ();
633 setup_click_state (state_tree->root());
635 setup_click_state (0);
640 Session::setup_click_state (const XMLNode* node)
642 const XMLNode* child = 0;
644 if (node && (child = find_named_node (*node, "Click")) != 0) {
646 /* existing state for Click */
649 if (Stateful::loading_state_version < 3000) {
650 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
652 const XMLNodeList& children (child->children());
653 XMLNodeList::const_iterator i = children.begin();
654 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
656 if (i != children.end()) {
657 c = _click_gain->set_state (**i, Stateful::loading_state_version);
663 _clicking = Config->get_clicking ();
667 error << _("could not setup Click I/O") << endmsg;
674 /* default state for Click: dual-mono to first 2 physical outputs */
677 _engine.get_physical_outputs (DataType::AUDIO, outs);
679 for (uint32_t physport = 0; physport < 2; ++physport) {
680 if (outs.size() > physport) {
681 if (_click_io->add_port (outs[physport], this)) {
682 // relax, even though its an error
687 if (_click_io->n_ports () > ChanCount::ZERO) {
688 _clicking = Config->get_clicking ();
694 Session::setup_bundles ()
698 RCUWriter<BundleList> writer (_bundles);
699 boost::shared_ptr<BundleList> b = writer.get_copy ();
700 for (BundleList::iterator i = b->begin(); i != b->end();) {
701 if (boost::dynamic_pointer_cast<UserBundle>(*i)) {
709 vector<string> inputs[DataType::num_types];
710 vector<string> outputs[DataType::num_types];
711 for (uint32_t i = 0; i < DataType::num_types; ++i) {
712 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
713 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
716 /* Create a set of Bundle objects that map
717 to the physical I/O currently available. We create both
718 mono and stereo bundles, so that the common cases of mono
719 and stereo tracks get bundles to put in their mixer strip
720 in / out menus. There may be a nicer way of achieving that;
721 it doesn't really scale that well to higher channel counts
724 /* mono output bundles */
726 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
728 std::string pn = _engine.get_pretty_name_by_name (outputs[DataType::AUDIO][np]);
730 snprintf (buf, sizeof (buf), _("out %s"), pn.substr(0,12).c_str());
732 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
735 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
736 c->add_channel (_("mono"), DataType::AUDIO);
737 c->set_port (0, outputs[DataType::AUDIO][np]);
739 add_bundle (c, false);
742 /* stereo output bundles */
744 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
745 if (np + 1 < outputs[DataType::AUDIO].size()) {
747 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
748 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
749 c->add_channel (_("L"), DataType::AUDIO);
750 c->set_port (0, outputs[DataType::AUDIO][np]);
751 c->add_channel (_("R"), DataType::AUDIO);
752 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
754 add_bundle (c, false);
758 /* mono input bundles */
760 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
762 std::string pn = _engine.get_pretty_name_by_name (inputs[DataType::AUDIO][np]);
764 snprintf (buf, sizeof (buf), _("in %s"), pn.substr(0,12).c_str());
766 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
769 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
770 c->add_channel (_("mono"), DataType::AUDIO);
771 c->set_port (0, inputs[DataType::AUDIO][np]);
773 add_bundle (c, false);
776 /* stereo input bundles */
778 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
779 if (np + 1 < inputs[DataType::AUDIO].size()) {
781 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
783 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
784 c->add_channel (_("L"), DataType::AUDIO);
785 c->set_port (0, inputs[DataType::AUDIO][np]);
786 c->add_channel (_("R"), DataType::AUDIO);
787 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
789 add_bundle (c, false);
793 /* MIDI input bundles */
795 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
796 string n = inputs[DataType::MIDI][np];
797 std::string pn = _engine.get_pretty_name_by_name (n);
801 boost::erase_first (n, X_("alsa_pcm:"));
803 boost::shared_ptr<Bundle> c (new Bundle (n, false));
804 c->add_channel ("", DataType::MIDI);
805 c->set_port (0, inputs[DataType::MIDI][np]);
806 add_bundle (c, false);
809 /* MIDI output bundles */
811 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
812 string n = outputs[DataType::MIDI][np];
813 std::string pn = _engine.get_pretty_name_by_name (n);
817 boost::erase_first (n, X_("alsa_pcm:"));
819 boost::shared_ptr<Bundle> c (new Bundle (n, true));
820 c->add_channel ("", DataType::MIDI);
821 c->set_port (0, outputs[DataType::MIDI][np]);
822 add_bundle (c, false);
825 // we trust the backend to only calls us if there's a change
826 BundleAddedOrRemoved (); /* EMIT SIGNAL */
830 Session::auto_connect_master_bus ()
832 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
836 /* if requested auto-connect the outputs to the first N physical ports.
839 uint32_t limit = _master_out->n_outputs().n_total();
840 vector<string> outputs[DataType::num_types];
842 for (uint32_t i = 0; i < DataType::num_types; ++i) {
843 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
846 for (uint32_t n = 0; n < limit; ++n) {
847 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
849 if (outputs[p->type()].size() > n) {
850 connect_to = outputs[p->type()][n];
853 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
854 if (_master_out->output()->connect (p, connect_to, this)) {
855 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
864 Session::remove_monitor_section ()
870 /* force reversion to Solo-In-Place */
871 Config->set_solo_control_is_listen_control (false);
873 /* if we are auditioning, cancel it ... this is a workaround
874 to a problem (auditioning does not execute the process graph,
875 which is needed to remove routes when using >1 core for processing)
880 /* Hold process lock while doing this so that we don't hear bits and
881 * pieces of audio as we work on each route.
884 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
886 /* Connect tracks to monitor section. Note that in an
887 existing session, the internal sends will already exist, but we want the
888 routes to notice that they connect to the control out specifically.
892 boost::shared_ptr<RouteList> r = routes.reader ();
893 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
895 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
897 if ((*x)->is_monitor()) {
899 } else if ((*x)->is_master()) {
902 (*x)->remove_aux_or_listen (_monitor_out);
907 remove_route (_monitor_out);
908 auto_connect_master_bus ();
911 auditioner->connect ();
916 Session::add_monitor_section ()
920 if (_monitor_out || !_master_out) {
924 boost::shared_ptr<Route> r (new Route (*this, _("Monitor"), Route::MonitorOut, DataType::AUDIO));
930 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
931 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
934 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
935 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
936 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
940 add_routes (rl, false, false, false);
942 assert (_monitor_out);
944 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
945 are undefined, at best.
948 uint32_t limit = _monitor_out->n_inputs().n_audio();
952 /* connect the inputs to the master bus outputs. this
953 * represents a separate data feed from the internal sends from
954 * each route. as of jan 2011, it allows the monitor section to
955 * conditionally ignore either the internal sends or the normal
956 * input feed, but we should really find a better way to do
960 _master_out->output()->disconnect (this);
962 for (uint32_t n = 0; n < limit; ++n) {
963 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
964 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
967 string connect_to = o->name();
968 if (_monitor_out->input()->connect (p, connect_to, this)) {
969 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
977 /* if monitor section is not connected, connect it to physical outs
980 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
982 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
984 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
987 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
989 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
990 Config->get_monitor_bus_preferred_bundle())
996 /* Monitor bus is audio only */
998 vector<string> outputs[DataType::num_types];
1000 for (uint32_t i = 0; i < DataType::num_types; ++i) {
1001 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1004 uint32_t mod = outputs[DataType::AUDIO].size();
1005 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1009 for (uint32_t n = 0; n < limit; ++n) {
1011 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1013 if (outputs[DataType::AUDIO].size() > (n % mod)) {
1014 connect_to = outputs[DataType::AUDIO][n % mod];
1017 if (!connect_to.empty()) {
1018 if (_monitor_out->output()->connect (p, connect_to, this)) {
1019 error << string_compose (
1020 _("cannot connect control output %1 to %2"),
1031 /* Hold process lock while doing this so that we don't hear bits and
1032 * pieces of audio as we work on each route.
1035 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1037 /* Connect tracks to monitor section. Note that in an
1038 existing session, the internal sends will already exist, but we want the
1039 routes to notice that they connect to the control out specifically.
1043 boost::shared_ptr<RouteList> rls = routes.reader ();
1045 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1047 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1049 if ((*x)->is_monitor()) {
1051 } else if ((*x)->is_master()) {
1054 (*x)->enable_monitor_send ();
1059 auditioner->connect ();
1064 Session::hookup_io ()
1066 /* stop graph reordering notifications from
1067 causing resorts, etc.
1070 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
1074 /* we delay creating the auditioner till now because
1075 it makes its own connections to ports.
1079 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
1081 throw failed_constructor ();
1083 a->use_new_diskstream ();
1087 catch (failed_constructor& err) {
1088 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
1092 /* load bundles, which we may have postponed earlier on */
1093 if (_bundle_xml_node) {
1094 load_bundles (*_bundle_xml_node);
1095 delete _bundle_xml_node;
1098 /* Tell all IO objects to connect themselves together */
1100 IO::enable_connecting ();
1102 /* Now tell all "floating" ports to connect to whatever
1103 they should be connected to.
1106 AudioEngine::instance()->reconnect_ports ();
1108 /* Anyone who cares about input state, wake up and do something */
1110 IOConnectionsComplete (); /* EMIT SIGNAL */
1112 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
1114 /* now handle the whole enchilada as if it was one
1115 graph reorder event.
1120 /* update the full solo state, which can't be
1121 correctly determined on a per-route basis, but
1122 needs the global overview that only the session
1126 update_route_solo_state ();
1130 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
1132 boost::shared_ptr<Track> track = wp.lock ();
1137 boost::shared_ptr<Playlist> playlist;
1139 if ((playlist = track->playlist()) != 0) {
1140 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
1141 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
1142 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
1147 Session::record_enabling_legal () const
1149 /* this used to be in here, but survey says.... we don't need to restrict it */
1150 // if (record_status() == Recording) {
1154 if (Config->get_all_safe()) {
1161 Session::set_track_monitor_input_status (bool yn)
1163 boost::shared_ptr<RouteList> rl = routes.reader ();
1164 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1165 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1166 if (tr && tr->record_enabled ()) {
1167 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1168 tr->request_input_monitoring (yn);
1174 Session::auto_punch_start_changed (Location* location)
1176 replace_event (SessionEvent::PunchIn, location->start());
1178 if (get_record_enabled() && config.get_punch_in()) {
1179 /* capture start has been changed, so save new pending state */
1180 save_state ("", true);
1185 Session::auto_punch_end_changed (Location* location)
1187 framepos_t when_to_stop = location->end();
1188 // when_to_stop += _worst_output_latency + _worst_input_latency;
1189 replace_event (SessionEvent::PunchOut, when_to_stop);
1193 Session::auto_punch_changed (Location* location)
1195 framepos_t when_to_stop = location->end();
1197 replace_event (SessionEvent::PunchIn, location->start());
1198 //when_to_stop += _worst_output_latency + _worst_input_latency;
1199 replace_event (SessionEvent::PunchOut, when_to_stop);
1202 /** @param loc A loop location.
1203 * @param pos Filled in with the start time of the required fade-out (in session frames).
1204 * @param length Filled in with the length of the required fade-out.
1207 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
1209 pos = max (loc->start(), loc->end() - 64);
1210 length = loc->end() - pos;
1214 Session::auto_loop_changed (Location* location)
1216 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1219 auto_loop_declick_range (location, dcp, dcl);
1220 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1222 if (transport_rolling() && play_loop) {
1225 // if (_transport_frame > location->end()) {
1227 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1228 // relocate to beginning of loop
1229 clear_events (SessionEvent::LocateRoll);
1231 request_locate (location->start(), true);
1234 else if (Config->get_seamless_loop() && !loop_changing) {
1236 // schedule a locate-roll to refill the diskstreams at the
1237 // previous loop end
1238 loop_changing = true;
1240 if (location->end() > last_loopend) {
1241 clear_events (SessionEvent::LocateRoll);
1242 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1249 last_loopend = location->end();
1254 Session::set_auto_punch_location (Location* location)
1258 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1259 punch_connections.drop_connections();
1260 existing->set_auto_punch (false, this);
1261 remove_event (existing->start(), SessionEvent::PunchIn);
1262 clear_events (SessionEvent::PunchOut);
1263 auto_punch_location_changed (0);
1268 if (location == 0) {
1272 if (location->end() <= location->start()) {
1273 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1277 punch_connections.drop_connections ();
1279 location->StartChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, location));
1280 location->EndChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, location));
1281 location->Changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, location));
1283 location->set_auto_punch (true, this);
1285 auto_punch_changed (location);
1287 auto_punch_location_changed (location);
1291 Session::set_session_extents (framepos_t start, framepos_t end)
1294 if ((existing = _locations->session_range_location()) == 0) {
1295 //if there is no existing session, we need to make a new session location (should never happen)
1296 existing = new Location (*this, 0, 0, _("session"), Location::IsSessionRange);
1300 error << _("Session: you can't use that location for session start/end)") << endmsg;
1304 existing->set( start, end );
1310 Session::set_auto_loop_location (Location* location)
1314 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1315 loop_connections.drop_connections ();
1316 existing->set_auto_loop (false, this);
1317 remove_event (existing->end(), SessionEvent::AutoLoop);
1320 auto_loop_declick_range (existing, dcp, dcl);
1321 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1322 auto_loop_location_changed (0);
1327 if (location == 0) {
1331 if (location->end() <= location->start()) {
1332 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1336 last_loopend = location->end();
1338 loop_connections.drop_connections ();
1340 location->StartChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1341 location->EndChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1342 location->Changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1344 location->set_auto_loop (true, this);
1346 /* take care of our stuff first */
1348 auto_loop_changed (location);
1350 /* now tell everyone else */
1352 auto_loop_location_changed (location);
1356 Session::update_loop (Location*)
1362 Session::update_marks (Location*)
1368 Session::update_skips (Location* loc, bool consolidate)
1370 if (_ignore_skips_updates) {
1374 Locations::LocationList skips;
1377 PBD::Unwinder<bool> uw (_ignore_skips_updates, true);
1378 consolidate_skips (loc);
1381 sync_locations_to_skips ();
1387 Session::consolidate_skips (Location* loc)
1389 Locations::LocationList all_locations = _locations->list ();
1391 for (Locations::LocationList::iterator l = all_locations.begin(); l != all_locations.end(); ) {
1393 if (!(*l)->is_skip ()) {
1398 /* don't test against self */
1405 switch (Evoral::coverage ((*l)->start(), (*l)->end(), loc->start(), loc->end())) {
1406 case Evoral::OverlapInternal:
1407 case Evoral::OverlapExternal:
1408 case Evoral::OverlapStart:
1409 case Evoral::OverlapEnd:
1410 /* adjust new location to cover existing one */
1411 loc->set_start (min (loc->start(), (*l)->start()));
1412 loc->set_end (max (loc->end(), (*l)->end()));
1413 /* we don't need this one any more */
1414 _locations->remove (*l);
1415 /* the location has been deleted, so remove reference to it in our local list */
1416 l = all_locations.erase (l);
1419 case Evoral::OverlapNone:
1427 Session::sync_locations_to_skips ()
1429 /* This happens asynchronously (in the audioengine thread). After the clear is done, we will call
1430 * Session::_sync_locations_to_skips() from the audioengine thread.
1432 clear_events (SessionEvent::Skip, boost::bind (&Session::_sync_locations_to_skips, this));
1436 Session::_sync_locations_to_skips ()
1438 /* called as a callback after existing Skip events have been cleared from a realtime audioengine thread */
1440 Locations::LocationList const & locs (_locations->list());
1442 for (Locations::LocationList::const_iterator i = locs.begin(); i != locs.end(); ++i) {
1444 Location* location = *i;
1446 if (location->is_skip() && location->is_skipping()) {
1447 SessionEvent* ev = new SessionEvent (SessionEvent::Skip, SessionEvent::Add, location->start(), location->end(), 1.0);
1455 Session::location_added (Location *location)
1457 if (location->is_auto_punch()) {
1458 set_auto_punch_location (location);
1461 if (location->is_auto_loop()) {
1462 set_auto_loop_location (location);
1465 if (location->is_session_range()) {
1466 /* no need for any signal handling or event setting with the session range,
1467 because we keep a direct reference to it and use its start/end directly.
1469 _session_range_location = location;
1472 if (location->is_skip()) {
1473 /* listen for per-location signals that require us to update skip-locate events */
1475 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1476 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1477 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1478 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, false));
1480 update_skips (location, true);
1487 Session::location_removed (Location *location)
1489 if (location->is_auto_loop()) {
1490 set_auto_loop_location (0);
1491 set_track_loop (false);
1494 if (location->is_auto_punch()) {
1495 set_auto_punch_location (0);
1498 if (location->is_session_range()) {
1499 /* this is never supposed to happen */
1500 error << _("programming error: session range removed!") << endl;
1503 if (location->is_skip()) {
1505 update_skips (location, false);
1512 Session::locations_changed ()
1514 _locations->apply (*this, &Session::_locations_changed);
1518 Session::_locations_changed (const Locations::LocationList& locations)
1520 /* There was some mass-change in the Locations object.
1522 We might be re-adding a location here but it doesn't actually matter
1523 for all the locations that the Session takes an interest in.
1526 for (Locations::LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
1527 location_added (*i);
1532 Session::enable_record ()
1534 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1535 /* no recording at anything except normal speed */
1540 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1542 if (rs == Recording) {
1546 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1548 _last_record_location = _transport_frame;
1549 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1551 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1552 set_track_monitor_input_status (true);
1555 RecordStateChanged ();
1562 Session::disable_record (bool rt_context, bool force)
1566 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1568 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1569 g_atomic_int_set (&_record_status, Disabled);
1570 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1572 if (rs == Recording) {
1573 g_atomic_int_set (&_record_status, Enabled);
1577 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1578 set_track_monitor_input_status (false);
1581 RecordStateChanged (); /* emit signal */
1584 remove_pending_capture_state ();
1590 Session::step_back_from_record ()
1592 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1594 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1595 set_track_monitor_input_status (false);
1598 RecordStateChanged (); /* emit signal */
1603 Session::maybe_enable_record ()
1605 if (_step_editors > 0) {
1609 g_atomic_int_set (&_record_status, Enabled);
1611 /* This function is currently called from somewhere other than an RT thread.
1612 This save_state() call therefore doesn't impact anything. Doing it here
1613 means that we save pending state of which sources the next record will use,
1614 which gives us some chance of recovering from a crash during the record.
1617 save_state ("", true);
1619 if (_transport_speed) {
1620 if (!config.get_punch_in()) {
1624 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1625 RecordStateChanged (); /* EMIT SIGNAL */
1632 Session::audible_frame () const
1638 offset = worst_playback_latency ();
1640 if (synced_to_engine()) {
1641 /* Note: this is basically just sync-to-JACK */
1642 tf = _engine.transport_frame();
1644 tf = _transport_frame;
1649 if (!non_realtime_work_pending()) {
1653 /* Check to see if we have passed the first guaranteed
1654 audible frame past our last start position. if not,
1655 return that last start point because in terms
1656 of audible frames, we have not moved yet.
1658 `Start position' in this context means the time we last
1659 either started, located, or changed transport direction.
1662 if (_transport_speed > 0.0f) {
1664 if (!play_loop || !have_looped) {
1665 if (tf < _last_roll_or_reversal_location + offset) {
1666 return _last_roll_or_reversal_location;
1674 } else if (_transport_speed < 0.0f) {
1676 /* XXX wot? no backward looping? */
1678 if (tf > _last_roll_or_reversal_location - offset) {
1679 return _last_roll_or_reversal_location;
1691 Session::set_frame_rate (framecnt_t frames_per_second)
1693 /** \fn void Session::set_frame_size(framecnt_t)
1694 the AudioEngine object that calls this guarantees
1695 that it will not be called while we are also in
1696 ::process(). Its fine to do things that block
1700 _base_frame_rate = frames_per_second;
1701 _nominal_frame_rate = frames_per_second;
1707 // XXX we need some equivalent to this, somehow
1708 // SndFileSource::setup_standard_crossfades (frames_per_second);
1712 /* XXX need to reset/reinstantiate all LADSPA plugins */
1716 Session::set_block_size (pframes_t nframes)
1718 /* the AudioEngine guarantees
1719 that it will not be called while we are also in
1720 ::process(). It is therefore fine to do things that block
1725 current_block_size = nframes;
1729 boost::shared_ptr<RouteList> r = routes.reader ();
1731 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1732 (*i)->set_block_size (nframes);
1735 boost::shared_ptr<RouteList> rl = routes.reader ();
1736 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1737 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1739 tr->set_block_size (nframes);
1743 set_worst_io_latencies ();
1749 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1751 boost::shared_ptr<Route> r2;
1753 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1754 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1758 /* make a copy of the existing list of routes that feed r1 */
1760 Route::FedBy existing (r1->fed_by());
1762 /* for each route that feeds r1, recurse, marking it as feeding
1766 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1767 if (!(r2 = i->r.lock ())) {
1768 /* (*i) went away, ignore it */
1772 /* r2 is a route that feeds r1 which somehow feeds base. mark
1773 base as being fed by r2
1776 rbase->add_fed_by (r2, i->sends_only);
1780 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1784 if (r1->feeds (r2) && r2->feeds (r1)) {
1788 /* now recurse, so that we can mark base as being fed by
1789 all routes that feed r2
1792 trace_terminal (r2, rbase);
1799 Session::resort_routes ()
1801 /* don't do anything here with signals emitted
1802 by Routes during initial setup or while we
1803 are being destroyed.
1806 if (_state_of_the_state & (InitialConnecting | Deletion)) {
1811 RCUWriter<RouteList> writer (routes);
1812 boost::shared_ptr<RouteList> r = writer.get_copy ();
1813 resort_routes_using (r);
1814 /* writer goes out of scope and forces update */
1818 boost::shared_ptr<RouteList> rl = routes.reader ();
1819 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1820 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1822 const Route::FedBy& fb ((*i)->fed_by());
1824 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1825 boost::shared_ptr<Route> sf = f->r.lock();
1827 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1835 /** This is called whenever we need to rebuild the graph of how we will process
1837 * @param r List of routes, in any order.
1841 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1843 /* We are going to build a directed graph of our routes;
1844 this is where the edges of that graph are put.
1849 /* Go through all routes doing two things:
1851 * 1. Collect the edges of the route graph. Each of these edges
1852 * is a pair of routes, one of which directly feeds the other
1853 * either by a JACK connection or by an internal send.
1855 * 2. Begin the process of making routes aware of which other
1856 * routes directly or indirectly feed them. This information
1857 * is used by the solo code.
1860 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1862 /* Clear out the route's list of direct or indirect feeds */
1863 (*i)->clear_fed_by ();
1865 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
1867 bool via_sends_only;
1869 /* See if this *j feeds *i according to the current state of the JACK
1870 connections and internal sends.
1872 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
1873 /* add the edge to the graph (part #1) */
1874 edges.add (*j, *i, via_sends_only);
1875 /* tell the route (for part #2) */
1876 (*i)->add_fed_by (*j, via_sends_only);
1881 /* Attempt a topological sort of the route graph */
1882 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
1884 if (sorted_routes) {
1885 /* We got a satisfactory topological sort, so there is no feedback;
1888 Note: the process graph rechain does not require a
1889 topologically-sorted list, but hey ho.
1891 if (_process_graph) {
1892 _process_graph->rechain (sorted_routes, edges);
1895 _current_route_graph = edges;
1897 /* Complete the building of the routes' lists of what directly
1898 or indirectly feeds them.
1900 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1901 trace_terminal (*i, *i);
1904 *r = *sorted_routes;
1907 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1908 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1909 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1910 (*i)->name(), (*i)->order_key ()));
1914 SuccessfulGraphSort (); /* EMIT SIGNAL */
1917 /* The topological sort failed, so we have a problem. Tell everyone
1918 and stick to the old graph; this will continue to be processed, so
1919 until the feedback is fixed, what is played back will not quite
1920 reflect what is actually connected. Note also that we do not
1921 do trace_terminal here, as it would fail due to an endless recursion,
1922 so the solo code will think that everything is still connected
1926 FeedbackDetected (); /* EMIT SIGNAL */
1931 /** Find a route name starting with \a base, maybe followed by the
1932 * lowest \a id. \a id will always be added if \a definitely_add_number
1933 * is true on entry; otherwise it will only be added if required
1934 * to make the name unique.
1936 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1937 * The available route name with the lowest ID will be used, and \a id
1938 * will be set to the ID.
1940 * \return false if a route name could not be found, and \a track_name
1941 * and \a id do not reflect a free route name.
1944 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1946 if (!definitely_add_number && route_by_name (base) == 0) {
1947 /* juse use the base */
1948 snprintf (name, name_len, "%s", base.c_str());
1953 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1955 if (route_by_name (name) == 0) {
1961 } while (id < (UINT_MAX-1));
1966 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
1968 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
1970 in = ChanCount::ZERO;
1971 out = ChanCount::ZERO;
1973 boost::shared_ptr<RouteList> r = routes.reader ();
1975 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1976 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1977 if (tr && !tr->is_auditioner()) {
1978 in += tr->n_inputs();
1979 out += tr->n_outputs();
1984 /** Caller must not hold process lock
1985 * @param name_template string to use for the start of the name, or "" to use "MIDI".
1986 * @param instrument plugin info for the instrument to insert pre-fader, if any
1988 list<boost::shared_ptr<MidiTrack> >
1989 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
1990 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1992 char track_name[32];
1993 uint32_t track_id = 0;
1995 RouteList new_routes;
1996 list<boost::shared_ptr<MidiTrack> > ret;
1998 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
2001 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
2002 error << "cannot find name for new midi track" << endmsg;
2006 boost::shared_ptr<MidiTrack> track;
2009 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
2011 if (track->init ()) {
2015 track->use_new_diskstream();
2017 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2018 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2021 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2022 if (track->input()->ensure_io (input, false, this)) {
2023 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
2027 if (track->output()->ensure_io (output, false, this)) {
2028 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
2033 track->non_realtime_input_change();
2036 route_group->add (track);
2039 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2041 if (Config->get_remote_model() == UserOrdered) {
2042 track->set_remote_control_id (next_control_id());
2045 new_routes.push_back (track);
2046 ret.push_back (track);
2049 catch (failed_constructor &err) {
2050 error << _("Session: could not create new midi track.") << endmsg;
2054 catch (AudioEngine::PortRegistrationFailure& pfe) {
2056 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;
2064 if (!new_routes.empty()) {
2065 StateProtector sp (this);
2066 add_routes (new_routes, true, true, true);
2069 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
2070 PluginPtr plugin = instrument->load (*this);
2071 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2072 (*r)->add_processor (p, PreFader);
2082 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2084 boost::shared_ptr<Route> midi_track (wmt.lock());
2090 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2092 if (change.after.n_audio() <= change.before.n_audio()) {
2096 /* new audio ports: make sure the audio goes somewhere useful,
2097 unless the user has no-auto-connect selected.
2099 The existing ChanCounts don't matter for this call as they are only
2100 to do with matching input and output indices, and we are only changing
2106 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
2110 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
2111 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
2112 * @param output_start As \a input_start, but for outputs.
2115 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
2116 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
2118 if (!IO::connecting_legal) {
2122 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2128 /* If both inputs and outputs are auto-connected to physical ports,
2129 use the max of input and output offsets to ensure auto-connected
2130 port numbers always match up (e.g. the first audio input and the
2131 first audio output of the route will have the same physical
2132 port number). Otherwise just use the lowest input or output
2136 DEBUG_TRACE (DEBUG::Graph,
2137 string_compose("Auto-connect: existing in = %1 out = %2\n",
2138 existing_inputs, existing_outputs));
2140 const bool in_out_physical =
2141 (Config->get_input_auto_connect() & AutoConnectPhysical)
2142 && (Config->get_output_auto_connect() & AutoConnectPhysical)
2145 const ChanCount in_offset = in_out_physical
2146 ? ChanCount::max(existing_inputs, existing_outputs)
2149 const ChanCount out_offset = in_out_physical
2150 ? ChanCount::max(existing_inputs, existing_outputs)
2153 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2154 vector<string> physinputs;
2155 vector<string> physoutputs;
2157 _engine.get_physical_outputs (*t, physoutputs);
2158 _engine.get_physical_inputs (*t, physinputs);
2160 if (!physinputs.empty() && connect_inputs) {
2161 uint32_t nphysical_in = physinputs.size();
2163 DEBUG_TRACE (DEBUG::Graph,
2164 string_compose("There are %1 physical inputs of type %2\n",
2167 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
2170 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
2171 DEBUG_TRACE (DEBUG::Graph,
2172 string_compose("Get index %1 + %2 % %3 = %4\n",
2173 in_offset.get(*t), i, nphysical_in,
2174 (in_offset.get(*t) + i) % nphysical_in));
2175 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
2178 DEBUG_TRACE (DEBUG::Graph,
2179 string_compose("Connect route %1 IN to %2\n",
2180 route->name(), port));
2182 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
2186 ChanCount one_added (*t, 1);
2187 existing_inputs += one_added;
2191 if (!physoutputs.empty()) {
2192 uint32_t nphysical_out = physoutputs.size();
2193 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
2196 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
2197 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
2198 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
2199 /* master bus is audio only */
2200 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
2201 port = _master_out->input()->ports().port(*t,
2202 i % _master_out->input()->n_ports().get(*t))->name();
2206 DEBUG_TRACE (DEBUG::Graph,
2207 string_compose("Connect route %1 OUT to %2\n",
2208 route->name(), port));
2210 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
2214 ChanCount one_added (*t, 1);
2215 existing_outputs += one_added;
2222 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2224 /* TRX does stuff here, ardour does not (but probably should). This is called after an engine reset (in particular).
2229 /** Caller must not hold process lock
2230 * @param name_template string to use for the start of the name, or "" to use "Audio".
2232 list< boost::shared_ptr<AudioTrack> >
2233 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
2234 uint32_t how_many, string name_template)
2236 char track_name[32];
2237 uint32_t track_id = 0;
2239 RouteList new_routes;
2240 list<boost::shared_ptr<AudioTrack> > ret;
2242 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
2245 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
2246 error << "cannot find name for new audio track" << endmsg;
2250 boost::shared_ptr<AudioTrack> track;
2253 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
2255 if (track->init ()) {
2259 track->use_new_diskstream();
2261 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2262 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
2265 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2267 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2268 error << string_compose (
2269 _("cannot configure %1 in/%2 out configuration for new audio track"),
2270 input_channels, output_channels)
2275 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2276 error << string_compose (
2277 _("cannot configure %1 in/%2 out configuration for new audio track"),
2278 input_channels, output_channels)
2285 route_group->add (track);
2288 track->non_realtime_input_change();
2290 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2291 if (Config->get_remote_model() == UserOrdered) {
2292 track->set_remote_control_id (next_control_id());
2295 new_routes.push_back (track);
2296 ret.push_back (track);
2299 catch (failed_constructor &err) {
2300 error << _("Session: could not create new audio track.") << endmsg;
2304 catch (AudioEngine::PortRegistrationFailure& pfe) {
2306 error << pfe.what() << endmsg;
2314 if (!new_routes.empty()) {
2315 StateProtector sp (this);
2316 add_routes (new_routes, true, true, true);
2322 /** Caller must not hold process lock.
2323 * @param name_template string to use for the start of the name, or "" to use "Bus".
2326 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
2329 uint32_t bus_id = 0;
2333 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
2336 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
2337 error << "cannot find name for new audio bus" << endmsg;
2342 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
2348 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
2349 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
2352 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2354 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
2355 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2356 input_channels, output_channels)
2362 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
2363 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
2364 input_channels, output_channels)
2371 route_group->add (bus);
2373 if (Config->get_remote_model() == UserOrdered) {
2374 bus->set_remote_control_id (next_control_id());
2377 bus->add_internal_return ();
2379 ret.push_back (bus);
2385 catch (failed_constructor &err) {
2386 error << _("Session: could not create new audio route.") << endmsg;
2390 catch (AudioEngine::PortRegistrationFailure& pfe) {
2391 error << pfe.what() << endmsg;
2401 StateProtector sp (this);
2402 add_routes (ret, false, true, true); // autoconnect outputs only
2410 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base)
2413 uint32_t control_id;
2415 uint32_t number = 0;
2416 const uint32_t being_added = how_many;
2418 if (!tree.read (template_path.c_str())) {
2422 XMLNode* node = tree.root();
2424 IO::disable_connecting ();
2426 control_id = next_control_id ();
2430 XMLNode node_copy (*node);
2432 /* Remove IDs of everything so that new ones are used */
2433 node_copy.remove_property_recursively (X_("id"));
2438 if (!name_base.empty()) {
2440 /* if we're adding more than one routes, force
2441 * all the names of the new routes to be
2442 * numbered, via the final parameter.
2445 if (!find_route_name (name_base.c_str(), ++number, name, sizeof(name), (being_added > 1))) {
2446 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2452 string const route_name = node_copy.property(X_("name"))->value ();
2454 /* generate a new name by adding a number to the end of the template name */
2455 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2456 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2457 abort(); /*NOTREACHED*/
2461 /* set this name in the XML description that we are about to use */
2462 Route::set_name_in_state (node_copy, name);
2464 /* trim bitslots from listen sends so that new ones are used */
2465 XMLNodeList children = node_copy.children ();
2466 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2467 if ((*i)->name() == X_("Processor")) {
2468 XMLProperty* role = (*i)->property (X_("role"));
2469 if (role && role->value() == X_("Listen")) {
2470 (*i)->remove_property (X_("bitslot"));
2475 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2478 error << _("Session: cannot create track/bus from template description") << endmsg;
2482 if (boost::dynamic_pointer_cast<Track>(route)) {
2483 /* force input/output change signals so that the new diskstream
2484 picks up the configuration of the route. During session
2485 loading this normally happens in a different way.
2488 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2490 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2491 change.after = route->input()->n_ports();
2492 route->input()->changed (change, this);
2493 change.after = route->output()->n_ports();
2494 route->output()->changed (change, this);
2497 route->set_remote_control_id (control_id);
2500 ret.push_back (route);
2503 catch (failed_constructor &err) {
2504 error << _("Session: could not create new route from template") << endmsg;
2508 catch (AudioEngine::PortRegistrationFailure& pfe) {
2509 error << pfe.what() << endmsg;
2518 StateProtector sp (this);
2519 add_routes (ret, true, true, true);
2520 IO::enable_connecting ();
2527 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
2530 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
2531 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
2534 error << _("Adding new tracks/busses failed") << endmsg;
2539 update_latency (true);
2540 update_latency (false);
2545 save_state (_current_snapshot_name);
2548 reassign_track_numbers();
2550 RouteAdded (new_routes); /* EMIT SIGNAL */
2554 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
2556 ChanCount existing_inputs;
2557 ChanCount existing_outputs;
2558 uint32_t order = next_control_id();
2560 if (_order_hint > -1) {
2561 order = _order_hint;
2565 count_existing_track_channels (existing_inputs, existing_outputs);
2568 RCUWriter<RouteList> writer (routes);
2569 boost::shared_ptr<RouteList> r = writer.get_copy ();
2570 r->insert (r->end(), new_routes.begin(), new_routes.end());
2572 /* if there is no control out and we're not in the middle of loading,
2573 resort the graph here. if there is a control out, we will resort
2574 toward the end of this method. if we are in the middle of loading,
2575 we will resort when done.
2578 if (!_monitor_out && IO::connecting_legal) {
2579 resort_routes_using (r);
2583 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2585 boost::weak_ptr<Route> wpr (*x);
2586 boost::shared_ptr<Route> r (*x);
2588 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2589 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2590 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2591 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2592 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2593 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2595 if (r->is_master()) {
2599 if (r->is_monitor()) {
2603 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2605 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2606 track_playlist_changed (boost::weak_ptr<Track> (tr));
2607 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2609 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2611 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2612 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2617 if (input_auto_connect || output_auto_connect) {
2618 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
2621 /* order keys are a GUI responsibility but we need to set up
2622 reasonable defaults because they also affect the remote control
2623 ID in most situations.
2626 if (!r->has_order_key ()) {
2627 if (r->is_auditioner()) {
2628 /* use an arbitrarily high value */
2629 r->set_order_key (UINT_MAX);
2631 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
2632 r->set_order_key (order);
2640 if (_monitor_out && IO::connecting_legal) {
2641 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
2643 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2644 if ((*x)->is_monitor()) {
2646 } else if ((*x)->is_master()) {
2649 (*x)->enable_monitor_send ();
2656 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2658 boost::shared_ptr<RouteList> r = routes.reader ();
2659 boost::shared_ptr<Send> s;
2661 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2662 if ((s = (*i)->internal_send_for (dest)) != 0) {
2663 s->amp()->gain_control()->set_value (0.0);
2669 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2671 boost::shared_ptr<RouteList> r = routes.reader ();
2672 boost::shared_ptr<Send> s;
2674 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2675 if ((s = (*i)->internal_send_for (dest)) != 0) {
2676 s->amp()->gain_control()->set_value (1.0);
2682 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2684 boost::shared_ptr<RouteList> r = routes.reader ();
2685 boost::shared_ptr<Send> s;
2687 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2688 if ((s = (*i)->internal_send_for (dest)) != 0) {
2689 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2694 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2696 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2698 boost::shared_ptr<RouteList> r = routes.reader ();
2699 boost::shared_ptr<RouteList> t (new RouteList);
2701 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2702 /* no MIDI sends because there are no MIDI busses yet */
2703 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2708 add_internal_sends (dest, p, t);
2712 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2714 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2715 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
2720 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
2722 add_internal_send (dest, sender->before_processor_for_index (index), sender);
2726 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
2728 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
2732 if (!dest->internal_return()) {
2733 dest->add_internal_return ();
2736 sender->add_aux_send (dest, before);
2742 Session::remove_route (boost::shared_ptr<Route> route)
2744 if (route == _master_out) {
2748 route->set_solo (false, this);
2751 RCUWriter<RouteList> writer (routes);
2752 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2756 /* deleting the master out seems like a dumb
2757 idea, but its more of a UI policy issue
2761 if (route == _master_out) {
2762 _master_out = boost::shared_ptr<Route> ();
2765 if (route == _monitor_out) {
2766 _monitor_out.reset ();
2769 /* writer goes out of scope, forces route list update */
2772 update_route_solo_state ();
2774 // We need to disconnect the route's inputs and outputs
2776 route->input()->disconnect (0);
2777 route->output()->disconnect (0);
2779 /* if the route had internal sends sending to it, remove them */
2780 if (route->internal_return()) {
2782 boost::shared_ptr<RouteList> r = routes.reader ();
2783 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2784 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2786 (*i)->remove_processor (s);
2791 /* if the monitoring section had a pointer to this route, remove it */
2792 if (_monitor_out && !route->is_master() && !route->is_monitor()) {
2793 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2794 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
2795 route->remove_aux_or_listen (_monitor_out);
2798 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2799 if (mt && mt->step_editing()) {
2800 if (_step_editors > 0) {
2805 update_latency_compensation ();
2808 /* Re-sort routes to remove the graph's current references to the one that is
2809 * going away, then flush old references out of the graph.
2813 if (_process_graph) {
2814 _process_graph->clear_other_chain ();
2817 /* get rid of it from the dead wood collection in the route list manager */
2819 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2823 /* try to cause everyone to drop their references */
2825 route->drop_references ();
2827 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2829 /* save the new state of the world */
2831 if (save_state (_current_snapshot_name)) {
2832 save_history (_current_snapshot_name);
2834 reassign_track_numbers();
2838 Session::route_mute_changed (void* /*src*/)
2844 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2846 boost::shared_ptr<Route> route = wpr.lock();
2848 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2852 if (route->listening_via_monitor ()) {
2854 if (Config->get_exclusive_solo()) {
2855 /* new listen: disable all other listen */
2856 boost::shared_ptr<RouteList> r = routes.reader ();
2857 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2858 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
2861 (*i)->set_listen (false, this);
2867 } else if (_listen_cnt > 0) {
2872 update_route_solo_state ();
2875 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2877 boost::shared_ptr<Route> route = wpr.lock ();
2880 /* should not happen */
2881 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2885 bool send_changed = false;
2887 if (route->solo_isolated()) {
2888 if (_solo_isolated_cnt == 0) {
2889 send_changed = true;
2891 _solo_isolated_cnt++;
2892 } else if (_solo_isolated_cnt > 0) {
2893 _solo_isolated_cnt--;
2894 if (_solo_isolated_cnt == 0) {
2895 send_changed = true;
2900 IsolatedChanged (); /* EMIT SIGNAL */
2905 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2907 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
2909 if (!self_solo_change) {
2910 // session doesn't care about changes to soloed-by-others
2914 if (solo_update_disabled) {
2916 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
2920 boost::shared_ptr<Route> route = wpr.lock ();
2923 boost::shared_ptr<RouteList> r = routes.reader ();
2926 if (route->self_soloed()) {
2932 RouteGroup* rg = route->route_group ();
2933 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
2935 if (delta == 1 && Config->get_exclusive_solo()) {
2937 /* new solo: disable all other solos, but not the group if its solo-enabled */
2939 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2940 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
2941 (leave_group_alone && ((*i)->route_group() == rg))) {
2944 (*i)->set_solo (false, this);
2948 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
2950 solo_update_disabled = true;
2952 RouteList uninvolved;
2954 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
2956 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2957 bool via_sends_only;
2958 bool in_signal_flow;
2960 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
2961 (leave_group_alone && ((*i)->route_group() == rg))) {
2965 in_signal_flow = false;
2967 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
2969 if ((*i)->feeds (route, &via_sends_only)) {
2970 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
2971 if (!via_sends_only) {
2972 if (!route->soloed_by_others_upstream()) {
2973 (*i)->mod_solo_by_others_downstream (delta);
2976 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
2978 in_signal_flow = true;
2980 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
2983 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
2985 if (route->feeds (*i, &via_sends_only)) {
2986 /* propagate solo upstream only if routing other than
2987 sends is involved, but do consider the other route
2988 (*i) to be part of the signal flow even if only
2991 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
2995 route->soloed_by_others_downstream(),
2996 route->soloed_by_others_upstream()));
2997 if (!via_sends_only) {
2998 if (!route->soloed_by_others_downstream()) {
2999 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3000 (*i)->mod_solo_by_others_upstream (delta);
3002 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
3005 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3007 in_signal_flow = true;
3009 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3012 if (!in_signal_flow) {
3013 uninvolved.push_back (*i);
3017 solo_update_disabled = false;
3018 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3020 update_route_solo_state (r);
3022 /* now notify that the mute state of the routes not involved in the signal
3023 pathway of the just-solo-changed route may have altered.
3026 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3027 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
3028 (*i)->act_on_mute ();
3029 (*i)->mute_changed (this);
3032 SoloChanged (); /* EMIT SIGNAL */
3037 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
3039 /* now figure out if anything that matters is soloed (or is "listening")*/
3041 bool something_soloed = false;
3042 uint32_t listeners = 0;
3043 uint32_t isolated = 0;
3046 r = routes.reader();
3049 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3050 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
3051 something_soloed = true;
3054 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
3055 if (Config->get_solo_control_is_listen_control()) {
3058 (*i)->set_listen (false, this);
3062 if ((*i)->solo_isolated()) {
3067 if (something_soloed != _non_soloed_outs_muted) {
3068 _non_soloed_outs_muted = something_soloed;
3069 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
3072 _listen_cnt = listeners;
3074 if (isolated != _solo_isolated_cnt) {
3075 _solo_isolated_cnt = isolated;
3076 IsolatedChanged (); /* EMIT SIGNAL */
3079 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
3080 something_soloed, listeners, isolated));
3083 boost::shared_ptr<RouteList>
3084 Session::get_routes_with_internal_returns() const
3086 boost::shared_ptr<RouteList> r = routes.reader ();
3087 boost::shared_ptr<RouteList> rl (new RouteList);
3089 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3090 if ((*i)->internal_return ()) {
3098 Session::io_name_is_legal (const std::string& name)
3100 boost::shared_ptr<RouteList> r = routes.reader ();
3102 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3103 if ((*i)->name() == name) {
3107 if ((*i)->has_io_processor_named (name)) {
3116 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
3119 vector<string> connections;
3121 /* if we are passed only a single route and we're not told to turn
3122 * others off, then just do the simple thing.
3125 if (flip_others == false && rl->size() == 1) {
3126 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
3128 mt->set_input_active (onoff);
3133 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
3135 PortSet& ps ((*rt)->input()->ports());
3137 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
3138 p->get_connections (connections);
3141 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
3142 routes_using_input_from (*s, rl2);
3145 /* scan all relevant routes to see if others are on or off */
3147 bool others_are_already_on = false;
3149 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3151 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3157 if ((*r) != (*rt)) {
3158 if (mt->input_active()) {
3159 others_are_already_on = true;
3162 /* this one needs changing */
3163 mt->set_input_active (onoff);
3169 /* globally reverse other routes */
3171 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
3172 if ((*r) != (*rt)) {
3173 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
3175 mt->set_input_active (!others_are_already_on);
3184 Session::routes_using_input_from (const string& str, RouteList& rl)
3186 boost::shared_ptr<RouteList> r = routes.reader();
3188 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3189 if ((*i)->input()->connected_to (str)) {
3195 boost::shared_ptr<Route>
3196 Session::route_by_name (string name)
3198 boost::shared_ptr<RouteList> r = routes.reader ();
3200 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3201 if ((*i)->name() == name) {
3206 return boost::shared_ptr<Route> ((Route*) 0);
3209 boost::shared_ptr<Route>
3210 Session::route_by_id (PBD::ID id)
3212 boost::shared_ptr<RouteList> r = routes.reader ();
3214 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3215 if ((*i)->id() == id) {
3220 return boost::shared_ptr<Route> ((Route*) 0);
3223 boost::shared_ptr<Track>
3224 Session::track_by_diskstream_id (PBD::ID id)
3226 boost::shared_ptr<RouteList> r = routes.reader ();
3228 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3229 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3230 if (t && t->using_diskstream_id (id)) {
3235 return boost::shared_ptr<Track> ();
3238 boost::shared_ptr<Route>
3239 Session::route_by_remote_id (uint32_t id)
3241 boost::shared_ptr<RouteList> r = routes.reader ();
3243 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3244 if ((*i)->remote_control_id() == id) {
3249 return boost::shared_ptr<Route> ((Route*) 0);
3254 Session::reassign_track_numbers ()
3258 RouteList r (*(routes.reader ()));
3259 SignalOrderRouteSorter sorter;
3262 StateProtector sp (this);
3264 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3265 if (boost::dynamic_pointer_cast<Track> (*i)) {
3266 (*i)->set_track_number(++tn);
3268 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
3269 (*i)->set_track_number(--bn);
3272 const uint32_t decimals = ceilf (log10f (tn + 1));
3273 const bool decimals_changed = _track_number_decimals != decimals;
3274 _track_number_decimals = decimals;
3276 if (decimals_changed && config.get_track_name_number ()) {
3277 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
3278 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
3280 t->resync_track_name();
3283 // trigger GUI re-layout
3284 config.ParameterChanged("track-name-number");
3289 Session::playlist_region_added (boost::weak_ptr<Region> w)
3291 boost::shared_ptr<Region> r = w.lock ();
3296 /* These are the operations that are currently in progress... */
3297 list<GQuark> curr = _current_trans_quarks;
3300 /* ...and these are the operations during which we want to update
3301 the session range location markers.
3304 ops.push_back (Operations::capture);
3305 ops.push_back (Operations::paste);
3306 ops.push_back (Operations::duplicate_region);
3307 ops.push_back (Operations::insert_file);
3308 ops.push_back (Operations::insert_region);
3309 ops.push_back (Operations::drag_region_brush);
3310 ops.push_back (Operations::region_drag);
3311 ops.push_back (Operations::selection_grab);
3312 ops.push_back (Operations::region_fill);
3313 ops.push_back (Operations::fill_selection);
3314 ops.push_back (Operations::create_region);
3315 ops.push_back (Operations::region_copy);
3316 ops.push_back (Operations::fixed_time_region_copy);
3319 /* See if any of the current operations match the ones that we want */
3321 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
3323 /* If so, update the session range markers */
3325 maybe_update_session_range (r->position (), r->last_frame ());
3329 /** Update the session range markers if a is before the current start or
3330 * b is after the current end.
3333 Session::maybe_update_session_range (framepos_t a, framepos_t b)
3335 if (_state_of_the_state & Loading) {
3339 if (_session_range_location == 0) {
3341 add_session_range_location (a, b);
3345 if (a < _session_range_location->start()) {
3346 _session_range_location->set_start (a);
3349 if (b > _session_range_location->end()) {
3350 _session_range_location->set_end (b);
3356 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
3358 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3359 maybe_update_session_range (i->to, i->to + i->length);
3364 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
3366 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
3367 maybe_update_session_range (i->from, i->to);
3371 /* Region management */
3373 boost::shared_ptr<Region>
3374 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
3376 const RegionFactory::RegionMap& regions (RegionFactory::regions());
3377 RegionFactory::RegionMap::const_iterator i;
3378 boost::shared_ptr<Region> region;
3380 Glib::Threads::Mutex::Lock lm (region_lock);
3382 for (i = regions.begin(); i != regions.end(); ++i) {
3386 if (region->whole_file()) {
3388 if (child->source_equivalent (region)) {
3394 return boost::shared_ptr<Region> ();
3398 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
3400 set<boost::shared_ptr<Region> > relevant_regions;
3402 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
3403 RegionFactory::get_regions_using_source (*s, relevant_regions);
3406 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
3407 set<boost::shared_ptr<Region> >::iterator tmp;
3412 playlists->destroy_region (*r);
3413 RegionFactory::map_remove (*r);
3415 (*r)->drop_sources ();
3416 (*r)->drop_references ();
3418 relevant_regions.erase (r);
3423 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
3426 Glib::Threads::Mutex::Lock ls (source_lock);
3427 /* remove from the main source list */
3428 sources.erase ((*s)->id());
3431 (*s)->mark_for_remove ();
3432 (*s)->drop_references ();
3441 Session::remove_last_capture ()
3443 list<boost::shared_ptr<Source> > srcs;
3445 boost::shared_ptr<RouteList> rl = routes.reader ();
3446 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3447 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3452 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
3455 srcs.insert (srcs.end(), l.begin(), l.end());
3460 destroy_sources (srcs);
3462 save_state (_current_snapshot_name);
3467 /* Source Management */
3470 Session::add_source (boost::shared_ptr<Source> source)
3472 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
3473 pair<SourceMap::iterator,bool> result;
3475 entry.first = source->id();
3476 entry.second = source;
3479 Glib::Threads::Mutex::Lock lm (source_lock);
3480 result = sources.insert (entry);
3483 if (result.second) {
3485 /* yay, new source */
3487 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
3490 if (!fs->within_session()) {
3491 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
3497 boost::shared_ptr<AudioFileSource> afs;
3499 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
3500 if (Config->get_auto_analyse_audio()) {
3501 Analyser::queue_source_for_analysis (source, false);
3505 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
3510 Session::remove_source (boost::weak_ptr<Source> src)
3512 if (_state_of_the_state & Deletion) {
3516 SourceMap::iterator i;
3517 boost::shared_ptr<Source> source = src.lock();
3524 Glib::Threads::Mutex::Lock lm (source_lock);
3526 if ((i = sources.find (source->id())) != sources.end()) {
3531 if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
3533 /* save state so we don't end up with a session file
3534 referring to non-existent sources.
3537 save_state (_current_snapshot_name);
3541 boost::shared_ptr<Source>
3542 Session::source_by_id (const PBD::ID& id)
3544 Glib::Threads::Mutex::Lock lm (source_lock);
3545 SourceMap::iterator i;
3546 boost::shared_ptr<Source> source;
3548 if ((i = sources.find (id)) != sources.end()) {
3555 boost::shared_ptr<AudioFileSource>
3556 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
3558 /* Restricted to audio files because only audio sources have channel
3562 Glib::Threads::Mutex::Lock lm (source_lock);
3564 for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
3565 boost::shared_ptr<AudioFileSource> afs
3566 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
3568 if (afs && afs->path() == path && chn == afs->channel()) {
3573 return boost::shared_ptr<AudioFileSource>();
3576 boost::shared_ptr<MidiSource>
3577 Session::midi_source_by_path (const std::string& path) const
3579 /* Restricted to MIDI files because audio sources require a channel
3580 for unique identification, in addition to a path.
3583 Glib::Threads::Mutex::Lock lm (source_lock);
3585 for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
3586 boost::shared_ptr<MidiSource> ms
3587 = boost::dynamic_pointer_cast<MidiSource>(s->second);
3588 boost::shared_ptr<FileSource> fs
3589 = boost::dynamic_pointer_cast<FileSource>(s->second);
3591 if (ms && fs && fs->path() == path) {
3596 return boost::shared_ptr<MidiSource>();
3600 Session::count_sources_by_origin (const string& path)
3603 Glib::Threads::Mutex::Lock lm (source_lock);
3605 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3606 boost::shared_ptr<FileSource> fs
3607 = boost::dynamic_pointer_cast<FileSource>(i->second);
3609 if (fs && fs->origin() == path) {
3618 Session::peak_path (string base) const
3620 return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
3624 Session::new_audio_source_path_for_embedded (const std::string& path)
3628 * we know that the filename is already unique because it exists
3629 * out in the filesystem.
3631 * However, when we bring it into the session, we could get a
3634 * Eg. two embedded files:
3639 * When merged into session, these collide.
3641 * There will not be a conflict with in-memory sources
3642 * because when the source was created we already picked
3643 * a unique name for it.
3645 * This collision is not likely to be common, but we have to guard
3646 * against it. So, if there is a collision, take the md5 hash of the
3647 * the path, and use that as the filename instead.
3650 SessionDirectory sdir (get_best_session_directory_for_new_audio());
3651 string base = Glib::path_get_basename (path);
3652 string newpath = Glib::build_filename (sdir.sound_path(), base);
3654 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
3658 md5.digestString (path.c_str());
3659 md5.writeToString ();
3660 base = md5.digestChars;
3662 string ext = get_suffix (path);
3669 newpath = Glib::build_filename (sdir.sound_path(), base);
3671 /* if this collides, we're screwed */
3673 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
3674 error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
3683 /** Return true if there are no audio file sources that use @param name as
3684 * the filename component of their path.
3686 * Return false otherwise.
3688 * This method MUST ONLY be used to check in-session, mono files since it
3689 * hard-codes the channel of the audio file source we are looking for as zero.
3691 * If/when Ardour supports native files in non-mono formats, the logic here
3692 * will need to be revisited.
3695 Session::audio_source_name_is_unique (const string& name)
3697 std::vector<string> sdirs = source_search_path (DataType::AUDIO);
3698 vector<space_and_path>::iterator i;
3699 uint32_t existing = 0;
3701 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
3703 /* note that we search *without* the extension so that
3704 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3705 in the event that this new name is required for
3706 a file format change.
3709 const string spath = *i;
3711 if (matching_unsuffixed_filename_exists_in (spath, name)) {
3716 /* it is possible that we have the path already
3717 * assigned to a source that has not yet been written
3718 * (ie. the write source for a diskstream). we have to
3719 * check this in order to make sure that our candidate
3720 * path isn't used again, because that can lead to
3721 * two Sources point to the same file with different
3722 * notions of their removability.
3726 string possible_path = Glib::build_filename (spath, name);
3728 if (audio_source_by_path_and_channel (possible_path, 0)) {
3734 return (existing == 0);
3738 Session::format_audio_source_name (const string& legalized_base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required, uint32_t cnt, bool related_exists)
3741 const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3745 sstr << setfill ('0') << setw (4) << cnt;
3746 sstr << legalized_base;
3748 sstr << legalized_base;
3750 if (take_required || related_exists) {
3762 } else if (nchan > 2) {
3767 /* XXX what? more than 26 channels! */
3778 /** Return a unique name based on \a base for a new internal audio source */
3780 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
3783 string possible_name;
3784 const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
3786 bool some_related_source_name_exists = false;
3788 legalized = legalize_for_path (base);
3790 // Find a "version" of the base name that doesn't exist in any of the possible directories.
3792 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3794 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
3796 if (audio_source_name_is_unique (possible_name)) {
3800 some_related_source_name_exists = true;
3803 error << string_compose(
3804 _("There are already %1 recordings for %2, which I consider too many."),
3805 limit, base) << endmsg;
3807 throw failed_constructor();
3811 /* We've established that the new name does not exist in any session
3812 * directory, so now find out which one we should use for this new
3816 SessionDirectory sdir (get_best_session_directory_for_new_audio());
3818 std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
3823 /** Return a unique name based on `base` for a new internal MIDI source */
3825 Session::new_midi_source_path (const string& base)
3828 char buf[PATH_MAX+1];
3829 const uint32_t limit = 10000;
3831 string possible_path;
3832 string possible_name;
3835 legalized = legalize_for_path (base);
3837 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3838 std::vector<string> sdirs = source_search_path(DataType::MIDI);
3840 /* - the main session folder is the first in the vector.
3841 * - after checking all locations for file-name uniqueness,
3842 * we keep the one from the last iteration as new file name
3843 * - midi files are small and should just be kept in the main session-folder
3845 * -> reverse the array, check main session folder last and use that as location
3848 std::reverse(sdirs.begin(), sdirs.end());
3850 for (cnt = 1; cnt <= limit; ++cnt) {
3852 vector<space_and_path>::iterator i;
3853 uint32_t existing = 0;
3855 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
3857 snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
3858 possible_name = buf;
3860 possible_path = Glib::build_filename (*i, possible_name);
3862 if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
3866 if (midi_source_by_path (possible_path)) {
3871 if (existing == 0) {
3876 error << string_compose(
3877 _("There are already %1 recordings for %2, which I consider too many."),
3878 limit, base) << endmsg;
3884 /* No need to "find best location" for software/app-based RAID, because
3885 MIDI is so small that we always put it in the same place.
3888 return possible_path;
3892 /** Create a new within-session audio source */
3893 boost::shared_ptr<AudioFileSource>
3894 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
3896 const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
3898 if (!path.empty()) {
3899 return boost::dynamic_pointer_cast<AudioFileSource> (
3900 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
3902 throw failed_constructor ();
3906 /** Create a new within-session MIDI source */
3907 boost::shared_ptr<MidiSource>
3908 Session::create_midi_source_for_session (string const & basic_name)
3910 const string path = new_midi_source_path (basic_name);
3912 if (!path.empty()) {
3913 return boost::dynamic_pointer_cast<SMFSource> (
3914 SourceFactory::createWritable (
3915 DataType::MIDI, *this, path, false, frame_rate()));
3917 throw failed_constructor ();
3921 /** Create a new within-session MIDI source */
3922 boost::shared_ptr<MidiSource>
3923 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
3925 /* the caller passes in the track the source will be used in,
3926 so that we can keep the numbering sane.
3928 Rationale: a track with the name "Foo" that has had N
3929 captures carried out so far will ALREADY have a write source
3930 named "Foo-N+1.mid" waiting to be used for the next capture.
3932 If we call new_midi_source_name() we will get "Foo-N+2". But
3933 there is no region corresponding to "Foo-N+1", so when
3934 "Foo-N+2" appears in the track, the gap presents the user
3935 with odd behaviour - why did it skip past Foo-N+1?
3937 We could explain this to the user in some odd way, but
3938 instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
3941 If that attempted rename fails, we get "Foo-N+2.mid" anyway.
3944 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
3946 std::string name = track->steal_write_source_name ();
3949 return boost::shared_ptr<MidiSource>();
3952 /* MIDI files are small, just put them in the first location of the
3953 session source search path.
3956 const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
3958 return boost::dynamic_pointer_cast<SMFSource> (
3959 SourceFactory::createWritable (
3960 DataType::MIDI, *this, path, false, frame_rate()));
3965 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3967 if (playlist->hidden()) {
3971 playlists->add (playlist);
3974 playlist->release();
3981 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3983 if (_state_of_the_state & Deletion) {
3987 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3993 playlists->remove (playlist);
3999 Session::set_audition (boost::shared_ptr<Region> r)
4001 pending_audition_region = r;
4002 add_post_transport_work (PostTransportAudition);
4003 _butler->schedule_transport_work ();
4007 Session::audition_playlist ()
4009 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4010 ev->region.reset ();
4015 Session::non_realtime_set_audition ()
4017 assert (pending_audition_region);
4018 auditioner->audition_region (pending_audition_region);
4019 pending_audition_region.reset ();
4020 AuditionActive (true); /* EMIT SIGNAL */
4024 Session::audition_region (boost::shared_ptr<Region> r)
4026 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
4032 Session::cancel_audition ()
4037 if (auditioner->auditioning()) {
4038 auditioner->cancel_audition ();
4039 AuditionActive (false); /* EMIT SIGNAL */
4044 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
4046 if (a->is_monitor()) {
4049 if (b->is_monitor()) {
4052 return a->order_key () < b->order_key ();
4056 Session::is_auditioning () const
4058 /* can be called before we have an auditioner object */
4060 return auditioner->auditioning();
4067 Session::graph_reordered ()
4069 /* don't do this stuff if we are setting up connections
4070 from a set_state() call or creating new tracks. Ditto for deletion.
4073 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
4077 /* every track/bus asked for this to be handled but it was deferred because
4078 we were connecting. do it now.
4081 request_input_change_handling ();
4085 /* force all diskstreams to update their capture offset values to
4086 reflect any changes in latencies within the graph.
4089 boost::shared_ptr<RouteList> rl = routes.reader ();
4090 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4091 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4093 tr->set_capture_offset ();
4098 /** @return Number of frames that there is disk space available to write,
4101 boost::optional<framecnt_t>
4102 Session::available_capture_duration ()
4104 Glib::Threads::Mutex::Lock lm (space_lock);
4106 if (_total_free_4k_blocks_uncertain) {
4107 return boost::optional<framecnt_t> ();
4110 float sample_bytes_on_disk = 4.0; // keep gcc happy
4112 switch (config.get_native_file_data_format()) {
4114 sample_bytes_on_disk = 4.0;
4118 sample_bytes_on_disk = 3.0;
4122 sample_bytes_on_disk = 2.0;
4126 /* impossible, but keep some gcc versions happy */
4127 fatal << string_compose (_("programming error: %1"),
4128 X_("illegal native file data format"))
4130 abort(); /*NOTREACHED*/
4133 double scale = 4096.0 / sample_bytes_on_disk;
4135 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
4136 return max_framecnt;
4139 return (framecnt_t) floor (_total_free_4k_blocks * scale);
4143 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
4146 RCUWriter<BundleList> writer (_bundles);
4147 boost::shared_ptr<BundleList> b = writer.get_copy ();
4148 b->push_back (bundle);
4152 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4159 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
4161 bool removed = false;
4164 RCUWriter<BundleList> writer (_bundles);
4165 boost::shared_ptr<BundleList> b = writer.get_copy ();
4166 BundleList::iterator i = find (b->begin(), b->end(), bundle);
4168 if (i != b->end()) {
4175 BundleAddedOrRemoved (); /* EMIT SIGNAL */
4181 boost::shared_ptr<Bundle>
4182 Session::bundle_by_name (string name) const
4184 boost::shared_ptr<BundleList> b = _bundles.reader ();
4186 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
4187 if ((*i)->name() == name) {
4192 return boost::shared_ptr<Bundle> ();
4196 Session::tempo_map_changed (const PropertyChange&)
4200 playlists->update_after_tempo_map_change ();
4202 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
4208 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
4210 for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
4211 (*i)->recompute_frames_from_bbt ();
4215 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
4216 * the given count with the current block size.
4219 Session::ensure_buffers (ChanCount howmany)
4221 BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
4225 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
4227 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4228 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
4233 Session::next_insert_id ()
4235 /* this doesn't really loop forever. just think about it */
4238 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
4239 if (!insert_bitset[n]) {
4240 insert_bitset[n] = true;
4246 /* none available, so resize and try again */
4248 insert_bitset.resize (insert_bitset.size() + 16, false);
4253 Session::next_send_id ()
4255 /* this doesn't really loop forever. just think about it */
4258 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
4259 if (!send_bitset[n]) {
4260 send_bitset[n] = true;
4266 /* none available, so resize and try again */
4268 send_bitset.resize (send_bitset.size() + 16, false);
4273 Session::next_aux_send_id ()
4275 /* this doesn't really loop forever. just think about it */
4278 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
4279 if (!aux_send_bitset[n]) {
4280 aux_send_bitset[n] = true;
4286 /* none available, so resize and try again */
4288 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
4293 Session::next_return_id ()
4295 /* this doesn't really loop forever. just think about it */
4298 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
4299 if (!return_bitset[n]) {
4300 return_bitset[n] = true;
4306 /* none available, so resize and try again */
4308 return_bitset.resize (return_bitset.size() + 16, false);
4313 Session::mark_send_id (uint32_t id)
4315 if (id >= send_bitset.size()) {
4316 send_bitset.resize (id+16, false);
4318 if (send_bitset[id]) {
4319 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
4321 send_bitset[id] = true;
4325 Session::mark_aux_send_id (uint32_t id)
4327 if (id >= aux_send_bitset.size()) {
4328 aux_send_bitset.resize (id+16, false);
4330 if (aux_send_bitset[id]) {
4331 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
4333 aux_send_bitset[id] = true;
4337 Session::mark_return_id (uint32_t id)
4339 if (id >= return_bitset.size()) {
4340 return_bitset.resize (id+16, false);
4342 if (return_bitset[id]) {
4343 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
4345 return_bitset[id] = true;
4349 Session::mark_insert_id (uint32_t id)
4351 if (id >= insert_bitset.size()) {
4352 insert_bitset.resize (id+16, false);
4354 if (insert_bitset[id]) {
4355 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
4357 insert_bitset[id] = true;
4361 Session::unmark_send_id (uint32_t id)
4363 if (id < send_bitset.size()) {
4364 send_bitset[id] = false;
4369 Session::unmark_aux_send_id (uint32_t id)
4371 if (id < aux_send_bitset.size()) {
4372 aux_send_bitset[id] = false;
4377 Session::unmark_return_id (uint32_t id)
4379 if (id < return_bitset.size()) {
4380 return_bitset[id] = false;
4385 Session::unmark_insert_id (uint32_t id)
4387 if (id < insert_bitset.size()) {
4388 insert_bitset[id] = false;
4393 Session::reset_native_file_format ()
4395 boost::shared_ptr<RouteList> rl = routes.reader ();
4396 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4397 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4399 /* don't save state as we do this, there's no point
4402 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
4403 tr->reset_write_sources (false);
4404 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
4410 Session::route_name_unique (string n) const
4412 boost::shared_ptr<RouteList> r = routes.reader ();
4414 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4415 if ((*i)->name() == n) {
4424 Session::route_name_internal (string n) const
4426 if (auditioner && auditioner->name() == n) {
4430 if (_click_io && _click_io->name() == n) {
4438 Session::freeze_all (InterThreadInfo& itt)
4440 boost::shared_ptr<RouteList> r = routes.reader ();
4442 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4444 boost::shared_ptr<Track> t;
4446 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
4447 /* XXX this is wrong because itt.progress will keep returning to zero at the start
4457 boost::shared_ptr<Region>
4458 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
4459 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
4460 InterThreadInfo& itt,
4461 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
4462 bool for_export, bool for_freeze)
4464 boost::shared_ptr<Region> result;
4465 boost::shared_ptr<Playlist> playlist;
4466 boost::shared_ptr<Source> source;
4467 ChanCount diskstream_channels (track.n_channels());
4468 framepos_t position;
4469 framecnt_t this_chunk;
4471 framepos_t latency_skip;
4473 framepos_t len = end - start;
4474 bool need_block_size_reset = false;
4475 ChanCount const max_proc = track.max_processor_streams ();
4476 string legal_playlist_name;
4477 string possible_path;
4480 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
4481 end, start) << endmsg;
4485 diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
4486 include_endpoint, for_export, for_freeze);
4488 if (diskstream_channels.n(track.data_type()) < 1) {
4489 error << _("Cannot write a range with no data.") << endmsg;
4493 // block all process callback handling
4495 block_processing ();
4498 // synchronize with AudioEngine::process_callback()
4499 // make sure processing is not currently running
4500 // and processing_blocked() is honored before
4501 // acquiring thread buffers
4502 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
4505 _bounce_processing_active = true;
4507 /* call tree *MUST* hold route_lock */
4509 if ((playlist = track.playlist()) == 0) {
4513 legal_playlist_name = legalize_for_path (playlist->name());
4515 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
4517 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
4518 string path = ((track.data_type() == DataType::AUDIO)
4519 ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
4520 : new_midi_source_path (legal_playlist_name));
4527 source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
4530 catch (failed_constructor& err) {
4531 error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
4535 srcs.push_back (source);
4538 /* tell redirects that care that we are about to use a much larger
4539 * blocksize. this will flush all plugins too, so that they are ready
4540 * to be used for this process.
4543 need_block_size_reset = true;
4544 track.set_block_size (bounce_chunk_size);
4545 _engine.main_thread()->get_buffers ();
4549 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
4551 /* create a set of reasonably-sized buffers */
4552 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4553 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
4555 buffers.set_count (max_proc);
4557 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4558 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4559 boost::shared_ptr<MidiSource> ms;
4561 afs->prepare_for_peakfile_writes ();
4562 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
4563 Source::Lock lock(ms->mutex());
4564 ms->mark_streaming_write_started(lock);
4568 while (to_do && !itt.cancel) {
4570 this_chunk = min (to_do, bounce_chunk_size);
4572 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
4576 start += this_chunk;
4577 to_do -= this_chunk;
4578 itt.progress = (float) (1.0 - ((double) to_do / len));
4580 if (latency_skip >= bounce_chunk_size) {
4581 latency_skip -= bounce_chunk_size;
4585 const framecnt_t current_chunk = this_chunk - latency_skip;
4588 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4589 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4590 boost::shared_ptr<MidiSource> ms;
4593 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
4596 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
4597 Source::Lock lock(ms->mutex());
4599 const MidiBuffer& buf = buffers.get_midi(0);
4600 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
4601 Evoral::Event<framepos_t> ev = *i;
4602 ev.set_time(ev.time() - position);
4603 ms->append_event_frames(lock, ev, ms->timeline_position());
4610 /* post-roll, pick up delayed processor output */
4611 latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
4613 while (latency_skip && !itt.cancel) {
4614 this_chunk = min (latency_skip, bounce_chunk_size);
4615 latency_skip -= this_chunk;
4617 buffers.silence (this_chunk, 0);
4618 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
4621 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4622 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4625 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
4637 xnow = localtime (&now);
4639 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
4640 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4641 boost::shared_ptr<MidiSource> ms;
4644 afs->update_header (position, *xnow, now);
4645 afs->flush_header ();
4646 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
4647 Source::Lock lock(ms->mutex());
4648 ms->mark_streaming_write_completed(lock);
4652 /* construct a region to represent the bounced material */
4656 plist.add (Properties::start, 0);
4657 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4658 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4660 result = RegionFactory::create (srcs, plist);
4666 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4667 (*src)->mark_for_remove ();
4668 (*src)->drop_references ();
4672 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4673 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4676 afs->done_with_peakfile_writes ();
4680 _bounce_processing_active = false;
4682 if (need_block_size_reset) {
4683 _engine.main_thread()->drop_buffers ();
4684 track.set_block_size (get_block_size());
4687 unblock_processing ();
4693 Session::gain_automation_buffer() const
4695 return ProcessThread::gain_automation_buffer ();
4699 Session::send_gain_automation_buffer() const
4701 return ProcessThread::send_gain_automation_buffer ();
4705 Session::pan_automation_buffer() const
4707 return ProcessThread::pan_automation_buffer ();
4711 Session::get_silent_buffers (ChanCount count)
4713 return ProcessThread::get_silent_buffers (count);
4717 Session::get_scratch_buffers (ChanCount count, bool silence)
4719 return ProcessThread::get_scratch_buffers (count, silence);
4723 Session::get_route_buffers (ChanCount count, bool silence)
4725 return ProcessThread::get_route_buffers (count, silence);
4730 Session::get_mix_buffers (ChanCount count)
4732 return ProcessThread::get_mix_buffers (count);
4736 Session::ntracks () const
4739 boost::shared_ptr<RouteList> r = routes.reader ();
4741 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4742 if (boost::dynamic_pointer_cast<Track> (*i)) {
4751 Session::nbusses () const
4754 boost::shared_ptr<RouteList> r = routes.reader ();
4756 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4757 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
4766 Session::add_automation_list(AutomationList *al)
4768 automation_lists[al->id()] = al;
4771 /** @return true if there is at least one record-enabled track, otherwise false */
4773 Session::have_rec_enabled_track () const
4775 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
4778 /** Update the state of our rec-enabled tracks flag */
4780 Session::update_have_rec_enabled_track ()
4782 boost::shared_ptr<RouteList> rl = routes.reader ();
4783 RouteList::iterator i = rl->begin();
4784 while (i != rl->end ()) {
4786 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4787 if (tr && tr->record_enabled ()) {
4794 int const old = g_atomic_int_get (&_have_rec_enabled_track);
4796 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4798 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4799 RecordStateChanged (); /* EMIT SIGNAL */
4804 Session::listen_position_changed ()
4806 boost::shared_ptr<RouteList> r = routes.reader ();
4808 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4809 (*i)->listen_position_changed ();
4814 Session::solo_control_mode_changed ()
4816 /* cancel all solo or all listen when solo control mode changes */
4819 set_solo (get_routes(), false);
4820 } else if (listening()) {
4821 set_listen (get_routes(), false);
4825 /** Called when a property of one of our route groups changes */
4827 Session::route_group_property_changed (RouteGroup* rg)
4829 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4832 /** Called when a route is added to one of our route groups */
4834 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4836 RouteAddedToRouteGroup (rg, r);
4839 /** Called when a route is removed from one of our route groups */
4841 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4843 RouteRemovedFromRouteGroup (rg, r);
4846 boost::shared_ptr<RouteList>
4847 Session::get_tracks () const
4849 boost::shared_ptr<RouteList> rl = routes.reader ();
4850 boost::shared_ptr<RouteList> tl (new RouteList);
4852 for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
4853 if (boost::dynamic_pointer_cast<Track> (*r)) {
4854 if (!(*r)->is_auditioner()) {
4862 boost::shared_ptr<RouteList>
4863 Session::get_routes_with_regions_at (framepos_t const p) const
4865 boost::shared_ptr<RouteList> r = routes.reader ();
4866 boost::shared_ptr<RouteList> rl (new RouteList);
4868 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4869 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4874 boost::shared_ptr<Playlist> pl = tr->playlist ();
4879 if (pl->has_region_at (p)) {
4888 Session::goto_end ()
4890 if (_session_range_location) {
4891 request_locate (_session_range_location->end(), false);
4893 request_locate (0, false);
4898 Session::goto_start ()
4900 if (_session_range_location) {
4901 request_locate (_session_range_location->start(), false);
4903 request_locate (0, false);
4908 Session::current_start_frame () const
4910 return _session_range_location ? _session_range_location->start() : 0;
4914 Session::current_end_frame () const
4916 return _session_range_location ? _session_range_location->end() : 0;
4920 Session::add_session_range_location (framepos_t start, framepos_t end)
4922 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4923 _locations->add (_session_range_location);
4927 Session::step_edit_status_change (bool yn)
4933 send = (_step_editors == 0);
4938 send = (_step_editors == 1);
4941 if (_step_editors > 0) {
4947 StepEditStatusChange (val);
4953 Session::start_time_changed (framepos_t old)
4955 /* Update the auto loop range to match the session range
4956 (unless the auto loop range has been changed by the user)
4959 Location* s = _locations->session_range_location ();
4964 Location* l = _locations->auto_loop_location ();
4966 if (l && l->start() == old) {
4967 l->set_start (s->start(), true);
4972 Session::end_time_changed (framepos_t old)
4974 /* Update the auto loop range to match the session range
4975 (unless the auto loop range has been changed by the user)
4978 Location* s = _locations->session_range_location ();
4983 Location* l = _locations->auto_loop_location ();
4985 if (l && l->end() == old) {
4986 l->set_end (s->end(), true);
4990 std::vector<std::string>
4991 Session::source_search_path (DataType type) const
4995 if (session_dirs.size() == 1) {
4997 case DataType::AUDIO:
4998 sp.push_back (_session_dir->sound_path());
5000 case DataType::MIDI:
5001 sp.push_back (_session_dir->midi_path());
5005 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
5006 SessionDirectory sdir (i->path);
5008 case DataType::AUDIO:
5009 sp.push_back (sdir.sound_path());
5011 case DataType::MIDI:
5012 sp.push_back (sdir.midi_path());
5018 if (type == DataType::AUDIO) {
5019 const string sound_path_2X = _session_dir->sound_path_2X();
5020 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
5021 if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
5022 sp.push_back (sound_path_2X);
5027 // now check the explicit (possibly user-specified) search path
5030 case DataType::AUDIO:
5031 sp += Searchpath(config.get_audio_search_path ());
5033 case DataType::MIDI:
5034 sp += Searchpath(config.get_midi_search_path ());
5042 Session::ensure_search_path_includes (const string& path, DataType type)
5051 case DataType::AUDIO:
5052 sp += Searchpath(config.get_audio_search_path ());
5054 case DataType::MIDI:
5055 sp += Searchpath (config.get_midi_search_path ());
5059 for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
5060 /* No need to add this new directory if it has the same inode as
5061 an existing one; checking inode rather than name prevents duplicated
5062 directories when we are using symlinks.
5064 On Windows, I think we could just do if (*i == path) here.
5066 if (PBD::equivalent_paths (*i, path)) {
5074 case DataType::AUDIO:
5075 config.set_audio_search_path (sp.to_string());
5077 case DataType::MIDI:
5078 config.set_midi_search_path (sp.to_string());
5084 Session::remove_dir_from_search_path (const string& dir, DataType type)
5089 case DataType::AUDIO:
5090 sp = Searchpath(config.get_audio_search_path ());
5092 case DataType::MIDI:
5093 sp = Searchpath (config.get_midi_search_path ());
5100 case DataType::AUDIO:
5101 config.set_audio_search_path (sp.to_string());
5103 case DataType::MIDI:
5104 config.set_midi_search_path (sp.to_string());
5110 boost::shared_ptr<Speakers>
5111 Session::get_speakers()
5117 Session::unknown_processors () const
5121 boost::shared_ptr<RouteList> r = routes.reader ();
5122 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5123 list<string> t = (*i)->unknown_processors ();
5124 copy (t.begin(), t.end(), back_inserter (p));
5134 Session::update_latency (bool playback)
5136 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
5138 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
5142 boost::shared_ptr<RouteList> r = routes.reader ();
5143 framecnt_t max_latency = 0;
5146 /* reverse the list so that we work backwards from the last route to run to the first */
5147 RouteList* rl = routes.reader().get();
5148 r.reset (new RouteList (*rl));
5149 reverse (r->begin(), r->end());
5152 /* compute actual latency values for the given direction and store them all in per-port
5153 structures. this will also publish the same values (to JACK) so that computation of latency
5154 for routes can consistently use public latency values.
5157 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5158 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
5161 /* because we latency compensate playback, our published playback latencies should
5162 be the same for all output ports - all material played back by ardour has
5163 the same latency, whether its caused by plugins or by latency compensation. since
5164 these may differ from the values computed above, reset all playback port latencies
5168 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
5170 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5171 (*i)->set_public_port_latencies (max_latency, playback);
5176 post_playback_latency ();
5180 post_capture_latency ();
5183 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
5187 Session::post_playback_latency ()
5189 set_worst_playback_latency ();
5191 boost::shared_ptr<RouteList> r = routes.reader ();
5193 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5194 if (!(*i)->is_auditioner() && ((*i)->active())) {
5195 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
5199 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5200 (*i)->set_latency_compensation (_worst_track_latency);
5205 Session::post_capture_latency ()
5207 set_worst_capture_latency ();
5209 /* reflect any changes in capture latencies into capture offsets
5212 boost::shared_ptr<RouteList> rl = routes.reader();
5213 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5214 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5216 tr->set_capture_offset ();
5222 Session::initialize_latencies ()
5225 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5226 update_latency (false);
5227 update_latency (true);
5230 set_worst_io_latencies ();
5234 Session::set_worst_io_latencies ()
5236 set_worst_playback_latency ();
5237 set_worst_capture_latency ();
5241 Session::set_worst_playback_latency ()
5243 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5247 _worst_output_latency = 0;
5249 if (!_engine.connected()) {
5253 boost::shared_ptr<RouteList> r = routes.reader ();
5255 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5256 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
5259 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
5263 Session::set_worst_capture_latency ()
5265 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5269 _worst_input_latency = 0;
5271 if (!_engine.connected()) {
5275 boost::shared_ptr<RouteList> r = routes.reader ();
5277 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5278 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
5281 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
5285 Session::update_latency_compensation (bool force_whole_graph)
5287 bool some_track_latency_changed = false;
5289 if (_state_of_the_state & (InitialConnecting|Deletion)) {
5293 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
5295 _worst_track_latency = 0;
5297 boost::shared_ptr<RouteList> r = routes.reader ();
5299 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5300 if (!(*i)->is_auditioner() && ((*i)->active())) {
5302 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
5303 some_track_latency_changed = true;
5305 _worst_track_latency = max (tl, _worst_track_latency);
5309 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
5310 (some_track_latency_changed ? "yes" : "no")));
5312 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
5314 if (some_track_latency_changed || force_whole_graph) {
5315 _engine.update_latencies ();
5319 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5320 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5324 tr->set_capture_offset ();
5329 Session::session_name_is_legal (const string& path)
5331 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
5333 for (int i = 0; illegal_chars[i]; ++i) {
5334 if (path.find (illegal_chars[i]) != string::npos) {
5335 return illegal_chars[i];
5343 Session::next_control_id () const
5347 /* the monitor bus remote ID is in a different
5348 * "namespace" than regular routes. its existence doesn't
5349 * affect normal (low) numbered routes.
5356 return nroutes() - subtract;
5360 Session::notify_remote_id_change ()
5362 if (deletion_in_progress()) {
5366 switch (Config->get_remote_model()) {
5368 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
5376 Session::sync_order_keys ()
5378 if (deletion_in_progress()) {
5382 /* tell everyone that something has happened to the sort keys
5383 and let them sync up with the change(s)
5384 this will give objects that manage the sort order keys the
5385 opportunity to keep them in sync if they wish to.
5388 DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
5390 reassign_track_numbers();
5392 Route::SyncOrderKeys (); /* EMIT SIGNAL */
5394 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
5398 Session::operation_in_progress (GQuark op) const
5400 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
5403 boost::shared_ptr<Port>
5404 Session::ltc_input_port () const
5406 return _ltc_input->nth (0);
5409 boost::shared_ptr<Port>
5410 Session::ltc_output_port () const
5412 return _ltc_output->nth (0);
5416 Session::reconnect_ltc_input ()
5420 string src = Config->get_ltc_source_port();
5422 _ltc_input->disconnect (this);
5424 if (src != _("None") && !src.empty()) {
5425 _ltc_input->nth (0)->connect (src);
5431 Session::reconnect_ltc_output ()
5436 string src = Config->get_ltc_sink_port();
5438 _ltc_output->disconnect (this);
5440 if (src != _("None") && !src.empty()) {
5441 _ltc_output->nth (0)->connect (src);