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 , _unique_track_number (0)
138 , _session_dir (new SessionDirectory(fullpath))
140 , _state_of_the_state (Clean)
141 , _butler (new Butler (*this))
142 , _post_transport_work (0)
143 , _send_timecode_update (false)
145 , _all_route_group (new RouteGroup (*this, "all"))
146 , routes (new RouteList)
147 , _total_free_4k_blocks (0)
148 , _total_free_4k_blocks_uncertain (false)
149 , _bundles (new BundleList)
150 , _bundle_xml_node (0)
153 , click_emphasis_data (0)
155 , _have_rec_enabled_track (false)
156 , _suspend_timecode_transmission (0)
158 _locations = new Locations (*this);
161 if (how_many_dsp_threads () > 1) {
162 /* For now, only create the graph if we are using >1 DSP threads, as
163 it is a bit slower than the old code with 1 thread.
165 _process_graph.reset (new Graph (*this));
168 playlists.reset (new SessionPlaylists);
170 _all_route_group->set_active (true, this);
172 interpolation.add_channel_to (0, 0);
174 if (!eng.connected()) {
175 throw failed_constructor();
178 n_physical_outputs = _engine.n_physical_outputs ();
179 n_physical_inputs = _engine.n_physical_inputs ();
181 first_stage_init (fullpath, snapshot_name);
183 _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
186 if (create (mix_template, bus_profile)) {
188 throw failed_constructor ();
192 if (second_stage_init ()) {
194 throw failed_constructor ();
197 store_recent_sessions(_name, _path);
199 bool was_dirty = dirty();
201 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
203 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
204 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
207 DirtyChanged (); /* EMIT SIGNAL */
210 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
211 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
227 vector<void*> debug_pointers;
229 /* if we got to here, leaving pending capture state around
233 remove_pending_capture_state ();
235 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
237 /* disconnect from any and all signals that we are connected to */
241 _engine.remove_session ();
243 /* deregister all ports - there will be no process or any other
244 * callbacks from the engine any more.
247 Port::PortDrop (); /* EMIT SIGNAL */
251 /* clear history so that no references to objects are held any more */
255 /* clear state tree so that no references to objects are held any more */
259 /* reset dynamic state version back to default */
261 Stateful::loading_state_version = 0;
263 _butler->drop_references ();
267 delete midi_control_ui;
268 delete _all_route_group;
270 if (click_data != default_click) {
271 delete [] click_data;
274 if (click_emphasis_data != default_click_emphasis) {
275 delete [] click_emphasis_data;
280 /* clear out any pending dead wood from RCU managed objects */
285 AudioDiskstream::free_working_buffers();
287 /* tell everyone who is still standing that we're about to die */
290 /* tell everyone to drop references and delete objects as we go */
292 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
293 RegionFactory::delete_all_regions ();
295 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
297 /* reset these three references to special routes before we do the usual route delete thing */
300 _master_out.reset ();
301 _monitor_out.reset ();
304 RCUWriter<RouteList> writer (routes);
305 boost::shared_ptr<RouteList> r = writer.get_copy ();
307 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
308 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
309 (*i)->drop_references ();
313 /* writer goes out of scope and updates master */
317 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
318 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
319 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
320 i->second->drop_references ();
325 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
326 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
331 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
336 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
338 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
339 boost_debug_list_ptrs ();
344 Session::when_engine_running ()
346 string first_physical_output;
348 BootMessage (_("Set block size and sample rate"));
350 set_block_size (_engine.frames_per_cycle());
351 set_frame_rate (_engine.frame_rate());
353 BootMessage (_("Using configuration"));
355 boost::function<void (std::string)> ff (boost::bind (&Session::config_changed, this, _1, false));
356 boost::function<void (std::string)> ft (boost::bind (&Session::config_changed, this, _1, true));
358 Config->map_parameters (ff);
359 config.map_parameters (ft);
361 /* every time we reconnect, recompute worst case output latencies */
363 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
365 if (synced_to_jack()) {
366 _engine.transport_stop ();
369 if (config.get_jack_time_master()) {
370 _engine.transport_locate (_transport_frame);
378 _ltc_input.reset (new IO (*this, _("LTC In"), IO::Input));
379 _ltc_output.reset (new IO (*this, _("LTC Out"), IO::Output));
381 if (state_tree && (child = find_named_node (*state_tree->root(), "LTC-In")) != 0) {
382 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
385 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
386 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
388 reconnect_ltc_input ();
391 if (state_tree && (child = find_named_node (*state_tree->root(), "LTC-Out")) != 0) {
392 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
395 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
396 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
398 reconnect_ltc_output ();
401 /* fix up names of LTC ports because we don't want the normal
402 * IO style of NAME/TYPE-{in,out}N
405 _ltc_input->nth (0)->set_name (_("LTC-in"));
406 _ltc_output->nth (0)->set_name (_("LTC-out"));
408 _click_io.reset (new ClickIO (*this, "click"));
409 _click_gain.reset (new Amp (*this));
410 _click_gain->activate ();
412 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
414 /* existing state for Click */
417 if (Stateful::loading_state_version < 3000) {
418 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
420 const XMLNodeList& children (child->children());
421 XMLNodeList::const_iterator i = children.begin();
422 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
424 if (i != children.end()) {
425 c = _click_gain->set_state (**i, Stateful::loading_state_version);
431 _clicking = Config->get_clicking ();
435 error << _("could not setup Click I/O") << endmsg;
442 /* default state for Click: dual-mono to first 2 physical outputs */
445 _engine.get_physical_outputs (DataType::AUDIO, outs);
447 for (uint32_t physport = 0; physport < 2; ++physport) {
448 if (outs.size() > physport) {
449 if (_click_io->add_port (outs[physport], this)) {
450 // relax, even though its an error
455 if (_click_io->n_ports () > ChanCount::ZERO) {
456 _clicking = Config->get_clicking ();
461 catch (failed_constructor& err) {
462 error << _("cannot setup Click I/O") << endmsg;
465 BootMessage (_("Compute I/O Latencies"));
468 // XXX HOW TO ALERT UI TO THIS ? DO WE NEED TO?
471 BootMessage (_("Set up standard connections"));
473 vector<string> inputs[DataType::num_types];
474 vector<string> outputs[DataType::num_types];
475 for (uint32_t i = 0; i < DataType::num_types; ++i) {
476 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
477 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
480 /* Create a set of Bundle objects that map
481 to the physical I/O currently available. We create both
482 mono and stereo bundles, so that the common cases of mono
483 and stereo tracks get bundles to put in their mixer strip
484 in / out menus. There may be a nicer way of achieving that;
485 it doesn't really scale that well to higher channel counts
488 /* mono output bundles */
490 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
492 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
494 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
495 c->add_channel (_("mono"), DataType::AUDIO);
496 c->set_port (0, outputs[DataType::AUDIO][np]);
501 /* stereo output bundles */
503 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
504 if (np + 1 < outputs[DataType::AUDIO].size()) {
506 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
507 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
508 c->add_channel (_("L"), DataType::AUDIO);
509 c->set_port (0, outputs[DataType::AUDIO][np]);
510 c->add_channel (_("R"), DataType::AUDIO);
511 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
517 /* mono input bundles */
519 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
521 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
523 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
524 c->add_channel (_("mono"), DataType::AUDIO);
525 c->set_port (0, inputs[DataType::AUDIO][np]);
530 /* stereo input bundles */
532 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
533 if (np + 1 < inputs[DataType::AUDIO].size()) {
535 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
537 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
538 c->add_channel (_("L"), DataType::AUDIO);
539 c->set_port (0, inputs[DataType::AUDIO][np]);
540 c->add_channel (_("R"), DataType::AUDIO);
541 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
547 /* MIDI input bundles */
549 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
550 string n = inputs[DataType::MIDI][np];
551 boost::erase_first (n, X_("alsa_pcm:"));
553 boost::shared_ptr<Bundle> c (new Bundle (n, false));
554 c->add_channel ("", DataType::MIDI);
555 c->set_port (0, inputs[DataType::MIDI][np]);
559 /* MIDI output bundles */
561 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
562 string n = outputs[DataType::MIDI][np];
563 boost::erase_first (n, X_("alsa_pcm:"));
565 boost::shared_ptr<Bundle> c (new Bundle (n, true));
566 c->add_channel ("", DataType::MIDI);
567 c->set_port (0, outputs[DataType::MIDI][np]);
571 BootMessage (_("Setup signal flow and plugins"));
573 /* Reset all panners */
575 Delivery::reset_panners ();
577 /* this will cause the CPM to instantiate any protocols that are in use
578 * (or mandatory), which will pass it this Session, and then call
579 * set_state() on each instantiated protocol to match stored state.
582 ControlProtocolManager::instance().set_session (this);
584 /* This must be done after the ControlProtocolManager set_session above,
585 as it will set states for ports which the ControlProtocolManager creates.
588 MIDI::Manager::instance()->set_port_states (Config->midi_port_states ());
590 /* And this must be done after the MIDI::Manager::set_port_states as
591 * it will try to make connections whose details are loaded by set_port_states.
596 /* Let control protocols know that we are now all connected, so they
597 * could start talking to surfaces if they want to.
600 ControlProtocolManager::instance().midi_connectivity_established ();
602 if (_is_new && !no_auto_connect()) {
603 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock());
604 auto_connect_master_bus ();
607 _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
609 /* update latencies */
611 initialize_latencies ();
613 /* hook us up to the engine */
615 BootMessage (_("Connect to engine"));
616 _engine.set_session (this);
617 _engine.reset_timebase ();
621 Session::auto_connect_master_bus ()
623 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
627 /* if requested auto-connect the outputs to the first N physical ports.
630 uint32_t limit = _master_out->n_outputs().n_total();
631 vector<string> outputs[DataType::num_types];
633 for (uint32_t i = 0; i < DataType::num_types; ++i) {
634 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
637 for (uint32_t n = 0; n < limit; ++n) {
638 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
640 if (outputs[p->type()].size() > n) {
641 connect_to = outputs[p->type()][n];
644 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
645 if (_master_out->output()->connect (p, connect_to, this)) {
646 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
655 Session::remove_monitor_section ()
661 /* force reversion to Solo-In-Place */
662 Config->set_solo_control_is_listen_control (false);
665 /* Hold process lock while doing this so that we don't hear bits and
666 * pieces of audio as we work on each route.
669 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
671 /* Connect tracks to monitor section. Note that in an
672 existing session, the internal sends will already exist, but we want the
673 routes to notice that they connect to the control out specifically.
677 boost::shared_ptr<RouteList> r = routes.reader ();
678 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
680 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
682 if ((*x)->is_monitor()) {
684 } else if ((*x)->is_master()) {
687 (*x)->remove_aux_or_listen (_monitor_out);
692 remove_route (_monitor_out);
693 auto_connect_master_bus ();
697 Session::add_monitor_section ()
701 if (_monitor_out || !_master_out) {
705 boost::shared_ptr<Route> r (new Route (*this, _("monitor"), Route::MonitorOut, DataType::AUDIO));
711 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
712 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
715 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
716 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
717 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
721 add_routes (rl, false, false, false);
723 assert (_monitor_out);
725 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
726 are undefined, at best.
729 uint32_t limit = _monitor_out->n_inputs().n_audio();
733 /* connect the inputs to the master bus outputs. this
734 * represents a separate data feed from the internal sends from
735 * each route. as of jan 2011, it allows the monitor section to
736 * conditionally ignore either the internal sends or the normal
737 * input feed, but we should really find a better way to do
741 _master_out->output()->disconnect (this);
743 for (uint32_t n = 0; n < limit; ++n) {
744 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
745 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
748 string connect_to = o->name();
749 if (_monitor_out->input()->connect (p, connect_to, this)) {
750 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
758 /* if monitor section is not connected, connect it to physical outs
761 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
763 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
765 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
768 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
770 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
771 Config->get_monitor_bus_preferred_bundle())
777 /* Monitor bus is audio only */
779 uint32_t mod = n_physical_outputs.get (DataType::AUDIO);
780 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
781 vector<string> outputs[DataType::num_types];
783 for (uint32_t i = 0; i < DataType::num_types; ++i) {
784 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
790 for (uint32_t n = 0; n < limit; ++n) {
792 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
794 if (outputs[DataType::AUDIO].size() > (n % mod)) {
795 connect_to = outputs[DataType::AUDIO][n % mod];
798 if (!connect_to.empty()) {
799 if (_monitor_out->output()->connect (p, connect_to, this)) {
800 error << string_compose (
801 _("cannot connect control output %1 to %2"),
812 /* Hold process lock while doing this so that we don't hear bits and
813 * pieces of audio as we work on each route.
816 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
818 /* Connect tracks to monitor section. Note that in an
819 existing session, the internal sends will already exist, but we want the
820 routes to notice that they connect to the control out specifically.
824 boost::shared_ptr<RouteList> rls = routes.reader ();
826 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
828 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
830 if ((*x)->is_monitor()) {
832 } else if ((*x)->is_master()) {
835 (*x)->enable_monitor_send ();
841 Session::hookup_io ()
843 /* stop graph reordering notifications from
844 causing resorts, etc.
847 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
851 /* we delay creating the auditioner till now because
852 it makes its own connections to ports.
856 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
858 throw failed_constructor ();
860 a->use_new_diskstream ();
864 catch (failed_constructor& err) {
865 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
869 /* load bundles, which we may have postponed earlier on */
870 if (_bundle_xml_node) {
871 load_bundles (*_bundle_xml_node);
872 delete _bundle_xml_node;
875 /* Tell all IO objects to connect themselves together */
877 IO::enable_connecting ();
878 MIDI::JackMIDIPort::MakeConnections ();
880 /* Anyone who cares about input state, wake up and do something */
882 IOConnectionsComplete (); /* EMIT SIGNAL */
884 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
886 /* now handle the whole enchilada as if it was one
892 /* update the full solo state, which can't be
893 correctly determined on a per-route basis, but
894 needs the global overview that only the session
898 update_route_solo_state ();
902 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
904 boost::shared_ptr<Track> track = wp.lock ();
909 boost::shared_ptr<Playlist> playlist;
911 if ((playlist = track->playlist()) != 0) {
912 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
913 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
914 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
919 Session::record_enabling_legal () const
921 /* this used to be in here, but survey says.... we don't need to restrict it */
922 // if (record_status() == Recording) {
926 if (Config->get_all_safe()) {
933 Session::set_track_monitor_input_status (bool yn)
935 boost::shared_ptr<RouteList> rl = routes.reader ();
936 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
937 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
938 if (tr && tr->record_enabled ()) {
939 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
940 tr->request_jack_monitors_input (yn);
946 Session::auto_punch_start_changed (Location* location)
948 replace_event (SessionEvent::PunchIn, location->start());
950 if (get_record_enabled() && config.get_punch_in()) {
951 /* capture start has been changed, so save new pending state */
952 save_state ("", true);
957 Session::auto_punch_end_changed (Location* location)
959 framepos_t when_to_stop = location->end();
960 // when_to_stop += _worst_output_latency + _worst_input_latency;
961 replace_event (SessionEvent::PunchOut, when_to_stop);
965 Session::auto_punch_changed (Location* location)
967 framepos_t when_to_stop = location->end();
969 replace_event (SessionEvent::PunchIn, location->start());
970 //when_to_stop += _worst_output_latency + _worst_input_latency;
971 replace_event (SessionEvent::PunchOut, when_to_stop);
974 /** @param loc A loop location.
975 * @param pos Filled in with the start time of the required fade-out (in session frames).
976 * @param length Filled in with the length of the required fade-out.
979 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
981 pos = max (loc->start(), loc->end() - 64);
982 length = loc->end() - pos;
986 Session::auto_loop_changed (Location* location)
988 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
991 auto_loop_declick_range (location, dcp, dcl);
992 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
994 if (transport_rolling() && play_loop) {
997 // if (_transport_frame > location->end()) {
999 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1000 // relocate to beginning of loop
1001 clear_events (SessionEvent::LocateRoll);
1003 request_locate (location->start(), true);
1006 else if (Config->get_seamless_loop() && !loop_changing) {
1008 // schedule a locate-roll to refill the diskstreams at the
1009 // previous loop end
1010 loop_changing = true;
1012 if (location->end() > last_loopend) {
1013 clear_events (SessionEvent::LocateRoll);
1014 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1021 last_loopend = location->end();
1025 Session::set_auto_punch_location (Location* location)
1029 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1030 punch_connections.drop_connections();
1031 existing->set_auto_punch (false, this);
1032 remove_event (existing->start(), SessionEvent::PunchIn);
1033 clear_events (SessionEvent::PunchOut);
1034 auto_punch_location_changed (0);
1039 if (location == 0) {
1043 if (location->end() <= location->start()) {
1044 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1048 punch_connections.drop_connections ();
1050 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
1051 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
1052 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
1054 location->set_auto_punch (true, this);
1056 auto_punch_changed (location);
1058 auto_punch_location_changed (location);
1062 Session::set_auto_loop_location (Location* location)
1066 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1067 loop_connections.drop_connections ();
1068 existing->set_auto_loop (false, this);
1069 remove_event (existing->end(), SessionEvent::AutoLoop);
1072 auto_loop_declick_range (existing, dcp, dcl);
1073 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1074 auto_loop_location_changed (0);
1079 if (location == 0) {
1083 if (location->end() <= location->start()) {
1084 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1088 last_loopend = location->end();
1090 loop_connections.drop_connections ();
1092 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1093 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1094 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1096 location->set_auto_loop (true, this);
1098 /* take care of our stuff first */
1100 auto_loop_changed (location);
1102 /* now tell everyone else */
1104 auto_loop_location_changed (location);
1108 Session::locations_added (Location *)
1114 Session::locations_changed ()
1116 _locations->apply (*this, &Session::handle_locations_changed);
1120 Session::handle_locations_changed (Locations::LocationList& locations)
1122 Locations::LocationList::iterator i;
1124 bool set_loop = false;
1125 bool set_punch = false;
1127 for (i = locations.begin(); i != locations.end(); ++i) {
1131 if (location->is_auto_punch()) {
1132 set_auto_punch_location (location);
1135 if (location->is_auto_loop()) {
1136 set_auto_loop_location (location);
1140 if (location->is_session_range()) {
1141 _session_range_location = location;
1146 set_auto_loop_location (0);
1149 set_auto_punch_location (0);
1156 Session::enable_record ()
1158 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1159 /* no recording at anything except normal speed */
1164 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1166 if (rs == Recording) {
1170 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1172 _last_record_location = _transport_frame;
1173 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1175 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1176 set_track_monitor_input_status (true);
1179 RecordStateChanged ();
1186 Session::disable_record (bool rt_context, bool force)
1190 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1192 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1193 g_atomic_int_set (&_record_status, Disabled);
1194 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1196 if (rs == Recording) {
1197 g_atomic_int_set (&_record_status, Enabled);
1201 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1202 set_track_monitor_input_status (false);
1205 RecordStateChanged (); /* emit signal */
1208 remove_pending_capture_state ();
1214 Session::step_back_from_record ()
1216 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1218 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1219 set_track_monitor_input_status (false);
1222 RecordStateChanged (); /* emit signal */
1227 Session::maybe_enable_record ()
1229 if (_step_editors > 0) {
1233 g_atomic_int_set (&_record_status, Enabled);
1235 /* This function is currently called from somewhere other than an RT thread.
1236 This save_state() call therefore doesn't impact anything. Doing it here
1237 means that we save pending state of which sources the next record will use,
1238 which gives us some chance of recovering from a crash during the record.
1241 save_state ("", true);
1243 if (_transport_speed) {
1244 if (!config.get_punch_in()) {
1248 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1249 RecordStateChanged (); /* EMIT SIGNAL */
1256 Session::audible_frame () const
1262 /* the first of these two possible settings for "offset"
1263 mean that the audible frame is stationary until
1264 audio emerges from the latency compensation
1267 the second means that the audible frame is stationary
1268 until audio would emerge from a physical port
1269 in the absence of any plugin latency compensation
1272 offset = worst_playback_latency ();
1274 if (offset > current_block_size) {
1275 offset -= current_block_size;
1277 /* XXX is this correct? if we have no external
1278 physical connections and everything is internal
1279 then surely this is zero? still, how
1280 likely is that anyway?
1282 offset = current_block_size;
1285 if (synced_to_jack()) {
1286 tf = _engine.transport_frame();
1288 tf = _transport_frame;
1293 if (!non_realtime_work_pending()) {
1297 /* Check to see if we have passed the first guaranteed
1298 audible frame past our last start position. if not,
1299 return that last start point because in terms
1300 of audible frames, we have not moved yet.
1302 `Start position' in this context means the time we last
1303 either started, located, or changed transport direction.
1306 if (_transport_speed > 0.0f) {
1308 if (!play_loop || !have_looped) {
1309 if (tf < _last_roll_or_reversal_location + offset) {
1310 return _last_roll_or_reversal_location;
1318 } else if (_transport_speed < 0.0f) {
1320 /* XXX wot? no backward looping? */
1322 if (tf > _last_roll_or_reversal_location - offset) {
1323 return _last_roll_or_reversal_location;
1335 Session::set_frame_rate (framecnt_t frames_per_second)
1337 /** \fn void Session::set_frame_size(framecnt_t)
1338 the AudioEngine object that calls this guarantees
1339 that it will not be called while we are also in
1340 ::process(). Its fine to do things that block
1344 _base_frame_rate = frames_per_second;
1350 // XXX we need some equivalent to this, somehow
1351 // SndFileSource::setup_standard_crossfades (frames_per_second);
1355 /* XXX need to reset/reinstantiate all LADSPA plugins */
1359 Session::set_block_size (pframes_t nframes)
1361 /* the AudioEngine guarantees
1362 that it will not be called while we are also in
1363 ::process(). It is therefore fine to do things that block
1368 current_block_size = nframes;
1372 boost::shared_ptr<RouteList> r = routes.reader ();
1374 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1375 (*i)->set_block_size (nframes);
1378 boost::shared_ptr<RouteList> rl = routes.reader ();
1379 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1380 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1382 tr->set_block_size (nframes);
1386 set_worst_io_latencies ();
1392 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1394 boost::shared_ptr<Route> r2;
1396 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1397 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1401 /* make a copy of the existing list of routes that feed r1 */
1403 Route::FedBy existing (r1->fed_by());
1405 /* for each route that feeds r1, recurse, marking it as feeding
1409 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1410 if (!(r2 = i->r.lock ())) {
1411 /* (*i) went away, ignore it */
1415 /* r2 is a route that feeds r1 which somehow feeds base. mark
1416 base as being fed by r2
1419 rbase->add_fed_by (r2, i->sends_only);
1423 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1427 if (r1->feeds (r2) && r2->feeds (r1)) {
1431 /* now recurse, so that we can mark base as being fed by
1432 all routes that feed r2
1435 trace_terminal (r2, rbase);
1442 Session::resort_routes ()
1444 /* don't do anything here with signals emitted
1445 by Routes during initial setup or while we
1446 are being destroyed.
1449 if (_state_of_the_state & (InitialConnecting | Deletion)) {
1454 RCUWriter<RouteList> writer (routes);
1455 boost::shared_ptr<RouteList> r = writer.get_copy ();
1456 resort_routes_using (r);
1457 /* writer goes out of scope and forces update */
1461 boost::shared_ptr<RouteList> rl = routes.reader ();
1462 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1463 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1465 const Route::FedBy& fb ((*i)->fed_by());
1467 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1468 boost::shared_ptr<Route> sf = f->r.lock();
1470 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1478 /** This is called whenever we need to rebuild the graph of how we will process
1480 * @param r List of routes, in any order.
1484 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1486 /* We are going to build a directed graph of our routes;
1487 this is where the edges of that graph are put.
1492 /* Go through all routes doing two things:
1494 * 1. Collect the edges of the route graph. Each of these edges
1495 * is a pair of routes, one of which directly feeds the other
1496 * either by a JACK connection or by an internal send.
1498 * 2. Begin the process of making routes aware of which other
1499 * routes directly or indirectly feed them. This information
1500 * is used by the solo code.
1503 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1505 /* Clear out the route's list of direct or indirect feeds */
1506 (*i)->clear_fed_by ();
1508 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
1510 bool via_sends_only;
1512 /* See if this *j feeds *i according to the current state of the JACK
1513 connections and internal sends.
1515 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
1516 /* add the edge to the graph (part #1) */
1517 edges.add (*j, *i, via_sends_only);
1518 /* tell the route (for part #2) */
1519 (*i)->add_fed_by (*j, via_sends_only);
1524 /* Attempt a topological sort of the route graph */
1525 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
1527 if (sorted_routes) {
1528 /* We got a satisfactory topological sort, so there is no feedback;
1531 Note: the process graph rechain does not require a
1532 topologically-sorted list, but hey ho.
1534 if (_process_graph) {
1535 _process_graph->rechain (sorted_routes, edges);
1538 _current_route_graph = edges;
1540 /* Complete the building of the routes' lists of what directly
1541 or indirectly feeds them.
1543 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1544 trace_terminal (*i, *i);
1547 *r = *sorted_routes;
1550 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1551 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1552 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1553 (*i)->name(), (*i)->order_key (MixerSort)));
1557 SuccessfulGraphSort (); /* EMIT SIGNAL */
1560 /* The topological sort failed, so we have a problem. Tell everyone
1561 and stick to the old graph; this will continue to be processed, so
1562 until the feedback is fixed, what is played back will not quite
1563 reflect what is actually connected. Note also that we do not
1564 do trace_terminal here, as it would fail due to an endless recursion,
1565 so the solo code will think that everything is still connected
1569 FeedbackDetected (); /* EMIT SIGNAL */
1574 /** Find a route name starting with \a base, maybe followed by the
1575 * lowest \a id. \a id will always be added if \a definitely_add_number
1576 * is true on entry; otherwise it will only be added if required
1577 * to make the name unique.
1579 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1580 * The available route name with the lowest ID will be used, and \a id
1581 * will be set to the ID.
1583 * \return false if a route name could not be found, and \a track_name
1584 * and \a id do not reflect a free route name.
1587 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1589 if (!definitely_add_number && route_by_name (base) == 0) {
1590 /* juse use the base */
1591 snprintf (name, name_len, "%s", base.c_str());
1596 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1598 if (route_by_name (name) == 0) {
1604 } while (id < (UINT_MAX-1));
1609 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
1611 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
1613 in = ChanCount::ZERO;
1614 out = ChanCount::ZERO;
1616 boost::shared_ptr<RouteList> r = routes.reader ();
1618 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1619 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1620 if (tr && !tr->is_auditioner()) {
1621 in += tr->n_inputs();
1622 out += tr->n_outputs();
1627 /** Caller must not hold process lock
1628 * @param name_template string to use for the start of the name, or "" to use "MIDI".
1629 * @param instrument plugin info for the instrument to insert pre-fader, if any
1631 list<boost::shared_ptr<MidiTrack> >
1632 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
1633 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1635 char track_name[32];
1636 uint32_t track_id = 0;
1638 RouteList new_routes;
1639 list<boost::shared_ptr<MidiTrack> > ret;
1641 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
1644 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1645 error << "cannot find name for new midi track" << endmsg;
1649 boost::shared_ptr<MidiTrack> track;
1652 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1653 track->set_unique_id(++_unique_track_number);
1655 if (track->init ()) {
1659 track->use_new_diskstream();
1661 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1662 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1665 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1666 if (track->input()->ensure_io (input, false, this)) {
1667 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
1671 if (track->output()->ensure_io (output, false, this)) {
1672 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
1677 track->non_realtime_input_change();
1680 route_group->add (track);
1683 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1685 if (Config->get_remote_model() == UserOrdered) {
1686 track->set_remote_control_id (next_control_id());
1689 new_routes.push_back (track);
1690 ret.push_back (track);
1693 catch (failed_constructor &err) {
1694 error << _("Session: could not create new midi track.") << endmsg;
1698 catch (AudioEngine::PortRegistrationFailure& pfe) {
1700 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;
1708 if (!new_routes.empty()) {
1709 add_routes (new_routes, true, true, true);
1712 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
1713 PluginPtr plugin = instrument->load (*this);
1714 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
1715 (*r)->add_processor (p, PreFader);
1725 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
1727 boost::shared_ptr<Route> midi_track (wmt.lock());
1733 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
1735 if (change.after.n_audio() <= change.before.n_audio()) {
1739 /* new audio ports: make sure the audio goes somewhere useful,
1740 unless the user has no-auto-connect selected.
1742 The existing ChanCounts don't matter for this call as they are only
1743 to do with matching input and output indices, and we are only changing
1749 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
1753 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1754 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1755 * @param output_start As \a input_start, but for outputs.
1758 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
1759 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
1761 if (!IO::connecting_legal) {
1765 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1771 /* If both inputs and outputs are auto-connected to physical ports,
1772 use the max of input and output offsets to ensure auto-connected
1773 port numbers always match up (e.g. the first audio input and the
1774 first audio output of the route will have the same physical
1775 port number). Otherwise just use the lowest input or output
1779 DEBUG_TRACE (DEBUG::Graph,
1780 string_compose("Auto-connect: existing in = %1 out = %2\n",
1781 existing_inputs, existing_outputs));
1783 const bool in_out_physical =
1784 (Config->get_input_auto_connect() & AutoConnectPhysical)
1785 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1788 const ChanCount in_offset = in_out_physical
1789 ? ChanCount::max(existing_inputs, existing_outputs)
1792 const ChanCount out_offset = in_out_physical
1793 ? ChanCount::max(existing_inputs, existing_outputs)
1796 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1797 vector<string> physinputs;
1798 vector<string> physoutputs;
1800 _engine.get_physical_outputs (*t, physoutputs);
1801 _engine.get_physical_inputs (*t, physinputs);
1803 if (!physinputs.empty() && connect_inputs) {
1804 uint32_t nphysical_in = physinputs.size();
1806 DEBUG_TRACE (DEBUG::Graph,
1807 string_compose("There are %1 physical inputs of type %2\n",
1810 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1813 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1814 DEBUG_TRACE (DEBUG::Graph,
1815 string_compose("Get index %1 + %2 % %3 = %4\n",
1816 in_offset.get(*t), i, nphysical_in,
1817 (in_offset.get(*t) + i) % nphysical_in));
1818 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1821 DEBUG_TRACE (DEBUG::Graph,
1822 string_compose("Connect route %1 IN to %2\n",
1823 route->name(), port));
1825 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
1829 ChanCount one_added (*t, 1);
1830 existing_inputs += one_added;
1834 if (!physoutputs.empty()) {
1835 uint32_t nphysical_out = physoutputs.size();
1836 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
1839 if ((*t) == DataType::MIDI || Config->get_output_auto_connect() & AutoConnectPhysical) {
1840 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1841 } else if ((*t) == DataType::AUDIO && Config->get_output_auto_connect() & AutoConnectMaster) {
1842 /* master bus is audio only */
1843 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1844 port = _master_out->input()->ports().port(*t,
1845 i % _master_out->input()->n_ports().get(*t))->name();
1849 DEBUG_TRACE (DEBUG::Graph,
1850 string_compose("Connect route %1 OUT to %2\n",
1851 route->name(), port));
1853 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
1857 ChanCount one_added (*t, 1);
1858 existing_outputs += one_added;
1864 /** Caller must not hold process lock
1865 * @param name_template string to use for the start of the name, or "" to use "Audio".
1867 list< boost::shared_ptr<AudioTrack> >
1868 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
1869 uint32_t how_many, string name_template)
1871 char track_name[32];
1872 uint32_t track_id = 0;
1874 RouteList new_routes;
1875 list<boost::shared_ptr<AudioTrack> > ret;
1877 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
1880 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1881 error << "cannot find name for new audio track" << endmsg;
1885 boost::shared_ptr<AudioTrack> track;
1888 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
1889 track->set_unique_id(++_unique_track_number);
1891 if (track->init ()) {
1895 track->use_new_diskstream();
1897 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1898 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1901 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1903 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1904 error << string_compose (
1905 _("cannot configure %1 in/%2 out configuration for new audio track"),
1906 input_channels, output_channels)
1911 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1912 error << string_compose (
1913 _("cannot configure %1 in/%2 out configuration for new audio track"),
1914 input_channels, output_channels)
1921 route_group->add (track);
1924 track->non_realtime_input_change();
1926 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1927 if (Config->get_remote_model() == UserOrdered) {
1928 track->set_remote_control_id (next_control_id());
1931 new_routes.push_back (track);
1932 ret.push_back (track);
1935 catch (failed_constructor &err) {
1936 error << _("Session: could not create new audio track.") << endmsg;
1940 catch (AudioEngine::PortRegistrationFailure& pfe) {
1942 error << pfe.what() << endmsg;
1950 if (!new_routes.empty()) {
1951 add_routes (new_routes, true, true, true);
1957 /** Caller must not hold process lock.
1958 * @param name_template string to use for the start of the name, or "" to use "Bus".
1961 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
1964 uint32_t bus_id = 0;
1968 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
1971 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
1972 error << "cannot find name for new audio bus" << endmsg;
1977 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
1983 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1984 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
1987 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1989 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1990 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1991 input_channels, output_channels)
1997 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1998 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1999 input_channels, output_channels)
2006 route_group->add (bus);
2008 if (Config->get_remote_model() == UserOrdered) {
2009 bus->set_remote_control_id (next_control_id());
2012 bus->add_internal_return ();
2014 ret.push_back (bus);
2020 catch (failed_constructor &err) {
2021 error << _("Session: could not create new audio route.") << endmsg;
2025 catch (AudioEngine::PortRegistrationFailure& pfe) {
2026 error << pfe.what() << endmsg;
2036 add_routes (ret, false, true, true); // autoconnect outputs only
2044 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base)
2047 uint32_t control_id;
2049 uint32_t number = 0;
2050 const uint32_t being_added = how_many;
2052 if (!tree.read (template_path.c_str())) {
2056 XMLNode* node = tree.root();
2058 IO::disable_connecting ();
2060 control_id = next_control_id ();
2064 XMLNode node_copy (*node);
2066 /* Remove IDs of everything so that new ones are used */
2067 node_copy.remove_property_recursively (X_("id"));
2072 if (!name_base.empty()) {
2074 /* if we're adding more than one routes, force
2075 * all the names of the new routes to be
2076 * numbered, via the final parameter.
2079 if (!find_route_name (name_base.c_str(), ++number, name, sizeof(name), (being_added > 1))) {
2080 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2086 string const route_name = node_copy.property(X_("name"))->value ();
2088 /* generate a new name by adding a number to the end of the template name */
2089 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2090 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2095 /* set this name in the XML description that we are about to use */
2096 Route::set_name_in_state (node_copy, name);
2098 /* trim bitslots from listen sends so that new ones are used */
2099 XMLNodeList children = node_copy.children ();
2100 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2101 if ((*i)->name() == X_("Processor")) {
2102 XMLProperty* role = (*i)->property (X_("role"));
2103 if (role && role->value() == X_("Listen")) {
2104 (*i)->remove_property (X_("bitslot"));
2109 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2112 error << _("Session: cannot create track/bus from template description") << endmsg;
2116 if (boost::dynamic_pointer_cast<Track>(route)) {
2117 /* force input/output change signals so that the new diskstream
2118 picks up the configuration of the route. During session
2119 loading this normally happens in a different way.
2122 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2124 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2125 change.after = route->input()->n_ports();
2126 route->input()->changed (change, this);
2127 change.after = route->output()->n_ports();
2128 route->output()->changed (change, this);
2131 route->set_remote_control_id (control_id);
2134 ret.push_back (route);
2137 catch (failed_constructor &err) {
2138 error << _("Session: could not create new route from template") << endmsg;
2142 catch (AudioEngine::PortRegistrationFailure& pfe) {
2143 error << pfe.what() << endmsg;
2152 add_routes (ret, true, true, true);
2153 IO::enable_connecting ();
2160 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
2163 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
2164 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
2167 error << _("Adding new tracks/busses failed") << endmsg;
2172 update_latency (true);
2173 update_latency (false);
2178 save_state (_current_snapshot_name);
2181 RouteAdded (new_routes); /* EMIT SIGNAL */
2185 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
2187 ChanCount existing_inputs;
2188 ChanCount existing_outputs;
2189 uint32_t order = next_control_id();
2191 count_existing_track_channels (existing_inputs, existing_outputs);
2194 RCUWriter<RouteList> writer (routes);
2195 boost::shared_ptr<RouteList> r = writer.get_copy ();
2196 r->insert (r->end(), new_routes.begin(), new_routes.end());
2198 /* if there is no control out and we're not in the middle of loading,
2199 resort the graph here. if there is a control out, we will resort
2200 toward the end of this method. if we are in the middle of loading,
2201 we will resort when done.
2204 if (!_monitor_out && IO::connecting_legal) {
2205 resort_routes_using (r);
2209 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2211 boost::weak_ptr<Route> wpr (*x);
2212 boost::shared_ptr<Route> r (*x);
2214 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2215 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2216 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2217 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2218 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2219 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2221 if (r->is_master()) {
2225 if (r->is_monitor()) {
2229 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2231 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2232 track_playlist_changed (boost::weak_ptr<Track> (tr));
2233 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2235 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2237 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2238 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2243 if (input_auto_connect || output_auto_connect) {
2244 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
2247 /* order keys are a GUI responsibility but we need to set up
2248 reasonable defaults because they also affect the remote control
2249 ID in most situations.
2252 if (!r->has_order_key (EditorSort)) {
2253 if (r->is_auditioner()) {
2254 /* use an arbitrarily high value */
2255 r->set_order_key (EditorSort, UINT_MAX);
2256 r->set_order_key (MixerSort, UINT_MAX);
2258 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
2259 r->set_order_key (EditorSort, order);
2260 r->set_order_key (MixerSort, order);
2268 if (_monitor_out && IO::connecting_legal) {
2269 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
2271 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2272 if ((*x)->is_monitor()) {
2274 } else if ((*x)->is_master()) {
2277 (*x)->enable_monitor_send ();
2284 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2286 boost::shared_ptr<RouteList> r = routes.reader ();
2287 boost::shared_ptr<Send> s;
2289 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2290 if ((s = (*i)->internal_send_for (dest)) != 0) {
2291 s->amp()->gain_control()->set_value (0.0);
2297 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2299 boost::shared_ptr<RouteList> r = routes.reader ();
2300 boost::shared_ptr<Send> s;
2302 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2303 if ((s = (*i)->internal_send_for (dest)) != 0) {
2304 s->amp()->gain_control()->set_value (1.0);
2310 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2312 boost::shared_ptr<RouteList> r = routes.reader ();
2313 boost::shared_ptr<Send> s;
2315 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2316 if ((s = (*i)->internal_send_for (dest)) != 0) {
2317 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2322 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2324 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2326 boost::shared_ptr<RouteList> r = routes.reader ();
2327 boost::shared_ptr<RouteList> t (new RouteList);
2329 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2330 /* no MIDI sends because there are no MIDI busses yet */
2331 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2336 add_internal_sends (dest, p, t);
2340 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2342 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2343 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
2348 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
2350 add_internal_send (dest, sender->before_processor_for_index (index), sender);
2354 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
2356 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
2360 if (!dest->internal_return()) {
2361 dest->add_internal_return ();
2364 sender->add_aux_send (dest, before);
2370 Session::remove_route (boost::shared_ptr<Route> route)
2372 if (route == _master_out) {
2376 route->set_solo (false, this);
2379 RCUWriter<RouteList> writer (routes);
2380 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2384 /* deleting the master out seems like a dumb
2385 idea, but its more of a UI policy issue
2389 if (route == _master_out) {
2390 _master_out = boost::shared_ptr<Route> ();
2393 if (route == _monitor_out) {
2394 _monitor_out.reset ();
2397 /* writer goes out of scope, forces route list update */
2400 update_route_solo_state ();
2402 // We need to disconnect the route's inputs and outputs
2404 route->input()->disconnect (0);
2405 route->output()->disconnect (0);
2407 /* if the route had internal sends sending to it, remove them */
2408 if (route->internal_return()) {
2410 boost::shared_ptr<RouteList> r = routes.reader ();
2411 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2412 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2414 (*i)->remove_processor (s);
2419 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2420 if (mt && mt->step_editing()) {
2421 if (_step_editors > 0) {
2426 update_latency_compensation ();
2429 /* Re-sort routes to remove the graph's current references to the one that is
2430 * going away, then flush old references out of the graph.
2434 if (_process_graph) {
2435 _process_graph->clear_other_chain ();
2438 /* get rid of it from the dead wood collection in the route list manager */
2440 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2444 /* try to cause everyone to drop their references */
2446 route->drop_references ();
2448 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2450 /* save the new state of the world */
2452 if (save_state (_current_snapshot_name)) {
2453 save_history (_current_snapshot_name);
2458 Session::route_mute_changed (void* /*src*/)
2464 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2466 boost::shared_ptr<Route> route = wpr.lock();
2468 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2472 if (route->listening_via_monitor ()) {
2474 if (Config->get_exclusive_solo()) {
2475 /* new listen: disable all other listen */
2476 boost::shared_ptr<RouteList> r = routes.reader ();
2477 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2478 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
2481 (*i)->set_listen (false, this);
2487 } else if (_listen_cnt > 0) {
2492 update_route_solo_state ();
2495 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2497 boost::shared_ptr<Route> route = wpr.lock ();
2500 /* should not happen */
2501 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2505 bool send_changed = false;
2507 if (route->solo_isolated()) {
2508 if (_solo_isolated_cnt == 0) {
2509 send_changed = true;
2511 _solo_isolated_cnt++;
2512 } else if (_solo_isolated_cnt > 0) {
2513 _solo_isolated_cnt--;
2514 if (_solo_isolated_cnt == 0) {
2515 send_changed = true;
2520 IsolatedChanged (); /* EMIT SIGNAL */
2525 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2527 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
2529 if (!self_solo_change) {
2530 // session doesn't care about changes to soloed-by-others
2534 if (solo_update_disabled) {
2536 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
2540 boost::shared_ptr<Route> route = wpr.lock ();
2543 boost::shared_ptr<RouteList> r = routes.reader ();
2546 if (route->self_soloed()) {
2552 RouteGroup* rg = route->route_group ();
2553 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
2555 if (delta == 1 && Config->get_exclusive_solo()) {
2557 /* new solo: disable all other solos, but not the group if its solo-enabled */
2559 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2560 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
2561 (leave_group_alone && ((*i)->route_group() == rg))) {
2564 (*i)->set_solo (false, this);
2568 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
2570 solo_update_disabled = true;
2572 RouteList uninvolved;
2574 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
2576 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2577 bool via_sends_only;
2578 bool in_signal_flow;
2580 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner() ||
2581 (leave_group_alone && ((*i)->route_group() == rg))) {
2585 in_signal_flow = false;
2587 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
2589 if ((*i)->feeds (route, &via_sends_only)) {
2590 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
2591 if (!via_sends_only) {
2592 if (!route->soloed_by_others_upstream()) {
2593 (*i)->mod_solo_by_others_downstream (delta);
2596 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
2598 in_signal_flow = true;
2600 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
2603 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
2605 if (route->feeds (*i, &via_sends_only)) {
2606 /* propagate solo upstream only if routing other than
2607 sends is involved, but do consider the other route
2608 (*i) to be part of the signal flow even if only
2611 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
2615 route->soloed_by_others_downstream(),
2616 route->soloed_by_others_upstream()));
2617 if (!via_sends_only) {
2618 if (!route->soloed_by_others_downstream()) {
2619 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
2620 (*i)->mod_solo_by_others_upstream (delta);
2622 DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
2625 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
2627 in_signal_flow = true;
2629 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
2632 if (!in_signal_flow) {
2633 uninvolved.push_back (*i);
2637 solo_update_disabled = false;
2638 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
2640 update_route_solo_state (r);
2642 /* now notify that the mute state of the routes not involved in the signal
2643 pathway of the just-solo-changed route may have altered.
2646 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2647 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
2648 (*i)->mute_changed (this);
2651 SoloChanged (); /* EMIT SIGNAL */
2656 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2658 /* now figure out if anything that matters is soloed (or is "listening")*/
2660 bool something_soloed = false;
2661 uint32_t listeners = 0;
2662 uint32_t isolated = 0;
2665 r = routes.reader();
2668 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2669 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
2670 something_soloed = true;
2673 if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
2674 if (Config->get_solo_control_is_listen_control()) {
2677 (*i)->set_listen (false, this);
2681 if ((*i)->solo_isolated()) {
2686 if (something_soloed != _non_soloed_outs_muted) {
2687 _non_soloed_outs_muted = something_soloed;
2688 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2691 _listen_cnt = listeners;
2693 if (isolated != _solo_isolated_cnt) {
2694 _solo_isolated_cnt = isolated;
2695 IsolatedChanged (); /* EMIT SIGNAL */
2698 DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
2699 something_soloed, listeners, isolated));
2702 boost::shared_ptr<RouteList>
2703 Session::get_routes_with_internal_returns() const
2705 boost::shared_ptr<RouteList> r = routes.reader ();
2706 boost::shared_ptr<RouteList> rl (new RouteList);
2708 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2709 if ((*i)->internal_return ()) {
2717 Session::io_name_is_legal (const std::string& name)
2719 boost::shared_ptr<RouteList> r = routes.reader ();
2721 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2722 if ((*i)->name() == name) {
2726 if ((*i)->has_io_processor_named (name)) {
2735 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
2738 vector<string> connections;
2740 /* if we are passed only a single route and we're not told to turn
2741 * others off, then just do the simple thing.
2744 if (flip_others == false && rl->size() == 1) {
2745 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
2747 mt->set_input_active (onoff);
2752 for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
2754 PortSet& ps ((*rt)->input()->ports());
2756 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
2757 p->get_connections (connections);
2760 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
2761 routes_using_input_from (*s, rl2);
2764 /* scan all relevant routes to see if others are on or off */
2766 bool others_are_already_on = false;
2768 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
2770 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2776 if ((*r) != (*rt)) {
2777 if (mt->input_active()) {
2778 others_are_already_on = true;
2781 /* this one needs changing */
2782 mt->set_input_active (onoff);
2788 /* globally reverse other routes */
2790 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
2791 if ((*r) != (*rt)) {
2792 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2794 mt->set_input_active (!others_are_already_on);
2803 Session::routes_using_input_from (const string& str, RouteList& rl)
2805 boost::shared_ptr<RouteList> r = routes.reader();
2807 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2808 if ((*i)->input()->connected_to (str)) {
2814 boost::shared_ptr<Route>
2815 Session::route_by_name (string name)
2817 boost::shared_ptr<RouteList> r = routes.reader ();
2819 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2820 if ((*i)->name() == name) {
2825 return boost::shared_ptr<Route> ((Route*) 0);
2828 boost::shared_ptr<Route>
2829 Session::route_by_id (PBD::ID id)
2831 boost::shared_ptr<RouteList> r = routes.reader ();
2833 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2834 if ((*i)->id() == id) {
2839 return boost::shared_ptr<Route> ((Route*) 0);
2842 boost::shared_ptr<Track>
2843 Session::track_by_diskstream_id (PBD::ID id)
2845 boost::shared_ptr<RouteList> r = routes.reader ();
2847 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2848 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
2849 if (t && t->using_diskstream_id (id)) {
2854 return boost::shared_ptr<Track> ();
2857 boost::shared_ptr<Route>
2858 Session::route_by_remote_id (uint32_t id)
2860 boost::shared_ptr<RouteList> r = routes.reader ();
2862 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2863 if ((*i)->remote_control_id() == id) {
2868 return boost::shared_ptr<Route> ((Route*) 0);
2872 Session::playlist_region_added (boost::weak_ptr<Region> w)
2874 boost::shared_ptr<Region> r = w.lock ();
2879 /* These are the operations that are currently in progress... */
2880 list<GQuark> curr = _current_trans_quarks;
2883 /* ...and these are the operations during which we want to update
2884 the session range location markers.
2887 ops.push_back (Operations::capture);
2888 ops.push_back (Operations::paste);
2889 ops.push_back (Operations::duplicate_region);
2890 ops.push_back (Operations::insert_file);
2891 ops.push_back (Operations::insert_region);
2892 ops.push_back (Operations::drag_region_brush);
2893 ops.push_back (Operations::region_drag);
2894 ops.push_back (Operations::selection_grab);
2895 ops.push_back (Operations::region_fill);
2896 ops.push_back (Operations::fill_selection);
2897 ops.push_back (Operations::create_region);
2898 ops.push_back (Operations::region_copy);
2899 ops.push_back (Operations::fixed_time_region_copy);
2902 /* See if any of the current operations match the ones that we want */
2904 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
2906 /* If so, update the session range markers */
2908 maybe_update_session_range (r->position (), r->last_frame ());
2912 /** Update the session range markers if a is before the current start or
2913 * b is after the current end.
2916 Session::maybe_update_session_range (framepos_t a, framepos_t b)
2918 if (_state_of_the_state & Loading) {
2922 if (_session_range_location == 0) {
2924 add_session_range_location (a, b);
2928 if (a < _session_range_location->start()) {
2929 _session_range_location->set_start (a);
2932 if (b > _session_range_location->end()) {
2933 _session_range_location->set_end (b);
2939 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
2941 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2942 maybe_update_session_range (i->to, i->to + i->length);
2947 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
2949 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2950 maybe_update_session_range (i->from, i->to);
2954 /* Region management */
2956 boost::shared_ptr<Region>
2957 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2959 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2960 RegionFactory::RegionMap::const_iterator i;
2961 boost::shared_ptr<Region> region;
2963 Glib::Threads::Mutex::Lock lm (region_lock);
2965 for (i = regions.begin(); i != regions.end(); ++i) {
2969 if (region->whole_file()) {
2971 if (child->source_equivalent (region)) {
2977 return boost::shared_ptr<Region> ();
2981 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2983 set<boost::shared_ptr<Region> > relevant_regions;
2985 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2986 RegionFactory::get_regions_using_source (*s, relevant_regions);
2989 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2990 set<boost::shared_ptr<Region> >::iterator tmp;
2995 playlists->destroy_region (*r);
2996 RegionFactory::map_remove (*r);
2998 (*r)->drop_sources ();
2999 (*r)->drop_references ();
3001 relevant_regions.erase (r);
3006 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
3009 Glib::Threads::Mutex::Lock ls (source_lock);
3010 /* remove from the main source list */
3011 sources.erase ((*s)->id());
3014 (*s)->mark_for_remove ();
3015 (*s)->drop_references ();
3024 Session::remove_last_capture ()
3026 list<boost::shared_ptr<Source> > srcs;
3028 boost::shared_ptr<RouteList> rl = routes.reader ();
3029 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3030 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3035 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
3038 srcs.insert (srcs.end(), l.begin(), l.end());
3043 destroy_sources (srcs);
3045 save_state (_current_snapshot_name);
3050 /* Source Management */
3053 Session::add_source (boost::shared_ptr<Source> source)
3055 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
3056 pair<SourceMap::iterator,bool> result;
3058 entry.first = source->id();
3059 entry.second = source;
3062 Glib::Threads::Mutex::Lock lm (source_lock);
3063 result = sources.insert (entry);
3066 if (result.second) {
3068 /* yay, new source */
3070 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
3073 if (!fs->within_session()) {
3074 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
3080 boost::shared_ptr<AudioFileSource> afs;
3082 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
3083 if (Config->get_auto_analyse_audio()) {
3084 Analyser::queue_source_for_analysis (source, false);
3088 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
3093 Session::remove_source (boost::weak_ptr<Source> src)
3095 if (_state_of_the_state & Deletion) {
3099 SourceMap::iterator i;
3100 boost::shared_ptr<Source> source = src.lock();
3107 Glib::Threads::Mutex::Lock lm (source_lock);
3109 if ((i = sources.find (source->id())) != sources.end()) {
3114 if (!(_state_of_the_state & InCleanup)) {
3116 /* save state so we don't end up with a session file
3117 referring to non-existent sources.
3120 save_state (_current_snapshot_name);
3124 boost::shared_ptr<Source>
3125 Session::source_by_id (const PBD::ID& id)
3127 Glib::Threads::Mutex::Lock lm (source_lock);
3128 SourceMap::iterator i;
3129 boost::shared_ptr<Source> source;
3131 if ((i = sources.find (id)) != sources.end()) {
3138 boost::shared_ptr<Source>
3139 Session::source_by_path_and_channel (const string& path, uint16_t chn)
3141 Glib::Threads::Mutex::Lock lm (source_lock);
3143 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3144 boost::shared_ptr<AudioFileSource> afs
3145 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
3147 if (afs && afs->path() == path && chn == afs->channel()) {
3151 return boost::shared_ptr<Source>();
3155 Session::count_sources_by_origin (const string& path)
3158 Glib::Threads::Mutex::Lock lm (source_lock);
3160 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3161 boost::shared_ptr<FileSource> fs
3162 = boost::dynamic_pointer_cast<FileSource>(i->second);
3164 if (fs && fs->origin() == path) {
3174 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
3177 string old_basename = PBD::basename_nosuffix (oldname);
3178 string new_legalized = legalize_for_path (newname);
3180 /* note: we know (or assume) the old path is already valid */
3184 /* destructive file sources have a name of the form:
3186 /path/to/Tnnnn-NAME(%[LR])?.wav
3188 the task here is to replace NAME with the new name.
3193 string::size_type dash;
3195 dir = Glib::path_get_dirname (path);
3196 path = Glib::path_get_basename (path);
3198 /* '-' is not a legal character for the NAME part of the path */
3200 if ((dash = path.find_last_of ('-')) == string::npos) {
3204 prefix = path.substr (0, dash);
3208 path += new_legalized;
3209 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3210 path = Glib::build_filename (dir, path);
3214 /* non-destructive file sources have a name of the form:
3216 /path/to/NAME-nnnnn(%[LR])?.ext
3218 the task here is to replace NAME with the new name.
3223 string::size_type dash;
3224 string::size_type postfix;
3226 dir = Glib::path_get_dirname (path);
3227 path = Glib::path_get_basename (path);
3229 /* '-' is not a legal character for the NAME part of the path */
3231 if ((dash = path.find_last_of ('-')) == string::npos) {
3235 suffix = path.substr (dash+1);
3237 // Suffix is now everything after the dash. Now we need to eliminate
3238 // the nnnnn part, which is done by either finding a '%' or a '.'
3240 postfix = suffix.find_last_of ("%");
3241 if (postfix == string::npos) {
3242 postfix = suffix.find_last_of ('.');
3245 if (postfix != string::npos) {
3246 suffix = suffix.substr (postfix);
3248 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
3252 const uint32_t limit = 10000;
3253 char buf[PATH_MAX+1];
3255 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
3257 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
3259 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
3260 path = Glib::build_filename (dir, buf);
3268 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
3277 /** Return the full path (in some session directory) for a new within-session source.
3278 * \a name must be a session-unique name that does not contain slashes
3279 * (e.g. as returned by new_*_source_name)
3282 Session::new_source_path_from_name (DataType type, const string& name)
3284 assert(name.find("/") == string::npos);
3286 SessionDirectory sdir(get_best_session_directory_for_new_source());
3289 if (type == DataType::AUDIO) {
3290 p = sdir.sound_path();
3291 } else if (type == DataType::MIDI) {
3292 p = sdir.midi_path();
3294 error << "Unknown source type, unable to create file path" << endmsg;
3298 return Glib::build_filename (p, name);
3302 Session::peak_path (string base) const
3304 return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
3307 /** Return a unique name based on \a base for a new internal audio source */
3309 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
3312 char buf[PATH_MAX+1];
3313 const uint32_t limit = 10000;
3315 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3318 legalized = legalize_for_path (base);
3320 // Find a "version" of the base name that doesn't exist in any of the possible directories.
3321 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3323 vector<space_and_path>::iterator i;
3324 uint32_t existing = 0;
3326 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3331 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3332 cnt, legalized.c_str(), ext.c_str());
3333 } else if (nchan == 2) {
3335 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
3336 cnt, legalized.c_str(), ext.c_str());
3338 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
3339 cnt, legalized.c_str(), ext.c_str());
3341 } else if (nchan < 26) {
3342 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
3343 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
3345 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3346 cnt, legalized.c_str(), ext.c_str());
3352 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3353 } else if (nchan == 2) {
3355 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
3357 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
3359 } else if (nchan < 26) {
3360 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
3362 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3366 SessionDirectory sdir((*i).path);
3368 string spath = sdir.sound_path();
3370 /* note that we search *without* the extension so that
3371 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3372 in the event that this new name is required for
3373 a file format change.
3376 if (matching_unsuffixed_filename_exists_in (spath, buf)) {
3382 if (existing == 0) {
3387 error << string_compose(
3388 _("There are already %1 recordings for %2, which I consider too many."),
3389 limit, base) << endmsg;
3391 throw failed_constructor();
3395 return Glib::path_get_basename (buf);
3398 /** Create a new within-session audio source */
3399 boost::shared_ptr<AudioFileSource>
3400 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
3402 const string name = new_audio_source_name (n, n_chans, chan, destructive);
3403 const string path = new_source_path_from_name(DataType::AUDIO, name);
3405 return boost::dynamic_pointer_cast<AudioFileSource> (
3406 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
3409 /** Return a unique name based on \a base for a new internal MIDI source */
3411 Session::new_midi_source_name (const string& base)
3414 char buf[PATH_MAX+1];
3415 const uint32_t limit = 10000;
3419 legalized = legalize_for_path (base);
3421 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3422 for (cnt = 1; cnt <= limit; ++cnt) {
3424 vector<space_and_path>::iterator i;
3425 uint32_t existing = 0;
3427 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3429 SessionDirectory sdir((*i).path);
3431 std::string p = Glib::build_filename (sdir.midi_path(), legalized);
3433 snprintf (buf, sizeof(buf), "%s-%u.mid", p.c_str(), cnt);
3435 if (Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
3440 if (existing == 0) {
3445 error << string_compose(
3446 _("There are already %1 recordings for %2, which I consider too many."),
3447 limit, base) << endmsg;
3449 throw failed_constructor();
3453 return Glib::path_get_basename(buf);
3457 /** Create a new within-session MIDI source */
3458 boost::shared_ptr<MidiSource>
3459 Session::create_midi_source_for_session (Track* track, string const & n)
3461 /* try to use the existing write source for the track, to keep numbering sane
3465 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3469 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3472 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3473 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3477 const string name = new_midi_source_name (n);
3478 const string path = new_source_path_from_name (DataType::MIDI, name);
3480 return boost::dynamic_pointer_cast<SMFSource> (
3481 SourceFactory::createWritable (
3482 DataType::MIDI, *this, path, false, frame_rate()));
3487 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3489 if (playlist->hidden()) {
3493 playlists->add (playlist);
3496 playlist->release();
3503 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3505 if (_state_of_the_state & Deletion) {
3509 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3515 playlists->remove (playlist);
3521 Session::set_audition (boost::shared_ptr<Region> r)
3523 pending_audition_region = r;
3524 add_post_transport_work (PostTransportAudition);
3525 _butler->schedule_transport_work ();
3529 Session::audition_playlist ()
3531 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3532 ev->region.reset ();
3537 Session::non_realtime_set_audition ()
3539 assert (pending_audition_region);
3540 auditioner->audition_region (pending_audition_region);
3541 pending_audition_region.reset ();
3542 AuditionActive (true); /* EMIT SIGNAL */
3546 Session::audition_region (boost::shared_ptr<Region> r)
3548 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3554 Session::cancel_audition ()
3556 if (auditioner->auditioning()) {
3557 auditioner->cancel_audition ();
3558 AuditionActive (false); /* EMIT SIGNAL */
3563 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3565 if (a->is_monitor()) {
3568 if (b->is_monitor()) {
3571 return a->order_key (MixerSort) < b->order_key (MixerSort);
3575 Session::is_auditioning () const
3577 /* can be called before we have an auditioner object */
3579 return auditioner->auditioning();
3586 Session::graph_reordered ()
3588 /* don't do this stuff if we are setting up connections
3589 from a set_state() call or creating new tracks. Ditto for deletion.
3592 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
3596 /* every track/bus asked for this to be handled but it was deferred because
3597 we were connecting. do it now.
3600 request_input_change_handling ();
3604 /* force all diskstreams to update their capture offset values to
3605 reflect any changes in latencies within the graph.
3608 boost::shared_ptr<RouteList> rl = routes.reader ();
3609 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3610 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3612 tr->set_capture_offset ();
3617 /** @return Number of frames that there is disk space available to write,
3620 boost::optional<framecnt_t>
3621 Session::available_capture_duration ()
3623 Glib::Threads::Mutex::Lock lm (space_lock);
3625 if (_total_free_4k_blocks_uncertain) {
3626 return boost::optional<framecnt_t> ();
3629 float sample_bytes_on_disk = 4.0; // keep gcc happy
3631 switch (config.get_native_file_data_format()) {
3633 sample_bytes_on_disk = 4.0;
3637 sample_bytes_on_disk = 3.0;
3641 sample_bytes_on_disk = 2.0;
3645 /* impossible, but keep some gcc versions happy */
3646 fatal << string_compose (_("programming error: %1"),
3647 X_("illegal native file data format"))
3652 double scale = 4096.0 / sample_bytes_on_disk;
3654 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3655 return max_framecnt;
3658 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3662 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3665 RCUWriter<BundleList> writer (_bundles);
3666 boost::shared_ptr<BundleList> b = writer.get_copy ();
3667 b->push_back (bundle);
3670 BundleAdded (bundle); /* EMIT SIGNAL */
3676 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3678 bool removed = false;
3681 RCUWriter<BundleList> writer (_bundles);
3682 boost::shared_ptr<BundleList> b = writer.get_copy ();
3683 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3685 if (i != b->end()) {
3692 BundleRemoved (bundle); /* EMIT SIGNAL */
3698 boost::shared_ptr<Bundle>
3699 Session::bundle_by_name (string name) const
3701 boost::shared_ptr<BundleList> b = _bundles.reader ();
3703 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3704 if ((*i)->name() == name) {
3709 return boost::shared_ptr<Bundle> ();
3713 Session::tempo_map_changed (const PropertyChange&)
3717 playlists->update_after_tempo_map_change ();
3719 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3725 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3727 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3728 (*i)->recompute_frames_from_bbt ();
3732 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3733 * the given count with the current block size.
3736 Session::ensure_buffers (ChanCount howmany)
3738 BufferManager::ensure_buffers (howmany);
3742 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3744 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3745 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3750 Session::next_insert_id ()
3752 /* this doesn't really loop forever. just think about it */
3755 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3756 if (!insert_bitset[n]) {
3757 insert_bitset[n] = true;
3763 /* none available, so resize and try again */
3765 insert_bitset.resize (insert_bitset.size() + 16, false);
3770 Session::next_send_id ()
3772 /* this doesn't really loop forever. just think about it */
3775 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3776 if (!send_bitset[n]) {
3777 send_bitset[n] = true;
3783 /* none available, so resize and try again */
3785 send_bitset.resize (send_bitset.size() + 16, false);
3790 Session::next_aux_send_id ()
3792 /* this doesn't really loop forever. just think about it */
3795 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
3796 if (!aux_send_bitset[n]) {
3797 aux_send_bitset[n] = true;
3803 /* none available, so resize and try again */
3805 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
3810 Session::next_return_id ()
3812 /* this doesn't really loop forever. just think about it */
3815 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3816 if (!return_bitset[n]) {
3817 return_bitset[n] = true;
3823 /* none available, so resize and try again */
3825 return_bitset.resize (return_bitset.size() + 16, false);
3830 Session::mark_send_id (uint32_t id)
3832 if (id >= send_bitset.size()) {
3833 send_bitset.resize (id+16, false);
3835 if (send_bitset[id]) {
3836 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3838 send_bitset[id] = true;
3842 Session::mark_aux_send_id (uint32_t id)
3844 if (id >= aux_send_bitset.size()) {
3845 aux_send_bitset.resize (id+16, false);
3847 if (aux_send_bitset[id]) {
3848 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
3850 aux_send_bitset[id] = true;
3854 Session::mark_return_id (uint32_t id)
3856 if (id >= return_bitset.size()) {
3857 return_bitset.resize (id+16, false);
3859 if (return_bitset[id]) {
3860 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3862 return_bitset[id] = true;
3866 Session::mark_insert_id (uint32_t id)
3868 if (id >= insert_bitset.size()) {
3869 insert_bitset.resize (id+16, false);
3871 if (insert_bitset[id]) {
3872 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3874 insert_bitset[id] = true;
3878 Session::unmark_send_id (uint32_t id)
3880 if (id < send_bitset.size()) {
3881 send_bitset[id] = false;
3886 Session::unmark_aux_send_id (uint32_t id)
3888 if (id < aux_send_bitset.size()) {
3889 aux_send_bitset[id] = false;
3894 Session::unmark_return_id (uint32_t id)
3896 if (id < return_bitset.size()) {
3897 return_bitset[id] = false;
3902 Session::unmark_insert_id (uint32_t id)
3904 if (id < insert_bitset.size()) {
3905 insert_bitset[id] = false;
3910 Session::reset_native_file_format ()
3912 boost::shared_ptr<RouteList> rl = routes.reader ();
3913 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3914 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3916 /* don't save state as we do this, there's no point
3919 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3920 tr->reset_write_sources (false);
3921 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3927 Session::route_name_unique (string n) const
3929 boost::shared_ptr<RouteList> r = routes.reader ();
3931 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3932 if ((*i)->name() == n) {
3941 Session::route_name_internal (string n) const
3943 if (auditioner && auditioner->name() == n) {
3947 if (_click_io && _click_io->name() == n) {
3955 Session::freeze_all (InterThreadInfo& itt)
3957 boost::shared_ptr<RouteList> r = routes.reader ();
3959 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3961 boost::shared_ptr<Track> t;
3963 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3964 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3974 boost::shared_ptr<Region>
3975 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
3976 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3977 InterThreadInfo& itt,
3978 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
3981 boost::shared_ptr<Region> result;
3982 boost::shared_ptr<Playlist> playlist;
3983 boost::shared_ptr<AudioFileSource> fsource;
3985 char buf[PATH_MAX+1];
3986 ChanCount diskstream_channels (track.n_channels());
3987 framepos_t position;
3988 framecnt_t this_chunk;
3991 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3992 const string sound_dir = sdir.sound_path();
3993 framepos_t len = end - start;
3994 bool need_block_size_reset = false;
3996 ChanCount const max_proc = track.max_processor_streams ();
3999 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
4000 end, start) << endmsg;
4004 const framecnt_t chunk_size = (256 * 1024)/4;
4006 // block all process callback handling
4008 block_processing ();
4010 /* call tree *MUST* hold route_lock */
4012 if ((playlist = track.playlist()) == 0) {
4016 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4018 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
4020 for (x = 0; x < 99999; ++x) {
4021 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());
4022 if (!Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
4028 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
4033 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
4034 SourceFactory::createWritable (DataType::AUDIO, *this, buf, false, frame_rate()));
4037 catch (failed_constructor& err) {
4038 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
4042 srcs.push_back (fsource);
4045 /* tell redirects that care that we are about to use a much larger
4046 * blocksize. this will flush all plugins too, so that they are ready
4047 * to be used for this process.
4050 need_block_size_reset = true;
4051 track.set_block_size (chunk_size);
4056 /* create a set of reasonably-sized buffers */
4057 buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
4058 buffers.set_count (max_proc);
4060 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4061 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4063 afs->prepare_for_peakfile_writes ();
4066 while (to_do && !itt.cancel) {
4068 this_chunk = min (to_do, chunk_size);
4070 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export)) {
4075 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4076 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4079 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
4085 start += this_chunk;
4086 to_do -= this_chunk;
4088 itt.progress = (float) (1.0 - ((double) to_do / len));
4097 xnow = localtime (&now);
4099 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
4100 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4103 afs->update_header (position, *xnow, now);
4104 afs->flush_header ();
4108 /* construct a region to represent the bounced material */
4112 plist.add (Properties::start, 0);
4113 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4114 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4116 result = RegionFactory::create (srcs, plist);
4122 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4123 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4126 afs->mark_for_remove ();
4129 (*src)->drop_references ();
4133 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4134 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4137 afs->done_with_peakfile_writes ();
4142 if (need_block_size_reset) {
4143 track.set_block_size (get_block_size());
4146 unblock_processing ();
4152 Session::gain_automation_buffer() const
4154 return ProcessThread::gain_automation_buffer ();
4158 Session::send_gain_automation_buffer() const
4160 return ProcessThread::send_gain_automation_buffer ();
4164 Session::pan_automation_buffer() const
4166 return ProcessThread::pan_automation_buffer ();
4170 Session::get_silent_buffers (ChanCount count)
4172 return ProcessThread::get_silent_buffers (count);
4176 Session::get_scratch_buffers (ChanCount count)
4178 return ProcessThread::get_scratch_buffers (count);
4182 Session::get_mix_buffers (ChanCount count)
4184 return ProcessThread::get_mix_buffers (count);
4188 Session::ntracks () const
4191 boost::shared_ptr<RouteList> r = routes.reader ();
4193 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4194 if (boost::dynamic_pointer_cast<Track> (*i)) {
4203 Session::nbusses () const
4206 boost::shared_ptr<RouteList> r = routes.reader ();
4208 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4209 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
4218 Session::add_automation_list(AutomationList *al)
4220 automation_lists[al->id()] = al;
4223 /** @return true if there is at least one record-enabled track, otherwise false */
4225 Session::have_rec_enabled_track () const
4227 return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
4230 /** Update the state of our rec-enabled tracks flag */
4232 Session::update_have_rec_enabled_track ()
4234 boost::shared_ptr<RouteList> rl = routes.reader ();
4235 RouteList::iterator i = rl->begin();
4236 while (i != rl->end ()) {
4238 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4239 if (tr && tr->record_enabled ()) {
4246 int const old = g_atomic_int_get (&_have_rec_enabled_track);
4248 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4250 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4251 RecordStateChanged (); /* EMIT SIGNAL */
4256 Session::listen_position_changed ()
4258 boost::shared_ptr<RouteList> r = routes.reader ();
4260 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4261 (*i)->listen_position_changed ();
4266 Session::solo_control_mode_changed ()
4268 /* cancel all solo or all listen when solo control mode changes */
4271 set_solo (get_routes(), false);
4272 } else if (listening()) {
4273 set_listen (get_routes(), false);
4277 /** Called when a property of one of our route groups changes */
4279 Session::route_group_property_changed (RouteGroup* rg)
4281 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4284 /** Called when a route is added to one of our route groups */
4286 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4288 RouteAddedToRouteGroup (rg, r);
4291 /** Called when a route is removed from one of our route groups */
4293 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4295 RouteRemovedFromRouteGroup (rg, r);
4298 boost::shared_ptr<RouteList>
4299 Session::get_routes_with_regions_at (framepos_t const p) const
4301 boost::shared_ptr<RouteList> r = routes.reader ();
4302 boost::shared_ptr<RouteList> rl (new RouteList);
4304 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4305 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4310 boost::shared_ptr<Playlist> pl = tr->playlist ();
4315 if (pl->has_region_at (p)) {
4324 Session::goto_end ()
4326 if (_session_range_location) {
4327 request_locate (_session_range_location->end(), false);
4329 request_locate (0, false);
4334 Session::goto_start ()
4336 if (_session_range_location) {
4337 request_locate (_session_range_location->start(), false);
4339 request_locate (0, false);
4344 Session::current_start_frame () const
4346 return _session_range_location ? _session_range_location->start() : 0;
4350 Session::current_end_frame () const
4352 return _session_range_location ? _session_range_location->end() : 0;
4356 Session::add_session_range_location (framepos_t start, framepos_t end)
4358 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4359 _locations->add (_session_range_location);
4363 Session::step_edit_status_change (bool yn)
4369 send = (_step_editors == 0);
4374 send = (_step_editors == 1);
4377 if (_step_editors > 0) {
4383 StepEditStatusChange (val);
4389 Session::start_time_changed (framepos_t old)
4391 /* Update the auto loop range to match the session range
4392 (unless the auto loop range has been changed by the user)
4395 Location* s = _locations->session_range_location ();
4400 Location* l = _locations->auto_loop_location ();
4402 if (l && l->start() == old) {
4403 l->set_start (s->start(), true);
4408 Session::end_time_changed (framepos_t old)
4410 /* Update the auto loop range to match the session range
4411 (unless the auto loop range has been changed by the user)
4414 Location* s = _locations->session_range_location ();
4419 Location* l = _locations->auto_loop_location ();
4421 if (l && l->end() == old) {
4422 l->set_end (s->end(), true);
4427 Session::source_search_path (DataType type) const
4431 if (session_dirs.size() == 1) {
4433 case DataType::AUDIO:
4434 s.push_back (_session_dir->sound_path());
4436 case DataType::MIDI:
4437 s.push_back (_session_dir->midi_path());
4441 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4442 SessionDirectory sdir (i->path);
4444 case DataType::AUDIO:
4445 s.push_back (sdir.sound_path());
4447 case DataType::MIDI:
4448 s.push_back (sdir.midi_path());
4454 if (type == DataType::AUDIO) {
4455 const string sound_path_2X = _session_dir->sound_path_2X();
4456 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
4457 if (find (s.begin(), s.end(), sound_path_2X) == s.end()) {
4458 s.push_back (sound_path_2X);
4463 /* now check the explicit (possibly user-specified) search path
4466 vector<string> dirs;
4469 case DataType::AUDIO:
4470 split (config.get_audio_search_path (), dirs, ':');
4472 case DataType::MIDI:
4473 split (config.get_midi_search_path (), dirs, ':');
4477 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4478 if (find (s.begin(), s.end(), *i) == s.end()) {
4485 for (vector<string>::iterator si = s.begin(); si != s.end(); ++si) {
4486 if (!search_path.empty()) {
4496 Session::ensure_search_path_includes (const string& path, DataType type)
4499 vector<string> dirs;
4506 case DataType::AUDIO:
4507 search_path = config.get_audio_search_path ();
4509 case DataType::MIDI:
4510 search_path = config.get_midi_search_path ();
4514 split (search_path, dirs, ':');
4516 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4517 /* No need to add this new directory if it has the same inode as
4518 an existing one; checking inode rather than name prevents duplicated
4519 directories when we are using symlinks.
4521 On Windows, I think we could just do if (*i == path) here.
4523 if (PBD::equivalent_paths (*i, path)) {
4528 if (!search_path.empty()) {
4532 search_path += path;
4535 case DataType::AUDIO:
4536 config.set_audio_search_path (search_path);
4538 case DataType::MIDI:
4539 config.set_midi_search_path (search_path);
4544 boost::shared_ptr<Speakers>
4545 Session::get_speakers()
4551 Session::unknown_processors () const
4555 boost::shared_ptr<RouteList> r = routes.reader ();
4556 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4557 list<string> t = (*i)->unknown_processors ();
4558 copy (t.begin(), t.end(), back_inserter (p));
4568 Session::update_latency (bool playback)
4570 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
4572 if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
4576 boost::shared_ptr<RouteList> r = routes.reader ();
4577 framecnt_t max_latency = 0;
4580 /* reverse the list so that we work backwards from the last route to run to the first */
4581 RouteList* rl = routes.reader().get();
4582 r.reset (new RouteList (*rl));
4583 reverse (r->begin(), r->end());
4586 /* compute actual latency values for the given direction and store them all in per-port
4587 structures. this will also publish the same values (to JACK) so that computation of latency
4588 for routes can consistently use public latency values.
4591 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4592 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
4595 /* because we latency compensate playback, our published playback latencies should
4596 be the same for all output ports - all material played back by ardour has
4597 the same latency, whether its caused by plugins or by latency compensation. since
4598 these may differ from the values computed above, reset all playback port latencies
4602 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
4604 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4605 (*i)->set_public_port_latencies (max_latency, playback);
4610 post_playback_latency ();
4614 post_capture_latency ();
4617 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
4621 Session::post_playback_latency ()
4623 set_worst_playback_latency ();
4625 boost::shared_ptr<RouteList> r = routes.reader ();
4627 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4628 if (!(*i)->is_auditioner() && ((*i)->active())) {
4629 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
4633 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4634 (*i)->set_latency_compensation (_worst_track_latency);
4639 Session::post_capture_latency ()
4641 set_worst_capture_latency ();
4643 /* reflect any changes in capture latencies into capture offsets
4646 boost::shared_ptr<RouteList> rl = routes.reader();
4647 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4648 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4650 tr->set_capture_offset ();
4656 Session::initialize_latencies ()
4659 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
4660 update_latency (false);
4661 update_latency (true);
4664 set_worst_io_latencies ();
4668 Session::set_worst_io_latencies ()
4670 set_worst_playback_latency ();
4671 set_worst_capture_latency ();
4675 Session::set_worst_playback_latency ()
4677 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4681 _worst_output_latency = 0;
4683 if (!_engine.connected()) {
4687 boost::shared_ptr<RouteList> r = routes.reader ();
4689 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4690 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
4693 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
4697 Session::set_worst_capture_latency ()
4699 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4703 _worst_input_latency = 0;
4705 if (!_engine.connected()) {
4709 boost::shared_ptr<RouteList> r = routes.reader ();
4711 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4712 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
4715 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
4719 Session::update_latency_compensation (bool force_whole_graph)
4721 bool some_track_latency_changed = false;
4723 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4727 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
4729 _worst_track_latency = 0;
4731 boost::shared_ptr<RouteList> r = routes.reader ();
4733 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4734 if (!(*i)->is_auditioner() && ((*i)->active())) {
4736 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
4737 some_track_latency_changed = true;
4739 _worst_track_latency = max (tl, _worst_track_latency);
4743 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
4744 (some_track_latency_changed ? "yes" : "no")));
4746 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
4748 if (some_track_latency_changed || force_whole_graph) {
4749 _engine.update_latencies ();
4753 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4754 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4758 tr->set_capture_offset ();
4763 Session::session_name_is_legal (const string& path)
4765 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
4767 for (int i = 0; illegal_chars[i]; ++i) {
4768 if (path.find (illegal_chars[i]) != string::npos) {
4769 return illegal_chars[i];
4777 Session::next_control_id () const
4781 /* the monitor bus remote ID is in a different
4782 * "namespace" than regular routes. its existence doesn't
4783 * affect normal (low) numbered routes.
4790 return nroutes() - subtract;
4794 Session::notify_remote_id_change ()
4796 if (deletion_in_progress()) {
4800 switch (Config->get_remote_model()) {
4803 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
4811 Session::sync_order_keys (RouteSortOrderKey sort_key_changed)
4813 if (deletion_in_progress()) {
4817 /* tell everyone that something has happened to the sort keys
4818 and let them sync up with the change(s)
4819 this will give objects that manage the sort order keys the
4820 opportunity to keep them in sync if they wish to.
4823 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("Sync Order Keys, based on %1\n", enum_2_string (sort_key_changed)));
4825 Route::SyncOrderKeys (sort_key_changed); /* EMIT SIGNAL */
4827 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
4831 Session::operation_in_progress (GQuark op) const
4833 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
4836 boost::shared_ptr<Port>
4837 Session::ltc_input_port () const
4839 return _ltc_input->nth (0);
4842 boost::shared_ptr<Port>
4843 Session::ltc_output_port () const
4845 return _ltc_output->nth (0);
4849 Session::reconnect_ltc_input ()
4853 string src = Config->get_ltc_source_port();
4855 _ltc_input->disconnect (this);
4857 if (src != _("None") && !src.empty()) {
4858 _ltc_input->nth (0)->connect (src);
4864 Session::reconnect_ltc_output ()
4869 string src = Config->get_ltc_sink_port();
4871 _ltc_output->disconnect (this);
4873 if (src != _("None") && !src.empty()) {
4874 _ltc_output->nth (0)->connect (src);