2 Copyright (C) 1999-2010 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #include <cstdio> /* sprintf(3) ... grrr */
33 #include <glibmm/threads.h>
34 #include <glibmm/miscutils.h>
35 #include <glibmm/fileutils.h>
37 #include <boost/algorithm/string/erase.hpp>
39 #include "pbd/error.h"
40 #include "pbd/boost_debug.h"
41 #include "pbd/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/unwind.h"
50 #include "ardour/amp.h"
51 #include "ardour/analyser.h"
52 #include "ardour/audio_buffer.h"
53 #include "ardour/audio_diskstream.h"
54 #include "ardour/audio_port.h"
55 #include "ardour/audio_track.h"
56 #include "ardour/audioengine.h"
57 #include "ardour/audiofilesource.h"
58 #include "ardour/auditioner.h"
59 #include "ardour/buffer_manager.h"
60 #include "ardour/buffer_set.h"
61 #include "ardour/bundle.h"
62 #include "ardour/butler.h"
63 #include "ardour/click.h"
64 #include "ardour/control_protocol_manager.h"
65 #include "ardour/data_type.h"
66 #include "ardour/debug.h"
67 #include "ardour/filename_extensions.h"
68 #include "ardour/graph.h"
69 #include "ardour/midi_track.h"
70 #include "ardour/midi_ui.h"
71 #include "ardour/operations.h"
72 #include "ardour/playlist.h"
73 #include "ardour/plugin.h"
74 #include "ardour/plugin_insert.h"
75 #include "ardour/process_thread.h"
76 #include "ardour/rc_configuration.h"
77 #include "ardour/recent_sessions.h"
78 #include "ardour/region.h"
79 #include "ardour/region_factory.h"
80 #include "ardour/route_graph.h"
81 #include "ardour/route_group.h"
82 #include "ardour/send.h"
83 #include "ardour/session.h"
84 #include "ardour/session_directory.h"
85 #include "ardour/session_playlists.h"
86 #include "ardour/smf_source.h"
87 #include "ardour/source_factory.h"
88 #include "ardour/utils.h"
90 #include "midi++/port.h"
91 #include "midi++/jack_midi_port.h"
92 #include "midi++/mmc.h"
93 #include "midi++/manager.h"
104 using namespace ARDOUR;
107 bool Session::_disable_all_loaded_plugins = false;
109 PBD::Signal1<void,std::string> Session::Dialog;
110 PBD::Signal0<int> Session::AskAboutPendingState;
111 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
112 PBD::Signal0<void> Session::SendFeedback;
113 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
115 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
116 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
117 PBD::Signal2<void,std::string, std::string> Session::Exported;
118 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
119 PBD::Signal0<void> Session::Quit;
120 PBD::Signal0<void> Session::FeedbackDetected;
121 PBD::Signal0<void> Session::SuccessfulGraphSort;
122 PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
124 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
125 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
127 /** @param snapshot_name Snapshot name, without .ardour suffix */
128 Session::Session (AudioEngine &eng,
129 const string& fullpath,
130 const string& snapshot_name,
131 BusProfile* bus_profile,
134 , _target_transport_speed (0.0)
135 , _requested_return_frame (-1)
136 , _under_nsm_control (false)
137 , _session_dir (new SessionDirectory(fullpath))
139 , _state_of_the_state (Clean)
140 , _butler (new Butler (*this))
141 , _post_transport_work (0)
142 , _send_timecode_update (false)
143 , _all_route_group (new RouteGroup (*this, "all"))
144 , routes (new RouteList)
145 , _total_free_4k_blocks (0)
146 , _total_free_4k_blocks_uncertain (false)
147 , _bundles (new BundleList)
148 , _bundle_xml_node (0)
151 , click_emphasis_data (0)
153 , _have_rec_enabled_track (false)
154 , _suspend_timecode_transmission (0)
156 _locations = new Locations (*this);
159 if (how_many_dsp_threads () > 1) {
160 /* For now, only create the graph if we are using >1 DSP threads, as
161 it is a bit slower than the old code with 1 thread.
163 _process_graph.reset (new Graph (*this));
166 playlists.reset (new SessionPlaylists);
168 _all_route_group->set_active (true, this);
170 interpolation.add_channel_to (0, 0);
172 if (!eng.connected()) {
173 throw failed_constructor();
176 n_physical_outputs = _engine.n_physical_outputs ();
177 n_physical_inputs = _engine.n_physical_inputs ();
179 first_stage_init (fullpath, snapshot_name);
181 _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
184 if (create (mix_template, bus_profile)) {
186 throw failed_constructor ();
190 if (second_stage_init ()) {
192 throw failed_constructor ();
195 store_recent_sessions(_name, _path);
197 bool was_dirty = dirty();
199 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
201 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
202 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
205 DirtyChanged (); /* EMIT SIGNAL */
208 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
209 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
225 vector<void*> debug_pointers;
227 /* if we got to here, leaving pending capture state around
231 remove_pending_capture_state ();
233 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
235 /* disconnect from any and all signals that we are connected to */
239 _engine.remove_session ();
241 /* deregister all ports - there will be no process or any other
242 * callbacks from the engine any more.
245 Port::PortDrop (); /* EMIT SIGNAL */
249 /* clear history so that no references to objects are held any more */
253 /* clear state tree so that no references to objects are held any more */
257 /* reset dynamic state version back to default */
259 Stateful::loading_state_version = 0;
261 _butler->drop_references ();
265 delete midi_control_ui;
266 delete _all_route_group;
268 if (click_data != default_click) {
269 delete [] click_data;
272 if (click_emphasis_data != default_click_emphasis) {
273 delete [] click_emphasis_data;
278 /* clear out any pending dead wood from RCU managed objects */
283 AudioDiskstream::free_working_buffers();
285 /* tell everyone who is still standing that we're about to die */
288 /* tell everyone to drop references and delete objects as we go */
290 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
291 RegionFactory::delete_all_regions ();
293 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
295 /* reset these three references to special routes before we do the usual route delete thing */
298 _master_out.reset ();
299 _monitor_out.reset ();
302 RCUWriter<RouteList> writer (routes);
303 boost::shared_ptr<RouteList> r = writer.get_copy ();
305 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
306 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
307 (*i)->drop_references ();
311 /* writer goes out of scope and updates master */
315 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
316 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
317 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
318 i->second->drop_references ();
323 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
324 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
329 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
334 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
336 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
337 boost_debug_list_ptrs ();
342 Session::when_engine_running ()
344 string first_physical_output;
346 BootMessage (_("Set block size and sample rate"));
348 set_block_size (_engine.frames_per_cycle());
349 set_frame_rate (_engine.frame_rate());
351 BootMessage (_("Using configuration"));
353 boost::function<void (std::string)> ff (boost::bind (&Session::config_changed, this, _1, false));
354 boost::function<void (std::string)> ft (boost::bind (&Session::config_changed, this, _1, true));
356 Config->map_parameters (ff);
357 config.map_parameters (ft);
359 /* every time we reconnect, recompute worst case output latencies */
361 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
363 if (synced_to_jack()) {
364 _engine.transport_stop ();
367 if (config.get_jack_time_master()) {
368 _engine.transport_locate (_transport_frame);
376 _ltc_input.reset (new IO (*this, _("LTC In"), IO::Input));
377 _ltc_output.reset (new IO (*this, _("LTC Out"), IO::Output));
379 if (state_tree && (child = find_named_node (*state_tree->root(), "LTC-In")) != 0) {
380 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
383 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
384 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
386 reconnect_ltc_input ();
389 if (state_tree && (child = find_named_node (*state_tree->root(), "LTC-Out")) != 0) {
390 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
393 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
394 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
396 reconnect_ltc_output ();
399 /* fix up names of LTC ports because we don't want the normal
400 * IO style of NAME/TYPE-{in,out}N
403 _ltc_input->nth (0)->set_name (_("LTC-in"));
404 _ltc_output->nth (0)->set_name (_("LTC-out"));
406 _click_io.reset (new ClickIO (*this, "click"));
407 _click_gain.reset (new Amp (*this));
408 _click_gain->activate ();
410 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
412 /* existing state for Click */
415 if (Stateful::loading_state_version < 3000) {
416 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
418 const XMLNodeList& children (child->children());
419 XMLNodeList::const_iterator i = children.begin();
420 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
422 if (i != children.end()) {
423 c = _click_gain->set_state (**i, Stateful::loading_state_version);
429 _clicking = Config->get_clicking ();
433 error << _("could not setup Click I/O") << endmsg;
440 /* default state for Click: dual-mono to first 2 physical outputs */
443 _engine.get_physical_outputs (DataType::AUDIO, outs);
445 for (uint32_t physport = 0; physport < 2; ++physport) {
446 if (outs.size() > physport) {
447 if (_click_io->add_port (outs[physport], this)) {
448 // relax, even though its an error
453 if (_click_io->n_ports () > ChanCount::ZERO) {
454 _clicking = Config->get_clicking ();
459 catch (failed_constructor& err) {
460 error << _("cannot setup Click I/O") << endmsg;
463 BootMessage (_("Compute I/O Latencies"));
466 // XXX HOW TO ALERT UI TO THIS ? DO WE NEED TO?
469 BootMessage (_("Set up standard connections"));
471 vector<string> inputs[DataType::num_types];
472 vector<string> outputs[DataType::num_types];
473 for (uint32_t i = 0; i < DataType::num_types; ++i) {
474 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
475 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
478 /* Create a set of Bundle objects that map
479 to the physical I/O currently available. We create both
480 mono and stereo bundles, so that the common cases of mono
481 and stereo tracks get bundles to put in their mixer strip
482 in / out menus. There may be a nicer way of achieving that;
483 it doesn't really scale that well to higher channel counts
486 /* mono output bundles */
488 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
490 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
492 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
493 c->add_channel (_("mono"), DataType::AUDIO);
494 c->set_port (0, outputs[DataType::AUDIO][np]);
499 /* stereo output bundles */
501 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
502 if (np + 1 < outputs[DataType::AUDIO].size()) {
504 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
505 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
506 c->add_channel (_("L"), DataType::AUDIO);
507 c->set_port (0, outputs[DataType::AUDIO][np]);
508 c->add_channel (_("R"), DataType::AUDIO);
509 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
515 /* mono input bundles */
517 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
519 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
521 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
522 c->add_channel (_("mono"), DataType::AUDIO);
523 c->set_port (0, inputs[DataType::AUDIO][np]);
528 /* stereo input bundles */
530 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
531 if (np + 1 < inputs[DataType::AUDIO].size()) {
533 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
535 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
536 c->add_channel (_("L"), DataType::AUDIO);
537 c->set_port (0, inputs[DataType::AUDIO][np]);
538 c->add_channel (_("R"), DataType::AUDIO);
539 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
545 /* MIDI input bundles */
547 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
548 string n = inputs[DataType::MIDI][np];
549 boost::erase_first (n, X_("alsa_pcm:"));
551 boost::shared_ptr<Bundle> c (new Bundle (n, false));
552 c->add_channel ("", DataType::MIDI);
553 c->set_port (0, inputs[DataType::MIDI][np]);
557 /* MIDI output bundles */
559 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
560 string n = outputs[DataType::MIDI][np];
561 boost::erase_first (n, X_("alsa_pcm:"));
563 boost::shared_ptr<Bundle> c (new Bundle (n, true));
564 c->add_channel ("", DataType::MIDI);
565 c->set_port (0, outputs[DataType::MIDI][np]);
569 BootMessage (_("Setup signal flow and plugins"));
571 /* Reset all panners */
573 Delivery::reset_panners ();
575 /* this will cause the CPM to instantiate any protocols that are in use
576 * (or mandatory), which will pass it this Session, and then call
577 * set_state() on each instantiated protocol to match stored state.
580 ControlProtocolManager::instance().set_session (this);
582 /* This must be done after the ControlProtocolManager set_session above,
583 as it will set states for ports which the ControlProtocolManager creates.
586 MIDI::Manager::instance()->set_port_states (Config->midi_port_states ());
588 /* And this must be done after the MIDI::Manager::set_port_states as
589 * it will try to make connections whose details are loaded by set_port_states.
594 /* Let control protocols know that we are now all connected, so they
595 * could start talking to surfaces if they want to.
598 ControlProtocolManager::instance().midi_connectivity_established ();
600 if (_is_new && !no_auto_connect()) {
601 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock());
602 auto_connect_master_bus ();
605 _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
607 /* update latencies */
609 initialize_latencies ();
611 /* hook us up to the engine */
613 BootMessage (_("Connect to engine"));
614 _engine.set_session (this);
615 _engine.reset_timebase ();
619 Session::auto_connect_master_bus ()
621 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
625 /* if requested auto-connect the outputs to the first N physical ports.
628 uint32_t limit = _master_out->n_outputs().n_total();
629 vector<string> outputs[DataType::num_types];
631 for (uint32_t i = 0; i < DataType::num_types; ++i) {
632 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
635 for (uint32_t n = 0; n < limit; ++n) {
636 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
638 if (outputs[p->type()].size() > n) {
639 connect_to = outputs[p->type()][n];
642 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
643 if (_master_out->output()->connect (p, connect_to, this)) {
644 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
653 Session::remove_monitor_section ()
659 /* force reversion to Solo-In-Place */
660 Config->set_solo_control_is_listen_control (false);
663 /* Hold process lock while doing this so that we don't hear bits and
664 * pieces of audio as we work on each route.
667 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
669 /* Connect tracks to monitor section. Note that in an
670 existing session, the internal sends will already exist, but we want the
671 routes to notice that they connect to the control out specifically.
675 boost::shared_ptr<RouteList> r = routes.reader ();
676 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
678 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
680 if ((*x)->is_monitor()) {
682 } else if ((*x)->is_master()) {
685 (*x)->remove_aux_or_listen (_monitor_out);
690 remove_route (_monitor_out);
691 auto_connect_master_bus ();
695 Session::add_monitor_section ()
699 if (_monitor_out || !_master_out) {
703 boost::shared_ptr<Route> r (new Route (*this, _("monitor"), Route::MonitorOut, DataType::AUDIO));
709 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
710 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
713 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
714 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
715 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
719 add_routes (rl, false, false, false);
721 assert (_monitor_out);
723 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
724 are undefined, at best.
727 uint32_t limit = _monitor_out->n_inputs().n_audio();
731 /* connect the inputs to the master bus outputs. this
732 * represents a separate data feed from the internal sends from
733 * each route. as of jan 2011, it allows the monitor section to
734 * conditionally ignore either the internal sends or the normal
735 * input feed, but we should really find a better way to do
739 _master_out->output()->disconnect (this);
741 for (uint32_t n = 0; n < limit; ++n) {
742 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
743 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
746 string connect_to = o->name();
747 if (_monitor_out->input()->connect (p, connect_to, this)) {
748 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
756 /* if monitor section is not connected, connect it to physical outs
759 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
761 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
763 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
766 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
768 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
769 Config->get_monitor_bus_preferred_bundle())
775 /* Monitor bus is audio only */
777 uint32_t mod = n_physical_outputs.get (DataType::AUDIO);
778 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
779 vector<string> outputs[DataType::num_types];
781 for (uint32_t i = 0; i < DataType::num_types; ++i) {
782 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
788 for (uint32_t n = 0; n < limit; ++n) {
790 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
792 if (outputs[DataType::AUDIO].size() > (n % mod)) {
793 connect_to = outputs[DataType::AUDIO][n % mod];
796 if (!connect_to.empty()) {
797 if (_monitor_out->output()->connect (p, connect_to, this)) {
798 error << string_compose (
799 _("cannot connect control output %1 to %2"),
810 /* Hold process lock while doing this so that we don't hear bits and
811 * pieces of audio as we work on each route.
814 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
816 /* Connect tracks to monitor section. Note that in an
817 existing session, the internal sends will already exist, but we want the
818 routes to notice that they connect to the control out specifically.
822 boost::shared_ptr<RouteList> rls = routes.reader ();
824 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
826 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
828 if ((*x)->is_monitor()) {
830 } else if ((*x)->is_master()) {
833 (*x)->enable_monitor_send ();
839 Session::hookup_io ()
841 /* stop graph reordering notifications from
842 causing resorts, etc.
845 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
849 /* we delay creating the auditioner till now because
850 it makes its own connections to ports.
854 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
856 throw failed_constructor ();
858 a->use_new_diskstream ();
862 catch (failed_constructor& err) {
863 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
867 /* load bundles, which we may have postponed earlier on */
868 if (_bundle_xml_node) {
869 load_bundles (*_bundle_xml_node);
870 delete _bundle_xml_node;
873 /* Tell all IO objects to connect themselves together */
875 IO::enable_connecting ();
876 MIDI::JackMIDIPort::MakeConnections ();
878 /* Anyone who cares about input state, wake up and do something */
880 IOConnectionsComplete (); /* EMIT SIGNAL */
882 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
884 /* now handle the whole enchilada as if it was one
890 /* update the full solo state, which can't be
891 correctly determined on a per-route basis, but
892 needs the global overview that only the session
896 update_route_solo_state ();
900 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
902 boost::shared_ptr<Track> track = wp.lock ();
907 boost::shared_ptr<Playlist> playlist;
909 if ((playlist = track->playlist()) != 0) {
910 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
911 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
912 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
917 Session::record_enabling_legal () const
919 /* this used to be in here, but survey says.... we don't need to restrict it */
920 // if (record_status() == Recording) {
924 if (Config->get_all_safe()) {
931 Session::set_track_monitor_input_status (bool yn)
933 boost::shared_ptr<RouteList> rl = routes.reader ();
934 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
935 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
936 if (tr && tr->record_enabled ()) {
937 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
938 tr->request_jack_monitors_input (yn);
944 Session::auto_punch_start_changed (Location* location)
946 replace_event (SessionEvent::PunchIn, location->start());
948 if (get_record_enabled() && config.get_punch_in()) {
949 /* capture start has been changed, so save new pending state */
950 save_state ("", true);
955 Session::auto_punch_end_changed (Location* location)
957 framepos_t when_to_stop = location->end();
958 // when_to_stop += _worst_output_latency + _worst_input_latency;
959 replace_event (SessionEvent::PunchOut, when_to_stop);
963 Session::auto_punch_changed (Location* location)
965 framepos_t when_to_stop = location->end();
967 replace_event (SessionEvent::PunchIn, location->start());
968 //when_to_stop += _worst_output_latency + _worst_input_latency;
969 replace_event (SessionEvent::PunchOut, when_to_stop);
972 /** @param loc A loop location.
973 * @param pos Filled in with the start time of the required fade-out (in session frames).
974 * @param length Filled in with the length of the required fade-out.
977 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
979 pos = max (loc->start(), loc->end() - 64);
980 length = loc->end() - pos;
984 Session::auto_loop_changed (Location* location)
986 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
989 auto_loop_declick_range (location, dcp, dcl);
990 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
992 if (transport_rolling() && play_loop) {
995 // if (_transport_frame > location->end()) {
997 if (_transport_frame < location->start() || _transport_frame > location->end()) {
998 // relocate to beginning of loop
999 clear_events (SessionEvent::LocateRoll);
1001 request_locate (location->start(), true);
1004 else if (Config->get_seamless_loop() && !loop_changing) {
1006 // schedule a locate-roll to refill the diskstreams at the
1007 // previous loop end
1008 loop_changing = true;
1010 if (location->end() > last_loopend) {
1011 clear_events (SessionEvent::LocateRoll);
1012 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1019 last_loopend = location->end();
1023 Session::set_auto_punch_location (Location* location)
1027 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1028 punch_connections.drop_connections();
1029 existing->set_auto_punch (false, this);
1030 remove_event (existing->start(), SessionEvent::PunchIn);
1031 clear_events (SessionEvent::PunchOut);
1032 auto_punch_location_changed (0);
1037 if (location == 0) {
1041 if (location->end() <= location->start()) {
1042 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1046 punch_connections.drop_connections ();
1048 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
1049 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
1050 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
1052 location->set_auto_punch (true, this);
1054 auto_punch_changed (location);
1056 auto_punch_location_changed (location);
1060 Session::set_auto_loop_location (Location* location)
1064 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1065 loop_connections.drop_connections ();
1066 existing->set_auto_loop (false, this);
1067 remove_event (existing->end(), SessionEvent::AutoLoop);
1070 auto_loop_declick_range (existing, dcp, dcl);
1071 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1072 auto_loop_location_changed (0);
1077 if (location == 0) {
1081 if (location->end() <= location->start()) {
1082 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1086 last_loopend = location->end();
1088 loop_connections.drop_connections ();
1090 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1091 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1092 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1094 location->set_auto_loop (true, this);
1096 /* take care of our stuff first */
1098 auto_loop_changed (location);
1100 /* now tell everyone else */
1102 auto_loop_location_changed (location);
1106 Session::locations_added (Location *)
1112 Session::locations_changed ()
1114 _locations->apply (*this, &Session::handle_locations_changed);
1118 Session::handle_locations_changed (Locations::LocationList& locations)
1120 Locations::LocationList::iterator i;
1122 bool set_loop = false;
1123 bool set_punch = false;
1125 for (i = locations.begin(); i != locations.end(); ++i) {
1129 if (location->is_auto_punch()) {
1130 set_auto_punch_location (location);
1133 if (location->is_auto_loop()) {
1134 set_auto_loop_location (location);
1138 if (location->is_session_range()) {
1139 _session_range_location = location;
1144 set_auto_loop_location (0);
1147 set_auto_punch_location (0);
1154 Session::enable_record ()
1156 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1157 /* no recording at anything except normal speed */
1162 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1164 if (rs == Recording) {
1168 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1170 _last_record_location = _transport_frame;
1171 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1173 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1174 set_track_monitor_input_status (true);
1177 RecordStateChanged ();
1184 Session::disable_record (bool rt_context, bool force)
1188 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1190 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1191 g_atomic_int_set (&_record_status, Disabled);
1192 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1194 if (rs == Recording) {
1195 g_atomic_int_set (&_record_status, Enabled);
1199 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1200 set_track_monitor_input_status (false);
1203 RecordStateChanged (); /* emit signal */
1206 remove_pending_capture_state ();
1212 Session::step_back_from_record ()
1214 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1216 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1217 set_track_monitor_input_status (false);
1220 RecordStateChanged (); /* emit signal */
1225 Session::maybe_enable_record ()
1227 if (_step_editors > 0) {
1231 g_atomic_int_set (&_record_status, Enabled);
1233 /* This function is currently called from somewhere other than an RT thread.
1234 This save_state() call therefore doesn't impact anything. Doing it here
1235 means that we save pending state of which sources the next record will use,
1236 which gives us some chance of recovering from a crash during the record.
1239 save_state ("", true);
1241 if (_transport_speed) {
1242 if (!config.get_punch_in()) {
1246 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1247 RecordStateChanged (); /* EMIT SIGNAL */
1254 Session::audible_frame () const
1260 /* the first of these two possible settings for "offset"
1261 mean that the audible frame is stationary until
1262 audio emerges from the latency compensation
1265 the second means that the audible frame is stationary
1266 until audio would emerge from a physical port
1267 in the absence of any plugin latency compensation
1270 offset = worst_playback_latency ();
1272 if (offset > current_block_size) {
1273 offset -= current_block_size;
1275 /* XXX is this correct? if we have no external
1276 physical connections and everything is internal
1277 then surely this is zero? still, how
1278 likely is that anyway?
1280 offset = current_block_size;
1283 if (synced_to_jack()) {
1284 tf = _engine.transport_frame();
1286 tf = _transport_frame;
1291 if (!non_realtime_work_pending()) {
1295 /* Check to see if we have passed the first guaranteed
1296 audible frame past our last start position. if not,
1297 return that last start point because in terms
1298 of audible frames, we have not moved yet.
1300 `Start position' in this context means the time we last
1301 either started, located, or changed transport direction.
1304 if (_transport_speed > 0.0f) {
1306 if (!play_loop || !have_looped) {
1307 if (tf < _last_roll_or_reversal_location + offset) {
1308 return _last_roll_or_reversal_location;
1316 } else if (_transport_speed < 0.0f) {
1318 /* XXX wot? no backward looping? */
1320 if (tf > _last_roll_or_reversal_location - offset) {
1321 return _last_roll_or_reversal_location;
1333 Session::set_frame_rate (framecnt_t frames_per_second)
1335 /** \fn void Session::set_frame_size(framecnt_t)
1336 the AudioEngine object that calls this guarantees
1337 that it will not be called while we are also in
1338 ::process(). Its fine to do things that block
1342 _base_frame_rate = frames_per_second;
1348 // XXX we need some equivalent to this, somehow
1349 // SndFileSource::setup_standard_crossfades (frames_per_second);
1353 /* XXX need to reset/reinstantiate all LADSPA plugins */
1357 Session::set_block_size (pframes_t nframes)
1359 /* the AudioEngine guarantees
1360 that it will not be called while we are also in
1361 ::process(). It is therefore fine to do things that block
1366 current_block_size = nframes;
1370 boost::shared_ptr<RouteList> r = routes.reader ();
1372 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1373 (*i)->set_block_size (nframes);
1376 boost::shared_ptr<RouteList> rl = routes.reader ();
1377 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1378 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1380 tr->set_block_size (nframes);
1384 set_worst_io_latencies ();
1390 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1392 boost::shared_ptr<Route> r2;
1394 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1395 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1399 /* make a copy of the existing list of routes that feed r1 */
1401 Route::FedBy existing (r1->fed_by());
1403 /* for each route that feeds r1, recurse, marking it as feeding
1407 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1408 if (!(r2 = i->r.lock ())) {
1409 /* (*i) went away, ignore it */
1413 /* r2 is a route that feeds r1 which somehow feeds base. mark
1414 base as being fed by r2
1417 rbase->add_fed_by (r2, i->sends_only);
1421 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1425 if (r1->feeds (r2) && r2->feeds (r1)) {
1429 /* now recurse, so that we can mark base as being fed by
1430 all routes that feed r2
1433 trace_terminal (r2, rbase);
1440 Session::resort_routes ()
1442 /* don't do anything here with signals emitted
1443 by Routes during initial setup or while we
1444 are being destroyed.
1447 if (_state_of_the_state & (InitialConnecting | Deletion)) {
1452 RCUWriter<RouteList> writer (routes);
1453 boost::shared_ptr<RouteList> r = writer.get_copy ();
1454 resort_routes_using (r);
1455 /* writer goes out of scope and forces update */
1459 boost::shared_ptr<RouteList> rl = routes.reader ();
1460 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1461 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1463 const Route::FedBy& fb ((*i)->fed_by());
1465 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1466 boost::shared_ptr<Route> sf = f->r.lock();
1468 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1476 /** This is called whenever we need to rebuild the graph of how we will process
1478 * @param r List of routes, in any order.
1482 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1484 /* We are going to build a directed graph of our routes;
1485 this is where the edges of that graph are put.
1490 /* Go through all routes doing two things:
1492 * 1. Collect the edges of the route graph. Each of these edges
1493 * is a pair of routes, one of which directly feeds the other
1494 * either by a JACK connection or by an internal send.
1496 * 2. Begin the process of making routes aware of which other
1497 * routes directly or indirectly feed them. This information
1498 * is used by the solo code.
1501 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1503 /* Clear out the route's list of direct or indirect feeds */
1504 (*i)->clear_fed_by ();
1506 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
1508 bool via_sends_only;
1510 /* See if this *j feeds *i according to the current state of the JACK
1511 connections and internal sends.
1513 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
1514 /* add the edge to the graph (part #1) */
1515 edges.add (*j, *i, via_sends_only);
1516 /* tell the route (for part #2) */
1517 (*i)->add_fed_by (*j, via_sends_only);
1522 /* Attempt a topological sort of the route graph */
1523 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
1525 if (sorted_routes) {
1526 /* We got a satisfactory topological sort, so there is no feedback;
1529 Note: the process graph rechain does not require a
1530 topologically-sorted list, but hey ho.
1532 if (_process_graph) {
1533 _process_graph->rechain (sorted_routes, edges);
1536 _current_route_graph = edges;
1538 /* Complete the building of the routes' lists of what directly
1539 or indirectly feeds them.
1541 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1542 trace_terminal (*i, *i);
1545 *r = *sorted_routes;
1548 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1549 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1550 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1551 (*i)->name(), (*i)->order_key (MixerSort)));
1555 SuccessfulGraphSort (); /* EMIT SIGNAL */
1558 /* The topological sort failed, so we have a problem. Tell everyone
1559 and stick to the old graph; this will continue to be processed, so
1560 until the feedback is fixed, what is played back will not quite
1561 reflect what is actually connected. Note also that we do not
1562 do trace_terminal here, as it would fail due to an endless recursion,
1563 so the solo code will think that everything is still connected
1567 FeedbackDetected (); /* EMIT SIGNAL */
1572 /** Find a route name starting with \a base, maybe followed by the
1573 * lowest \a id. \a id will always be added if \a definitely_add_number
1574 * is true on entry; otherwise it will only be added if required
1575 * to make the name unique.
1577 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1578 * The available route name with the lowest ID will be used, and \a id
1579 * will be set to the ID.
1581 * \return false if a route name could not be found, and \a track_name
1582 * and \a id do not reflect a free route name.
1585 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1587 if (!definitely_add_number && route_by_name (base) == 0) {
1588 /* juse use the base */
1589 snprintf (name, name_len, "%s", base.c_str());
1594 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1596 if (route_by_name (name) == 0) {
1602 } while (id < (UINT_MAX-1));
1607 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
1609 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
1611 in = ChanCount::ZERO;
1612 out = ChanCount::ZERO;
1614 boost::shared_ptr<RouteList> r = routes.reader ();
1616 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1617 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1618 if (tr && !tr->is_auditioner()) {
1619 in += tr->n_inputs();
1620 out += tr->n_outputs();
1625 /** Caller must not hold process lock
1626 * @param name_template string to use for the start of the name, or "" to use "MIDI".
1627 * @param instrument plugin info for the instrument to insert pre-fader, if any
1629 list<boost::shared_ptr<MidiTrack> >
1630 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
1631 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1633 char track_name[32];
1634 uint32_t track_id = 0;
1636 RouteList new_routes;
1637 list<boost::shared_ptr<MidiTrack> > ret;
1639 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
1642 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1643 error << "cannot find name for new midi track" << endmsg;
1647 boost::shared_ptr<MidiTrack> track;
1650 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1652 if (track->init ()) {
1656 track->use_new_diskstream();
1658 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1659 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1662 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1663 if (track->input()->ensure_io (input, false, this)) {
1664 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
1668 if (track->output()->ensure_io (output, false, this)) {
1669 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
1674 track->non_realtime_input_change();
1677 route_group->add (track);
1680 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1682 if (Config->get_remote_model() == UserOrdered) {
1683 track->set_remote_control_id (next_control_id());
1686 new_routes.push_back (track);
1687 ret.push_back (track);
1690 catch (failed_constructor &err) {
1691 error << _("Session: could not create new midi track.") << endmsg;
1695 catch (AudioEngine::PortRegistrationFailure& pfe) {
1697 error << string_compose (_("No more JACK ports are available. You will need to stop %1 and restart JACK with more ports if you need this many tracks."), PROGRAM_NAME) << endmsg;
1705 if (!new_routes.empty()) {
1706 add_routes (new_routes, true, true, true);
1709 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
1710 PluginPtr plugin = instrument->load (*this);
1711 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
1712 (*r)->add_processor (p, PreFader);
1722 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
1724 boost::shared_ptr<Route> midi_track (wmt.lock());
1730 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
1732 if (change.after.n_audio() <= change.before.n_audio()) {
1736 /* new audio ports: make sure the audio goes somewhere useful,
1737 unless the user has no-auto-connect selected.
1739 The existing ChanCounts don't matter for this call as they are only
1740 to do with matching input and output indices, and we are only changing
1746 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
1750 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1751 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1752 * @param output_start As \a input_start, but for outputs.
1755 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
1756 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
1758 if (!IO::connecting_legal) {
1762 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1768 /* If both inputs and outputs are auto-connected to physical ports,
1769 use the max of input and output offsets to ensure auto-connected
1770 port numbers always match up (e.g. the first audio input and the
1771 first audio output of the route will have the same physical
1772 port number). Otherwise just use the lowest input or output
1776 DEBUG_TRACE (DEBUG::Graph,
1777 string_compose("Auto-connect: existing in = %1 out = %2\n",
1778 existing_inputs, existing_outputs));
1780 const bool in_out_physical =
1781 (Config->get_input_auto_connect() & AutoConnectPhysical)
1782 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1785 const ChanCount in_offset = in_out_physical
1786 ? ChanCount::max(existing_inputs, existing_outputs)
1789 const ChanCount out_offset = in_out_physical
1790 ? ChanCount::max(existing_inputs, existing_outputs)
1793 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1794 vector<string> physinputs;
1795 vector<string> physoutputs;
1797 _engine.get_physical_outputs (*t, physoutputs);
1798 _engine.get_physical_inputs (*t, physinputs);
1800 if (!physinputs.empty() && connect_inputs) {
1801 uint32_t nphysical_in = physinputs.size();
1803 DEBUG_TRACE (DEBUG::Graph,
1804 string_compose("There are %1 physical inputs of type %2\n",
1807 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1810 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1811 DEBUG_TRACE (DEBUG::Graph,
1812 string_compose("Get index %1 + %2 % %3 = %4\n",
1813 in_offset.get(*t), i, nphysical_in,
1814 (in_offset.get(*t) + i) % nphysical_in));
1815 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1818 DEBUG_TRACE (DEBUG::Graph,
1819 string_compose("Connect route %1 IN to %2\n",
1820 route->name(), port));
1822 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
1826 ChanCount one_added (*t, 1);
1827 existing_inputs += one_added;
1831 if (!physoutputs.empty()) {
1832 uint32_t nphysical_out = physoutputs.size();
1833 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
1836 if ((*t) == DataType::MIDI || Config->get_output_auto_connect() & AutoConnectPhysical) {
1837 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1838 } else if ((*t) == DataType::AUDIO && Config->get_output_auto_connect() & AutoConnectMaster) {
1839 /* master bus is audio only */
1840 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1841 port = _master_out->input()->ports().port(*t,
1842 i % _master_out->input()->n_ports().get(*t))->name();
1846 DEBUG_TRACE (DEBUG::Graph,
1847 string_compose("Connect route %1 OUT to %2\n",
1848 route->name(), port));
1850 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
1854 ChanCount one_added (*t, 1);
1855 existing_outputs += one_added;
1861 /** Caller must not hold process lock
1862 * @param name_template string to use for the start of the name, or "" to use "Audio".
1864 list< boost::shared_ptr<AudioTrack> >
1865 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
1866 uint32_t how_many, string name_template)
1868 char track_name[32];
1869 uint32_t track_id = 0;
1871 RouteList new_routes;
1872 list<boost::shared_ptr<AudioTrack> > ret;
1874 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
1877 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1878 error << "cannot find name for new audio track" << endmsg;
1882 boost::shared_ptr<AudioTrack> track;
1885 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
1887 if (track->init ()) {
1891 track->use_new_diskstream();
1893 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1894 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1897 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1899 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1900 error << string_compose (
1901 _("cannot configure %1 in/%2 out configuration for new audio track"),
1902 input_channels, output_channels)
1907 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1908 error << string_compose (
1909 _("cannot configure %1 in/%2 out configuration for new audio track"),
1910 input_channels, output_channels)
1917 route_group->add (track);
1920 track->non_realtime_input_change();
1922 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1923 if (Config->get_remote_model() == UserOrdered) {
1924 track->set_remote_control_id (next_control_id());
1927 new_routes.push_back (track);
1928 ret.push_back (track);
1931 catch (failed_constructor &err) {
1932 error << _("Session: could not create new audio track.") << endmsg;
1936 catch (AudioEngine::PortRegistrationFailure& pfe) {
1938 error << pfe.what() << endmsg;
1946 if (!new_routes.empty()) {
1947 add_routes (new_routes, true, true, true);
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;
1964 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
1967 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
1968 error << "cannot find name for new audio bus" << endmsg;
1973 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
1979 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1980 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
1983 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1985 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1986 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1987 input_channels, output_channels)
1993 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1994 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1995 input_channels, output_channels)
2002 route_group->add (bus);
2004 if (Config->get_remote_model() == UserOrdered) {
2005 bus->set_remote_control_id (next_control_id());
2008 bus->add_internal_return ();
2010 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, const std::string& name_base)
2043 uint32_t control_id;
2045 uint32_t number = 0;
2046 const uint32_t being_added = how_many;
2048 if (!tree.read (template_path.c_str())) {
2052 XMLNode* node = tree.root();
2054 IO::disable_connecting ();
2056 control_id = next_control_id ();
2060 XMLNode node_copy (*node);
2062 /* Remove IDs of everything so that new ones are used */
2063 node_copy.remove_property_recursively (X_("id"));
2068 if (!name_base.empty()) {
2070 /* if we're adding more than one routes, force
2071 * all the names of the new routes to be
2072 * numbered, via the final parameter.
2075 if (!find_route_name (name_base.c_str(), ++number, name, sizeof(name), (being_added > 1))) {
2076 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2082 string const route_name = node_copy.property(X_("name"))->value ();
2084 /* generate a new name by adding a number to the end of the template name */
2085 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2086 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2091 /* set this name in the XML description that we are about to use */
2092 Route::set_name_in_state (node_copy, name);
2094 /* trim bitslots from listen sends so that new ones are used */
2095 XMLNodeList children = node_copy.children ();
2096 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2097 if ((*i)->name() == X_("Processor")) {
2098 XMLProperty* role = (*i)->property (X_("role"));
2099 if (role && role->value() == X_("Listen")) {
2100 (*i)->remove_property (X_("bitslot"));
2105 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2108 error << _("Session: cannot create track/bus from template description") << endmsg;
2112 if (boost::dynamic_pointer_cast<Track>(route)) {
2113 /* force input/output change signals so that the new diskstream
2114 picks up the configuration of the route. During session
2115 loading this normally happens in a different way.
2118 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2120 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2121 change.after = route->input()->n_ports();
2122 route->input()->changed (change, this);
2123 change.after = route->output()->n_ports();
2124 route->output()->changed (change, this);
2127 route->set_remote_control_id (control_id);
2130 ret.push_back (route);
2133 catch (failed_constructor &err) {
2134 error << _("Session: could not create new route from template") << endmsg;
2138 catch (AudioEngine::PortRegistrationFailure& pfe) {
2139 error << pfe.what() << endmsg;
2148 add_routes (ret, true, true, true);
2149 IO::enable_connecting ();
2156 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
2159 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
2160 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
2163 error << _("Adding new tracks/busses failed") << endmsg;
2168 update_latency (true);
2169 update_latency (false);
2174 save_state (_current_snapshot_name);
2177 RouteAdded (new_routes); /* EMIT SIGNAL */
2181 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
2183 ChanCount existing_inputs;
2184 ChanCount existing_outputs;
2185 uint32_t order = next_control_id();
2187 count_existing_track_channels (existing_inputs, existing_outputs);
2190 RCUWriter<RouteList> writer (routes);
2191 boost::shared_ptr<RouteList> r = writer.get_copy ();
2192 r->insert (r->end(), new_routes.begin(), new_routes.end());
2194 /* if there is no control out and we're not in the middle of loading,
2195 resort the graph here. if there is a control out, we will resort
2196 toward the end of this method. if we are in the middle of loading,
2197 we will resort when done.
2200 if (!_monitor_out && IO::connecting_legal) {
2201 resort_routes_using (r);
2205 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2207 boost::weak_ptr<Route> wpr (*x);
2208 boost::shared_ptr<Route> r (*x);
2210 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2211 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2212 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2213 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2214 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2215 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2217 if (r->is_master()) {
2221 if (r->is_monitor()) {
2225 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2227 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2228 track_playlist_changed (boost::weak_ptr<Track> (tr));
2229 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2231 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2233 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2234 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2239 if (input_auto_connect || output_auto_connect) {
2240 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
2243 /* order keys are a GUI responsibility but we need to set up
2244 reasonable defaults because they also affect the remote control
2245 ID in most situations.
2248 if (!r->has_order_key (EditorSort)) {
2249 if (r->is_auditioner()) {
2250 /* use an arbitrarily high value */
2251 r->set_order_key (EditorSort, UINT_MAX);
2252 r->set_order_key (MixerSort, UINT_MAX);
2254 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
2255 r->set_order_key (EditorSort, order);
2256 r->set_order_key (MixerSort, order);
2264 if (_monitor_out && IO::connecting_legal) {
2265 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
2267 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2268 if ((*x)->is_monitor()) {
2270 } else if ((*x)->is_master()) {
2273 (*x)->enable_monitor_send ();
2280 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2282 boost::shared_ptr<RouteList> r = routes.reader ();
2283 boost::shared_ptr<Send> s;
2285 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2286 if ((s = (*i)->internal_send_for (dest)) != 0) {
2287 s->amp()->gain_control()->set_value (0.0);
2293 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2295 boost::shared_ptr<RouteList> r = routes.reader ();
2296 boost::shared_ptr<Send> s;
2298 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2299 if ((s = (*i)->internal_send_for (dest)) != 0) {
2300 s->amp()->gain_control()->set_value (1.0);
2306 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2308 boost::shared_ptr<RouteList> r = routes.reader ();
2309 boost::shared_ptr<Send> s;
2311 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2312 if ((s = (*i)->internal_send_for (dest)) != 0) {
2313 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2318 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2320 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2322 boost::shared_ptr<RouteList> r = routes.reader ();
2323 boost::shared_ptr<RouteList> t (new RouteList);
2325 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2326 /* no MIDI sends because there are no MIDI busses yet */
2327 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2332 add_internal_sends (dest, p, t);
2336 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2338 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2339 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
2344 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
2346 add_internal_send (dest, sender->before_processor_for_index (index), sender);
2350 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
2352 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
2356 if (!dest->internal_return()) {
2357 dest->add_internal_return ();
2360 sender->add_aux_send (dest, before);
2366 Session::remove_route (boost::shared_ptr<Route> route)
2368 if (route == _master_out) {
2372 route->set_solo (false, this);
2375 RCUWriter<RouteList> writer (routes);
2376 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2380 /* deleting the master out seems like a dumb
2381 idea, but its more of a UI policy issue
2385 if (route == _master_out) {
2386 _master_out = boost::shared_ptr<Route> ();
2389 if (route == _monitor_out) {
2390 _monitor_out.reset ();
2393 /* writer goes out of scope, forces route list update */
2396 update_route_solo_state ();
2398 // We need to disconnect the route's inputs and outputs
2400 route->input()->disconnect (0);
2401 route->output()->disconnect (0);
2403 /* if the route had internal sends sending to it, remove them */
2404 if (route->internal_return()) {
2406 boost::shared_ptr<RouteList> r = routes.reader ();
2407 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2408 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2410 (*i)->remove_processor (s);
2415 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2416 if (mt && mt->step_editing()) {
2417 if (_step_editors > 0) {
2422 update_latency_compensation ();
2425 /* Re-sort routes to remove the graph's current references to the one that is
2426 * going away, then flush old references out of the graph.
2430 if (_process_graph) {
2431 _process_graph->clear_other_chain ();
2434 /* get rid of it from the dead wood collection in the route list manager */
2436 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2440 /* try to cause everyone to drop their references */
2442 route->drop_references ();
2444 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2446 /* save the new state of the world */
2448 if (save_state (_current_snapshot_name)) {
2449 save_history (_current_snapshot_name);
2454 Session::route_mute_changed (void* /*src*/)
2460 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2462 boost::shared_ptr<Route> route = wpr.lock();
2464 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2468 if (route->listening_via_monitor ()) {
2470 if (Config->get_exclusive_solo()) {
2471 /* new listen: disable all other listen */
2472 boost::shared_ptr<RouteList> r = routes.reader ();
2473 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2474 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
2477 (*i)->set_listen (false, this);
2483 } else if (_listen_cnt > 0) {
2488 update_route_solo_state ();
2491 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2493 boost::shared_ptr<Route> route = wpr.lock ();
2496 /* should not happen */
2497 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2501 bool send_changed = false;
2503 if (route->solo_isolated()) {
2504 if (_solo_isolated_cnt == 0) {
2505 send_changed = true;
2507 _solo_isolated_cnt++;
2508 } else if (_solo_isolated_cnt > 0) {
2509 _solo_isolated_cnt--;
2510 if (_solo_isolated_cnt == 0) {
2511 send_changed = true;
2516 IsolatedChanged (); /* EMIT SIGNAL */
2521 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2523 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
2525 if (!self_solo_change) {
2526 // session doesn't care about changes to soloed-by-others
2530 if (solo_update_disabled) {
2532 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
2536 boost::shared_ptr<Route> route = wpr.lock ();
2539 boost::shared_ptr<RouteList> r = routes.reader ();
2542 if (route->self_soloed()) {
2548 RouteGroup* rg = route->route_group ();
2549 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
2551 if (delta == 1 && Config->get_exclusive_solo()) {
2553 /* new solo: disable all other solos, but not the group if its solo-enabled */
2555 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2556 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
2557 (leave_group_alone && ((*i)->route_group() == rg))) {
2560 (*i)->set_solo (false, this);
2564 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
2566 solo_update_disabled = true;
2568 RouteList uninvolved;
2570 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
2572 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2573 bool via_sends_only;
2574 bool in_signal_flow;
2576 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
2577 (leave_group_alone && ((*i)->route_group() == rg))) {
2581 in_signal_flow = false;
2583 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
2585 if ((*i)->feeds (route, &via_sends_only)) {
2586 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
2587 if (!via_sends_only) {
2588 if (!route->soloed_by_others_upstream()) {
2589 (*i)->mod_solo_by_others_downstream (delta);
2592 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
2594 in_signal_flow = true;
2596 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
2599 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
2601 if (route->feeds (*i, &via_sends_only)) {
2602 /* propagate solo upstream only if routing other than
2603 sends is involved, but do consider the other route
2604 (*i) to be part of the signal flow even if only
2607 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
2611 route->soloed_by_others_downstream(),
2612 route->soloed_by_others_upstream()));
2613 if (!via_sends_only) {
2614 if (!route->soloed_by_others_downstream()) {
2615 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
2616 (*i)->mod_solo_by_others_upstream (delta);
2618 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
2621 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
2623 in_signal_flow = true;
2625 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
2628 if (!in_signal_flow) {
2629 uninvolved.push_back (*i);
2633 solo_update_disabled = false;
2634 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
2636 update_route_solo_state (r);
2638 /* now notify that the mute state of the routes not involved in the signal
2639 pathway of the just-solo-changed route may have altered.
2642 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2643 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
2644 (*i)->mute_changed (this);
2647 SoloChanged (); /* EMIT SIGNAL */
2652 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2654 /* now figure out if anything that matters is soloed (or is "listening")*/
2656 bool something_soloed = false;
2657 uint32_t listeners = 0;
2658 uint32_t isolated = 0;
2661 r = routes.reader();
2664 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2665 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
2666 something_soloed = true;
2669 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
2670 if (Config->get_solo_control_is_listen_control()) {
2673 (*i)->set_listen (false, this);
2677 if ((*i)->solo_isolated()) {
2682 if (something_soloed != _non_soloed_outs_muted) {
2683 _non_soloed_outs_muted = something_soloed;
2684 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2687 _listen_cnt = listeners;
2689 if (isolated != _solo_isolated_cnt) {
2690 _solo_isolated_cnt = isolated;
2691 IsolatedChanged (); /* EMIT SIGNAL */
2694 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
2695 something_soloed, listeners, isolated));
2698 boost::shared_ptr<RouteList>
2699 Session::get_routes_with_internal_returns() const
2701 boost::shared_ptr<RouteList> r = routes.reader ();
2702 boost::shared_ptr<RouteList> rl (new RouteList);
2704 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2705 if ((*i)->internal_return ()) {
2713 Session::io_name_is_legal (const std::string& name)
2715 boost::shared_ptr<RouteList> r = routes.reader ();
2717 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2718 if ((*i)->name() == name) {
2722 if ((*i)->has_io_processor_named (name)) {
2731 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
2734 vector<string> connections;
2736 /* if we are passed only a single route and we're not told to turn
2737 * others off, then just do the simple thing.
2740 if (flip_others == false && rl->size() == 1) {
2741 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
2743 mt->set_input_active (onoff);
2748 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
2750 PortSet& ps ((*rt)->input()->ports());
2752 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
2753 p->get_connections (connections);
2756 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
2757 routes_using_input_from (*s, rl2);
2760 /* scan all relevant routes to see if others are on or off */
2762 bool others_are_already_on = false;
2764 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
2766 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2772 if ((*r) != (*rt)) {
2773 if (mt->input_active()) {
2774 others_are_already_on = true;
2777 /* this one needs changing */
2778 mt->set_input_active (onoff);
2784 /* globally reverse other routes */
2786 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
2787 if ((*r) != (*rt)) {
2788 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2790 mt->set_input_active (!others_are_already_on);
2799 Session::routes_using_input_from (const string& str, RouteList& rl)
2801 boost::shared_ptr<RouteList> r = routes.reader();
2803 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2804 if ((*i)->input()->connected_to (str)) {
2810 boost::shared_ptr<Route>
2811 Session::route_by_name (string name)
2813 boost::shared_ptr<RouteList> r = routes.reader ();
2815 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2816 if ((*i)->name() == name) {
2821 return boost::shared_ptr<Route> ((Route*) 0);
2824 boost::shared_ptr<Route>
2825 Session::route_by_id (PBD::ID id)
2827 boost::shared_ptr<RouteList> r = routes.reader ();
2829 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2830 if ((*i)->id() == id) {
2835 return boost::shared_ptr<Route> ((Route*) 0);
2838 boost::shared_ptr<Track>
2839 Session::track_by_diskstream_id (PBD::ID id)
2841 boost::shared_ptr<RouteList> r = routes.reader ();
2843 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2844 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
2845 if (t && t->using_diskstream_id (id)) {
2850 return boost::shared_ptr<Track> ();
2853 boost::shared_ptr<Route>
2854 Session::route_by_remote_id (uint32_t id)
2856 boost::shared_ptr<RouteList> r = routes.reader ();
2858 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2859 if ((*i)->remote_control_id() == id) {
2864 return boost::shared_ptr<Route> ((Route*) 0);
2868 Session::playlist_region_added (boost::weak_ptr<Region> w)
2870 boost::shared_ptr<Region> r = w.lock ();
2875 /* These are the operations that are currently in progress... */
2876 list<GQuark> curr = _current_trans_quarks;
2879 /* ...and these are the operations during which we want to update
2880 the session range location markers.
2883 ops.push_back (Operations::capture);
2884 ops.push_back (Operations::paste);
2885 ops.push_back (Operations::duplicate_region);
2886 ops.push_back (Operations::insert_file);
2887 ops.push_back (Operations::insert_region);
2888 ops.push_back (Operations::drag_region_brush);
2889 ops.push_back (Operations::region_drag);
2890 ops.push_back (Operations::selection_grab);
2891 ops.push_back (Operations::region_fill);
2892 ops.push_back (Operations::fill_selection);
2893 ops.push_back (Operations::create_region);
2894 ops.push_back (Operations::region_copy);
2895 ops.push_back (Operations::fixed_time_region_copy);
2898 /* See if any of the current operations match the ones that we want */
2900 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
2902 /* If so, update the session range markers */
2904 maybe_update_session_range (r->position (), r->last_frame ());
2908 /** Update the session range markers if a is before the current start or
2909 * b is after the current end.
2912 Session::maybe_update_session_range (framepos_t a, framepos_t b)
2914 if (_state_of_the_state & Loading) {
2918 if (_session_range_location == 0) {
2920 add_session_range_location (a, b);
2924 if (a < _session_range_location->start()) {
2925 _session_range_location->set_start (a);
2928 if (b > _session_range_location->end()) {
2929 _session_range_location->set_end (b);
2935 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
2937 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2938 maybe_update_session_range (i->to, i->to + i->length);
2943 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
2945 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2946 maybe_update_session_range (i->from, i->to);
2950 /* Region management */
2952 boost::shared_ptr<Region>
2953 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2955 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2956 RegionFactory::RegionMap::const_iterator i;
2957 boost::shared_ptr<Region> region;
2959 Glib::Threads::Mutex::Lock lm (region_lock);
2961 for (i = regions.begin(); i != regions.end(); ++i) {
2965 if (region->whole_file()) {
2967 if (child->source_equivalent (region)) {
2973 return boost::shared_ptr<Region> ();
2977 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2979 set<boost::shared_ptr<Region> > relevant_regions;
2981 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2982 RegionFactory::get_regions_using_source (*s, relevant_regions);
2985 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2986 set<boost::shared_ptr<Region> >::iterator tmp;
2991 playlists->destroy_region (*r);
2992 RegionFactory::map_remove (*r);
2994 (*r)->drop_sources ();
2995 (*r)->drop_references ();
2997 relevant_regions.erase (r);
3002 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
3005 Glib::Threads::Mutex::Lock ls (source_lock);
3006 /* remove from the main source list */
3007 sources.erase ((*s)->id());
3010 (*s)->mark_for_remove ();
3011 (*s)->drop_references ();
3020 Session::remove_last_capture ()
3022 list<boost::shared_ptr<Source> > srcs;
3024 boost::shared_ptr<RouteList> rl = routes.reader ();
3025 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3026 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3031 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
3034 srcs.insert (srcs.end(), l.begin(), l.end());
3039 destroy_sources (srcs);
3041 save_state (_current_snapshot_name);
3046 /* Source Management */
3049 Session::add_source (boost::shared_ptr<Source> source)
3051 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
3052 pair<SourceMap::iterator,bool> result;
3054 entry.first = source->id();
3055 entry.second = source;
3058 Glib::Threads::Mutex::Lock lm (source_lock);
3059 result = sources.insert (entry);
3062 if (result.second) {
3064 /* yay, new source */
3066 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
3069 if (!fs->within_session()) {
3070 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
3076 boost::shared_ptr<AudioFileSource> afs;
3078 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
3079 if (Config->get_auto_analyse_audio()) {
3080 Analyser::queue_source_for_analysis (source, false);
3084 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
3089 Session::remove_source (boost::weak_ptr<Source> src)
3091 if (_state_of_the_state & Deletion) {
3095 SourceMap::iterator i;
3096 boost::shared_ptr<Source> source = src.lock();
3103 Glib::Threads::Mutex::Lock lm (source_lock);
3105 if ((i = sources.find (source->id())) != sources.end()) {
3110 if (!(_state_of_the_state & InCleanup)) {
3112 /* save state so we don't end up with a session file
3113 referring to non-existent sources.
3116 save_state (_current_snapshot_name);
3120 boost::shared_ptr<Source>
3121 Session::source_by_id (const PBD::ID& id)
3123 Glib::Threads::Mutex::Lock lm (source_lock);
3124 SourceMap::iterator i;
3125 boost::shared_ptr<Source> source;
3127 if ((i = sources.find (id)) != sources.end()) {
3134 boost::shared_ptr<Source>
3135 Session::source_by_path_and_channel (const string& path, uint16_t chn)
3137 Glib::Threads::Mutex::Lock lm (source_lock);
3139 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3140 boost::shared_ptr<AudioFileSource> afs
3141 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
3143 if (afs && afs->path() == path && chn == afs->channel()) {
3147 return boost::shared_ptr<Source>();
3151 Session::count_sources_by_origin (const string& path)
3154 Glib::Threads::Mutex::Lock lm (source_lock);
3156 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3157 boost::shared_ptr<FileSource> fs
3158 = boost::dynamic_pointer_cast<FileSource>(i->second);
3160 if (fs && fs->origin() == path) {
3170 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
3173 string old_basename = PBD::basename_nosuffix (oldname);
3174 string new_legalized = legalize_for_path (newname);
3176 /* note: we know (or assume) the old path is already valid */
3180 /* destructive file sources have a name of the form:
3182 /path/to/Tnnnn-NAME(%[LR])?.wav
3184 the task here is to replace NAME with the new name.
3189 string::size_type dash;
3191 dir = Glib::path_get_dirname (path);
3192 path = Glib::path_get_basename (path);
3194 /* '-' is not a legal character for the NAME part of the path */
3196 if ((dash = path.find_last_of ('-')) == string::npos) {
3200 prefix = path.substr (0, dash);
3204 path += new_legalized;
3205 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3206 path = Glib::build_filename (dir, path);
3210 /* non-destructive file sources have a name of the form:
3212 /path/to/NAME-nnnnn(%[LR])?.ext
3214 the task here is to replace NAME with the new name.
3219 string::size_type dash;
3220 string::size_type postfix;
3222 dir = Glib::path_get_dirname (path);
3223 path = Glib::path_get_basename (path);
3225 /* '-' is not a legal character for the NAME part of the path */
3227 if ((dash = path.find_last_of ('-')) == string::npos) {
3231 suffix = path.substr (dash+1);
3233 // Suffix is now everything after the dash. Now we need to eliminate
3234 // the nnnnn part, which is done by either finding a '%' or a '.'
3236 postfix = suffix.find_last_of ("%");
3237 if (postfix == string::npos) {
3238 postfix = suffix.find_last_of ('.');
3241 if (postfix != string::npos) {
3242 suffix = suffix.substr (postfix);
3244 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
3248 const uint32_t limit = 10000;
3249 char buf[PATH_MAX+1];
3251 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
3253 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
3255 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
3256 path = Glib::build_filename (dir, buf);
3264 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
3273 /** Return the full path (in some session directory) for a new within-session source.
3274 * \a name must be a session-unique name that does not contain slashes
3275 * (e.g. as returned by new_*_source_name)
3278 Session::new_source_path_from_name (DataType type, const string& name)
3280 assert(name.find("/") == string::npos);
3282 SessionDirectory sdir(get_best_session_directory_for_new_source());
3285 if (type == DataType::AUDIO) {
3286 p = sdir.sound_path();
3287 } else if (type == DataType::MIDI) {
3288 p = sdir.midi_path();
3290 error << "Unknown source type, unable to create file path" << endmsg;
3294 return Glib::build_filename (p, name);
3298 Session::peak_path (string base) const
3300 return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
3303 /** Return a unique name based on \a base for a new internal audio source */
3305 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
3308 char buf[PATH_MAX+1];
3309 const uint32_t limit = 10000;
3311 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3314 legalized = legalize_for_path (base);
3316 // Find a "version" of the base name that doesn't exist in any of the possible directories.
3317 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3319 vector<space_and_path>::iterator i;
3320 uint32_t existing = 0;
3322 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3327 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3328 cnt, legalized.c_str(), ext.c_str());
3329 } else if (nchan == 2) {
3331 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
3332 cnt, legalized.c_str(), ext.c_str());
3334 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
3335 cnt, legalized.c_str(), ext.c_str());
3337 } else if (nchan < 26) {
3338 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
3339 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
3341 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3342 cnt, legalized.c_str(), ext.c_str());
3348 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3349 } else if (nchan == 2) {
3351 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
3353 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
3355 } else if (nchan < 26) {
3356 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
3358 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3362 SessionDirectory sdir((*i).path);
3364 string spath = sdir.sound_path();
3366 /* note that we search *without* the extension so that
3367 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3368 in the event that this new name is required for
3369 a file format change.
3372 if (matching_unsuffixed_filename_exists_in (spath, buf)) {
3378 if (existing == 0) {
3383 error << string_compose(
3384 _("There are already %1 recordings for %2, which I consider too many."),
3385 limit, base) << endmsg;
3387 throw failed_constructor();
3391 return Glib::path_get_basename (buf);
3394 /** Create a new within-session audio source */
3395 boost::shared_ptr<AudioFileSource>
3396 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
3398 const string name = new_audio_source_name (n, n_chans, chan, destructive);
3399 const string path = new_source_path_from_name(DataType::AUDIO, name);
3401 return boost::dynamic_pointer_cast<AudioFileSource> (
3402 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
3405 /** Return a unique name based on \a base for a new internal MIDI source */
3407 Session::new_midi_source_name (const string& base)
3410 char buf[PATH_MAX+1];
3411 const uint32_t limit = 10000;
3415 legalized = legalize_for_path (base);
3417 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3418 for (cnt = 1; cnt <= limit; ++cnt) {
3420 vector<space_and_path>::iterator i;
3421 uint32_t existing = 0;
3423 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3425 SessionDirectory sdir((*i).path);
3427 std::string p = Glib::build_filename (sdir.midi_path(), legalized);
3429 snprintf (buf, sizeof(buf), "%s-%u.mid", p.c_str(), cnt);
3431 if (Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
3436 if (existing == 0) {
3441 error << string_compose(
3442 _("There are already %1 recordings for %2, which I consider too many."),
3443 limit, base) << endmsg;
3445 throw failed_constructor();
3449 return Glib::path_get_basename(buf);
3453 /** Create a new within-session MIDI source */
3454 boost::shared_ptr<MidiSource>
3455 Session::create_midi_source_for_session (Track* track, string const & n)
3457 /* try to use the existing write source for the track, to keep numbering sane
3461 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3465 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3468 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3469 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3473 const string name = new_midi_source_name (n);
3474 const string path = new_source_path_from_name (DataType::MIDI, name);
3476 return boost::dynamic_pointer_cast<SMFSource> (
3477 SourceFactory::createWritable (
3478 DataType::MIDI, *this, path, false, frame_rate()));
3483 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3485 if (playlist->hidden()) {
3489 playlists->add (playlist);
3492 playlist->release();
3499 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3501 if (_state_of_the_state & Deletion) {
3505 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3511 playlists->remove (playlist);
3517 Session::set_audition (boost::shared_ptr<Region> r)
3519 pending_audition_region = r;
3520 add_post_transport_work (PostTransportAudition);
3521 _butler->schedule_transport_work ();
3525 Session::audition_playlist ()
3527 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3528 ev->region.reset ();
3533 Session::non_realtime_set_audition ()
3535 assert (pending_audition_region);
3536 auditioner->audition_region (pending_audition_region);
3537 pending_audition_region.reset ();
3538 AuditionActive (true); /* EMIT SIGNAL */
3542 Session::audition_region (boost::shared_ptr<Region> r)
3544 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3550 Session::cancel_audition ()
3552 if (auditioner->auditioning()) {
3553 auditioner->cancel_audition ();
3554 AuditionActive (false); /* EMIT SIGNAL */
3559 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3561 if (a->is_monitor()) {
3564 if (b->is_monitor()) {
3567 return a->order_key (MixerSort) < b->order_key (MixerSort);
3571 Session::is_auditioning () const
3573 /* can be called before we have an auditioner object */
3575 return auditioner->auditioning();
3582 Session::graph_reordered ()
3584 /* don't do this stuff if we are setting up connections
3585 from a set_state() call or creating new tracks. Ditto for deletion.
3588 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
3592 /* every track/bus asked for this to be handled but it was deferred because
3593 we were connecting. do it now.
3596 request_input_change_handling ();
3600 /* force all diskstreams to update their capture offset values to
3601 reflect any changes in latencies within the graph.
3604 boost::shared_ptr<RouteList> rl = routes.reader ();
3605 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3606 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3608 tr->set_capture_offset ();
3613 /** @return Number of frames that there is disk space available to write,
3616 boost::optional<framecnt_t>
3617 Session::available_capture_duration ()
3619 Glib::Threads::Mutex::Lock lm (space_lock);
3621 if (_total_free_4k_blocks_uncertain) {
3622 return boost::optional<framecnt_t> ();
3625 float sample_bytes_on_disk = 4.0; // keep gcc happy
3627 switch (config.get_native_file_data_format()) {
3629 sample_bytes_on_disk = 4.0;
3633 sample_bytes_on_disk = 3.0;
3637 sample_bytes_on_disk = 2.0;
3641 /* impossible, but keep some gcc versions happy */
3642 fatal << string_compose (_("programming error: %1"),
3643 X_("illegal native file data format"))
3648 double scale = 4096.0 / sample_bytes_on_disk;
3650 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3651 return max_framecnt;
3654 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3658 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3661 RCUWriter<BundleList> writer (_bundles);
3662 boost::shared_ptr<BundleList> b = writer.get_copy ();
3663 b->push_back (bundle);
3666 BundleAdded (bundle); /* EMIT SIGNAL */
3672 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3674 bool removed = false;
3677 RCUWriter<BundleList> writer (_bundles);
3678 boost::shared_ptr<BundleList> b = writer.get_copy ();
3679 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3681 if (i != b->end()) {
3688 BundleRemoved (bundle); /* EMIT SIGNAL */
3694 boost::shared_ptr<Bundle>
3695 Session::bundle_by_name (string name) const
3697 boost::shared_ptr<BundleList> b = _bundles.reader ();
3699 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3700 if ((*i)->name() == name) {
3705 return boost::shared_ptr<Bundle> ();
3709 Session::tempo_map_changed (const PropertyChange&)
3713 playlists->update_after_tempo_map_change ();
3715 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3721 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3723 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3724 (*i)->recompute_frames_from_bbt ();
3728 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3729 * the given count with the current block size.
3732 Session::ensure_buffers (ChanCount howmany)
3734 BufferManager::ensure_buffers (howmany);
3738 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3740 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3741 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3746 Session::next_insert_id ()
3748 /* this doesn't really loop forever. just think about it */
3751 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3752 if (!insert_bitset[n]) {
3753 insert_bitset[n] = true;
3759 /* none available, so resize and try again */
3761 insert_bitset.resize (insert_bitset.size() + 16, false);
3766 Session::next_send_id ()
3768 /* this doesn't really loop forever. just think about it */
3771 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3772 if (!send_bitset[n]) {
3773 send_bitset[n] = true;
3779 /* none available, so resize and try again */
3781 send_bitset.resize (send_bitset.size() + 16, false);
3786 Session::next_aux_send_id ()
3788 /* this doesn't really loop forever. just think about it */
3791 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
3792 if (!aux_send_bitset[n]) {
3793 aux_send_bitset[n] = true;
3799 /* none available, so resize and try again */
3801 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
3806 Session::next_return_id ()
3808 /* this doesn't really loop forever. just think about it */
3811 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3812 if (!return_bitset[n]) {
3813 return_bitset[n] = true;
3819 /* none available, so resize and try again */
3821 return_bitset.resize (return_bitset.size() + 16, false);
3826 Session::mark_send_id (uint32_t id)
3828 if (id >= send_bitset.size()) {
3829 send_bitset.resize (id+16, false);
3831 if (send_bitset[id]) {
3832 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3834 send_bitset[id] = true;
3838 Session::mark_aux_send_id (uint32_t id)
3840 if (id >= aux_send_bitset.size()) {
3841 aux_send_bitset.resize (id+16, false);
3843 if (aux_send_bitset[id]) {
3844 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
3846 aux_send_bitset[id] = true;
3850 Session::mark_return_id (uint32_t id)
3852 if (id >= return_bitset.size()) {
3853 return_bitset.resize (id+16, false);
3855 if (return_bitset[id]) {
3856 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3858 return_bitset[id] = true;
3862 Session::mark_insert_id (uint32_t id)
3864 if (id >= insert_bitset.size()) {
3865 insert_bitset.resize (id+16, false);
3867 if (insert_bitset[id]) {
3868 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3870 insert_bitset[id] = true;
3874 Session::unmark_send_id (uint32_t id)
3876 if (id < send_bitset.size()) {
3877 send_bitset[id] = false;
3882 Session::unmark_aux_send_id (uint32_t id)
3884 if (id < aux_send_bitset.size()) {
3885 aux_send_bitset[id] = false;
3890 Session::unmark_return_id (uint32_t id)
3892 if (id < return_bitset.size()) {
3893 return_bitset[id] = false;
3898 Session::unmark_insert_id (uint32_t id)
3900 if (id < insert_bitset.size()) {
3901 insert_bitset[id] = false;
3906 Session::reset_native_file_format ()
3908 boost::shared_ptr<RouteList> rl = routes.reader ();
3909 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3910 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3912 /* don't save state as we do this, there's no point
3915 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3916 tr->reset_write_sources (false);
3917 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3923 Session::route_name_unique (string n) const
3925 boost::shared_ptr<RouteList> r = routes.reader ();
3927 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3928 if ((*i)->name() == n) {
3937 Session::route_name_internal (string n) const
3939 if (auditioner && auditioner->name() == n) {
3943 if (_click_io && _click_io->name() == n) {
3951 Session::freeze_all (InterThreadInfo& itt)
3953 boost::shared_ptr<RouteList> r = routes.reader ();
3955 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3957 boost::shared_ptr<Track> t;
3959 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3960 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3970 boost::shared_ptr<Region>
3971 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
3972 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3973 InterThreadInfo& itt,
3974 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
3977 boost::shared_ptr<Region> result;
3978 boost::shared_ptr<Playlist> playlist;
3979 boost::shared_ptr<AudioFileSource> fsource;
3981 char buf[PATH_MAX+1];
3982 ChanCount diskstream_channels (track.n_channels());
3983 framepos_t position;
3984 framecnt_t this_chunk;
3987 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3988 const string sound_dir = sdir.sound_path();
3989 framepos_t len = end - start;
3990 bool need_block_size_reset = false;
3992 ChanCount const max_proc = track.max_processor_streams ();
3995 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3996 end, start) << endmsg;
4000 const framecnt_t chunk_size = (256 * 1024)/4;
4002 // block all process callback handling
4004 block_processing ();
4006 /* call tree *MUST* hold route_lock */
4008 if ((playlist = track.playlist()) == 0) {
4012 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4014 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
4016 for (x = 0; x < 99999; ++x) {
4017 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());
4018 if (!Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
4024 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
4029 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
4030 SourceFactory::createWritable (DataType::AUDIO, *this, buf, false, frame_rate()));
4033 catch (failed_constructor& err) {
4034 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
4038 srcs.push_back (fsource);
4041 /* tell redirects that care that we are about to use a much larger
4042 * blocksize. this will flush all plugins too, so that they are ready
4043 * to be used for this process.
4046 need_block_size_reset = true;
4047 track.set_block_size (chunk_size);
4052 /* create a set of reasonably-sized buffers */
4053 buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
4054 buffers.set_count (max_proc);
4056 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4057 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4059 afs->prepare_for_peakfile_writes ();
4062 while (to_do && !itt.cancel) {
4064 this_chunk = min (to_do, chunk_size);
4066 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export)) {
4071 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4072 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4075 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
4081 start += this_chunk;
4082 to_do -= this_chunk;
4084 itt.progress = (float) (1.0 - ((double) to_do / len));
4093 xnow = localtime (&now);
4095 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
4096 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4099 afs->update_header (position, *xnow, now);
4100 afs->flush_header ();
4104 /* construct a region to represent the bounced material */
4108 plist.add (Properties::start, 0);
4109 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4110 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4112 result = RegionFactory::create (srcs, plist);
4118 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4119 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4122 afs->mark_for_remove ();
4125 (*src)->drop_references ();
4129 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4130 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4133 afs->done_with_peakfile_writes ();
4138 if (need_block_size_reset) {
4139 track.set_block_size (get_block_size());
4142 unblock_processing ();
4148 Session::gain_automation_buffer() const
4150 return ProcessThread::gain_automation_buffer ();
4154 Session::send_gain_automation_buffer() const
4156 return ProcessThread::send_gain_automation_buffer ();
4160 Session::pan_automation_buffer() const
4162 return ProcessThread::pan_automation_buffer ();
4166 Session::get_silent_buffers (ChanCount count)
4168 return ProcessThread::get_silent_buffers (count);
4172 Session::get_scratch_buffers (ChanCount count)
4174 return ProcessThread::get_scratch_buffers (count);
4178 Session::get_mix_buffers (ChanCount count)
4180 return ProcessThread::get_mix_buffers (count);
4184 Session::ntracks () const
4187 boost::shared_ptr<RouteList> r = routes.reader ();
4189 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4190 if (boost::dynamic_pointer_cast<Track> (*i)) {
4199 Session::nbusses () const
4202 boost::shared_ptr<RouteList> r = routes.reader ();
4204 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4205 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
4214 Session::add_automation_list(AutomationList *al)
4216 automation_lists[al->id()] = al;
4219 /** @return true if there is at least one record-enabled track, otherwise false */
4221 Session::have_rec_enabled_track () const
4223 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
4226 /** Update the state of our rec-enabled tracks flag */
4228 Session::update_have_rec_enabled_track ()
4230 boost::shared_ptr<RouteList> rl = routes.reader ();
4231 RouteList::iterator i = rl->begin();
4232 while (i != rl->end ()) {
4234 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4235 if (tr && tr->record_enabled ()) {
4242 int const old = g_atomic_int_get (&_have_rec_enabled_track);
4244 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4246 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4247 RecordStateChanged (); /* EMIT SIGNAL */
4252 Session::listen_position_changed ()
4254 boost::shared_ptr<RouteList> r = routes.reader ();
4256 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4257 (*i)->listen_position_changed ();
4262 Session::solo_control_mode_changed ()
4264 /* cancel all solo or all listen when solo control mode changes */
4267 set_solo (get_routes(), false);
4268 } else if (listening()) {
4269 set_listen (get_routes(), false);
4273 /** Called when a property of one of our route groups changes */
4275 Session::route_group_property_changed (RouteGroup* rg)
4277 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4280 /** Called when a route is added to one of our route groups */
4282 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4284 RouteAddedToRouteGroup (rg, r);
4287 /** Called when a route is removed from one of our route groups */
4289 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4291 RouteRemovedFromRouteGroup (rg, r);
4294 boost::shared_ptr<RouteList>
4295 Session::get_routes_with_regions_at (framepos_t const p) const
4297 boost::shared_ptr<RouteList> r = routes.reader ();
4298 boost::shared_ptr<RouteList> rl (new RouteList);
4300 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4301 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4306 boost::shared_ptr<Playlist> pl = tr->playlist ();
4311 if (pl->has_region_at (p)) {
4320 Session::goto_end ()
4322 if (_session_range_location) {
4323 request_locate (_session_range_location->end(), false);
4325 request_locate (0, false);
4330 Session::goto_start ()
4332 if (_session_range_location) {
4333 request_locate (_session_range_location->start(), false);
4335 request_locate (0, false);
4340 Session::current_start_frame () const
4342 return _session_range_location ? _session_range_location->start() : 0;
4346 Session::current_end_frame () const
4348 return _session_range_location ? _session_range_location->end() : 0;
4352 Session::add_session_range_location (framepos_t start, framepos_t end)
4354 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4355 _locations->add (_session_range_location);
4359 Session::step_edit_status_change (bool yn)
4365 send = (_step_editors == 0);
4370 send = (_step_editors == 1);
4373 if (_step_editors > 0) {
4379 StepEditStatusChange (val);
4385 Session::start_time_changed (framepos_t old)
4387 /* Update the auto loop range to match the session range
4388 (unless the auto loop range has been changed by the user)
4391 Location* s = _locations->session_range_location ();
4396 Location* l = _locations->auto_loop_location ();
4398 if (l && l->start() == old) {
4399 l->set_start (s->start(), true);
4404 Session::end_time_changed (framepos_t old)
4406 /* Update the auto loop range to match the session range
4407 (unless the auto loop range has been changed by the user)
4410 Location* s = _locations->session_range_location ();
4415 Location* l = _locations->auto_loop_location ();
4417 if (l && l->end() == old) {
4418 l->set_end (s->end(), true);
4423 Session::source_search_path (DataType type) const
4427 if (session_dirs.size() == 1) {
4429 case DataType::AUDIO:
4430 s.push_back (_session_dir->sound_path());
4432 case DataType::MIDI:
4433 s.push_back (_session_dir->midi_path());
4437 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4438 SessionDirectory sdir (i->path);
4440 case DataType::AUDIO:
4441 s.push_back (sdir.sound_path());
4443 case DataType::MIDI:
4444 s.push_back (sdir.midi_path());
4450 if (type == DataType::AUDIO) {
4451 const string sound_path_2X = _session_dir->sound_path_2X();
4452 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
4453 if (find (s.begin(), s.end(), sound_path_2X) == s.end()) {
4454 s.push_back (sound_path_2X);
4459 /* now check the explicit (possibly user-specified) search path
4462 vector<string> dirs;
4465 case DataType::AUDIO:
4466 split (config.get_audio_search_path (), dirs, ':');
4468 case DataType::MIDI:
4469 split (config.get_midi_search_path (), dirs, ':');
4473 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4474 if (find (s.begin(), s.end(), *i) == s.end()) {
4481 for (vector<string>::iterator si = s.begin(); si != s.end(); ++si) {
4482 if (!search_path.empty()) {
4492 Session::ensure_search_path_includes (const string& path, DataType type)
4495 vector<string> dirs;
4502 case DataType::AUDIO:
4503 search_path = config.get_audio_search_path ();
4505 case DataType::MIDI:
4506 search_path = config.get_midi_search_path ();
4510 split (search_path, dirs, ':');
4512 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4513 /* No need to add this new directory if it has the same inode as
4514 an existing one; checking inode rather than name prevents duplicated
4515 directories when we are using symlinks.
4517 On Windows, I think we could just do if (*i == path) here.
4519 if (PBD::equivalent_paths (*i, path)) {
4524 if (!search_path.empty()) {
4528 search_path += path;
4531 case DataType::AUDIO:
4532 config.set_audio_search_path (search_path);
4534 case DataType::MIDI:
4535 config.set_midi_search_path (search_path);
4540 boost::shared_ptr<Speakers>
4541 Session::get_speakers()
4547 Session::unknown_processors () const
4551 boost::shared_ptr<RouteList> r = routes.reader ();
4552 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4553 list<string> t = (*i)->unknown_processors ();
4554 copy (t.begin(), t.end(), back_inserter (p));
4564 Session::update_latency (bool playback)
4566 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
4568 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
4572 boost::shared_ptr<RouteList> r = routes.reader ();
4573 framecnt_t max_latency = 0;
4576 /* reverse the list so that we work backwards from the last route to run to the first */
4577 RouteList* rl = routes.reader().get();
4578 r.reset (new RouteList (*rl));
4579 reverse (r->begin(), r->end());
4582 /* compute actual latency values for the given direction and store them all in per-port
4583 structures. this will also publish the same values (to JACK) so that computation of latency
4584 for routes can consistently use public latency values.
4587 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4588 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
4591 /* because we latency compensate playback, our published playback latencies should
4592 be the same for all output ports - all material played back by ardour has
4593 the same latency, whether its caused by plugins or by latency compensation. since
4594 these may differ from the values computed above, reset all playback port latencies
4598 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
4600 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4601 (*i)->set_public_port_latencies (max_latency, playback);
4606 post_playback_latency ();
4610 post_capture_latency ();
4613 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
4617 Session::post_playback_latency ()
4619 set_worst_playback_latency ();
4621 boost::shared_ptr<RouteList> r = routes.reader ();
4623 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4624 if (!(*i)->is_auditioner() && ((*i)->active())) {
4625 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
4629 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4630 (*i)->set_latency_compensation (_worst_track_latency);
4635 Session::post_capture_latency ()
4637 set_worst_capture_latency ();
4639 /* reflect any changes in capture latencies into capture offsets
4642 boost::shared_ptr<RouteList> rl = routes.reader();
4643 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4644 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4646 tr->set_capture_offset ();
4652 Session::initialize_latencies ()
4655 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
4656 update_latency (false);
4657 update_latency (true);
4660 set_worst_io_latencies ();
4664 Session::set_worst_io_latencies ()
4666 set_worst_playback_latency ();
4667 set_worst_capture_latency ();
4671 Session::set_worst_playback_latency ()
4673 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4677 _worst_output_latency = 0;
4679 if (!_engine.connected()) {
4683 boost::shared_ptr<RouteList> r = routes.reader ();
4685 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4686 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
4689 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
4693 Session::set_worst_capture_latency ()
4695 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4699 _worst_input_latency = 0;
4701 if (!_engine.connected()) {
4705 boost::shared_ptr<RouteList> r = routes.reader ();
4707 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4708 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
4711 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
4715 Session::update_latency_compensation (bool force_whole_graph)
4717 bool some_track_latency_changed = false;
4719 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4723 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
4725 _worst_track_latency = 0;
4727 boost::shared_ptr<RouteList> r = routes.reader ();
4729 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4730 if (!(*i)->is_auditioner() && ((*i)->active())) {
4732 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
4733 some_track_latency_changed = true;
4735 _worst_track_latency = max (tl, _worst_track_latency);
4739 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
4740 (some_track_latency_changed ? "yes" : "no")));
4742 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
4744 if (some_track_latency_changed || force_whole_graph) {
4745 _engine.update_latencies ();
4749 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4750 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4754 tr->set_capture_offset ();
4759 Session::session_name_is_legal (const string& path)
4761 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
4763 for (int i = 0; illegal_chars[i]; ++i) {
4764 if (path.find (illegal_chars[i]) != string::npos) {
4765 return illegal_chars[i];
4773 Session::next_control_id () const
4777 /* the monitor bus remote ID is in a different
4778 * "namespace" than regular routes. its existence doesn't
4779 * affect normal (low) numbered routes.
4786 return nroutes() - subtract;
4790 Session::notify_remote_id_change ()
4792 if (deletion_in_progress()) {
4796 switch (Config->get_remote_model()) {
4799 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
4807 Session::sync_order_keys (RouteSortOrderKey sort_key_changed)
4809 if (deletion_in_progress()) {
4813 /* tell everyone that something has happened to the sort keys
4814 and let them sync up with the change(s)
4815 this will give objects that manage the sort order keys the
4816 opportunity to keep them in sync if they wish to.
4819 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("Sync Order Keys, based on %1\n", enum_2_string (sort_key_changed)));
4821 Route::SyncOrderKeys (sort_key_changed); /* EMIT SIGNAL */
4823 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
4827 Session::operation_in_progress (GQuark op) const
4829 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
4832 boost::shared_ptr<Port>
4833 Session::ltc_input_port () const
4835 return _ltc_input->nth (0);
4838 boost::shared_ptr<Port>
4839 Session::ltc_output_port () const
4841 return _ltc_output->nth (0);
4845 Session::reconnect_ltc_input ()
4849 string src = Config->get_ltc_source_port();
4851 _ltc_input->disconnect (this);
4853 if (src != _("None") && !src.empty()) {
4854 _ltc_input->nth (0)->connect (src);
4860 Session::reconnect_ltc_output ()
4865 string src = Config->get_ltc_sink_port();
4867 _ltc_output->disconnect (this);
4869 if (src != _("None") && !src.empty()) {
4870 _ltc_output->nth (0)->connect (src);