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/thread.h>
34 #include <glibmm/miscutils.h>
35 #include <glibmm/fileutils.h>
37 #include <boost/algorithm/string/erase.hpp>
39 #include "pbd/error.h"
40 #include "pbd/boost_debug.h"
41 #include "pbd/pathscanner.h"
42 #include "pbd/stl_delete.h"
43 #include "pbd/basename.h"
44 #include "pbd/stacktrace.h"
45 #include "pbd/file_utils.h"
46 #include "pbd/convert.h"
47 #include "pbd/strsplit.h"
48 #include "pbd/strsplit.h"
49 #include "pbd/unwind.h"
51 #include "ardour/amp.h"
52 #include "ardour/analyser.h"
53 #include "ardour/audio_buffer.h"
54 #include "ardour/audio_diskstream.h"
55 #include "ardour/audio_port.h"
56 #include "ardour/audio_track.h"
57 #include "ardour/audioengine.h"
58 #include "ardour/audiofilesource.h"
59 #include "ardour/auditioner.h"
60 #include "ardour/buffer_manager.h"
61 #include "ardour/buffer_set.h"
62 #include "ardour/bundle.h"
63 #include "ardour/butler.h"
64 #include "ardour/click.h"
65 #include "ardour/control_protocol_manager.h"
66 #include "ardour/data_type.h"
67 #include "ardour/debug.h"
68 #include "ardour/filename_extensions.h"
69 #include "ardour/graph.h"
70 #include "ardour/midi_track.h"
71 #include "ardour/midi_ui.h"
72 #include "ardour/named_selection.h"
73 #include "ardour/operations.h"
74 #include "ardour/playlist.h"
75 #include "ardour/plugin.h"
76 #include "ardour/plugin_insert.h"
77 #include "ardour/process_thread.h"
78 #include "ardour/rc_configuration.h"
79 #include "ardour/recent_sessions.h"
80 #include "ardour/region.h"
81 #include "ardour/region_factory.h"
82 #include "ardour/route_graph.h"
83 #include "ardour/route_group.h"
84 #include "ardour/send.h"
85 #include "ardour/session.h"
86 #include "ardour/session_directory.h"
87 #include "ardour/session_playlists.h"
88 #include "ardour/smf_source.h"
89 #include "ardour/source_factory.h"
90 #include "ardour/utils.h"
92 #include "midi++/port.h"
93 #include "midi++/jack_midi_port.h"
94 #include "midi++/mmc.h"
95 #include "midi++/manager.h"
106 using namespace ARDOUR;
109 bool Session::_disable_all_loaded_plugins = false;
111 PBD::Signal1<void,std::string> Session::Dialog;
112 PBD::Signal0<int> Session::AskAboutPendingState;
113 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
114 PBD::Signal0<void> Session::SendFeedback;
115 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
117 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
118 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
119 PBD::Signal2<void,std::string, std::string> Session::Exported;
120 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
121 PBD::Signal0<void> Session::Quit;
122 PBD::Signal0<void> Session::FeedbackDetected;
123 PBD::Signal0<void> Session::SuccessfulGraphSort;
125 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
126 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
128 /** @param snapshot_name Snapshot name, without .ardour suffix */
129 Session::Session (AudioEngine &eng,
130 const string& fullpath,
131 const string& snapshot_name,
132 BusProfile* bus_profile,
135 , _target_transport_speed (0.0)
136 , _requested_return_frame (-1)
137 , _session_dir (new SessionDirectory(fullpath))
139 , _state_of_the_state (Clean)
140 , _butler (new Butler (*this))
141 , _post_transport_work (0)
142 , _send_timecode_update (false)
143 , _all_route_group (new RouteGroup (*this, "all"))
144 , routes (new RouteList)
145 , _total_free_4k_blocks (0)
146 , _total_free_4k_blocks_uncertain (false)
147 , _bundles (new BundleList)
148 , _bundle_xml_node (0)
150 , _click_io ((IO*) 0)
152 , click_emphasis_data (0)
154 , _have_rec_enabled_track (false)
155 , _suspend_timecode_transmission (0)
157 _locations = new Locations (*this);
159 if (how_many_dsp_threads () > 1) {
160 /* For now, only create the graph if we are using >1 DSP threads, as
161 it is a bit slower than the old code with 1 thread.
163 _process_graph.reset (new Graph (*this));
166 playlists.reset (new SessionPlaylists);
168 _all_route_group->set_active (true, this);
170 interpolation.add_channel_to (0, 0);
172 if (!eng.connected()) {
173 throw failed_constructor();
176 n_physical_outputs = _engine.n_physical_outputs ();
177 n_physical_inputs = _engine.n_physical_inputs ();
179 first_stage_init (fullpath, snapshot_name);
181 _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
184 if (create (mix_template, bus_profile)) {
186 throw failed_constructor ();
190 if (second_stage_init ()) {
192 throw failed_constructor ();
195 store_recent_sessions(_name, _path);
197 bool was_dirty = dirty();
199 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
201 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
202 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
205 DirtyChanged (); /* EMIT SIGNAL */
208 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
209 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
225 vector<void*> debug_pointers;
227 /* if we got to here, leaving pending capture state around
231 remove_pending_capture_state ();
233 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
235 _engine.remove_session ();
237 /* clear history so that no references to objects are held any more */
241 /* clear state tree so that no references to objects are held any more */
245 /* reset dynamic state version back to default */
247 Stateful::loading_state_version = 0;
249 _butler->drop_references ();
253 delete midi_control_ui;
254 delete _all_route_group;
256 if (click_data != default_click) {
257 delete [] click_data;
260 if (click_emphasis_data != default_click_emphasis) {
261 delete [] click_emphasis_data;
266 /* clear out any pending dead wood from RCU managed objects */
271 AudioDiskstream::free_working_buffers();
273 /* tell everyone who is still standing that we're about to die */
276 /* tell everyone to drop references and delete objects as we go */
278 DEBUG_TRACE (DEBUG::Destruction, "delete named selections\n");
279 named_selections.clear ();
281 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
282 RegionFactory::delete_all_regions ();
284 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
286 /* reset these three references to special routes before we do the usual route delete thing */
289 _master_out.reset ();
290 _monitor_out.reset ();
293 RCUWriter<RouteList> writer (routes);
294 boost::shared_ptr<RouteList> r = writer.get_copy ();
296 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
297 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
298 (*i)->drop_references ();
302 /* writer goes out of scope and updates master */
306 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
307 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
308 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
309 i->second->drop_references ();
314 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
315 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
320 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
325 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
327 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
328 boost_debug_list_ptrs ();
333 Session::when_engine_running ()
335 string first_physical_output;
337 BootMessage (_("Set block size and sample rate"));
339 set_block_size (_engine.frames_per_cycle());
340 set_frame_rate (_engine.frame_rate());
342 BootMessage (_("Using configuration"));
344 boost::function<void (std::string)> ff (boost::bind (&Session::config_changed, this, _1, false));
345 boost::function<void (std::string)> ft (boost::bind (&Session::config_changed, this, _1, true));
347 Config->map_parameters (ff);
348 config.map_parameters (ft);
350 /* every time we reconnect, recompute worst case output latencies */
352 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
354 if (synced_to_jack()) {
355 _engine.transport_stop ();
358 if (config.get_jack_time_master()) {
359 _engine.transport_locate (_transport_frame);
367 _click_io.reset (new ClickIO (*this, "click"));
368 _click_gain.reset (new Amp (*this));
369 _click_gain->activate ();
371 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
373 /* existing state for Click */
376 if (Stateful::loading_state_version < 3000) {
377 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
379 const XMLNodeList& children (child->children());
380 XMLNodeList::const_iterator i = children.begin();
381 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
383 if (i != children.end()) {
384 c = _click_gain->set_state (**i, Stateful::loading_state_version);
390 _clicking = Config->get_clicking ();
394 error << _("could not setup Click I/O") << endmsg;
401 /* default state for Click: dual-mono to first 2 physical outputs */
404 _engine.get_physical_outputs (DataType::AUDIO, outs);
406 for (uint32_t physport = 0; physport < 2; ++physport) {
407 if (outs.size() > physport) {
408 if (_click_io->add_port (outs[physport], this)) {
409 // relax, even though its an error
414 if (_click_io->n_ports () > ChanCount::ZERO) {
415 _clicking = Config->get_clicking ();
420 catch (failed_constructor& err) {
421 error << _("cannot setup Click I/O") << endmsg;
424 BootMessage (_("Compute I/O Latencies"));
427 // XXX HOW TO ALERT UI TO THIS ? DO WE NEED TO?
430 BootMessage (_("Set up standard connections"));
432 vector<string> inputs[DataType::num_types];
433 vector<string> outputs[DataType::num_types];
434 for (uint32_t i = 0; i < DataType::num_types; ++i) {
435 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
436 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
439 /* Create a set of Bundle objects that map
440 to the physical I/O currently available. We create both
441 mono and stereo bundles, so that the common cases of mono
442 and stereo tracks get bundles to put in their mixer strip
443 in / out menus. There may be a nicer way of achieving that;
444 it doesn't really scale that well to higher channel counts
447 /* mono output bundles */
449 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
451 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
453 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
454 c->add_channel (_("mono"), DataType::AUDIO);
455 c->set_port (0, outputs[DataType::AUDIO][np]);
460 /* stereo output bundles */
462 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
463 if (np + 1 < outputs[DataType::AUDIO].size()) {
465 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
466 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
467 c->add_channel (_("L"), DataType::AUDIO);
468 c->set_port (0, outputs[DataType::AUDIO][np]);
469 c->add_channel (_("R"), DataType::AUDIO);
470 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
476 /* mono input bundles */
478 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
480 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
482 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
483 c->add_channel (_("mono"), DataType::AUDIO);
484 c->set_port (0, inputs[DataType::AUDIO][np]);
489 /* stereo input bundles */
491 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
492 if (np + 1 < inputs[DataType::AUDIO].size()) {
494 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
496 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
497 c->add_channel (_("L"), DataType::AUDIO);
498 c->set_port (0, inputs[DataType::AUDIO][np]);
499 c->add_channel (_("R"), DataType::AUDIO);
500 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
506 /* MIDI input bundles */
508 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
509 string n = inputs[DataType::MIDI][np];
510 boost::erase_first (n, X_("alsa_pcm:"));
512 boost::shared_ptr<Bundle> c (new Bundle (n, false));
513 c->add_channel ("", DataType::MIDI);
514 c->set_port (0, inputs[DataType::MIDI][np]);
518 /* MIDI output bundles */
520 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
521 string n = outputs[DataType::MIDI][np];
522 boost::erase_first (n, X_("alsa_pcm:"));
524 boost::shared_ptr<Bundle> c (new Bundle (n, true));
525 c->add_channel ("", DataType::MIDI);
526 c->set_port (0, outputs[DataType::MIDI][np]);
530 BootMessage (_("Setup signal flow and plugins"));
532 /* Reset all panners */
534 Delivery::reset_panners ();
536 /* this will cause the CPM to instantiate any protocols that are in use
537 * (or mandatory), which will pass it this Session, and then call
538 * set_state() on each instantiated protocol to match stored state.
541 ControlProtocolManager::instance().set_session (this);
543 /* This must be done after the ControlProtocolManager set_session above,
544 as it will set states for ports which the ControlProtocolManager creates.
547 MIDI::Manager::instance()->set_port_states (Config->midi_port_states ());
549 /* And this must be done after the MIDI::Manager::set_port_states as
550 * it will try to make connections whose details are loaded by set_port_states.
555 /* Let control protocols know that we are now all connected, so they
556 * could start talking to surfaces if they want to.
559 ControlProtocolManager::instance().midi_connectivity_established ();
561 if (_is_new && !no_auto_connect()) {
562 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock());
563 auto_connect_master_bus ();
566 _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
568 /* update latencies */
570 initialize_latencies ();
572 /* hook us up to the engine */
574 BootMessage (_("Connect to engine"));
575 _engine.set_session (this);
579 Session::auto_connect_master_bus ()
581 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
585 /* if requested auto-connect the outputs to the first N physical ports.
588 uint32_t limit = _master_out->n_outputs().n_total();
589 vector<string> outputs[DataType::num_types];
591 for (uint32_t i = 0; i < DataType::num_types; ++i) {
592 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
595 for (uint32_t n = 0; n < limit; ++n) {
596 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
598 if (outputs[p->type()].size() > n) {
599 connect_to = outputs[p->type()][n];
602 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
603 if (_master_out->output()->connect (p, connect_to, this)) {
604 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
613 Session::remove_monitor_section ()
619 /* force reversion to Solo-In-Place */
620 Config->set_solo_control_is_listen_control (false);
623 /* Hold process lock while doing this so that we don't hear bits and
624 * pieces of audio as we work on each route.
627 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
629 /* Connect tracks to monitor section. Note that in an
630 existing session, the internal sends will already exist, but we want the
631 routes to notice that they connect to the control out specifically.
635 boost::shared_ptr<RouteList> r = routes.reader ();
636 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
638 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
640 if ((*x)->is_monitor()) {
642 } else if ((*x)->is_master()) {
645 (*x)->remove_aux_or_listen (_monitor_out);
650 remove_route (_monitor_out);
651 auto_connect_master_bus ();
655 Session::add_monitor_section ()
659 if (_monitor_out || !_master_out) {
663 boost::shared_ptr<Route> r (new Route (*this, _("monitor"), Route::MonitorOut, DataType::AUDIO));
669 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
670 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
673 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
674 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
675 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
679 add_routes (rl, false, false, false);
681 assert (_monitor_out);
683 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
684 are undefined, at best.
687 uint32_t limit = _monitor_out->n_inputs().n_audio();
691 /* connect the inputs to the master bus outputs. this
692 * represents a separate data feed from the internal sends from
693 * each route. as of jan 2011, it allows the monitor section to
694 * conditionally ignore either the internal sends or the normal
695 * input feed, but we should really find a better way to do
699 _master_out->output()->disconnect (this);
701 for (uint32_t n = 0; n < limit; ++n) {
702 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
703 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
706 string connect_to = o->name();
707 if (_monitor_out->input()->connect (p, connect_to, this)) {
708 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
716 /* if monitor section is not connected, connect it to physical outs
719 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
721 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
723 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
726 _monitor_out->output()->connect_ports_to_bundle (b, this);
728 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
729 Config->get_monitor_bus_preferred_bundle())
735 /* Monitor bus is audio only */
737 uint32_t mod = n_physical_outputs.get (DataType::AUDIO);
738 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
739 vector<string> outputs[DataType::num_types];
741 for (uint32_t i = 0; i < DataType::num_types; ++i) {
742 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
748 for (uint32_t n = 0; n < limit; ++n) {
750 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
752 if (outputs[DataType::AUDIO].size() > (n % mod)) {
753 connect_to = outputs[DataType::AUDIO][n % mod];
756 if (!connect_to.empty()) {
757 if (_monitor_out->output()->connect (p, connect_to, this)) {
758 error << string_compose (
759 _("cannot connect control output %1 to %2"),
770 /* Hold process lock while doing this so that we don't hear bits and
771 * pieces of audio as we work on each route.
774 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
776 /* Connect tracks to monitor section. Note that in an
777 existing session, the internal sends will already exist, but we want the
778 routes to notice that they connect to the control out specifically.
782 boost::shared_ptr<RouteList> rls = routes.reader ();
784 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
786 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
788 if ((*x)->is_monitor()) {
790 } else if ((*x)->is_master()) {
793 (*x)->enable_monitor_send ();
799 Session::hookup_io ()
801 /* stop graph reordering notifications from
802 causing resorts, etc.
805 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
809 /* we delay creating the auditioner till now because
810 it makes its own connections to ports.
814 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
816 throw failed_constructor ();
818 a->use_new_diskstream ();
822 catch (failed_constructor& err) {
823 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
827 /* load bundles, which we may have postponed earlier on */
828 if (_bundle_xml_node) {
829 load_bundles (*_bundle_xml_node);
830 delete _bundle_xml_node;
833 /* Tell all IO objects to connect themselves together */
835 IO::enable_connecting ();
836 MIDI::JackMIDIPort::MakeConnections ();
838 /* Anyone who cares about input state, wake up and do something */
840 IOConnectionsComplete (); /* EMIT SIGNAL */
842 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
844 /* now handle the whole enchilada as if it was one
850 /* update the full solo state, which can't be
851 correctly determined on a per-route basis, but
852 needs the global overview that only the session
856 update_route_solo_state ();
860 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
862 boost::shared_ptr<Track> track = wp.lock ();
867 boost::shared_ptr<Playlist> playlist;
869 if ((playlist = track->playlist()) != 0) {
870 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
871 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
872 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
877 Session::record_enabling_legal () const
879 /* this used to be in here, but survey says.... we don't need to restrict it */
880 // if (record_status() == Recording) {
884 if (Config->get_all_safe()) {
891 Session::set_track_monitor_input_status (bool yn)
893 boost::shared_ptr<RouteList> rl = routes.reader ();
894 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
895 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
896 if (tr && tr->record_enabled ()) {
897 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
898 tr->request_jack_monitors_input (yn);
904 Session::auto_punch_start_changed (Location* location)
906 replace_event (SessionEvent::PunchIn, location->start());
908 if (get_record_enabled() && config.get_punch_in()) {
909 /* capture start has been changed, so save new pending state */
910 save_state ("", true);
915 Session::auto_punch_end_changed (Location* location)
917 framepos_t when_to_stop = location->end();
918 // when_to_stop += _worst_output_latency + _worst_input_latency;
919 replace_event (SessionEvent::PunchOut, when_to_stop);
923 Session::auto_punch_changed (Location* location)
925 framepos_t when_to_stop = location->end();
927 replace_event (SessionEvent::PunchIn, location->start());
928 //when_to_stop += _worst_output_latency + _worst_input_latency;
929 replace_event (SessionEvent::PunchOut, when_to_stop);
933 Session::auto_loop_changed (Location* location)
935 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
937 if (transport_rolling() && play_loop) {
940 // if (_transport_frame > location->end()) {
942 if (_transport_frame < location->start() || _transport_frame > location->end()) {
943 // relocate to beginning of loop
944 clear_events (SessionEvent::LocateRoll);
946 request_locate (location->start(), true);
949 else if (Config->get_seamless_loop() && !loop_changing) {
951 // schedule a locate-roll to refill the diskstreams at the
953 loop_changing = true;
955 if (location->end() > last_loopend) {
956 clear_events (SessionEvent::LocateRoll);
957 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
964 last_loopend = location->end();
968 Session::set_auto_punch_location (Location* location)
972 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
973 punch_connections.drop_connections();
974 existing->set_auto_punch (false, this);
975 remove_event (existing->start(), SessionEvent::PunchIn);
976 clear_events (SessionEvent::PunchOut);
977 auto_punch_location_changed (0);
986 if (location->end() <= location->start()) {
987 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
991 punch_connections.drop_connections ();
993 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
994 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
995 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
997 location->set_auto_punch (true, this);
999 auto_punch_changed (location);
1001 auto_punch_location_changed (location);
1005 Session::set_auto_loop_location (Location* location)
1009 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1010 loop_connections.drop_connections ();
1011 existing->set_auto_loop (false, this);
1012 remove_event (existing->end(), SessionEvent::AutoLoop);
1013 auto_loop_location_changed (0);
1018 if (location == 0) {
1022 if (location->end() <= location->start()) {
1023 error << _("Session: you can't use a mark for auto loop") << endmsg;
1027 last_loopend = location->end();
1029 loop_connections.drop_connections ();
1031 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1032 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1033 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1035 location->set_auto_loop (true, this);
1037 /* take care of our stuff first */
1039 auto_loop_changed (location);
1041 /* now tell everyone else */
1043 auto_loop_location_changed (location);
1047 Session::locations_added (Location *)
1053 Session::locations_changed ()
1055 _locations->apply (*this, &Session::handle_locations_changed);
1059 Session::handle_locations_changed (Locations::LocationList& locations)
1061 Locations::LocationList::iterator i;
1063 bool set_loop = false;
1064 bool set_punch = false;
1066 for (i = locations.begin(); i != locations.end(); ++i) {
1070 if (location->is_auto_punch()) {
1071 set_auto_punch_location (location);
1074 if (location->is_auto_loop()) {
1075 set_auto_loop_location (location);
1079 if (location->is_session_range()) {
1080 _session_range_location = location;
1085 set_auto_loop_location (0);
1088 set_auto_punch_location (0);
1095 Session::enable_record ()
1097 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1098 /* no recording at anything except normal speed */
1103 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1105 if (rs == Recording) {
1109 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1111 _last_record_location = _transport_frame;
1112 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1114 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1115 set_track_monitor_input_status (true);
1118 RecordStateChanged ();
1125 Session::disable_record (bool rt_context, bool force)
1129 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1131 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1132 g_atomic_int_set (&_record_status, Disabled);
1133 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1135 if (rs == Recording) {
1136 g_atomic_int_set (&_record_status, Enabled);
1140 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1141 set_track_monitor_input_status (false);
1144 RecordStateChanged (); /* emit signal */
1147 remove_pending_capture_state ();
1153 Session::step_back_from_record ()
1155 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1157 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1158 set_track_monitor_input_status (false);
1161 RecordStateChanged (); /* emit signal */
1166 Session::maybe_enable_record ()
1168 if (_step_editors > 0) {
1172 g_atomic_int_set (&_record_status, Enabled);
1174 /* This function is currently called from somewhere other than an RT thread.
1175 This save_state() call therefore doesn't impact anything. Doing it here
1176 means that we save pending state of which sources the next record will use,
1177 which gives us some chance of recovering from a crash during the record.
1180 save_state ("", true);
1182 if (_transport_speed) {
1183 if (!config.get_punch_in()) {
1187 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1188 RecordStateChanged (); /* EMIT SIGNAL */
1195 Session::audible_frame () const
1201 /* the first of these two possible settings for "offset"
1202 mean that the audible frame is stationary until
1203 audio emerges from the latency compensation
1206 the second means that the audible frame is stationary
1207 until audio would emerge from a physical port
1208 in the absence of any plugin latency compensation
1211 offset = worst_playback_latency ();
1213 if (offset > current_block_size) {
1214 offset -= current_block_size;
1216 /* XXX is this correct? if we have no external
1217 physical connections and everything is internal
1218 then surely this is zero? still, how
1219 likely is that anyway?
1221 offset = current_block_size;
1224 if (synced_to_jack()) {
1225 tf = _engine.transport_frame();
1227 tf = _transport_frame;
1232 if (!non_realtime_work_pending()) {
1236 /* Check to see if we have passed the first guaranteed
1237 audible frame past our last start position. if not,
1238 return that last start point because in terms
1239 of audible frames, we have not moved yet.
1241 `Start position' in this context means the time we last
1242 either started or changed transport direction.
1245 if (_transport_speed > 0.0f) {
1247 if (!play_loop || !have_looped) {
1248 if (tf < _last_roll_or_reversal_location + offset) {
1249 return _last_roll_or_reversal_location;
1257 } else if (_transport_speed < 0.0f) {
1259 /* XXX wot? no backward looping? */
1261 if (tf > _last_roll_or_reversal_location - offset) {
1262 return _last_roll_or_reversal_location;
1274 Session::set_frame_rate (framecnt_t frames_per_second)
1276 /** \fn void Session::set_frame_size(framecnt_t)
1277 the AudioEngine object that calls this guarantees
1278 that it will not be called while we are also in
1279 ::process(). Its fine to do things that block
1283 _base_frame_rate = frames_per_second;
1287 Automatable::set_automation_interval (ceil ((double) frames_per_second * (0.001 * Config->get_automation_interval())));
1291 // XXX we need some equivalent to this, somehow
1292 // SndFileSource::setup_standard_crossfades (frames_per_second);
1296 /* XXX need to reset/reinstantiate all LADSPA plugins */
1300 Session::set_block_size (pframes_t nframes)
1302 /* the AudioEngine guarantees
1303 that it will not be called while we are also in
1304 ::process(). It is therefore fine to do things that block
1309 current_block_size = nframes;
1313 boost::shared_ptr<RouteList> r = routes.reader ();
1315 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1316 (*i)->set_block_size (nframes);
1319 boost::shared_ptr<RouteList> rl = routes.reader ();
1320 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1321 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1323 tr->set_block_size (nframes);
1327 set_worst_io_latencies ();
1333 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1335 boost::shared_ptr<Route> r2;
1337 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1338 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1342 /* make a copy of the existing list of routes that feed r1 */
1344 Route::FedBy existing (r1->fed_by());
1346 /* for each route that feeds r1, recurse, marking it as feeding
1350 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1351 if (!(r2 = i->r.lock ())) {
1352 /* (*i) went away, ignore it */
1356 /* r2 is a route that feeds r1 which somehow feeds base. mark
1357 base as being fed by r2
1360 rbase->add_fed_by (r2, i->sends_only);
1364 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1368 if (r1->feeds (r2) && r2->feeds (r1)) {
1372 /* now recurse, so that we can mark base as being fed by
1373 all routes that feed r2
1376 trace_terminal (r2, rbase);
1383 Session::resort_routes ()
1385 /* don't do anything here with signals emitted
1386 by Routes during initial setup or while we
1387 are being destroyed.
1390 if (_state_of_the_state & (InitialConnecting | Deletion)) {
1395 RCUWriter<RouteList> writer (routes);
1396 boost::shared_ptr<RouteList> r = writer.get_copy ();
1397 resort_routes_using (r);
1398 /* writer goes out of scope and forces update */
1402 boost::shared_ptr<RouteList> rl = routes.reader ();
1403 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1404 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1406 const Route::FedBy& fb ((*i)->fed_by());
1408 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1409 boost::shared_ptr<Route> sf = f->r.lock();
1411 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1419 /** This is called whenever we need to rebuild the graph of how we will process
1421 * @param r List of routes, in any order.
1425 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1427 /* We are going to build a directed graph of our routes;
1428 this is where the edges of that graph are put.
1433 /* Go through all routes doing two things:
1435 * 1. Collect the edges of the route graph. Each of these edges
1436 * is a pair of routes, one of which directly feeds the other
1437 * either by a JACK connection or by an internal send.
1439 * 2. Begin the process of making routes aware of which other
1440 * routes directly or indirectly feed them. This information
1441 * is used by the solo code.
1444 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1446 /* Clear out the route's list of direct or indirect feeds */
1447 (*i)->clear_fed_by ();
1449 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
1451 bool via_sends_only;
1453 /* See if this *j feeds *i according to the current state of the JACK
1454 connections and internal sends.
1456 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
1457 /* add the edge to the graph (part #1) */
1458 edges.add (*j, *i, via_sends_only);
1459 /* tell the route (for part #2) */
1460 (*i)->add_fed_by (*j, via_sends_only);
1465 /* Attempt a topological sort of the route graph */
1466 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
1468 if (sorted_routes) {
1469 /* We got a satisfactory topological sort, so there is no feedback;
1472 Note: the process graph rechain does not require a
1473 topologically-sorted list, but hey ho.
1475 if (_process_graph) {
1476 _process_graph->rechain (sorted_routes, edges);
1479 _current_route_graph = edges;
1481 /* Complete the building of the routes' lists of what directly
1482 or indirectly feeds them.
1484 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1485 trace_terminal (*i, *i);
1488 *r = *sorted_routes;
1491 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1492 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1493 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1494 (*i)->name(), (*i)->order_key ("signal")));
1498 SuccessfulGraphSort (); /* EMIT SIGNAL */
1501 /* The topological sort failed, so we have a problem. Tell everyone
1502 and stick to the old graph; this will continue to be processed, so
1503 until the feedback is fixed, what is played back will not quite
1504 reflect what is actually connected. Note also that we do not
1505 do trace_terminal here, as it would fail due to an endless recursion,
1506 so the solo code will think that everything is still connected
1510 FeedbackDetected (); /* EMIT SIGNAL */
1515 /** Find a route name starting with \a base, maybe followed by the
1516 * lowest \a id. \a id will always be added if \a definitely_add_number
1517 * is true on entry; otherwise it will only be added if required
1518 * to make the name unique.
1520 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1521 * The available route name with the lowest ID will be used, and \a id
1522 * will be set to the ID.
1524 * \return false if a route name could not be found, and \a track_name
1525 * and \a id do not reflect a free route name.
1528 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1530 if (!definitely_add_number && route_by_name (base) == 0) {
1531 /* juse use the base */
1532 snprintf (name, name_len, "%s", base.c_str());
1537 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1539 if (route_by_name (name) == 0) {
1545 } while (id < (UINT_MAX-1));
1550 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
1552 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
1554 in = ChanCount::ZERO;
1555 out = ChanCount::ZERO;
1557 boost::shared_ptr<RouteList> r = routes.reader ();
1559 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1560 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1561 if (tr && !tr->is_hidden()) {
1562 in += tr->n_inputs();
1563 out += tr->n_outputs();
1568 /** Caller must not hold process lock
1569 * @param name_template string to use for the start of the name, or "" to use "MIDI".
1570 * @param instrument plugin info for the instrument to insert pre-fader, if any
1572 list<boost::shared_ptr<MidiTrack> >
1573 Session::new_midi_track (boost::shared_ptr<PluginInfo> instrument, TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1575 char track_name[32];
1576 uint32_t track_id = 0;
1578 RouteList new_routes;
1579 list<boost::shared_ptr<MidiTrack> > ret;
1580 uint32_t control_id;
1582 control_id = next_control_id ();
1584 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
1587 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1588 error << "cannot find name for new midi track" << endmsg;
1592 boost::shared_ptr<MidiTrack> track;
1595 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1597 if (track->init ()) {
1601 track->use_new_diskstream();
1603 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1604 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1607 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1608 if (track->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1609 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1613 if (track->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1614 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1619 track->non_realtime_input_change();
1622 route_group->add (track);
1625 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1626 track->set_remote_control_id (control_id);
1628 new_routes.push_back (track);
1629 ret.push_back (track);
1632 catch (failed_constructor &err) {
1633 error << _("Session: could not create new midi track.") << endmsg;
1637 catch (AudioEngine::PortRegistrationFailure& pfe) {
1639 error << string_compose (_("No more JACK ports are available. You will need to stop %1 and restart JACK with ports if you need this many tracks."), PROGRAM_NAME) << endmsg;
1647 if (!new_routes.empty()) {
1648 add_routes (new_routes, true, true, true);
1651 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
1652 PluginPtr plugin = instrument->load (*this);
1653 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
1654 (*r)->add_processor (p, PreFader);
1664 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
1666 boost::shared_ptr<Route> midi_track (wmt.lock());
1672 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
1674 if (change.after.n_audio() <= change.before.n_audio()) {
1678 /* new audio ports: make sure the audio goes somewhere useful,
1679 unless the user has no-auto-connect selected.
1681 The existing ChanCounts don't matter for this call as they are only
1682 to do with matching input and output indices, and we are only changing
1688 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
1692 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1693 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1694 * @param output_start As \a input_start, but for outputs.
1697 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
1698 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
1700 if (!IO::connecting_legal) {
1704 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::NOT_LOCK);
1710 /* If both inputs and outputs are auto-connected to physical ports,
1711 use the max of input and output offsets to ensure auto-connected
1712 port numbers always match up (e.g. the first audio input and the
1713 first audio output of the route will have the same physical
1714 port number). Otherwise just use the lowest input or output
1718 DEBUG_TRACE (DEBUG::Graph,
1719 string_compose("Auto-connect: existing in = %1 out = %2\n",
1720 existing_inputs, existing_outputs));
1722 const bool in_out_physical =
1723 (Config->get_input_auto_connect() & AutoConnectPhysical)
1724 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1727 const ChanCount in_offset = in_out_physical
1728 ? ChanCount::max(existing_inputs, existing_outputs)
1731 const ChanCount out_offset = in_out_physical
1732 ? ChanCount::max(existing_inputs, existing_outputs)
1735 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1736 vector<string> physinputs;
1737 vector<string> physoutputs;
1739 _engine.get_physical_outputs (*t, physoutputs);
1740 _engine.get_physical_inputs (*t, physinputs);
1742 if (!physinputs.empty() && connect_inputs) {
1743 uint32_t nphysical_in = physinputs.size();
1745 DEBUG_TRACE (DEBUG::Graph,
1746 string_compose("There are %1 physical inputs of type %2\n",
1749 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1752 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1753 DEBUG_TRACE (DEBUG::Graph,
1754 string_compose("Get index %1 + %2 % %3 = %4\n",
1755 in_offset.get(*t), i, nphysical_in,
1756 (in_offset.get(*t) + i) % nphysical_in));
1757 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1760 DEBUG_TRACE (DEBUG::Graph,
1761 string_compose("Connect route %1 IN to %2\n",
1762 route->name(), port));
1764 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
1768 ChanCount one_added (*t, 1);
1769 existing_inputs += one_added;
1773 if (!physoutputs.empty()) {
1774 uint32_t nphysical_out = physoutputs.size();
1775 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
1778 if ((*t) == DataType::MIDI || Config->get_output_auto_connect() & AutoConnectPhysical) {
1779 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1780 } else if ((*t) == DataType::AUDIO && Config->get_output_auto_connect() & AutoConnectMaster) {
1781 /* master bus is audio only */
1782 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1783 port = _master_out->input()->ports().port(*t,
1784 i % _master_out->input()->n_ports().get(*t))->name();
1788 DEBUG_TRACE (DEBUG::Graph,
1789 string_compose("Connect route %1 OUT to %2\n",
1790 route->name(), port));
1792 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
1796 ChanCount one_added (*t, 1);
1797 existing_outputs += one_added;
1803 /** Caller must not hold process lock
1804 * @param name_template string to use for the start of the name, or "" to use "Audio".
1806 list< boost::shared_ptr<AudioTrack> >
1807 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
1808 uint32_t how_many, string name_template)
1810 char track_name[32];
1811 uint32_t track_id = 0;
1813 RouteList new_routes;
1814 list<boost::shared_ptr<AudioTrack> > ret;
1815 uint32_t control_id;
1817 control_id = next_control_id ();
1819 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
1822 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1823 error << "cannot find name for new audio track" << endmsg;
1827 boost::shared_ptr<AudioTrack> track;
1830 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
1832 if (track->init ()) {
1836 track->use_new_diskstream();
1838 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1839 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1842 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1844 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1845 error << string_compose (
1846 _("cannot configure %1 in/%2 out configuration for new audio track"),
1847 input_channels, output_channels)
1852 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1853 error << string_compose (
1854 _("cannot configure %1 in/%2 out configuration for new audio track"),
1855 input_channels, output_channels)
1862 route_group->add (track);
1865 track->non_realtime_input_change();
1867 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1868 track->set_remote_control_id (control_id);
1871 new_routes.push_back (track);
1872 ret.push_back (track);
1875 catch (failed_constructor &err) {
1876 error << _("Session: could not create new audio track.") << endmsg;
1880 catch (AudioEngine::PortRegistrationFailure& pfe) {
1882 error << pfe.what() << endmsg;
1890 if (!new_routes.empty()) {
1891 add_routes (new_routes, true, true, true);
1898 Session::set_remote_control_ids ()
1900 RemoteModel m = Config->get_remote_model();
1901 bool emit_signal = false;
1903 boost::shared_ptr<RouteList> r = routes.reader ();
1905 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1906 if (MixerOrdered == m) {
1907 int32_t order = (*i)->order_key(N_("signal"));
1908 (*i)->set_remote_control_id (order+1, false);
1910 } else if (EditorOrdered == m) {
1911 int32_t order = (*i)->order_key(N_("editor"));
1912 (*i)->set_remote_control_id (order+1, false);
1914 } else if (UserOrdered == m) {
1915 //do nothing ... only changes to remote id's are initiated by user
1920 Route::RemoteControlIDChange();
1924 /** Caller must not hold process lock.
1925 * @param name_template string to use for the start of the name, or "" to use "Bus".
1928 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
1931 uint32_t bus_id = 0;
1934 uint32_t control_id;
1936 control_id = next_control_id ();
1938 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
1941 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
1942 error << "cannot find name for new audio bus" << endmsg;
1947 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
1953 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1954 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
1957 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1959 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1960 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1961 input_channels, output_channels)
1967 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1968 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1969 input_channels, output_channels)
1976 route_group->add (bus);
1978 bus->set_remote_control_id (control_id);
1981 bus->add_internal_return ();
1983 ret.push_back (bus);
1987 catch (failed_constructor &err) {
1988 error << _("Session: could not create new audio route.") << endmsg;
1992 catch (AudioEngine::PortRegistrationFailure& pfe) {
1993 error << pfe.what() << endmsg;
2003 add_routes (ret, false, true, true); // autoconnect outputs only
2011 Session::new_route_from_template (uint32_t how_many, const std::string& template_path)
2014 uint32_t control_id;
2016 uint32_t number = 0;
2018 if (!tree.read (template_path.c_str())) {
2022 XMLNode* node = tree.root();
2024 IO::disable_connecting ();
2026 control_id = next_control_id ();
2030 XMLNode node_copy (*node);
2032 /* Remove IDs of everything so that new ones are used */
2033 node_copy.remove_property_recursively (X_("id"));
2036 string const route_name = node_copy.property(X_("name"))->value ();
2038 /* generate a new name by adding a number to the end of the template name */
2040 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2041 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2045 /* set this name in the XML description that we are about to use */
2046 Route::set_name_in_state (node_copy, name);
2048 /* trim bitslots from listen sends so that new ones are used */
2049 XMLNodeList children = node_copy.children ();
2050 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2051 if ((*i)->name() == X_("Processor")) {
2052 XMLProperty* role = (*i)->property (X_("role"));
2053 if (role && role->value() == X_("Listen")) {
2054 (*i)->remove_property (X_("bitslot"));
2059 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2062 error << _("Session: cannot create track/bus from template description") << endmsg;
2066 if (boost::dynamic_pointer_cast<Track>(route)) {
2067 /* force input/output change signals so that the new diskstream
2068 picks up the configuration of the route. During session
2069 loading this normally happens in a different way.
2072 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2074 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2075 change.after = route->input()->n_ports();
2076 route->input()->changed (change, this);
2077 change.after = route->output()->n_ports();
2078 route->output()->changed (change, this);
2081 route->set_remote_control_id (control_id);
2084 ret.push_back (route);
2087 catch (failed_constructor &err) {
2088 error << _("Session: could not create new route from template") << endmsg;
2092 catch (AudioEngine::PortRegistrationFailure& pfe) {
2093 error << pfe.what() << endmsg;
2102 add_routes (ret, true, true, true);
2103 IO::enable_connecting ();
2110 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
2112 ChanCount existing_inputs;
2113 ChanCount existing_outputs;
2115 count_existing_track_channels (existing_inputs, existing_outputs);
2118 RCUWriter<RouteList> writer (routes);
2119 boost::shared_ptr<RouteList> r = writer.get_copy ();
2120 r->insert (r->end(), new_routes.begin(), new_routes.end());
2122 /* if there is no control out and we're not in the middle of loading,
2123 resort the graph here. if there is a control out, we will resort
2124 toward the end of this method. if we are in the middle of loading,
2125 we will resort when done.
2128 if (!_monitor_out && IO::connecting_legal) {
2129 resort_routes_using (r);
2133 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2135 boost::weak_ptr<Route> wpr (*x);
2136 boost::shared_ptr<Route> r (*x);
2138 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2139 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2140 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2141 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2142 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2143 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2144 r->order_key_changed.connect_same_thread (*this, boost::bind (&Session::route_order_key_changed, this));
2146 if (r->is_master()) {
2150 if (r->is_monitor()) {
2154 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2156 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2157 track_playlist_changed (boost::weak_ptr<Track> (tr));
2158 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2160 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2162 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2163 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2167 if (input_auto_connect || output_auto_connect) {
2168 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
2172 if (_monitor_out && IO::connecting_legal) {
2175 Glib::Mutex::Lock lm (_engine.process_lock());
2177 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2178 if ((*x)->is_monitor()) {
2180 } else if ((*x)->is_master()) {
2183 (*x)->enable_monitor_send ();
2194 save_state (_current_snapshot_name);
2197 RouteAdded (new_routes); /* EMIT SIGNAL */
2198 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
2202 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2204 boost::shared_ptr<RouteList> r = routes.reader ();
2205 boost::shared_ptr<Send> s;
2207 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2208 if ((s = (*i)->internal_send_for (dest)) != 0) {
2209 s->amp()->gain_control()->set_value (0.0);
2215 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2217 boost::shared_ptr<RouteList> r = routes.reader ();
2218 boost::shared_ptr<Send> s;
2220 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2221 if ((s = (*i)->internal_send_for (dest)) != 0) {
2222 s->amp()->gain_control()->set_value (1.0);
2228 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2230 boost::shared_ptr<RouteList> r = routes.reader ();
2231 boost::shared_ptr<Send> s;
2233 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2234 if ((s = (*i)->internal_send_for (dest)) != 0) {
2235 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2240 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2242 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2244 boost::shared_ptr<RouteList> r = routes.reader ();
2245 boost::shared_ptr<RouteList> t (new RouteList);
2247 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2248 /* no MIDI sends because there are no MIDI busses yet */
2249 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2254 add_internal_sends (dest, p, t);
2258 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2260 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2261 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
2266 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
2268 add_internal_send (dest, sender->before_processor_for_index (index), sender);
2272 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
2274 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
2278 if (!dest->internal_return()) {
2279 dest->add_internal_return ();
2282 sender->add_aux_send (dest, before);
2288 Session::remove_route (boost::shared_ptr<Route> route)
2290 if (route == _master_out) {
2294 route->set_solo (false, this);
2297 RCUWriter<RouteList> writer (routes);
2298 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2302 /* deleting the master out seems like a dumb
2303 idea, but its more of a UI policy issue
2307 if (route == _master_out) {
2308 _master_out = boost::shared_ptr<Route> ();
2311 if (route == _monitor_out) {
2312 _monitor_out.reset ();
2315 /* writer goes out of scope, forces route list update */
2318 update_route_solo_state ();
2320 // We need to disconnect the route's inputs and outputs
2322 route->input()->disconnect (0);
2323 route->output()->disconnect (0);
2325 /* if the route had internal sends sending to it, remove them */
2326 if (route->internal_return()) {
2328 boost::shared_ptr<RouteList> r = routes.reader ();
2329 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2330 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2332 (*i)->remove_processor (s);
2337 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2338 if (mt && mt->step_editing()) {
2339 if (_step_editors > 0) {
2344 update_latency_compensation ();
2347 /* Re-sort routes to remove the graph's current references to the one that is
2348 * going away, then flush old references out of the graph.
2352 if (_process_graph) {
2353 _process_graph->clear_other_chain ();
2356 /* get rid of it from the dead wood collection in the route list manager */
2358 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2362 /* try to cause everyone to drop their references */
2364 route->drop_references ();
2366 sync_order_keys (N_("session"));
2368 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2370 /* save the new state of the world */
2372 if (save_state (_current_snapshot_name)) {
2373 save_history (_current_snapshot_name);
2378 Session::route_mute_changed (void* /*src*/)
2384 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2386 boost::shared_ptr<Route> route = wpr.lock();
2388 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2392 if (route->listening_via_monitor ()) {
2394 if (Config->get_exclusive_solo()) {
2395 /* new listen: disable all other listen */
2396 boost::shared_ptr<RouteList> r = routes.reader ();
2397 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2398 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2401 (*i)->set_listen (false, this);
2407 } else if (_listen_cnt > 0) {
2412 update_route_solo_state ();
2415 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2417 boost::shared_ptr<Route> route = wpr.lock ();
2420 /* should not happen */
2421 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2425 bool send_changed = false;
2427 if (route->solo_isolated()) {
2428 if (_solo_isolated_cnt == 0) {
2429 send_changed = true;
2431 _solo_isolated_cnt++;
2432 } else if (_solo_isolated_cnt > 0) {
2433 _solo_isolated_cnt--;
2434 if (_solo_isolated_cnt == 0) {
2435 send_changed = true;
2440 IsolatedChanged (); /* EMIT SIGNAL */
2445 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2447 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
2449 if (!self_solo_change) {
2450 // session doesn't care about changes to soloed-by-others
2454 if (solo_update_disabled) {
2456 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
2460 boost::shared_ptr<Route> route = wpr.lock ();
2463 boost::shared_ptr<RouteList> r = routes.reader ();
2466 if (route->self_soloed()) {
2472 RouteGroup* rg = route->route_group ();
2473 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
2475 if (delta == 1 && Config->get_exclusive_solo()) {
2477 /* new solo: disable all other solos, but not the group if its solo-enabled */
2479 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2480 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2481 (leave_group_alone && ((*i)->route_group() == rg))) {
2484 (*i)->set_solo (false, this);
2488 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
2490 solo_update_disabled = true;
2492 RouteList uninvolved;
2494 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
2496 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2497 bool via_sends_only;
2498 bool in_signal_flow;
2500 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2501 (leave_group_alone && ((*i)->route_group() == rg))) {
2505 in_signal_flow = false;
2507 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
2509 if ((*i)->feeds (route, &via_sends_only)) {
2510 if (!via_sends_only) {
2511 if (!route->soloed_by_others_upstream()) {
2512 (*i)->mod_solo_by_others_downstream (delta);
2515 in_signal_flow = true;
2517 DEBUG_TRACE (DEBUG::Solo, "\tno feed from\n");
2520 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
2522 if (route->feeds (*i, &via_sends_only)) {
2523 /* propagate solo upstream only if routing other than
2524 sends is involved, but do consider the other route
2525 (*i) to be part of the signal flow even if only
2528 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
2532 route->soloed_by_others_downstream(),
2533 route->soloed_by_others_upstream()));
2534 if (!via_sends_only) {
2535 if (!route->soloed_by_others_downstream()) {
2536 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
2537 (*i)->mod_solo_by_others_upstream (delta);
2540 in_signal_flow = true;
2542 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
2545 if (!in_signal_flow) {
2546 uninvolved.push_back (*i);
2550 solo_update_disabled = false;
2551 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
2553 update_route_solo_state (r);
2555 /* now notify that the mute state of the routes not involved in the signal
2556 pathway of the just-solo-changed route may have altered.
2559 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2560 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1\n", (*i)->name()));
2561 (*i)->mute_changed (this);
2564 SoloChanged (); /* EMIT SIGNAL */
2569 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2571 /* now figure out if anything that matters is soloed (or is "listening")*/
2573 bool something_soloed = false;
2574 uint32_t listeners = 0;
2575 uint32_t isolated = 0;
2578 r = routes.reader();
2581 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2582 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2583 something_soloed = true;
2586 if (!(*i)->is_hidden() && (*i)->listening_via_monitor()) {
2587 if (Config->get_solo_control_is_listen_control()) {
2590 (*i)->set_listen (false, this);
2594 if ((*i)->solo_isolated()) {
2599 if (something_soloed != _non_soloed_outs_muted) {
2600 _non_soloed_outs_muted = something_soloed;
2601 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2604 _listen_cnt = listeners;
2606 if (isolated != _solo_isolated_cnt) {
2607 _solo_isolated_cnt = isolated;
2608 IsolatedChanged (); /* EMIT SIGNAL */
2612 boost::shared_ptr<RouteList>
2613 Session::get_routes_with_internal_returns() const
2615 boost::shared_ptr<RouteList> r = routes.reader ();
2616 boost::shared_ptr<RouteList> rl (new RouteList);
2618 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2619 if ((*i)->internal_return ()) {
2627 Session::io_name_is_legal (const std::string& name)
2629 boost::shared_ptr<RouteList> r = routes.reader ();
2631 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2632 if ((*i)->name() == name) {
2636 if ((*i)->has_io_processor_named (name)) {
2645 Session::set_exclusive_input_active (boost::shared_ptr<Route> rt, bool /*others_on*/)
2648 vector<string> connections;
2650 PortSet& ps (rt->input()->ports());
2652 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
2653 p->get_connections (connections);
2656 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
2657 routes_using_input_from (*s, rl);
2660 /* scan all relevant routes to see if others are on or off */
2662 bool others_are_already_on = false;
2664 for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
2666 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2668 if (mt->input_active()) {
2669 others_are_already_on = true;
2676 /* globally reverse other routes */
2678 for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
2680 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2682 mt->set_input_active (!others_are_already_on);
2689 Session::routes_using_input_from (const string& str, RouteList& rl)
2691 boost::shared_ptr<RouteList> r = routes.reader ();
2693 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2694 if ((*i)->input()->connected_to (str)) {
2700 boost::shared_ptr<Route>
2701 Session::route_by_name (string name)
2703 boost::shared_ptr<RouteList> r = routes.reader ();
2705 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2706 if ((*i)->name() == name) {
2711 return boost::shared_ptr<Route> ((Route*) 0);
2714 boost::shared_ptr<Route>
2715 Session::route_by_id (PBD::ID id)
2717 boost::shared_ptr<RouteList> r = routes.reader ();
2719 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2720 if ((*i)->id() == id) {
2725 return boost::shared_ptr<Route> ((Route*) 0);
2728 boost::shared_ptr<Track>
2729 Session::track_by_diskstream_id (PBD::ID id)
2731 boost::shared_ptr<RouteList> r = routes.reader ();
2733 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2734 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
2735 if (t && t->using_diskstream_id (id)) {
2740 return boost::shared_ptr<Track> ();
2743 boost::shared_ptr<Route>
2744 Session::route_by_remote_id (uint32_t id)
2746 boost::shared_ptr<RouteList> r = routes.reader ();
2748 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2749 if ((*i)->remote_control_id() == id) {
2754 return boost::shared_ptr<Route> ((Route*) 0);
2758 Session::playlist_region_added (boost::weak_ptr<Region> w)
2760 boost::shared_ptr<Region> r = w.lock ();
2765 /* These are the operations that are currently in progress... */
2766 list<GQuark> curr = _current_trans_quarks;
2769 /* ...and these are the operations during which we want to update
2770 the session range location markers.
2773 ops.push_back (Operations::capture);
2774 ops.push_back (Operations::paste);
2775 ops.push_back (Operations::duplicate_region);
2776 ops.push_back (Operations::insert_file);
2777 ops.push_back (Operations::insert_region);
2778 ops.push_back (Operations::drag_region_brush);
2779 ops.push_back (Operations::region_drag);
2780 ops.push_back (Operations::selection_grab);
2781 ops.push_back (Operations::region_fill);
2782 ops.push_back (Operations::fill_selection);
2783 ops.push_back (Operations::create_region);
2784 ops.push_back (Operations::region_copy);
2785 ops.push_back (Operations::fixed_time_region_copy);
2788 /* See if any of the current operations match the ones that we want */
2790 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
2792 /* If so, update the session range markers */
2794 maybe_update_session_range (r->position (), r->last_frame ());
2798 /** Update the session range markers if a is before the current start or
2799 * b is after the current end.
2802 Session::maybe_update_session_range (framepos_t a, framepos_t b)
2804 if (_state_of_the_state & Loading) {
2808 if (_session_range_location == 0) {
2810 add_session_range_location (a, b);
2814 if (a < _session_range_location->start()) {
2815 _session_range_location->set_start (a);
2818 if (b > _session_range_location->end()) {
2819 _session_range_location->set_end (b);
2825 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
2827 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2828 maybe_update_session_range (i->to, i->to + i->length);
2833 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
2835 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2836 maybe_update_session_range (i->from, i->to);
2840 /* Region management */
2842 boost::shared_ptr<Region>
2843 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2845 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2846 RegionFactory::RegionMap::const_iterator i;
2847 boost::shared_ptr<Region> region;
2849 Glib::Mutex::Lock lm (region_lock);
2851 for (i = regions.begin(); i != regions.end(); ++i) {
2855 if (region->whole_file()) {
2857 if (child->source_equivalent (region)) {
2863 return boost::shared_ptr<Region> ();
2867 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2869 set<boost::shared_ptr<Region> > relevant_regions;
2871 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2872 RegionFactory::get_regions_using_source (*s, relevant_regions);
2875 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2876 set<boost::shared_ptr<Region> >::iterator tmp;
2881 playlists->destroy_region (*r);
2882 RegionFactory::map_remove (*r);
2884 (*r)->drop_sources ();
2885 (*r)->drop_references ();
2887 relevant_regions.erase (r);
2892 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
2895 Glib::Mutex::Lock ls (source_lock);
2896 /* remove from the main source list */
2897 sources.erase ((*s)->id());
2900 (*s)->mark_for_remove ();
2901 (*s)->drop_references ();
2910 Session::remove_last_capture ()
2912 list<boost::shared_ptr<Source> > srcs;
2914 boost::shared_ptr<RouteList> rl = routes.reader ();
2915 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2916 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2921 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
2924 srcs.insert (srcs.end(), l.begin(), l.end());
2929 destroy_sources (srcs);
2931 save_state (_current_snapshot_name);
2936 /* Source Management */
2939 Session::add_source (boost::shared_ptr<Source> source)
2941 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
2942 pair<SourceMap::iterator,bool> result;
2944 entry.first = source->id();
2945 entry.second = source;
2948 Glib::Mutex::Lock lm (source_lock);
2949 result = sources.insert (entry);
2952 if (result.second) {
2954 /* yay, new source */
2956 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
2959 if (!fs->within_session()) {
2960 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
2966 boost::shared_ptr<AudioFileSource> afs;
2968 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
2969 if (Config->get_auto_analyse_audio()) {
2970 Analyser::queue_source_for_analysis (source, false);
2974 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
2979 Session::remove_source (boost::weak_ptr<Source> src)
2981 if (_state_of_the_state & Deletion) {
2985 SourceMap::iterator i;
2986 boost::shared_ptr<Source> source = src.lock();
2993 Glib::Mutex::Lock lm (source_lock);
2995 if ((i = sources.find (source->id())) != sources.end()) {
3000 if (!(_state_of_the_state & InCleanup)) {
3002 /* save state so we don't end up with a session file
3003 referring to non-existent sources.
3006 save_state (_current_snapshot_name);
3010 boost::shared_ptr<Source>
3011 Session::source_by_id (const PBD::ID& id)
3013 Glib::Mutex::Lock lm (source_lock);
3014 SourceMap::iterator i;
3015 boost::shared_ptr<Source> source;
3017 if ((i = sources.find (id)) != sources.end()) {
3024 boost::shared_ptr<Source>
3025 Session::source_by_path_and_channel (const string& path, uint16_t chn)
3027 Glib::Mutex::Lock lm (source_lock);
3029 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3030 boost::shared_ptr<AudioFileSource> afs
3031 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
3033 if (afs && afs->path() == path && chn == afs->channel()) {
3037 return boost::shared_ptr<Source>();
3041 Session::count_sources_by_origin (const string& path)
3044 Glib::Mutex::Lock lm (source_lock);
3046 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3047 boost::shared_ptr<FileSource> fs
3048 = boost::dynamic_pointer_cast<FileSource>(i->second);
3050 if (fs && fs->origin() == path) {
3060 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
3063 string old_basename = PBD::basename_nosuffix (oldname);
3064 string new_legalized = legalize_for_path (newname);
3066 /* note: we know (or assume) the old path is already valid */
3070 /* destructive file sources have a name of the form:
3072 /path/to/Tnnnn-NAME(%[LR])?.wav
3074 the task here is to replace NAME with the new name.
3079 string::size_type dash;
3081 dir = Glib::path_get_dirname (path);
3082 path = Glib::path_get_basename (path);
3084 /* '-' is not a legal character for the NAME part of the path */
3086 if ((dash = path.find_last_of ('-')) == string::npos) {
3090 prefix = path.substr (0, dash);
3094 path += new_legalized;
3095 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3096 path = Glib::build_filename (dir, path);
3100 /* non-destructive file sources have a name of the form:
3102 /path/to/NAME-nnnnn(%[LR])?.ext
3104 the task here is to replace NAME with the new name.
3109 string::size_type dash;
3110 string::size_type postfix;
3112 dir = Glib::path_get_dirname (path);
3113 path = Glib::path_get_basename (path);
3115 /* '-' is not a legal character for the NAME part of the path */
3117 if ((dash = path.find_last_of ('-')) == string::npos) {
3121 suffix = path.substr (dash+1);
3123 // Suffix is now everything after the dash. Now we need to eliminate
3124 // the nnnnn part, which is done by either finding a '%' or a '.'
3126 postfix = suffix.find_last_of ("%");
3127 if (postfix == string::npos) {
3128 postfix = suffix.find_last_of ('.');
3131 if (postfix != string::npos) {
3132 suffix = suffix.substr (postfix);
3134 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
3138 const uint32_t limit = 10000;
3139 char buf[PATH_MAX+1];
3141 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
3143 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
3145 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
3146 path = Glib::build_filename (dir, buf);
3154 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
3163 /** Return the full path (in some session directory) for a new within-session source.
3164 * \a name must be a session-unique name that does not contain slashes
3165 * (e.g. as returned by new_*_source_name)
3168 Session::new_source_path_from_name (DataType type, const string& name)
3170 assert(name.find("/") == string::npos);
3172 SessionDirectory sdir(get_best_session_directory_for_new_source());
3175 if (type == DataType::AUDIO) {
3176 p = sdir.sound_path();
3177 } else if (type == DataType::MIDI) {
3178 p = sdir.midi_path();
3180 error << "Unknown source type, unable to create file path" << endmsg;
3185 return p.to_string();
3189 Session::peak_path (string base) const
3191 sys::path peakfile_path(_session_dir->peak_path());
3192 peakfile_path /= base + peakfile_suffix;
3193 return peakfile_path.to_string();
3196 /** Return a unique name based on \a base for a new internal audio source */
3198 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
3201 char buf[PATH_MAX+1];
3202 const uint32_t limit = 10000;
3204 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3207 legalized = legalize_for_path (base);
3209 // Find a "version" of the base name that doesn't exist in any of the possible directories.
3210 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3212 vector<space_and_path>::iterator i;
3213 uint32_t existing = 0;
3215 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3220 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3221 cnt, legalized.c_str(), ext.c_str());
3222 } else if (nchan == 2) {
3224 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
3225 cnt, legalized.c_str(), ext.c_str());
3227 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
3228 cnt, legalized.c_str(), ext.c_str());
3230 } else if (nchan < 26) {
3231 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
3232 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
3234 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3235 cnt, legalized.c_str(), ext.c_str());
3241 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3242 } else if (nchan == 2) {
3244 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
3246 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
3248 } else if (nchan < 26) {
3249 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
3251 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3255 SessionDirectory sdir((*i).path);
3257 string spath = sdir.sound_path().to_string();
3259 /* note that we search *without* the extension so that
3260 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3261 in the event that this new name is required for
3262 a file format change.
3265 if (matching_unsuffixed_filename_exists_in (spath, buf)) {
3271 if (existing == 0) {
3276 error << string_compose(
3277 _("There are already %1 recordings for %2, which I consider too many."),
3278 limit, base) << endmsg;
3280 throw failed_constructor();
3284 return Glib::path_get_basename (buf);
3287 /** Create a new within-session audio source */
3288 boost::shared_ptr<AudioFileSource>
3289 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
3291 const string name = new_audio_source_name (n, n_chans, chan, destructive);
3292 const string path = new_source_path_from_name(DataType::AUDIO, name);
3294 return boost::dynamic_pointer_cast<AudioFileSource> (
3295 SourceFactory::createWritable (DataType::AUDIO, *this, path, string(), destructive, frame_rate()));
3298 /** Return a unique name based on \a base for a new internal MIDI source */
3300 Session::new_midi_source_name (const string& base)
3303 char buf[PATH_MAX+1];
3304 const uint32_t limit = 10000;
3308 legalized = legalize_for_path (base);
3310 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3311 for (cnt = 1; cnt <= limit; ++cnt) {
3313 vector<space_and_path>::iterator i;
3314 uint32_t existing = 0;
3316 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3318 SessionDirectory sdir((*i).path);
3320 sys::path p = sdir.midi_path();
3323 snprintf (buf, sizeof(buf), "%s-%u.mid", p.to_string().c_str(), cnt);
3325 if (sys::exists (buf)) {
3330 if (existing == 0) {
3335 error << string_compose(
3336 _("There are already %1 recordings for %2, which I consider too many."),
3337 limit, base) << endmsg;
3339 throw failed_constructor();
3343 return Glib::path_get_basename(buf);
3347 /** Create a new within-session MIDI source */
3348 boost::shared_ptr<MidiSource>
3349 Session::create_midi_source_for_session (Track* track, string const & n)
3351 /* try to use the existing write source for the track, to keep numbering sane
3355 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3359 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3362 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3363 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3367 const string name = new_midi_source_name (n);
3368 const string path = new_source_path_from_name (DataType::MIDI, name);
3370 return boost::dynamic_pointer_cast<SMFSource> (
3371 SourceFactory::createWritable (
3372 DataType::MIDI, *this, path, string(), false, frame_rate()));
3377 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3379 if (playlist->hidden()) {
3383 playlists->add (playlist);
3386 playlist->release();
3393 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3395 if (_state_of_the_state & Deletion) {
3399 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3405 playlists->remove (playlist);
3411 Session::set_audition (boost::shared_ptr<Region> r)
3413 pending_audition_region = r;
3414 add_post_transport_work (PostTransportAudition);
3415 _butler->schedule_transport_work ();
3419 Session::audition_playlist ()
3421 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3422 ev->region.reset ();
3427 Session::non_realtime_set_audition ()
3429 assert (pending_audition_region);
3430 auditioner->audition_region (pending_audition_region);
3431 pending_audition_region.reset ();
3432 AuditionActive (true); /* EMIT SIGNAL */
3436 Session::audition_region (boost::shared_ptr<Region> r)
3438 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3444 Session::cancel_audition ()
3446 if (auditioner->auditioning()) {
3447 auditioner->cancel_audition ();
3448 AuditionActive (false); /* EMIT SIGNAL */
3453 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3455 if (a->is_monitor()) {
3458 if (b->is_monitor()) {
3461 return a->order_key(N_("signal")) < b->order_key(N_("signal"));
3465 Session::is_auditioning () const
3467 /* can be called before we have an auditioner object */
3469 return auditioner->auditioning();
3476 Session::graph_reordered ()
3478 /* don't do this stuff if we are setting up connections
3479 from a set_state() call or creating new tracks. Ditto for deletion.
3482 if (_state_of_the_state & (InitialConnecting|Deletion)) {
3486 /* every track/bus asked for this to be handled but it was deferred because
3487 we were connecting. do it now.
3490 request_input_change_handling ();
3494 /* force all diskstreams to update their capture offset values to
3495 reflect any changes in latencies within the graph.
3498 boost::shared_ptr<RouteList> rl = routes.reader ();
3499 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3500 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3502 tr->set_capture_offset ();
3507 /** @return Number of frames that there is disk space available to write,
3510 boost::optional<framecnt_t>
3511 Session::available_capture_duration ()
3513 if (_total_free_4k_blocks_uncertain) {
3514 return boost::optional<framecnt_t> ();
3517 float sample_bytes_on_disk = 4.0; // keep gcc happy
3519 switch (config.get_native_file_data_format()) {
3521 sample_bytes_on_disk = 4.0;
3525 sample_bytes_on_disk = 3.0;
3529 sample_bytes_on_disk = 2.0;
3533 /* impossible, but keep some gcc versions happy */
3534 fatal << string_compose (_("programming error: %1"),
3535 X_("illegal native file data format"))
3540 double scale = 4096.0 / sample_bytes_on_disk;
3542 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3543 return max_framecnt;
3546 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3550 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3553 RCUWriter<BundleList> writer (_bundles);
3554 boost::shared_ptr<BundleList> b = writer.get_copy ();
3555 b->push_back (bundle);
3558 BundleAdded (bundle); /* EMIT SIGNAL */
3564 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3566 bool removed = false;
3569 RCUWriter<BundleList> writer (_bundles);
3570 boost::shared_ptr<BundleList> b = writer.get_copy ();
3571 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3573 if (i != b->end()) {
3580 BundleRemoved (bundle); /* EMIT SIGNAL */
3586 boost::shared_ptr<Bundle>
3587 Session::bundle_by_name (string name) const
3589 boost::shared_ptr<BundleList> b = _bundles.reader ();
3591 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3592 if ((*i)->name() == name) {
3597 return boost::shared_ptr<Bundle> ();
3601 Session::tempo_map_changed (const PropertyChange&)
3605 playlists->update_after_tempo_map_change ();
3607 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3613 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3615 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3616 (*i)->recompute_frames_from_bbt ();
3620 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3621 * the given count with the current block size.
3624 Session::ensure_buffers (ChanCount howmany)
3626 BufferManager::ensure_buffers (howmany);
3630 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3632 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3633 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3638 Session::next_insert_id ()
3640 /* this doesn't really loop forever. just think about it */
3643 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3644 if (!insert_bitset[n]) {
3645 insert_bitset[n] = true;
3651 /* none available, so resize and try again */
3653 insert_bitset.resize (insert_bitset.size() + 16, false);
3658 Session::next_send_id ()
3660 /* this doesn't really loop forever. just think about it */
3663 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3664 if (!send_bitset[n]) {
3665 send_bitset[n] = true;
3671 /* none available, so resize and try again */
3673 send_bitset.resize (send_bitset.size() + 16, false);
3678 Session::next_aux_send_id ()
3680 /* this doesn't really loop forever. just think about it */
3683 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
3684 if (!aux_send_bitset[n]) {
3685 aux_send_bitset[n] = true;
3691 /* none available, so resize and try again */
3693 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
3698 Session::next_return_id ()
3700 /* this doesn't really loop forever. just think about it */
3703 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3704 if (!return_bitset[n]) {
3705 return_bitset[n] = true;
3711 /* none available, so resize and try again */
3713 return_bitset.resize (return_bitset.size() + 16, false);
3718 Session::mark_send_id (uint32_t id)
3720 if (id >= send_bitset.size()) {
3721 send_bitset.resize (id+16, false);
3723 if (send_bitset[id]) {
3724 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3726 send_bitset[id] = true;
3730 Session::mark_aux_send_id (uint32_t id)
3732 if (id >= aux_send_bitset.size()) {
3733 aux_send_bitset.resize (id+16, false);
3735 if (aux_send_bitset[id]) {
3736 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
3738 aux_send_bitset[id] = true;
3742 Session::mark_return_id (uint32_t id)
3744 if (id >= return_bitset.size()) {
3745 return_bitset.resize (id+16, false);
3747 if (return_bitset[id]) {
3748 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3750 return_bitset[id] = true;
3754 Session::mark_insert_id (uint32_t id)
3756 if (id >= insert_bitset.size()) {
3757 insert_bitset.resize (id+16, false);
3759 if (insert_bitset[id]) {
3760 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3762 insert_bitset[id] = true;
3766 Session::unmark_send_id (uint32_t id)
3768 if (id < send_bitset.size()) {
3769 send_bitset[id] = false;
3774 Session::unmark_aux_send_id (uint32_t id)
3776 if (id < aux_send_bitset.size()) {
3777 aux_send_bitset[id] = false;
3782 Session::unmark_return_id (uint32_t id)
3784 if (id < return_bitset.size()) {
3785 return_bitset[id] = false;
3790 Session::unmark_insert_id (uint32_t id)
3792 if (id < insert_bitset.size()) {
3793 insert_bitset[id] = false;
3798 /* Named Selection management */
3800 boost::shared_ptr<NamedSelection>
3801 Session::named_selection_by_name (string name)
3803 Glib::Mutex::Lock lm (named_selection_lock);
3804 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
3805 if ((*i)->name == name) {
3809 return boost::shared_ptr<NamedSelection>();
3813 Session::add_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3816 Glib::Mutex::Lock lm (named_selection_lock);
3817 named_selections.insert (named_selections.begin(), named_selection);
3822 NamedSelectionAdded (); /* EMIT SIGNAL */
3826 Session::remove_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3828 bool removed = false;
3831 Glib::Mutex::Lock lm (named_selection_lock);
3833 NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
3835 if (i != named_selections.end()) {
3836 named_selections.erase (i);
3843 NamedSelectionRemoved (); /* EMIT SIGNAL */
3848 Session::reset_native_file_format ()
3850 boost::shared_ptr<RouteList> rl = routes.reader ();
3851 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3852 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3854 /* don't save state as we do this, there's no point
3857 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3858 tr->reset_write_sources (false);
3859 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3865 Session::route_name_unique (string n) const
3867 boost::shared_ptr<RouteList> r = routes.reader ();
3869 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3870 if ((*i)->name() == n) {
3879 Session::route_name_internal (string n) const
3881 if (auditioner && auditioner->name() == n) {
3885 if (_click_io && _click_io->name() == n) {
3893 Session::freeze_all (InterThreadInfo& itt)
3895 boost::shared_ptr<RouteList> r = routes.reader ();
3897 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3899 boost::shared_ptr<Track> t;
3901 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3902 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3912 boost::shared_ptr<Region>
3913 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
3914 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3915 InterThreadInfo& itt,
3916 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
3919 boost::shared_ptr<Region> result;
3920 boost::shared_ptr<Playlist> playlist;
3921 boost::shared_ptr<AudioFileSource> fsource;
3923 char buf[PATH_MAX+1];
3924 ChanCount diskstream_channels (track.n_channels());
3925 framepos_t position;
3926 framecnt_t this_chunk;
3929 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3930 const string sound_dir = sdir.sound_path().to_string();
3931 framepos_t len = end - start;
3932 bool need_block_size_reset = false;
3934 ChanCount const max_proc = track.max_processor_streams ();
3937 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3938 end, start) << endmsg;
3942 const framecnt_t chunk_size = (256 * 1024)/4;
3944 // block all process callback handling
3946 block_processing ();
3948 /* call tree *MUST* hold route_lock */
3950 if ((playlist = track.playlist()) == 0) {
3954 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3956 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
3958 for (x = 0; x < 99999; ++x) {
3959 snprintf (buf, sizeof(buf), "%s/%s-%d-bounce-%" PRIu32 "%s", sound_dir.c_str(), playlist->name().c_str(), chan_n, x+1, ext.c_str());
3960 if (!Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
3966 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3971 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
3972 SourceFactory::createWritable (DataType::AUDIO, *this, buf, string(), false, frame_rate()));
3975 catch (failed_constructor& err) {
3976 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
3980 srcs.push_back (fsource);
3983 /* tell redirects that care that we are about to use a much larger
3984 * blocksize. this will flush all plugins too, so that they are ready
3985 * to be used for this process.
3988 need_block_size_reset = true;
3989 track.set_block_size (chunk_size);
3994 /* create a set of reasonably-sized buffers */
3995 buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
3996 buffers.set_count (max_proc);
3998 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3999 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4001 afs->prepare_for_peakfile_writes ();
4004 while (to_do && !itt.cancel) {
4006 this_chunk = min (to_do, chunk_size);
4008 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export)) {
4013 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4014 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4017 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
4023 start += this_chunk;
4024 to_do -= this_chunk;
4026 itt.progress = (float) (1.0 - ((double) to_do / len));
4035 xnow = localtime (&now);
4037 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
4038 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4041 afs->update_header (position, *xnow, now);
4042 afs->flush_header ();
4046 /* construct a region to represent the bounced material */
4050 plist.add (Properties::start, 0);
4051 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4052 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4054 result = RegionFactory::create (srcs, plist);
4060 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4061 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4064 afs->mark_for_remove ();
4067 (*src)->drop_references ();
4071 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4072 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4075 afs->done_with_peakfile_writes ();
4080 if (need_block_size_reset) {
4081 track.set_block_size (get_block_size());
4084 unblock_processing ();
4090 Session::gain_automation_buffer() const
4092 return ProcessThread::gain_automation_buffer ();
4096 Session::send_gain_automation_buffer() const
4098 return ProcessThread::send_gain_automation_buffer ();
4102 Session::pan_automation_buffer() const
4104 return ProcessThread::pan_automation_buffer ();
4108 Session::get_silent_buffers (ChanCount count)
4110 return ProcessThread::get_silent_buffers (count);
4114 Session::get_scratch_buffers (ChanCount count)
4116 return ProcessThread::get_scratch_buffers (count);
4120 Session::get_mix_buffers (ChanCount count)
4122 return ProcessThread::get_mix_buffers (count);
4126 Session::ntracks () const
4129 boost::shared_ptr<RouteList> r = routes.reader ();
4131 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4132 if (boost::dynamic_pointer_cast<Track> (*i)) {
4141 Session::nbusses () const
4144 boost::shared_ptr<RouteList> r = routes.reader ();
4146 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4147 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
4156 Session::add_automation_list(AutomationList *al)
4158 automation_lists[al->id()] = al;
4162 Session::sync_order_keys (std::string const & base)
4164 if (deletion_in_progress()) {
4168 if (!Config->get_sync_all_route_ordering()) {
4169 /* leave order keys as they are */
4173 boost::shared_ptr<RouteList> r = routes.reader ();
4175 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4176 (*i)->sync_order_keys (base);
4179 Route::SyncOrderKeys (base); // EMIT SIGNAL
4181 /* this might not do anything */
4183 set_remote_control_ids ();
4186 /** @return true if there is at least one record-enabled track, otherwise false */
4188 Session::have_rec_enabled_track () const
4190 return g_atomic_int_get (&_have_rec_enabled_track) == 1;
4193 /** Update the state of our rec-enabled tracks flag */
4195 Session::update_have_rec_enabled_track ()
4197 boost::shared_ptr<RouteList> rl = routes.reader ();
4198 RouteList::iterator i = rl->begin();
4199 while (i != rl->end ()) {
4201 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4202 if (tr && tr->record_enabled ()) {
4209 int const old = g_atomic_int_get (&_have_rec_enabled_track);
4211 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4213 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4214 RecordStateChanged (); /* EMIT SIGNAL */
4219 Session::listen_position_changed ()
4221 boost::shared_ptr<RouteList> r = routes.reader ();
4223 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4224 (*i)->listen_position_changed ();
4229 Session::solo_control_mode_changed ()
4231 /* cancel all solo or all listen when solo control mode changes */
4234 set_solo (get_routes(), false);
4235 } else if (listening()) {
4236 set_listen (get_routes(), false);
4240 /** Called when a property of one of our route groups changes */
4242 Session::route_group_property_changed (RouteGroup* rg)
4244 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4247 /** Called when a route is added to one of our route groups */
4249 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4251 RouteAddedToRouteGroup (rg, r);
4254 /** Called when a route is removed from one of our route groups */
4256 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4258 RouteRemovedFromRouteGroup (rg, r);
4262 Session::get_available_sync_options () const
4264 vector<SyncSource> ret;
4266 ret.push_back (JACK);
4267 ret.push_back (MTC);
4268 ret.push_back (MIDIClock);
4273 boost::shared_ptr<RouteList>
4274 Session::get_routes_with_regions_at (framepos_t const p) const
4276 boost::shared_ptr<RouteList> r = routes.reader ();
4277 boost::shared_ptr<RouteList> rl (new RouteList);
4279 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4280 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4285 boost::shared_ptr<Playlist> pl = tr->playlist ();
4290 if (pl->has_region_at (p)) {
4299 Session::goto_end ()
4301 if (_session_range_location) {
4302 request_locate (_session_range_location->end(), false);
4304 request_locate (0, false);
4309 Session::goto_start ()
4311 if (_session_range_location) {
4312 request_locate (_session_range_location->start(), false);
4314 request_locate (0, false);
4319 Session::current_start_frame () const
4321 return _session_range_location ? _session_range_location->start() : 0;
4325 Session::current_end_frame () const
4327 return _session_range_location ? _session_range_location->end() : 0;
4331 Session::add_session_range_location (framepos_t start, framepos_t end)
4333 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4334 _locations->add (_session_range_location);
4337 /** Called when one of our routes' order keys has changed */
4339 Session::route_order_key_changed ()
4341 RouteOrderKeyChanged (); /* EMIT SIGNAL */
4345 Session::step_edit_status_change (bool yn)
4351 send = (_step_editors == 0);
4356 send = (_step_editors == 1);
4359 if (_step_editors > 0) {
4365 StepEditStatusChange (val);
4371 Session::start_time_changed (framepos_t old)
4373 /* Update the auto loop range to match the session range
4374 (unless the auto loop range has been changed by the user)
4377 Location* s = _locations->session_range_location ();
4382 Location* l = _locations->auto_loop_location ();
4384 if (l && l->start() == old) {
4385 l->set_start (s->start(), true);
4390 Session::end_time_changed (framepos_t old)
4392 /* Update the auto loop range to match the session range
4393 (unless the auto loop range has been changed by the user)
4396 Location* s = _locations->session_range_location ();
4401 Location* l = _locations->auto_loop_location ();
4403 if (l && l->end() == old) {
4404 l->set_end (s->end(), true);
4409 Session::source_search_path (DataType type) const
4413 if (session_dirs.size() == 1) {
4415 case DataType::AUDIO:
4416 s.push_back ( _session_dir->sound_path().to_string());
4418 case DataType::MIDI:
4419 s.push_back (_session_dir->midi_path().to_string());
4423 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4424 SessionDirectory sdir (i->path);
4426 case DataType::AUDIO:
4427 s.push_back (sdir.sound_path().to_string());
4429 case DataType::MIDI:
4430 s.push_back (sdir.midi_path().to_string());
4436 /* now check the explicit (possibly user-specified) search path
4439 vector<string> dirs;
4442 case DataType::AUDIO:
4443 split (config.get_audio_search_path (), dirs, ':');
4445 case DataType::MIDI:
4446 split (config.get_midi_search_path (), dirs, ':');
4450 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4452 vector<string>::iterator si;
4454 for (si = s.begin(); si != s.end(); ++si) {
4460 if (si == s.end()) {
4467 for (vector<string>::iterator si = s.begin(); si != s.end(); ++si) {
4468 if (!search_path.empty()) {
4478 Session::ensure_search_path_includes (const string& path, DataType type)
4481 vector<string> dirs;
4488 case DataType::AUDIO:
4489 search_path = config.get_audio_search_path ();
4491 case DataType::MIDI:
4492 search_path = config.get_midi_search_path ();
4496 split (search_path, dirs, ':');
4498 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4499 /* No need to add this new directory if it has the same inode as
4500 an existing one; checking inode rather than name prevents duplicated
4501 directories when we are using symlinks.
4503 On Windows, I think we could just do if (*i == path) here.
4505 if (PBD::sys::inodes_same (*i, path)) {
4510 if (!search_path.empty()) {
4514 search_path += path;
4517 case DataType::AUDIO:
4518 config.set_audio_search_path (search_path);
4520 case DataType::MIDI:
4521 config.set_midi_search_path (search_path);
4526 boost::shared_ptr<Speakers>
4527 Session::get_speakers()
4533 Session::unknown_processors () const
4537 boost::shared_ptr<RouteList> r = routes.reader ();
4538 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4539 list<string> t = (*i)->unknown_processors ();
4540 copy (t.begin(), t.end(), back_inserter (p));
4550 Session::update_latency (bool playback)
4552 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
4554 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4558 boost::shared_ptr<RouteList> r = routes.reader ();
4559 framecnt_t max_latency = 0;
4562 /* reverse the list so that we work backwards from the last route to run to the first */
4563 RouteList* rl = routes.reader().get();
4564 r.reset (new RouteList (*rl));
4565 reverse (r->begin(), r->end());
4568 /* compute actual latency values for the given direction and store them all in per-port
4569 structures. this will also publish the same values (to JACK) so that computation of latency
4570 for routes can consistently use public latency values.
4573 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4574 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
4577 /* because we latency compensate playback, our published playback latencies should
4578 be the same for all output ports - all material played back by ardour has
4579 the same latency, whether its caused by plugins or by latency compensation. since
4580 these may differ from the values computed above, reset all playback port latencies
4584 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
4586 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4587 (*i)->set_public_port_latencies (max_latency, playback);
4592 post_playback_latency ();
4596 post_capture_latency ();
4599 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
4603 Session::post_playback_latency ()
4605 set_worst_playback_latency ();
4607 boost::shared_ptr<RouteList> r = routes.reader ();
4609 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4610 if (!(*i)->is_hidden() && ((*i)->active())) {
4611 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
4615 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4616 (*i)->set_latency_compensation (_worst_track_latency);
4621 Session::post_capture_latency ()
4623 set_worst_capture_latency ();
4625 /* reflect any changes in capture latencies into capture offsets
4628 boost::shared_ptr<RouteList> rl = routes.reader();
4629 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4630 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4632 tr->set_capture_offset ();
4638 Session::initialize_latencies ()
4641 Glib::Mutex::Lock lm (_engine.process_lock());
4642 update_latency (false);
4643 update_latency (true);
4646 set_worst_io_latencies ();
4650 Session::set_worst_io_latencies ()
4652 set_worst_playback_latency ();
4653 set_worst_capture_latency ();
4657 Session::set_worst_playback_latency ()
4659 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4663 _worst_output_latency = 0;
4665 if (!_engine.connected()) {
4669 boost::shared_ptr<RouteList> r = routes.reader ();
4671 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4672 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
4675 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
4679 Session::set_worst_capture_latency ()
4681 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4685 _worst_input_latency = 0;
4687 if (!_engine.connected()) {
4691 boost::shared_ptr<RouteList> r = routes.reader ();
4693 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4694 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
4697 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
4701 Session::update_latency_compensation (bool force_whole_graph)
4703 bool some_track_latency_changed = false;
4705 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4709 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
4711 _worst_track_latency = 0;
4713 boost::shared_ptr<RouteList> r = routes.reader ();
4715 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4716 if (!(*i)->is_hidden() && ((*i)->active())) {
4718 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
4719 some_track_latency_changed = true;
4721 _worst_track_latency = max (tl, _worst_track_latency);
4725 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
4726 (some_track_latency_changed ? "yes" : "no")));
4728 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
4730 if (some_track_latency_changed || force_whole_graph) {
4731 _engine.update_latencies ();
4735 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4736 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4740 tr->set_capture_offset ();
4745 Session::session_name_is_legal (const string& path)
4747 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
4749 for (int i = 0; illegal_chars[i]; ++i) {
4750 if (path.find (illegal_chars[i]) != string::npos) {
4751 return illegal_chars[i];
4759 Session::next_control_id () const
4761 return ntracks() + nbusses() + 1;
4765 Session::operation_in_progress (GQuark op) const
4767 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());