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"
50 #include "pbd/filesystem.h"
52 #include "ardour/amp.h"
53 #include "ardour/analyser.h"
54 #include "ardour/audio_buffer.h"
55 #include "ardour/audio_diskstream.h"
56 #include "ardour/audio_port.h"
57 #include "ardour/audio_track.h"
58 #include "ardour/audioengine.h"
59 #include "ardour/audiofilesource.h"
60 #include "ardour/auditioner.h"
61 #include "ardour/buffer_manager.h"
62 #include "ardour/buffer_set.h"
63 #include "ardour/bundle.h"
64 #include "ardour/butler.h"
65 #include "ardour/click.h"
66 #include "ardour/control_protocol_manager.h"
67 #include "ardour/data_type.h"
68 #include "ardour/debug.h"
69 #include "ardour/filename_extensions.h"
70 #include "ardour/graph.h"
71 #include "ardour/midi_track.h"
72 #include "ardour/midi_ui.h"
73 #include "ardour/named_selection.h"
74 #include "ardour/operations.h"
75 #include "ardour/playlist.h"
76 #include "ardour/plugin.h"
77 #include "ardour/plugin_insert.h"
78 #include "ardour/process_thread.h"
79 #include "ardour/rc_configuration.h"
80 #include "ardour/recent_sessions.h"
81 #include "ardour/region.h"
82 #include "ardour/region_factory.h"
83 #include "ardour/route_graph.h"
84 #include "ardour/route_group.h"
85 #include "ardour/send.h"
86 #include "ardour/session.h"
87 #include "ardour/session_directory.h"
88 #include "ardour/session_playlists.h"
89 #include "ardour/smf_source.h"
90 #include "ardour/source_factory.h"
91 #include "ardour/utils.h"
93 #include "midi++/port.h"
94 #include "midi++/jack_midi_port.h"
95 #include "midi++/mmc.h"
96 #include "midi++/manager.h"
107 using namespace ARDOUR;
110 bool Session::_disable_all_loaded_plugins = false;
112 PBD::Signal1<void,std::string> Session::Dialog;
113 PBD::Signal0<int> Session::AskAboutPendingState;
114 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
115 PBD::Signal0<void> Session::SendFeedback;
116 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
118 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
119 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
120 PBD::Signal2<void,std::string, std::string> Session::Exported;
121 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
122 PBD::Signal0<void> Session::Quit;
123 PBD::Signal0<void> Session::FeedbackDetected;
124 PBD::Signal0<void> Session::SuccessfulGraphSort;
126 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
127 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
129 /** @param snapshot_name Snapshot name, without .ardour suffix */
130 Session::Session (AudioEngine &eng,
131 const string& fullpath,
132 const string& snapshot_name,
133 BusProfile* bus_profile,
136 , _target_transport_speed (0.0)
137 , _requested_return_frame (-1)
138 , _session_dir (new SessionDirectory(fullpath))
140 , _state_of_the_state (Clean)
141 , _butler (new Butler (*this))
142 , _post_transport_work (0)
143 , _send_timecode_update (false)
144 , _all_route_group (new RouteGroup (*this, "all"))
145 , routes (new RouteList)
146 , _total_free_4k_blocks (0)
147 , _total_free_4k_blocks_uncertain (false)
148 , _bundles (new BundleList)
149 , _bundle_xml_node (0)
151 , _click_io ((IO*) 0)
153 , click_emphasis_data (0)
155 , _have_rec_enabled_track (false)
156 , _suspend_timecode_transmission (0)
158 _locations = new Locations (*this);
160 if (how_many_dsp_threads () > 1) {
161 /* For now, only create the graph if we are using >1 DSP threads, as
162 it is a bit slower than the old code with 1 thread.
164 _process_graph.reset (new Graph (*this));
167 playlists.reset (new SessionPlaylists);
169 _all_route_group->set_active (true, this);
171 interpolation.add_channel_to (0, 0);
173 if (!eng.connected()) {
174 throw failed_constructor();
177 n_physical_outputs = _engine.n_physical_outputs ();
178 n_physical_inputs = _engine.n_physical_inputs ();
180 first_stage_init (fullpath, snapshot_name);
182 _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
185 if (create (mix_template, bus_profile)) {
187 throw failed_constructor ();
191 if (second_stage_init ()) {
193 throw failed_constructor ();
196 store_recent_sessions(_name, _path);
198 bool was_dirty = dirty();
200 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
202 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
203 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
206 DirtyChanged (); /* EMIT SIGNAL */
209 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
210 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
226 vector<void*> debug_pointers;
228 /* if we got to here, leaving pending capture state around
232 remove_pending_capture_state ();
234 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
236 _engine.remove_session ();
238 /* deregister all ports - there will be no process or any other
239 * callbacks from the engine any more.
242 Port::PortDrop (); /* EMIT SIGNAL */
244 /* clear history so that no references to objects are held any more */
248 /* clear state tree so that no references to objects are held any more */
252 /* reset dynamic state version back to default */
254 Stateful::loading_state_version = 0;
256 _butler->drop_references ();
260 delete midi_control_ui;
261 delete _all_route_group;
263 if (click_data != default_click) {
264 delete [] click_data;
267 if (click_emphasis_data != default_click_emphasis) {
268 delete [] click_emphasis_data;
273 /* clear out any pending dead wood from RCU managed objects */
278 AudioDiskstream::free_working_buffers();
280 /* tell everyone who is still standing that we're about to die */
283 /* tell everyone to drop references and delete objects as we go */
285 DEBUG_TRACE (DEBUG::Destruction, "delete named selections\n");
286 named_selections.clear ();
288 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
289 RegionFactory::delete_all_regions ();
291 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
293 /* reset these three references to special routes before we do the usual route delete thing */
296 _master_out.reset ();
297 _monitor_out.reset ();
300 RCUWriter<RouteList> writer (routes);
301 boost::shared_ptr<RouteList> r = writer.get_copy ();
303 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
304 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
305 (*i)->drop_references ();
309 /* writer goes out of scope and updates master */
313 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
314 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
315 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
316 i->second->drop_references ();
321 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
322 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
327 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
332 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
334 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
335 boost_debug_list_ptrs ();
340 Session::when_engine_running ()
342 string first_physical_output;
344 BootMessage (_("Set block size and sample rate"));
346 set_block_size (_engine.frames_per_cycle());
347 set_frame_rate (_engine.frame_rate());
349 BootMessage (_("Using configuration"));
351 boost::function<void (std::string)> ff (boost::bind (&Session::config_changed, this, _1, false));
352 boost::function<void (std::string)> ft (boost::bind (&Session::config_changed, this, _1, true));
354 Config->map_parameters (ff);
355 config.map_parameters (ft);
357 /* every time we reconnect, recompute worst case output latencies */
359 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
361 if (synced_to_jack()) {
362 _engine.transport_stop ();
365 if (config.get_jack_time_master()) {
366 _engine.transport_locate (_transport_frame);
374 _click_io.reset (new ClickIO (*this, "click"));
375 _click_gain.reset (new Amp (*this));
376 _click_gain->activate ();
378 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
380 /* existing state for Click */
383 if (Stateful::loading_state_version < 3000) {
384 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
386 const XMLNodeList& children (child->children());
387 XMLNodeList::const_iterator i = children.begin();
388 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
390 if (i != children.end()) {
391 c = _click_gain->set_state (**i, Stateful::loading_state_version);
397 _clicking = Config->get_clicking ();
401 error << _("could not setup Click I/O") << endmsg;
408 /* default state for Click: dual-mono to first 2 physical outputs */
411 _engine.get_physical_outputs (DataType::AUDIO, outs);
413 for (uint32_t physport = 0; physport < 2; ++physport) {
414 if (outs.size() > physport) {
415 if (_click_io->add_port (outs[physport], this)) {
416 // relax, even though its an error
421 if (_click_io->n_ports () > ChanCount::ZERO) {
422 _clicking = Config->get_clicking ();
427 catch (failed_constructor& err) {
428 error << _("cannot setup Click I/O") << endmsg;
431 BootMessage (_("Compute I/O Latencies"));
434 // XXX HOW TO ALERT UI TO THIS ? DO WE NEED TO?
437 BootMessage (_("Set up standard connections"));
439 vector<string> inputs[DataType::num_types];
440 vector<string> outputs[DataType::num_types];
441 for (uint32_t i = 0; i < DataType::num_types; ++i) {
442 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
443 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
446 /* Create a set of Bundle objects that map
447 to the physical I/O currently available. We create both
448 mono and stereo bundles, so that the common cases of mono
449 and stereo tracks get bundles to put in their mixer strip
450 in / out menus. There may be a nicer way of achieving that;
451 it doesn't really scale that well to higher channel counts
454 /* mono output bundles */
456 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
458 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
460 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
461 c->add_channel (_("mono"), DataType::AUDIO);
462 c->set_port (0, outputs[DataType::AUDIO][np]);
467 /* stereo output bundles */
469 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
470 if (np + 1 < outputs[DataType::AUDIO].size()) {
472 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
473 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
474 c->add_channel (_("L"), DataType::AUDIO);
475 c->set_port (0, outputs[DataType::AUDIO][np]);
476 c->add_channel (_("R"), DataType::AUDIO);
477 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
483 /* mono input bundles */
485 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
487 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
489 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
490 c->add_channel (_("mono"), DataType::AUDIO);
491 c->set_port (0, inputs[DataType::AUDIO][np]);
496 /* stereo input bundles */
498 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
499 if (np + 1 < inputs[DataType::AUDIO].size()) {
501 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
503 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
504 c->add_channel (_("L"), DataType::AUDIO);
505 c->set_port (0, inputs[DataType::AUDIO][np]);
506 c->add_channel (_("R"), DataType::AUDIO);
507 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
513 /* MIDI input bundles */
515 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
516 string n = inputs[DataType::MIDI][np];
517 boost::erase_first (n, X_("alsa_pcm:"));
519 boost::shared_ptr<Bundle> c (new Bundle (n, false));
520 c->add_channel ("", DataType::MIDI);
521 c->set_port (0, inputs[DataType::MIDI][np]);
525 /* MIDI output bundles */
527 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
528 string n = outputs[DataType::MIDI][np];
529 boost::erase_first (n, X_("alsa_pcm:"));
531 boost::shared_ptr<Bundle> c (new Bundle (n, true));
532 c->add_channel ("", DataType::MIDI);
533 c->set_port (0, outputs[DataType::MIDI][np]);
537 BootMessage (_("Setup signal flow and plugins"));
539 /* Reset all panners */
541 Delivery::reset_panners ();
543 /* this will cause the CPM to instantiate any protocols that are in use
544 * (or mandatory), which will pass it this Session, and then call
545 * set_state() on each instantiated protocol to match stored state.
548 ControlProtocolManager::instance().set_session (this);
550 /* This must be done after the ControlProtocolManager set_session above,
551 as it will set states for ports which the ControlProtocolManager creates.
554 MIDI::Manager::instance()->set_port_states (Config->midi_port_states ());
556 /* And this must be done after the MIDI::Manager::set_port_states as
557 * it will try to make connections whose details are loaded by set_port_states.
562 /* Let control protocols know that we are now all connected, so they
563 * could start talking to surfaces if they want to.
566 ControlProtocolManager::instance().midi_connectivity_established ();
568 if (_is_new && !no_auto_connect()) {
569 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock());
570 auto_connect_master_bus ();
573 _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
575 /* update latencies */
577 initialize_latencies ();
579 /* hook us up to the engine */
581 BootMessage (_("Connect to engine"));
582 _engine.set_session (this);
586 Session::auto_connect_master_bus ()
588 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
592 /* if requested auto-connect the outputs to the first N physical ports.
595 uint32_t limit = _master_out->n_outputs().n_total();
596 vector<string> outputs[DataType::num_types];
598 for (uint32_t i = 0; i < DataType::num_types; ++i) {
599 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
602 for (uint32_t n = 0; n < limit; ++n) {
603 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
605 if (outputs[p->type()].size() > n) {
606 connect_to = outputs[p->type()][n];
609 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
610 if (_master_out->output()->connect (p, connect_to, this)) {
611 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
620 Session::remove_monitor_section ()
626 /* force reversion to Solo-In-Place */
627 Config->set_solo_control_is_listen_control (false);
630 /* Hold process lock while doing this so that we don't hear bits and
631 * pieces of audio as we work on each route.
634 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
636 /* Connect tracks to monitor section. Note that in an
637 existing session, the internal sends will already exist, but we want the
638 routes to notice that they connect to the control out specifically.
642 boost::shared_ptr<RouteList> r = routes.reader ();
643 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
645 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
647 if ((*x)->is_monitor()) {
649 } else if ((*x)->is_master()) {
652 (*x)->remove_aux_or_listen (_monitor_out);
657 remove_route (_monitor_out);
658 auto_connect_master_bus ();
662 Session::add_monitor_section ()
666 if (_monitor_out || !_master_out) {
670 boost::shared_ptr<Route> r (new Route (*this, _("monitor"), Route::MonitorOut, DataType::AUDIO));
676 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
677 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
680 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
681 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
682 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
686 add_routes (rl, false, false, false);
688 assert (_monitor_out);
690 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
691 are undefined, at best.
694 uint32_t limit = _monitor_out->n_inputs().n_audio();
698 /* connect the inputs to the master bus outputs. this
699 * represents a separate data feed from the internal sends from
700 * each route. as of jan 2011, it allows the monitor section to
701 * conditionally ignore either the internal sends or the normal
702 * input feed, but we should really find a better way to do
706 _master_out->output()->disconnect (this);
708 for (uint32_t n = 0; n < limit; ++n) {
709 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
710 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
713 string connect_to = o->name();
714 if (_monitor_out->input()->connect (p, connect_to, this)) {
715 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
723 /* if monitor section is not connected, connect it to physical outs
726 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
728 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
730 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
733 _monitor_out->output()->connect_ports_to_bundle (b, this);
735 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
736 Config->get_monitor_bus_preferred_bundle())
742 /* Monitor bus is audio only */
744 uint32_t mod = n_physical_outputs.get (DataType::AUDIO);
745 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
746 vector<string> outputs[DataType::num_types];
748 for (uint32_t i = 0; i < DataType::num_types; ++i) {
749 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
755 for (uint32_t n = 0; n < limit; ++n) {
757 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
759 if (outputs[DataType::AUDIO].size() > (n % mod)) {
760 connect_to = outputs[DataType::AUDIO][n % mod];
763 if (!connect_to.empty()) {
764 if (_monitor_out->output()->connect (p, connect_to, this)) {
765 error << string_compose (
766 _("cannot connect control output %1 to %2"),
777 /* Hold process lock while doing this so that we don't hear bits and
778 * pieces of audio as we work on each route.
781 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
783 /* Connect tracks to monitor section. Note that in an
784 existing session, the internal sends will already exist, but we want the
785 routes to notice that they connect to the control out specifically.
789 boost::shared_ptr<RouteList> rls = routes.reader ();
791 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
793 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
795 if ((*x)->is_monitor()) {
797 } else if ((*x)->is_master()) {
800 (*x)->enable_monitor_send ();
806 Session::hookup_io ()
808 /* stop graph reordering notifications from
809 causing resorts, etc.
812 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
816 /* we delay creating the auditioner till now because
817 it makes its own connections to ports.
821 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
823 throw failed_constructor ();
825 a->use_new_diskstream ();
829 catch (failed_constructor& err) {
830 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
834 /* load bundles, which we may have postponed earlier on */
835 if (_bundle_xml_node) {
836 load_bundles (*_bundle_xml_node);
837 delete _bundle_xml_node;
840 /* Tell all IO objects to connect themselves together */
842 IO::enable_connecting ();
843 MIDI::JackMIDIPort::MakeConnections ();
845 /* Anyone who cares about input state, wake up and do something */
847 IOConnectionsComplete (); /* EMIT SIGNAL */
849 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
851 /* now handle the whole enchilada as if it was one
857 /* update the full solo state, which can't be
858 correctly determined on a per-route basis, but
859 needs the global overview that only the session
863 update_route_solo_state ();
867 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
869 boost::shared_ptr<Track> track = wp.lock ();
874 boost::shared_ptr<Playlist> playlist;
876 if ((playlist = track->playlist()) != 0) {
877 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
878 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
879 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
884 Session::record_enabling_legal () const
886 /* this used to be in here, but survey says.... we don't need to restrict it */
887 // if (record_status() == Recording) {
891 if (Config->get_all_safe()) {
898 Session::set_track_monitor_input_status (bool yn)
900 boost::shared_ptr<RouteList> rl = routes.reader ();
901 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
902 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
903 if (tr && tr->record_enabled ()) {
904 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
905 tr->request_jack_monitors_input (yn);
911 Session::auto_punch_start_changed (Location* location)
913 replace_event (SessionEvent::PunchIn, location->start());
915 if (get_record_enabled() && config.get_punch_in()) {
916 /* capture start has been changed, so save new pending state */
917 save_state ("", true);
922 Session::auto_punch_end_changed (Location* location)
924 framepos_t when_to_stop = location->end();
925 // when_to_stop += _worst_output_latency + _worst_input_latency;
926 replace_event (SessionEvent::PunchOut, when_to_stop);
930 Session::auto_punch_changed (Location* location)
932 framepos_t when_to_stop = location->end();
934 replace_event (SessionEvent::PunchIn, location->start());
935 //when_to_stop += _worst_output_latency + _worst_input_latency;
936 replace_event (SessionEvent::PunchOut, when_to_stop);
939 /** @param loc A loop location.
940 * @param pos Filled in with the start time of the required fade-out (in session frames).
941 * @param length Filled in with the length of the required fade-out.
944 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
946 pos = max (loc->start(), loc->end() - 64);
947 length = loc->end() - pos;
951 Session::auto_loop_changed (Location* location)
953 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
956 auto_loop_declick_range (location, dcp, dcl);
957 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
959 if (transport_rolling() && play_loop) {
962 // if (_transport_frame > location->end()) {
964 if (_transport_frame < location->start() || _transport_frame > location->end()) {
965 // relocate to beginning of loop
966 clear_events (SessionEvent::LocateRoll);
968 request_locate (location->start(), true);
971 else if (Config->get_seamless_loop() && !loop_changing) {
973 // schedule a locate-roll to refill the diskstreams at the
975 loop_changing = true;
977 if (location->end() > last_loopend) {
978 clear_events (SessionEvent::LocateRoll);
979 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
986 last_loopend = location->end();
990 Session::set_auto_punch_location (Location* location)
994 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
995 punch_connections.drop_connections();
996 existing->set_auto_punch (false, this);
997 remove_event (existing->start(), SessionEvent::PunchIn);
998 clear_events (SessionEvent::PunchOut);
999 auto_punch_location_changed (0);
1004 if (location == 0) {
1008 if (location->end() <= location->start()) {
1009 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1013 punch_connections.drop_connections ();
1015 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
1016 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
1017 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
1019 location->set_auto_punch (true, this);
1021 auto_punch_changed (location);
1023 auto_punch_location_changed (location);
1027 Session::set_auto_loop_location (Location* location)
1031 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1032 loop_connections.drop_connections ();
1033 existing->set_auto_loop (false, this);
1034 remove_event (existing->end(), SessionEvent::AutoLoop);
1037 auto_loop_declick_range (existing, dcp, dcl);
1038 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1039 auto_loop_location_changed (0);
1044 if (location == 0) {
1048 if (location->end() <= location->start()) {
1049 error << _("Session: you can't use a mark for auto loop") << endmsg;
1053 last_loopend = location->end();
1055 loop_connections.drop_connections ();
1057 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1058 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1059 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1061 location->set_auto_loop (true, this);
1063 /* take care of our stuff first */
1065 auto_loop_changed (location);
1067 /* now tell everyone else */
1069 auto_loop_location_changed (location);
1073 Session::locations_added (Location *)
1079 Session::locations_changed ()
1081 _locations->apply (*this, &Session::handle_locations_changed);
1085 Session::handle_locations_changed (Locations::LocationList& locations)
1087 Locations::LocationList::iterator i;
1089 bool set_loop = false;
1090 bool set_punch = false;
1092 for (i = locations.begin(); i != locations.end(); ++i) {
1096 if (location->is_auto_punch()) {
1097 set_auto_punch_location (location);
1100 if (location->is_auto_loop()) {
1101 set_auto_loop_location (location);
1105 if (location->is_session_range()) {
1106 _session_range_location = location;
1111 set_auto_loop_location (0);
1114 set_auto_punch_location (0);
1121 Session::enable_record ()
1123 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1124 /* no recording at anything except normal speed */
1129 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1131 if (rs == Recording) {
1135 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1137 _last_record_location = _transport_frame;
1138 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1140 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1141 set_track_monitor_input_status (true);
1144 RecordStateChanged ();
1151 Session::disable_record (bool rt_context, bool force)
1155 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1157 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1158 g_atomic_int_set (&_record_status, Disabled);
1159 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1161 if (rs == Recording) {
1162 g_atomic_int_set (&_record_status, Enabled);
1166 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1167 set_track_monitor_input_status (false);
1170 RecordStateChanged (); /* emit signal */
1173 remove_pending_capture_state ();
1179 Session::step_back_from_record ()
1181 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1183 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1184 set_track_monitor_input_status (false);
1187 RecordStateChanged (); /* emit signal */
1192 Session::maybe_enable_record ()
1194 if (_step_editors > 0) {
1198 g_atomic_int_set (&_record_status, Enabled);
1200 /* This function is currently called from somewhere other than an RT thread.
1201 This save_state() call therefore doesn't impact anything. Doing it here
1202 means that we save pending state of which sources the next record will use,
1203 which gives us some chance of recovering from a crash during the record.
1206 save_state ("", true);
1208 if (_transport_speed) {
1209 if (!config.get_punch_in()) {
1213 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1214 RecordStateChanged (); /* EMIT SIGNAL */
1221 Session::audible_frame () const
1227 /* the first of these two possible settings for "offset"
1228 mean that the audible frame is stationary until
1229 audio emerges from the latency compensation
1232 the second means that the audible frame is stationary
1233 until audio would emerge from a physical port
1234 in the absence of any plugin latency compensation
1237 offset = worst_playback_latency ();
1239 if (offset > current_block_size) {
1240 offset -= current_block_size;
1242 /* XXX is this correct? if we have no external
1243 physical connections and everything is internal
1244 then surely this is zero? still, how
1245 likely is that anyway?
1247 offset = current_block_size;
1250 if (synced_to_jack()) {
1251 tf = _engine.transport_frame();
1253 tf = _transport_frame;
1258 if (!non_realtime_work_pending()) {
1262 /* Check to see if we have passed the first guaranteed
1263 audible frame past our last start position. if not,
1264 return that last start point because in terms
1265 of audible frames, we have not moved yet.
1267 `Start position' in this context means the time we last
1268 either started or changed transport direction.
1271 if (_transport_speed > 0.0f) {
1273 if (!play_loop || !have_looped) {
1274 if (tf < _last_roll_or_reversal_location + offset) {
1275 return _last_roll_or_reversal_location;
1283 } else if (_transport_speed < 0.0f) {
1285 /* XXX wot? no backward looping? */
1287 if (tf > _last_roll_or_reversal_location - offset) {
1288 return _last_roll_or_reversal_location;
1300 Session::set_frame_rate (framecnt_t frames_per_second)
1302 /** \fn void Session::set_frame_size(framecnt_t)
1303 the AudioEngine object that calls this guarantees
1304 that it will not be called while we are also in
1305 ::process(). Its fine to do things that block
1309 _base_frame_rate = frames_per_second;
1313 Automatable::set_automation_interval (ceil ((double) frames_per_second * (0.001 * Config->get_automation_interval())));
1317 // XXX we need some equivalent to this, somehow
1318 // SndFileSource::setup_standard_crossfades (frames_per_second);
1322 /* XXX need to reset/reinstantiate all LADSPA plugins */
1326 Session::set_block_size (pframes_t nframes)
1328 /* the AudioEngine guarantees
1329 that it will not be called while we are also in
1330 ::process(). It is therefore fine to do things that block
1335 current_block_size = nframes;
1339 boost::shared_ptr<RouteList> r = routes.reader ();
1341 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1342 (*i)->set_block_size (nframes);
1345 boost::shared_ptr<RouteList> rl = routes.reader ();
1346 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1347 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1349 tr->set_block_size (nframes);
1353 set_worst_io_latencies ();
1359 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1361 boost::shared_ptr<Route> r2;
1363 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1364 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1368 /* make a copy of the existing list of routes that feed r1 */
1370 Route::FedBy existing (r1->fed_by());
1372 /* for each route that feeds r1, recurse, marking it as feeding
1376 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1377 if (!(r2 = i->r.lock ())) {
1378 /* (*i) went away, ignore it */
1382 /* r2 is a route that feeds r1 which somehow feeds base. mark
1383 base as being fed by r2
1386 rbase->add_fed_by (r2, i->sends_only);
1390 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1394 if (r1->feeds (r2) && r2->feeds (r1)) {
1398 /* now recurse, so that we can mark base as being fed by
1399 all routes that feed r2
1402 trace_terminal (r2, rbase);
1409 Session::resort_routes ()
1411 /* don't do anything here with signals emitted
1412 by Routes during initial setup or while we
1413 are being destroyed.
1416 if (_state_of_the_state & (InitialConnecting | Deletion)) {
1421 RCUWriter<RouteList> writer (routes);
1422 boost::shared_ptr<RouteList> r = writer.get_copy ();
1423 resort_routes_using (r);
1424 /* writer goes out of scope and forces update */
1428 boost::shared_ptr<RouteList> rl = routes.reader ();
1429 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1430 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1432 const Route::FedBy& fb ((*i)->fed_by());
1434 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1435 boost::shared_ptr<Route> sf = f->r.lock();
1437 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1445 /** This is called whenever we need to rebuild the graph of how we will process
1447 * @param r List of routes, in any order.
1451 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1453 /* We are going to build a directed graph of our routes;
1454 this is where the edges of that graph are put.
1459 /* Go through all routes doing two things:
1461 * 1. Collect the edges of the route graph. Each of these edges
1462 * is a pair of routes, one of which directly feeds the other
1463 * either by a JACK connection or by an internal send.
1465 * 2. Begin the process of making routes aware of which other
1466 * routes directly or indirectly feed them. This information
1467 * is used by the solo code.
1470 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1472 /* Clear out the route's list of direct or indirect feeds */
1473 (*i)->clear_fed_by ();
1475 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
1477 bool via_sends_only;
1479 /* See if this *j feeds *i according to the current state of the JACK
1480 connections and internal sends.
1482 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
1483 /* add the edge to the graph (part #1) */
1484 edges.add (*j, *i, via_sends_only);
1485 /* tell the route (for part #2) */
1486 (*i)->add_fed_by (*j, via_sends_only);
1491 /* Attempt a topological sort of the route graph */
1492 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
1494 if (sorted_routes) {
1495 /* We got a satisfactory topological sort, so there is no feedback;
1498 Note: the process graph rechain does not require a
1499 topologically-sorted list, but hey ho.
1501 if (_process_graph) {
1502 _process_graph->rechain (sorted_routes, edges);
1505 _current_route_graph = edges;
1507 /* Complete the building of the routes' lists of what directly
1508 or indirectly feeds them.
1510 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1511 trace_terminal (*i, *i);
1514 *r = *sorted_routes;
1517 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1518 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1519 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1520 (*i)->name(), (*i)->order_key ("signal")));
1524 SuccessfulGraphSort (); /* EMIT SIGNAL */
1527 /* The topological sort failed, so we have a problem. Tell everyone
1528 and stick to the old graph; this will continue to be processed, so
1529 until the feedback is fixed, what is played back will not quite
1530 reflect what is actually connected. Note also that we do not
1531 do trace_terminal here, as it would fail due to an endless recursion,
1532 so the solo code will think that everything is still connected
1536 FeedbackDetected (); /* EMIT SIGNAL */
1541 /** Find a route name starting with \a base, maybe followed by the
1542 * lowest \a id. \a id will always be added if \a definitely_add_number
1543 * is true on entry; otherwise it will only be added if required
1544 * to make the name unique.
1546 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1547 * The available route name with the lowest ID will be used, and \a id
1548 * will be set to the ID.
1550 * \return false if a route name could not be found, and \a track_name
1551 * and \a id do not reflect a free route name.
1554 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1556 if (!definitely_add_number && route_by_name (base) == 0) {
1557 /* juse use the base */
1558 snprintf (name, name_len, "%s", base.c_str());
1563 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1565 if (route_by_name (name) == 0) {
1571 } while (id < (UINT_MAX-1));
1576 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
1578 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
1580 in = ChanCount::ZERO;
1581 out = ChanCount::ZERO;
1583 boost::shared_ptr<RouteList> r = routes.reader ();
1585 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1586 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1587 if (tr && !tr->is_hidden()) {
1588 in += tr->n_inputs();
1589 out += tr->n_outputs();
1594 /** Caller must not hold process lock
1595 * @param name_template string to use for the start of the name, or "" to use "MIDI".
1596 * @param instrument plugin info for the instrument to insert pre-fader, if any
1598 list<boost::shared_ptr<MidiTrack> >
1599 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
1600 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1602 char track_name[32];
1603 uint32_t track_id = 0;
1605 RouteList new_routes;
1606 list<boost::shared_ptr<MidiTrack> > ret;
1607 uint32_t control_id;
1609 cerr << "Adding MIDI track with in = " << input << " out = " << output << endl;
1611 control_id = next_control_id ();
1613 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
1616 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1617 error << "cannot find name for new midi track" << endmsg;
1621 boost::shared_ptr<MidiTrack> track;
1624 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1626 if (track->init ()) {
1630 track->use_new_diskstream();
1632 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1633 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1636 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1637 if (track->input()->ensure_io (input, false, this)) {
1638 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
1642 if (track->output()->ensure_io (output, false, this)) {
1643 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
1648 track->non_realtime_input_change();
1651 route_group->add (track);
1654 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1655 track->set_remote_control_id (control_id);
1657 new_routes.push_back (track);
1658 ret.push_back (track);
1661 catch (failed_constructor &err) {
1662 error << _("Session: could not create new midi track.") << endmsg;
1666 catch (AudioEngine::PortRegistrationFailure& pfe) {
1668 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;
1676 if (!new_routes.empty()) {
1677 add_routes (new_routes, true, true, true);
1680 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
1681 PluginPtr plugin = instrument->load (*this);
1682 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
1683 (*r)->add_processor (p, PreFader);
1693 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
1695 boost::shared_ptr<Route> midi_track (wmt.lock());
1701 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
1703 if (change.after.n_audio() <= change.before.n_audio()) {
1707 /* new audio ports: make sure the audio goes somewhere useful,
1708 unless the user has no-auto-connect selected.
1710 The existing ChanCounts don't matter for this call as they are only
1711 to do with matching input and output indices, and we are only changing
1717 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
1721 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1722 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1723 * @param output_start As \a input_start, but for outputs.
1726 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
1727 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
1729 if (!IO::connecting_legal) {
1733 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::NOT_LOCK);
1739 /* If both inputs and outputs are auto-connected to physical ports,
1740 use the max of input and output offsets to ensure auto-connected
1741 port numbers always match up (e.g. the first audio input and the
1742 first audio output of the route will have the same physical
1743 port number). Otherwise just use the lowest input or output
1747 DEBUG_TRACE (DEBUG::Graph,
1748 string_compose("Auto-connect: existing in = %1 out = %2\n",
1749 existing_inputs, existing_outputs));
1751 const bool in_out_physical =
1752 (Config->get_input_auto_connect() & AutoConnectPhysical)
1753 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1756 const ChanCount in_offset = in_out_physical
1757 ? ChanCount::max(existing_inputs, existing_outputs)
1760 const ChanCount out_offset = in_out_physical
1761 ? ChanCount::max(existing_inputs, existing_outputs)
1764 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1765 vector<string> physinputs;
1766 vector<string> physoutputs;
1768 _engine.get_physical_outputs (*t, physoutputs);
1769 _engine.get_physical_inputs (*t, physinputs);
1771 if (!physinputs.empty() && connect_inputs) {
1772 uint32_t nphysical_in = physinputs.size();
1774 DEBUG_TRACE (DEBUG::Graph,
1775 string_compose("There are %1 physical inputs of type %2\n",
1778 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1781 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1782 DEBUG_TRACE (DEBUG::Graph,
1783 string_compose("Get index %1 + %2 % %3 = %4\n",
1784 in_offset.get(*t), i, nphysical_in,
1785 (in_offset.get(*t) + i) % nphysical_in));
1786 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1789 DEBUG_TRACE (DEBUG::Graph,
1790 string_compose("Connect route %1 IN to %2\n",
1791 route->name(), port));
1793 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
1797 ChanCount one_added (*t, 1);
1798 existing_inputs += one_added;
1802 if (!physoutputs.empty()) {
1803 uint32_t nphysical_out = physoutputs.size();
1804 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
1807 if ((*t) == DataType::MIDI || Config->get_output_auto_connect() & AutoConnectPhysical) {
1808 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1809 } else if ((*t) == DataType::AUDIO && Config->get_output_auto_connect() & AutoConnectMaster) {
1810 /* master bus is audio only */
1811 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1812 port = _master_out->input()->ports().port(*t,
1813 i % _master_out->input()->n_ports().get(*t))->name();
1817 DEBUG_TRACE (DEBUG::Graph,
1818 string_compose("Connect route %1 OUT to %2\n",
1819 route->name(), port));
1821 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
1825 ChanCount one_added (*t, 1);
1826 existing_outputs += one_added;
1832 /** Caller must not hold process lock
1833 * @param name_template string to use for the start of the name, or "" to use "Audio".
1835 list< boost::shared_ptr<AudioTrack> >
1836 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
1837 uint32_t how_many, string name_template)
1839 char track_name[32];
1840 uint32_t track_id = 0;
1842 RouteList new_routes;
1843 list<boost::shared_ptr<AudioTrack> > ret;
1844 uint32_t control_id;
1846 control_id = next_control_id ();
1848 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
1851 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1852 error << "cannot find name for new audio track" << endmsg;
1856 boost::shared_ptr<AudioTrack> track;
1859 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
1861 if (track->init ()) {
1865 track->use_new_diskstream();
1867 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1868 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1871 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1873 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1874 error << string_compose (
1875 _("cannot configure %1 in/%2 out configuration for new audio track"),
1876 input_channels, output_channels)
1881 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1882 error << string_compose (
1883 _("cannot configure %1 in/%2 out configuration for new audio track"),
1884 input_channels, output_channels)
1891 route_group->add (track);
1894 track->non_realtime_input_change();
1896 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1897 track->set_remote_control_id (control_id);
1900 new_routes.push_back (track);
1901 ret.push_back (track);
1904 catch (failed_constructor &err) {
1905 error << _("Session: could not create new audio track.") << endmsg;
1909 catch (AudioEngine::PortRegistrationFailure& pfe) {
1911 error << pfe.what() << endmsg;
1919 if (!new_routes.empty()) {
1920 add_routes (new_routes, true, true, true);
1927 Session::set_remote_control_ids ()
1929 RemoteModel m = Config->get_remote_model();
1930 bool emit_signal = false;
1932 boost::shared_ptr<RouteList> r = routes.reader ();
1934 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1935 if (MixerOrdered == m) {
1936 int32_t order = (*i)->order_key(N_("signal"));
1937 (*i)->set_remote_control_id (order+1, false);
1939 } else if (EditorOrdered == m) {
1940 int32_t order = (*i)->order_key(N_("editor"));
1941 (*i)->set_remote_control_id (order+1, false);
1943 } else if (UserOrdered == m) {
1944 //do nothing ... only changes to remote id's are initiated by user
1949 Route::RemoteControlIDChange();
1953 /** Caller must not hold process lock.
1954 * @param name_template string to use for the start of the name, or "" to use "Bus".
1957 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
1960 uint32_t bus_id = 0;
1963 uint32_t control_id;
1965 control_id = next_control_id ();
1967 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
1970 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
1971 error << "cannot find name for new audio bus" << endmsg;
1976 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
1982 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1983 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
1986 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1988 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1989 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1990 input_channels, output_channels)
1996 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1997 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1998 input_channels, output_channels)
2005 route_group->add (bus);
2007 bus->set_remote_control_id (control_id);
2010 bus->add_internal_return ();
2012 ret.push_back (bus);
2016 catch (failed_constructor &err) {
2017 error << _("Session: could not create new audio route.") << endmsg;
2021 catch (AudioEngine::PortRegistrationFailure& pfe) {
2022 error << pfe.what() << endmsg;
2032 add_routes (ret, false, true, true); // autoconnect outputs only
2040 Session::new_route_from_template (uint32_t how_many, const std::string& template_path)
2043 uint32_t control_id;
2045 uint32_t number = 0;
2047 if (!tree.read (template_path.c_str())) {
2051 XMLNode* node = tree.root();
2053 IO::disable_connecting ();
2055 control_id = next_control_id ();
2059 XMLNode node_copy (*node);
2061 /* Remove IDs of everything so that new ones are used */
2062 node_copy.remove_property_recursively (X_("id"));
2065 string const route_name = node_copy.property(X_("name"))->value ();
2067 /* generate a new name by adding a number to the end of the template name */
2069 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2070 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2074 /* set this name in the XML description that we are about to use */
2075 Route::set_name_in_state (node_copy, name);
2077 /* trim bitslots from listen sends so that new ones are used */
2078 XMLNodeList children = node_copy.children ();
2079 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2080 if ((*i)->name() == X_("Processor")) {
2081 XMLProperty* role = (*i)->property (X_("role"));
2082 if (role && role->value() == X_("Listen")) {
2083 (*i)->remove_property (X_("bitslot"));
2088 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2091 error << _("Session: cannot create track/bus from template description") << endmsg;
2095 if (boost::dynamic_pointer_cast<Track>(route)) {
2096 /* force input/output change signals so that the new diskstream
2097 picks up the configuration of the route. During session
2098 loading this normally happens in a different way.
2101 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2103 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2104 change.after = route->input()->n_ports();
2105 route->input()->changed (change, this);
2106 change.after = route->output()->n_ports();
2107 route->output()->changed (change, this);
2110 route->set_remote_control_id (control_id);
2113 ret.push_back (route);
2116 catch (failed_constructor &err) {
2117 error << _("Session: could not create new route from template") << endmsg;
2121 catch (AudioEngine::PortRegistrationFailure& pfe) {
2122 error << pfe.what() << endmsg;
2131 add_routes (ret, true, true, true);
2132 IO::enable_connecting ();
2139 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
2141 ChanCount existing_inputs;
2142 ChanCount existing_outputs;
2144 count_existing_track_channels (existing_inputs, existing_outputs);
2147 RCUWriter<RouteList> writer (routes);
2148 boost::shared_ptr<RouteList> r = writer.get_copy ();
2149 r->insert (r->end(), new_routes.begin(), new_routes.end());
2151 /* if there is no control out and we're not in the middle of loading,
2152 resort the graph here. if there is a control out, we will resort
2153 toward the end of this method. if we are in the middle of loading,
2154 we will resort when done.
2157 if (!_monitor_out && IO::connecting_legal) {
2158 resort_routes_using (r);
2162 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2164 boost::weak_ptr<Route> wpr (*x);
2165 boost::shared_ptr<Route> r (*x);
2167 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2168 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2169 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2170 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2171 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2172 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2173 r->order_key_changed.connect_same_thread (*this, boost::bind (&Session::route_order_key_changed, this));
2175 if (r->is_master()) {
2179 if (r->is_monitor()) {
2183 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2185 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2186 track_playlist_changed (boost::weak_ptr<Track> (tr));
2187 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2189 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2191 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2192 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2196 if (input_auto_connect || output_auto_connect) {
2197 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
2201 if (_monitor_out && IO::connecting_legal) {
2204 Glib::Mutex::Lock lm (_engine.process_lock());
2206 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2207 if ((*x)->is_monitor()) {
2209 } else if ((*x)->is_master()) {
2212 (*x)->enable_monitor_send ();
2223 save_state (_current_snapshot_name);
2226 RouteAdded (new_routes); /* EMIT SIGNAL */
2227 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
2231 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2233 boost::shared_ptr<RouteList> r = routes.reader ();
2234 boost::shared_ptr<Send> s;
2236 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2237 if ((s = (*i)->internal_send_for (dest)) != 0) {
2238 s->amp()->gain_control()->set_value (0.0);
2244 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2246 boost::shared_ptr<RouteList> r = routes.reader ();
2247 boost::shared_ptr<Send> s;
2249 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2250 if ((s = (*i)->internal_send_for (dest)) != 0) {
2251 s->amp()->gain_control()->set_value (1.0);
2257 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2259 boost::shared_ptr<RouteList> r = routes.reader ();
2260 boost::shared_ptr<Send> s;
2262 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2263 if ((s = (*i)->internal_send_for (dest)) != 0) {
2264 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2269 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2271 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2273 boost::shared_ptr<RouteList> r = routes.reader ();
2274 boost::shared_ptr<RouteList> t (new RouteList);
2276 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2277 /* no MIDI sends because there are no MIDI busses yet */
2278 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2283 add_internal_sends (dest, p, t);
2287 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2289 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2290 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
2295 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
2297 add_internal_send (dest, sender->before_processor_for_index (index), sender);
2301 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
2303 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
2307 if (!dest->internal_return()) {
2308 dest->add_internal_return ();
2311 sender->add_aux_send (dest, before);
2317 Session::remove_route (boost::shared_ptr<Route> route)
2319 if (route == _master_out) {
2323 route->set_solo (false, this);
2326 RCUWriter<RouteList> writer (routes);
2327 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2331 /* deleting the master out seems like a dumb
2332 idea, but its more of a UI policy issue
2336 if (route == _master_out) {
2337 _master_out = boost::shared_ptr<Route> ();
2340 if (route == _monitor_out) {
2341 _monitor_out.reset ();
2344 /* writer goes out of scope, forces route list update */
2347 update_route_solo_state ();
2349 // We need to disconnect the route's inputs and outputs
2351 route->input()->disconnect (0);
2352 route->output()->disconnect (0);
2354 /* if the route had internal sends sending to it, remove them */
2355 if (route->internal_return()) {
2357 boost::shared_ptr<RouteList> r = routes.reader ();
2358 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2359 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2361 (*i)->remove_processor (s);
2366 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2367 if (mt && mt->step_editing()) {
2368 if (_step_editors > 0) {
2373 update_latency_compensation ();
2376 /* Re-sort routes to remove the graph's current references to the one that is
2377 * going away, then flush old references out of the graph.
2381 if (_process_graph) {
2382 _process_graph->clear_other_chain ();
2385 /* get rid of it from the dead wood collection in the route list manager */
2387 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2391 /* try to cause everyone to drop their references */
2393 route->drop_references ();
2395 sync_order_keys (N_("session"));
2397 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2399 /* save the new state of the world */
2401 if (save_state (_current_snapshot_name)) {
2402 save_history (_current_snapshot_name);
2407 Session::route_mute_changed (void* /*src*/)
2413 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2415 boost::shared_ptr<Route> route = wpr.lock();
2417 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2421 if (route->listening_via_monitor ()) {
2423 if (Config->get_exclusive_solo()) {
2424 /* new listen: disable all other listen */
2425 boost::shared_ptr<RouteList> r = routes.reader ();
2426 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2427 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2430 (*i)->set_listen (false, this);
2436 } else if (_listen_cnt > 0) {
2441 update_route_solo_state ();
2444 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2446 boost::shared_ptr<Route> route = wpr.lock ();
2449 /* should not happen */
2450 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2454 bool send_changed = false;
2456 if (route->solo_isolated()) {
2457 if (_solo_isolated_cnt == 0) {
2458 send_changed = true;
2460 _solo_isolated_cnt++;
2461 } else if (_solo_isolated_cnt > 0) {
2462 _solo_isolated_cnt--;
2463 if (_solo_isolated_cnt == 0) {
2464 send_changed = true;
2469 IsolatedChanged (); /* EMIT SIGNAL */
2474 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2476 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
2478 if (!self_solo_change) {
2479 // session doesn't care about changes to soloed-by-others
2483 if (solo_update_disabled) {
2485 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
2489 boost::shared_ptr<Route> route = wpr.lock ();
2492 boost::shared_ptr<RouteList> r = routes.reader ();
2495 if (route->self_soloed()) {
2501 RouteGroup* rg = route->route_group ();
2502 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
2504 if (delta == 1 && Config->get_exclusive_solo()) {
2506 /* new solo: disable all other solos, but not the group if its solo-enabled */
2508 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2509 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2510 (leave_group_alone && ((*i)->route_group() == rg))) {
2513 (*i)->set_solo (false, this);
2517 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
2519 solo_update_disabled = true;
2521 RouteList uninvolved;
2523 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
2525 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2526 bool via_sends_only;
2527 bool in_signal_flow;
2529 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2530 (leave_group_alone && ((*i)->route_group() == rg))) {
2534 in_signal_flow = false;
2536 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
2538 if ((*i)->feeds (route, &via_sends_only)) {
2539 if (!via_sends_only) {
2540 if (!route->soloed_by_others_upstream()) {
2541 (*i)->mod_solo_by_others_downstream (delta);
2544 in_signal_flow = true;
2546 DEBUG_TRACE (DEBUG::Solo, "\tno feed from\n");
2549 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
2551 if (route->feeds (*i, &via_sends_only)) {
2552 /* propagate solo upstream only if routing other than
2553 sends is involved, but do consider the other route
2554 (*i) to be part of the signal flow even if only
2557 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
2561 route->soloed_by_others_downstream(),
2562 route->soloed_by_others_upstream()));
2563 if (!via_sends_only) {
2564 if (!route->soloed_by_others_downstream()) {
2565 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
2566 (*i)->mod_solo_by_others_upstream (delta);
2569 in_signal_flow = true;
2571 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
2574 if (!in_signal_flow) {
2575 uninvolved.push_back (*i);
2579 solo_update_disabled = false;
2580 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
2582 update_route_solo_state (r);
2584 /* now notify that the mute state of the routes not involved in the signal
2585 pathway of the just-solo-changed route may have altered.
2588 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2589 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1\n", (*i)->name()));
2590 (*i)->mute_changed (this);
2593 SoloChanged (); /* EMIT SIGNAL */
2598 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2600 /* now figure out if anything that matters is soloed (or is "listening")*/
2602 bool something_soloed = false;
2603 uint32_t listeners = 0;
2604 uint32_t isolated = 0;
2607 r = routes.reader();
2610 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2611 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2612 something_soloed = true;
2615 if (!(*i)->is_hidden() && (*i)->listening_via_monitor()) {
2616 if (Config->get_solo_control_is_listen_control()) {
2619 (*i)->set_listen (false, this);
2623 if ((*i)->solo_isolated()) {
2628 if (something_soloed != _non_soloed_outs_muted) {
2629 _non_soloed_outs_muted = something_soloed;
2630 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2633 _listen_cnt = listeners;
2635 if (isolated != _solo_isolated_cnt) {
2636 _solo_isolated_cnt = isolated;
2637 IsolatedChanged (); /* EMIT SIGNAL */
2641 boost::shared_ptr<RouteList>
2642 Session::get_routes_with_internal_returns() const
2644 boost::shared_ptr<RouteList> r = routes.reader ();
2645 boost::shared_ptr<RouteList> rl (new RouteList);
2647 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2648 if ((*i)->internal_return ()) {
2656 Session::io_name_is_legal (const std::string& name)
2658 boost::shared_ptr<RouteList> r = routes.reader ();
2660 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2661 if ((*i)->name() == name) {
2665 if ((*i)->has_io_processor_named (name)) {
2674 Session::set_exclusive_input_active (boost::shared_ptr<Route> rt, bool /*others_on*/)
2677 vector<string> connections;
2679 PortSet& ps (rt->input()->ports());
2681 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
2682 p->get_connections (connections);
2685 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
2686 routes_using_input_from (*s, rl);
2689 /* scan all relevant routes to see if others are on or off */
2691 bool others_are_already_on = false;
2693 for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
2695 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2697 if (mt->input_active()) {
2698 others_are_already_on = true;
2705 /* globally reverse other routes */
2707 for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
2709 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2711 mt->set_input_active (!others_are_already_on);
2718 Session::routes_using_input_from (const string& str, RouteList& rl)
2720 boost::shared_ptr<RouteList> r = routes.reader ();
2722 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2723 if ((*i)->input()->connected_to (str)) {
2729 boost::shared_ptr<Route>
2730 Session::route_by_name (string name)
2732 boost::shared_ptr<RouteList> r = routes.reader ();
2734 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2735 if ((*i)->name() == name) {
2740 return boost::shared_ptr<Route> ((Route*) 0);
2743 boost::shared_ptr<Route>
2744 Session::route_by_id (PBD::ID id)
2746 boost::shared_ptr<RouteList> r = routes.reader ();
2748 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2749 if ((*i)->id() == id) {
2754 return boost::shared_ptr<Route> ((Route*) 0);
2757 boost::shared_ptr<Track>
2758 Session::track_by_diskstream_id (PBD::ID id)
2760 boost::shared_ptr<RouteList> r = routes.reader ();
2762 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2763 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
2764 if (t && t->using_diskstream_id (id)) {
2769 return boost::shared_ptr<Track> ();
2772 boost::shared_ptr<Route>
2773 Session::route_by_remote_id (uint32_t id)
2775 boost::shared_ptr<RouteList> r = routes.reader ();
2777 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2778 if ((*i)->remote_control_id() == id) {
2783 return boost::shared_ptr<Route> ((Route*) 0);
2787 Session::playlist_region_added (boost::weak_ptr<Region> w)
2789 boost::shared_ptr<Region> r = w.lock ();
2794 /* These are the operations that are currently in progress... */
2795 list<GQuark> curr = _current_trans_quarks;
2798 /* ...and these are the operations during which we want to update
2799 the session range location markers.
2802 ops.push_back (Operations::capture);
2803 ops.push_back (Operations::paste);
2804 ops.push_back (Operations::duplicate_region);
2805 ops.push_back (Operations::insert_file);
2806 ops.push_back (Operations::insert_region);
2807 ops.push_back (Operations::drag_region_brush);
2808 ops.push_back (Operations::region_drag);
2809 ops.push_back (Operations::selection_grab);
2810 ops.push_back (Operations::region_fill);
2811 ops.push_back (Operations::fill_selection);
2812 ops.push_back (Operations::create_region);
2813 ops.push_back (Operations::region_copy);
2814 ops.push_back (Operations::fixed_time_region_copy);
2817 /* See if any of the current operations match the ones that we want */
2819 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
2821 /* If so, update the session range markers */
2823 maybe_update_session_range (r->position (), r->last_frame ());
2827 /** Update the session range markers if a is before the current start or
2828 * b is after the current end.
2831 Session::maybe_update_session_range (framepos_t a, framepos_t b)
2833 if (_state_of_the_state & Loading) {
2837 if (_session_range_location == 0) {
2839 add_session_range_location (a, b);
2843 if (a < _session_range_location->start()) {
2844 _session_range_location->set_start (a);
2847 if (b > _session_range_location->end()) {
2848 _session_range_location->set_end (b);
2854 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
2856 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2857 maybe_update_session_range (i->to, i->to + i->length);
2862 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
2864 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2865 maybe_update_session_range (i->from, i->to);
2869 /* Region management */
2871 boost::shared_ptr<Region>
2872 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2874 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2875 RegionFactory::RegionMap::const_iterator i;
2876 boost::shared_ptr<Region> region;
2878 Glib::Mutex::Lock lm (region_lock);
2880 for (i = regions.begin(); i != regions.end(); ++i) {
2884 if (region->whole_file()) {
2886 if (child->source_equivalent (region)) {
2892 return boost::shared_ptr<Region> ();
2896 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2898 set<boost::shared_ptr<Region> > relevant_regions;
2900 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2901 RegionFactory::get_regions_using_source (*s, relevant_regions);
2904 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2905 set<boost::shared_ptr<Region> >::iterator tmp;
2910 playlists->destroy_region (*r);
2911 RegionFactory::map_remove (*r);
2913 (*r)->drop_sources ();
2914 (*r)->drop_references ();
2916 relevant_regions.erase (r);
2921 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
2924 Glib::Mutex::Lock ls (source_lock);
2925 /* remove from the main source list */
2926 sources.erase ((*s)->id());
2929 (*s)->mark_for_remove ();
2930 (*s)->drop_references ();
2939 Session::remove_last_capture ()
2941 list<boost::shared_ptr<Source> > srcs;
2943 boost::shared_ptr<RouteList> rl = routes.reader ();
2944 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2945 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2950 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
2953 srcs.insert (srcs.end(), l.begin(), l.end());
2958 destroy_sources (srcs);
2960 save_state (_current_snapshot_name);
2965 /* Source Management */
2968 Session::add_source (boost::shared_ptr<Source> source)
2970 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
2971 pair<SourceMap::iterator,bool> result;
2973 entry.first = source->id();
2974 entry.second = source;
2977 Glib::Mutex::Lock lm (source_lock);
2978 result = sources.insert (entry);
2981 if (result.second) {
2983 /* yay, new source */
2985 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
2988 if (!fs->within_session()) {
2989 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
2995 boost::shared_ptr<AudioFileSource> afs;
2997 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
2998 if (Config->get_auto_analyse_audio()) {
2999 Analyser::queue_source_for_analysis (source, false);
3003 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
3008 Session::remove_source (boost::weak_ptr<Source> src)
3010 if (_state_of_the_state & Deletion) {
3014 SourceMap::iterator i;
3015 boost::shared_ptr<Source> source = src.lock();
3022 Glib::Mutex::Lock lm (source_lock);
3024 if ((i = sources.find (source->id())) != sources.end()) {
3029 if (!(_state_of_the_state & InCleanup)) {
3031 /* save state so we don't end up with a session file
3032 referring to non-existent sources.
3035 save_state (_current_snapshot_name);
3039 boost::shared_ptr<Source>
3040 Session::source_by_id (const PBD::ID& id)
3042 Glib::Mutex::Lock lm (source_lock);
3043 SourceMap::iterator i;
3044 boost::shared_ptr<Source> source;
3046 if ((i = sources.find (id)) != sources.end()) {
3053 boost::shared_ptr<Source>
3054 Session::source_by_path_and_channel (const string& path, uint16_t chn)
3056 Glib::Mutex::Lock lm (source_lock);
3058 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3059 boost::shared_ptr<AudioFileSource> afs
3060 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
3062 if (afs && afs->path() == path && chn == afs->channel()) {
3066 return boost::shared_ptr<Source>();
3070 Session::count_sources_by_origin (const string& path)
3073 Glib::Mutex::Lock lm (source_lock);
3075 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3076 boost::shared_ptr<FileSource> fs
3077 = boost::dynamic_pointer_cast<FileSource>(i->second);
3079 if (fs && fs->origin() == path) {
3089 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
3092 string old_basename = PBD::basename_nosuffix (oldname);
3093 string new_legalized = legalize_for_path (newname);
3095 /* note: we know (or assume) the old path is already valid */
3099 /* destructive file sources have a name of the form:
3101 /path/to/Tnnnn-NAME(%[LR])?.wav
3103 the task here is to replace NAME with the new name.
3108 string::size_type dash;
3110 dir = Glib::path_get_dirname (path);
3111 path = Glib::path_get_basename (path);
3113 /* '-' is not a legal character for the NAME part of the path */
3115 if ((dash = path.find_last_of ('-')) == string::npos) {
3119 prefix = path.substr (0, dash);
3123 path += new_legalized;
3124 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3125 path = Glib::build_filename (dir, path);
3129 /* non-destructive file sources have a name of the form:
3131 /path/to/NAME-nnnnn(%[LR])?.ext
3133 the task here is to replace NAME with the new name.
3138 string::size_type dash;
3139 string::size_type postfix;
3141 dir = Glib::path_get_dirname (path);
3142 path = Glib::path_get_basename (path);
3144 /* '-' is not a legal character for the NAME part of the path */
3146 if ((dash = path.find_last_of ('-')) == string::npos) {
3150 suffix = path.substr (dash+1);
3152 // Suffix is now everything after the dash. Now we need to eliminate
3153 // the nnnnn part, which is done by either finding a '%' or a '.'
3155 postfix = suffix.find_last_of ("%");
3156 if (postfix == string::npos) {
3157 postfix = suffix.find_last_of ('.');
3160 if (postfix != string::npos) {
3161 suffix = suffix.substr (postfix);
3163 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
3167 const uint32_t limit = 10000;
3168 char buf[PATH_MAX+1];
3170 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
3172 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
3174 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
3175 path = Glib::build_filename (dir, buf);
3183 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
3192 /** Return the full path (in some session directory) for a new within-session source.
3193 * \a name must be a session-unique name that does not contain slashes
3194 * (e.g. as returned by new_*_source_name)
3197 Session::new_source_path_from_name (DataType type, const string& name)
3199 assert(name.find("/") == string::npos);
3201 SessionDirectory sdir(get_best_session_directory_for_new_source());
3204 if (type == DataType::AUDIO) {
3205 p = sdir.sound_path();
3206 } else if (type == DataType::MIDI) {
3207 p = sdir.midi_path();
3209 error << "Unknown source type, unable to create file path" << endmsg;
3213 return Glib::build_filename (p, name);
3217 Session::peak_path (string base) const
3219 return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
3222 /** Return a unique name based on \a base for a new internal audio source */
3224 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
3227 char buf[PATH_MAX+1];
3228 const uint32_t limit = 10000;
3230 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3233 legalized = legalize_for_path (base);
3235 // Find a "version" of the base name that doesn't exist in any of the possible directories.
3236 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3238 vector<space_and_path>::iterator i;
3239 uint32_t existing = 0;
3241 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3246 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3247 cnt, legalized.c_str(), ext.c_str());
3248 } else if (nchan == 2) {
3250 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
3251 cnt, legalized.c_str(), ext.c_str());
3253 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
3254 cnt, legalized.c_str(), ext.c_str());
3256 } else if (nchan < 26) {
3257 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
3258 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
3260 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3261 cnt, legalized.c_str(), ext.c_str());
3267 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3268 } else if (nchan == 2) {
3270 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
3272 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
3274 } else if (nchan < 26) {
3275 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
3277 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3281 SessionDirectory sdir((*i).path);
3283 string spath = sdir.sound_path();
3285 /* note that we search *without* the extension so that
3286 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3287 in the event that this new name is required for
3288 a file format change.
3291 if (matching_unsuffixed_filename_exists_in (spath, buf)) {
3297 if (existing == 0) {
3302 error << string_compose(
3303 _("There are already %1 recordings for %2, which I consider too many."),
3304 limit, base) << endmsg;
3306 throw failed_constructor();
3310 return Glib::path_get_basename (buf);
3313 /** Create a new within-session audio source */
3314 boost::shared_ptr<AudioFileSource>
3315 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
3317 const string name = new_audio_source_name (n, n_chans, chan, destructive);
3318 const string path = new_source_path_from_name(DataType::AUDIO, name);
3320 return boost::dynamic_pointer_cast<AudioFileSource> (
3321 SourceFactory::createWritable (DataType::AUDIO, *this, path, string(), destructive, frame_rate()));
3324 /** Return a unique name based on \a base for a new internal MIDI source */
3326 Session::new_midi_source_name (const string& base)
3329 char buf[PATH_MAX+1];
3330 const uint32_t limit = 10000;
3334 legalized = legalize_for_path (base);
3336 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3337 for (cnt = 1; cnt <= limit; ++cnt) {
3339 vector<space_and_path>::iterator i;
3340 uint32_t existing = 0;
3342 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3344 SessionDirectory sdir((*i).path);
3346 std::string p = Glib::build_filename (sdir.midi_path(), legalized);
3348 snprintf (buf, sizeof(buf), "%s-%u.mid", p.c_str(), cnt);
3350 if (Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
3355 if (existing == 0) {
3360 error << string_compose(
3361 _("There are already %1 recordings for %2, which I consider too many."),
3362 limit, base) << endmsg;
3364 throw failed_constructor();
3368 return Glib::path_get_basename(buf);
3372 /** Create a new within-session MIDI source */
3373 boost::shared_ptr<MidiSource>
3374 Session::create_midi_source_for_session (Track* track, string const & n)
3376 /* try to use the existing write source for the track, to keep numbering sane
3380 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3384 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3387 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3388 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3392 const string name = new_midi_source_name (n);
3393 const string path = new_source_path_from_name (DataType::MIDI, name);
3395 return boost::dynamic_pointer_cast<SMFSource> (
3396 SourceFactory::createWritable (
3397 DataType::MIDI, *this, path, string(), false, frame_rate()));
3402 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3404 if (playlist->hidden()) {
3408 playlists->add (playlist);
3411 playlist->release();
3418 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3420 if (_state_of_the_state & Deletion) {
3424 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3430 playlists->remove (playlist);
3436 Session::set_audition (boost::shared_ptr<Region> r)
3438 pending_audition_region = r;
3439 add_post_transport_work (PostTransportAudition);
3440 _butler->schedule_transport_work ();
3444 Session::audition_playlist ()
3446 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3447 ev->region.reset ();
3452 Session::non_realtime_set_audition ()
3454 assert (pending_audition_region);
3455 auditioner->audition_region (pending_audition_region);
3456 pending_audition_region.reset ();
3457 AuditionActive (true); /* EMIT SIGNAL */
3461 Session::audition_region (boost::shared_ptr<Region> r)
3463 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3469 Session::cancel_audition ()
3471 if (auditioner->auditioning()) {
3472 auditioner->cancel_audition ();
3473 AuditionActive (false); /* EMIT SIGNAL */
3478 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3480 if (a->is_monitor()) {
3483 if (b->is_monitor()) {
3486 return a->order_key(N_("signal")) < b->order_key(N_("signal"));
3490 Session::is_auditioning () const
3492 /* can be called before we have an auditioner object */
3494 return auditioner->auditioning();
3501 Session::graph_reordered ()
3503 /* don't do this stuff if we are setting up connections
3504 from a set_state() call or creating new tracks. Ditto for deletion.
3507 if (_state_of_the_state & (InitialConnecting|Deletion)) {
3511 /* every track/bus asked for this to be handled but it was deferred because
3512 we were connecting. do it now.
3515 request_input_change_handling ();
3519 /* force all diskstreams to update their capture offset values to
3520 reflect any changes in latencies within the graph.
3523 boost::shared_ptr<RouteList> rl = routes.reader ();
3524 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3525 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3527 tr->set_capture_offset ();
3532 /** @return Number of frames that there is disk space available to write,
3535 boost::optional<framecnt_t>
3536 Session::available_capture_duration ()
3538 if (_total_free_4k_blocks_uncertain) {
3539 return boost::optional<framecnt_t> ();
3542 float sample_bytes_on_disk = 4.0; // keep gcc happy
3544 switch (config.get_native_file_data_format()) {
3546 sample_bytes_on_disk = 4.0;
3550 sample_bytes_on_disk = 3.0;
3554 sample_bytes_on_disk = 2.0;
3558 /* impossible, but keep some gcc versions happy */
3559 fatal << string_compose (_("programming error: %1"),
3560 X_("illegal native file data format"))
3565 double scale = 4096.0 / sample_bytes_on_disk;
3567 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3568 return max_framecnt;
3571 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3575 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3578 RCUWriter<BundleList> writer (_bundles);
3579 boost::shared_ptr<BundleList> b = writer.get_copy ();
3580 b->push_back (bundle);
3583 BundleAdded (bundle); /* EMIT SIGNAL */
3589 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3591 bool removed = false;
3594 RCUWriter<BundleList> writer (_bundles);
3595 boost::shared_ptr<BundleList> b = writer.get_copy ();
3596 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3598 if (i != b->end()) {
3605 BundleRemoved (bundle); /* EMIT SIGNAL */
3611 boost::shared_ptr<Bundle>
3612 Session::bundle_by_name (string name) const
3614 boost::shared_ptr<BundleList> b = _bundles.reader ();
3616 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3617 if ((*i)->name() == name) {
3622 return boost::shared_ptr<Bundle> ();
3626 Session::tempo_map_changed (const PropertyChange&)
3630 playlists->update_after_tempo_map_change ();
3632 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3638 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3640 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3641 (*i)->recompute_frames_from_bbt ();
3645 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3646 * the given count with the current block size.
3649 Session::ensure_buffers (ChanCount howmany)
3651 BufferManager::ensure_buffers (howmany);
3655 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3657 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3658 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3663 Session::next_insert_id ()
3665 /* this doesn't really loop forever. just think about it */
3668 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3669 if (!insert_bitset[n]) {
3670 insert_bitset[n] = true;
3676 /* none available, so resize and try again */
3678 insert_bitset.resize (insert_bitset.size() + 16, false);
3683 Session::next_send_id ()
3685 /* this doesn't really loop forever. just think about it */
3688 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3689 if (!send_bitset[n]) {
3690 send_bitset[n] = true;
3696 /* none available, so resize and try again */
3698 send_bitset.resize (send_bitset.size() + 16, false);
3703 Session::next_aux_send_id ()
3705 /* this doesn't really loop forever. just think about it */
3708 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
3709 if (!aux_send_bitset[n]) {
3710 aux_send_bitset[n] = true;
3716 /* none available, so resize and try again */
3718 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
3723 Session::next_return_id ()
3725 /* this doesn't really loop forever. just think about it */
3728 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3729 if (!return_bitset[n]) {
3730 return_bitset[n] = true;
3736 /* none available, so resize and try again */
3738 return_bitset.resize (return_bitset.size() + 16, false);
3743 Session::mark_send_id (uint32_t id)
3745 if (id >= send_bitset.size()) {
3746 send_bitset.resize (id+16, false);
3748 if (send_bitset[id]) {
3749 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3751 send_bitset[id] = true;
3755 Session::mark_aux_send_id (uint32_t id)
3757 if (id >= aux_send_bitset.size()) {
3758 aux_send_bitset.resize (id+16, false);
3760 if (aux_send_bitset[id]) {
3761 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
3763 aux_send_bitset[id] = true;
3767 Session::mark_return_id (uint32_t id)
3769 if (id >= return_bitset.size()) {
3770 return_bitset.resize (id+16, false);
3772 if (return_bitset[id]) {
3773 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3775 return_bitset[id] = true;
3779 Session::mark_insert_id (uint32_t id)
3781 if (id >= insert_bitset.size()) {
3782 insert_bitset.resize (id+16, false);
3784 if (insert_bitset[id]) {
3785 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3787 insert_bitset[id] = true;
3791 Session::unmark_send_id (uint32_t id)
3793 if (id < send_bitset.size()) {
3794 send_bitset[id] = false;
3799 Session::unmark_aux_send_id (uint32_t id)
3801 if (id < aux_send_bitset.size()) {
3802 aux_send_bitset[id] = false;
3807 Session::unmark_return_id (uint32_t id)
3809 if (id < return_bitset.size()) {
3810 return_bitset[id] = false;
3815 Session::unmark_insert_id (uint32_t id)
3817 if (id < insert_bitset.size()) {
3818 insert_bitset[id] = false;
3823 /* Named Selection management */
3825 boost::shared_ptr<NamedSelection>
3826 Session::named_selection_by_name (string name)
3828 Glib::Mutex::Lock lm (named_selection_lock);
3829 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
3830 if ((*i)->name == name) {
3834 return boost::shared_ptr<NamedSelection>();
3838 Session::add_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3841 Glib::Mutex::Lock lm (named_selection_lock);
3842 named_selections.insert (named_selections.begin(), named_selection);
3847 NamedSelectionAdded (); /* EMIT SIGNAL */
3851 Session::remove_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3853 bool removed = false;
3856 Glib::Mutex::Lock lm (named_selection_lock);
3858 NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
3860 if (i != named_selections.end()) {
3861 named_selections.erase (i);
3868 NamedSelectionRemoved (); /* EMIT SIGNAL */
3873 Session::reset_native_file_format ()
3875 boost::shared_ptr<RouteList> rl = routes.reader ();
3876 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3877 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3879 /* don't save state as we do this, there's no point
3882 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3883 tr->reset_write_sources (false);
3884 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3890 Session::route_name_unique (string n) const
3892 boost::shared_ptr<RouteList> r = routes.reader ();
3894 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3895 if ((*i)->name() == n) {
3904 Session::route_name_internal (string n) const
3906 if (auditioner && auditioner->name() == n) {
3910 if (_click_io && _click_io->name() == n) {
3918 Session::freeze_all (InterThreadInfo& itt)
3920 boost::shared_ptr<RouteList> r = routes.reader ();
3922 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3924 boost::shared_ptr<Track> t;
3926 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3927 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3937 boost::shared_ptr<Region>
3938 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
3939 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3940 InterThreadInfo& itt,
3941 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
3944 boost::shared_ptr<Region> result;
3945 boost::shared_ptr<Playlist> playlist;
3946 boost::shared_ptr<AudioFileSource> fsource;
3948 char buf[PATH_MAX+1];
3949 ChanCount diskstream_channels (track.n_channels());
3950 framepos_t position;
3951 framecnt_t this_chunk;
3954 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3955 const string sound_dir = sdir.sound_path();
3956 framepos_t len = end - start;
3957 bool need_block_size_reset = false;
3959 ChanCount const max_proc = track.max_processor_streams ();
3962 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3963 end, start) << endmsg;
3967 const framecnt_t chunk_size = (256 * 1024)/4;
3969 // block all process callback handling
3971 block_processing ();
3973 /* call tree *MUST* hold route_lock */
3975 if ((playlist = track.playlist()) == 0) {
3979 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3981 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
3983 for (x = 0; x < 99999; ++x) {
3984 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());
3985 if (!Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
3991 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3996 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
3997 SourceFactory::createWritable (DataType::AUDIO, *this, buf, string(), false, frame_rate()));
4000 catch (failed_constructor& err) {
4001 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
4005 srcs.push_back (fsource);
4008 /* tell redirects that care that we are about to use a much larger
4009 * blocksize. this will flush all plugins too, so that they are ready
4010 * to be used for this process.
4013 need_block_size_reset = true;
4014 track.set_block_size (chunk_size);
4019 /* create a set of reasonably-sized buffers */
4020 buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
4021 buffers.set_count (max_proc);
4023 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4024 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4026 afs->prepare_for_peakfile_writes ();
4029 while (to_do && !itt.cancel) {
4031 this_chunk = min (to_do, chunk_size);
4033 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export)) {
4038 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4039 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4042 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
4048 start += this_chunk;
4049 to_do -= this_chunk;
4051 itt.progress = (float) (1.0 - ((double) to_do / len));
4060 xnow = localtime (&now);
4062 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
4063 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4066 afs->update_header (position, *xnow, now);
4067 afs->flush_header ();
4071 /* construct a region to represent the bounced material */
4075 plist.add (Properties::start, 0);
4076 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4077 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4079 result = RegionFactory::create (srcs, plist);
4085 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4086 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4089 afs->mark_for_remove ();
4092 (*src)->drop_references ();
4096 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4097 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4100 afs->done_with_peakfile_writes ();
4105 if (need_block_size_reset) {
4106 track.set_block_size (get_block_size());
4109 unblock_processing ();
4115 Session::gain_automation_buffer() const
4117 return ProcessThread::gain_automation_buffer ();
4121 Session::send_gain_automation_buffer() const
4123 return ProcessThread::send_gain_automation_buffer ();
4127 Session::pan_automation_buffer() const
4129 return ProcessThread::pan_automation_buffer ();
4133 Session::get_silent_buffers (ChanCount count)
4135 return ProcessThread::get_silent_buffers (count);
4139 Session::get_scratch_buffers (ChanCount count)
4141 return ProcessThread::get_scratch_buffers (count);
4145 Session::get_mix_buffers (ChanCount count)
4147 return ProcessThread::get_mix_buffers (count);
4151 Session::ntracks () const
4154 boost::shared_ptr<RouteList> r = routes.reader ();
4156 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4157 if (boost::dynamic_pointer_cast<Track> (*i)) {
4166 Session::nbusses () const
4169 boost::shared_ptr<RouteList> r = routes.reader ();
4171 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4172 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
4181 Session::add_automation_list(AutomationList *al)
4183 automation_lists[al->id()] = al;
4187 Session::sync_order_keys (std::string const & base)
4189 if (deletion_in_progress()) {
4193 if (!Config->get_sync_all_route_ordering()) {
4194 /* leave order keys as they are */
4198 boost::shared_ptr<RouteList> r = routes.reader ();
4200 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4201 (*i)->sync_order_keys (base);
4204 Route::SyncOrderKeys (base); // EMIT SIGNAL
4206 /* this might not do anything */
4208 set_remote_control_ids ();
4211 /** @return true if there is at least one record-enabled track, otherwise false */
4213 Session::have_rec_enabled_track () const
4215 return g_atomic_int_get (&_have_rec_enabled_track) == 1;
4218 /** Update the state of our rec-enabled tracks flag */
4220 Session::update_have_rec_enabled_track ()
4222 boost::shared_ptr<RouteList> rl = routes.reader ();
4223 RouteList::iterator i = rl->begin();
4224 while (i != rl->end ()) {
4226 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4227 if (tr && tr->record_enabled ()) {
4234 int const old = g_atomic_int_get (&_have_rec_enabled_track);
4236 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4238 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4239 RecordStateChanged (); /* EMIT SIGNAL */
4244 Session::listen_position_changed ()
4246 boost::shared_ptr<RouteList> r = routes.reader ();
4248 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4249 (*i)->listen_position_changed ();
4254 Session::solo_control_mode_changed ()
4256 /* cancel all solo or all listen when solo control mode changes */
4259 set_solo (get_routes(), false);
4260 } else if (listening()) {
4261 set_listen (get_routes(), false);
4265 /** Called when a property of one of our route groups changes */
4267 Session::route_group_property_changed (RouteGroup* rg)
4269 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4272 /** Called when a route is added to one of our route groups */
4274 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4276 RouteAddedToRouteGroup (rg, r);
4279 /** Called when a route is removed from one of our route groups */
4281 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4283 RouteRemovedFromRouteGroup (rg, r);
4287 Session::get_available_sync_options () const
4289 vector<SyncSource> ret;
4291 ret.push_back (JACK);
4292 ret.push_back (MTC);
4293 ret.push_back (MIDIClock);
4298 boost::shared_ptr<RouteList>
4299 Session::get_routes_with_regions_at (framepos_t const p) const
4301 boost::shared_ptr<RouteList> r = routes.reader ();
4302 boost::shared_ptr<RouteList> rl (new RouteList);
4304 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4305 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4310 boost::shared_ptr<Playlist> pl = tr->playlist ();
4315 if (pl->has_region_at (p)) {
4324 Session::goto_end ()
4326 if (_session_range_location) {
4327 request_locate (_session_range_location->end(), false);
4329 request_locate (0, false);
4334 Session::goto_start ()
4336 if (_session_range_location) {
4337 request_locate (_session_range_location->start(), false);
4339 request_locate (0, false);
4344 Session::current_start_frame () const
4346 return _session_range_location ? _session_range_location->start() : 0;
4350 Session::current_end_frame () const
4352 return _session_range_location ? _session_range_location->end() : 0;
4356 Session::add_session_range_location (framepos_t start, framepos_t end)
4358 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4359 _locations->add (_session_range_location);
4362 /** Called when one of our routes' order keys has changed */
4364 Session::route_order_key_changed ()
4366 RouteOrderKeyChanged (); /* EMIT SIGNAL */
4370 Session::step_edit_status_change (bool yn)
4376 send = (_step_editors == 0);
4381 send = (_step_editors == 1);
4384 if (_step_editors > 0) {
4390 StepEditStatusChange (val);
4396 Session::start_time_changed (framepos_t old)
4398 /* Update the auto loop range to match the session range
4399 (unless the auto loop range has been changed by the user)
4402 Location* s = _locations->session_range_location ();
4407 Location* l = _locations->auto_loop_location ();
4409 if (l && l->start() == old) {
4410 l->set_start (s->start(), true);
4415 Session::end_time_changed (framepos_t old)
4417 /* Update the auto loop range to match the session range
4418 (unless the auto loop range has been changed by the user)
4421 Location* s = _locations->session_range_location ();
4426 Location* l = _locations->auto_loop_location ();
4428 if (l && l->end() == old) {
4429 l->set_end (s->end(), true);
4434 Session::source_search_path (DataType type) const
4438 if (session_dirs.size() == 1) {
4440 case DataType::AUDIO:
4441 s.push_back ( _session_dir->sound_path());
4443 case DataType::MIDI:
4444 s.push_back (_session_dir->midi_path());
4448 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4449 SessionDirectory sdir (i->path);
4451 case DataType::AUDIO:
4452 s.push_back (sdir.sound_path());
4454 case DataType::MIDI:
4455 s.push_back (sdir.midi_path());
4461 /* now check the explicit (possibly user-specified) search path
4464 vector<string> dirs;
4467 case DataType::AUDIO:
4468 split (config.get_audio_search_path (), dirs, ':');
4470 case DataType::MIDI:
4471 split (config.get_midi_search_path (), dirs, ':');
4475 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4477 vector<string>::iterator si;
4479 for (si = s.begin(); si != s.end(); ++si) {
4485 if (si == s.end()) {
4492 for (vector<string>::iterator si = s.begin(); si != s.end(); ++si) {
4493 if (!search_path.empty()) {
4503 Session::ensure_search_path_includes (const string& path, DataType type)
4506 vector<string> dirs;
4513 case DataType::AUDIO:
4514 search_path = config.get_audio_search_path ();
4516 case DataType::MIDI:
4517 search_path = config.get_midi_search_path ();
4521 split (search_path, dirs, ':');
4523 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4524 /* No need to add this new directory if it has the same inode as
4525 an existing one; checking inode rather than name prevents duplicated
4526 directories when we are using symlinks.
4528 On Windows, I think we could just do if (*i == path) here.
4530 if (PBD::equivalent_paths (*i, path)) {
4535 if (!search_path.empty()) {
4539 search_path += path;
4542 case DataType::AUDIO:
4543 config.set_audio_search_path (search_path);
4545 case DataType::MIDI:
4546 config.set_midi_search_path (search_path);
4551 boost::shared_ptr<Speakers>
4552 Session::get_speakers()
4558 Session::unknown_processors () const
4562 boost::shared_ptr<RouteList> r = routes.reader ();
4563 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4564 list<string> t = (*i)->unknown_processors ();
4565 copy (t.begin(), t.end(), back_inserter (p));
4575 Session::update_latency (bool playback)
4577 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
4579 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4583 boost::shared_ptr<RouteList> r = routes.reader ();
4584 framecnt_t max_latency = 0;
4587 /* reverse the list so that we work backwards from the last route to run to the first */
4588 RouteList* rl = routes.reader().get();
4589 r.reset (new RouteList (*rl));
4590 reverse (r->begin(), r->end());
4593 /* compute actual latency values for the given direction and store them all in per-port
4594 structures. this will also publish the same values (to JACK) so that computation of latency
4595 for routes can consistently use public latency values.
4598 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4599 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
4602 /* because we latency compensate playback, our published playback latencies should
4603 be the same for all output ports - all material played back by ardour has
4604 the same latency, whether its caused by plugins or by latency compensation. since
4605 these may differ from the values computed above, reset all playback port latencies
4609 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
4611 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4612 (*i)->set_public_port_latencies (max_latency, playback);
4617 post_playback_latency ();
4621 post_capture_latency ();
4624 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
4628 Session::post_playback_latency ()
4630 set_worst_playback_latency ();
4632 boost::shared_ptr<RouteList> r = routes.reader ();
4634 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4635 if (!(*i)->is_hidden() && ((*i)->active())) {
4636 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
4640 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4641 (*i)->set_latency_compensation (_worst_track_latency);
4646 Session::post_capture_latency ()
4648 set_worst_capture_latency ();
4650 /* reflect any changes in capture latencies into capture offsets
4653 boost::shared_ptr<RouteList> rl = routes.reader();
4654 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4655 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4657 tr->set_capture_offset ();
4663 Session::initialize_latencies ()
4666 Glib::Mutex::Lock lm (_engine.process_lock());
4667 update_latency (false);
4668 update_latency (true);
4671 set_worst_io_latencies ();
4675 Session::set_worst_io_latencies ()
4677 set_worst_playback_latency ();
4678 set_worst_capture_latency ();
4682 Session::set_worst_playback_latency ()
4684 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4688 _worst_output_latency = 0;
4690 if (!_engine.connected()) {
4694 boost::shared_ptr<RouteList> r = routes.reader ();
4696 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4697 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
4700 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
4704 Session::set_worst_capture_latency ()
4706 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4710 _worst_input_latency = 0;
4712 if (!_engine.connected()) {
4716 boost::shared_ptr<RouteList> r = routes.reader ();
4718 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4719 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
4722 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
4726 Session::update_latency_compensation (bool force_whole_graph)
4728 bool some_track_latency_changed = false;
4730 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4734 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
4736 _worst_track_latency = 0;
4738 boost::shared_ptr<RouteList> r = routes.reader ();
4740 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4741 if (!(*i)->is_hidden() && ((*i)->active())) {
4743 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
4744 some_track_latency_changed = true;
4746 _worst_track_latency = max (tl, _worst_track_latency);
4750 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
4751 (some_track_latency_changed ? "yes" : "no")));
4753 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
4755 if (some_track_latency_changed || force_whole_graph) {
4756 _engine.update_latencies ();
4760 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4761 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4765 tr->set_capture_offset ();
4770 Session::session_name_is_legal (const string& path)
4772 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
4774 for (int i = 0; illegal_chars[i]; ++i) {
4775 if (path.find (illegal_chars[i]) != string::npos) {
4776 return illegal_chars[i];
4784 Session::next_control_id () const
4786 return ntracks() + nbusses() + 1;
4790 Session::operation_in_progress (GQuark op) const
4792 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());