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;
123 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
124 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
126 /** @param snapshot_name Snapshot name, without .ardour suffix */
127 Session::Session (AudioEngine &eng,
128 const string& fullpath,
129 const string& snapshot_name,
130 BusProfile* bus_profile,
133 , _target_transport_speed (0.0)
134 , _requested_return_frame (-1)
135 , _session_dir (new SessionDirectory(fullpath))
137 , _state_of_the_state (Clean)
138 , _butler (new Butler (*this))
139 , _post_transport_work (0)
140 , _send_timecode_update (false)
141 , _all_route_group (new RouteGroup (*this, "all"))
142 , routes (new RouteList)
143 , _total_free_4k_blocks (0)
144 , _total_free_4k_blocks_uncertain (false)
145 , _bundles (new BundleList)
146 , _bundle_xml_node (0)
149 , click_emphasis_data (0)
151 , _have_rec_enabled_track (false)
152 , _suspend_timecode_transmission (0)
154 _locations = new Locations (*this);
159 if (how_many_dsp_threads () > 1) {
160 /* For now, only create the graph if we are using >1 DSP threads, as
161 it is a bit slower than the old code with 1 thread.
163 _process_graph.reset (new Graph (*this));
166 playlists.reset (new SessionPlaylists);
168 _all_route_group->set_active (true, this);
170 interpolation.add_channel_to (0, 0);
172 if (!eng.connected()) {
173 throw failed_constructor();
176 n_physical_outputs = _engine.n_physical_outputs ();
177 n_physical_inputs = _engine.n_physical_inputs ();
179 first_stage_init (fullpath, snapshot_name);
181 _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
184 if (create (mix_template, bus_profile)) {
186 throw failed_constructor ();
190 if (second_stage_init ()) {
192 throw failed_constructor ();
195 store_recent_sessions(_name, _path);
197 bool was_dirty = dirty();
199 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
201 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
202 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
205 DirtyChanged (); /* EMIT SIGNAL */
208 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
209 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
225 vector<void*> debug_pointers;
227 /* if we got to here, leaving pending capture state around
231 remove_pending_capture_state ();
233 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
235 _engine.remove_session ();
237 /* deregister all ports - there will be no process or any other
238 * callbacks from the engine any more.
241 Port::PortDrop (); /* EMIT SIGNAL */
247 /* clear history so that no references to objects are held any more */
251 /* clear state tree so that no references to objects are held any more */
255 /* reset dynamic state version back to default */
257 Stateful::loading_state_version = 0;
259 _butler->drop_references ();
263 delete midi_control_ui;
264 delete _all_route_group;
266 if (click_data != default_click) {
267 delete [] click_data;
270 if (click_emphasis_data != default_click_emphasis) {
271 delete [] click_emphasis_data;
276 /* clear out any pending dead wood from RCU managed objects */
281 AudioDiskstream::free_working_buffers();
283 /* tell everyone who is still standing that we're about to die */
286 /* tell everyone to drop references and delete objects as we go */
288 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
289 RegionFactory::delete_all_regions ();
291 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
293 /* reset these three references to special routes before we do the usual route delete thing */
296 _master_out.reset ();
297 _monitor_out.reset ();
300 RCUWriter<RouteList> writer (routes);
301 boost::shared_ptr<RouteList> r = writer.get_copy ();
303 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
304 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
305 (*i)->drop_references ();
309 /* writer goes out of scope and updates master */
313 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
314 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
315 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
316 i->second->drop_references ();
321 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
322 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
327 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
332 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
334 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
335 boost_debug_list_ptrs ();
340 Session::when_engine_running ()
342 string first_physical_output;
344 BootMessage (_("Set block size and sample rate"));
346 set_block_size (_engine.frames_per_cycle());
347 set_frame_rate (_engine.frame_rate());
349 BootMessage (_("Using configuration"));
351 boost::function<void (std::string)> ff (boost::bind (&Session::config_changed, this, _1, false));
352 boost::function<void (std::string)> ft (boost::bind (&Session::config_changed, this, _1, true));
354 Config->map_parameters (ff);
355 config.map_parameters (ft);
357 /* every time we reconnect, recompute worst case output latencies */
359 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
361 if (synced_to_jack()) {
362 _engine.transport_stop ();
365 if (config.get_jack_time_master()) {
366 _engine.transport_locate (_transport_frame);
374 _ltc_input.reset (new IO (*this, _("LTC In"), IO::Input));
375 _ltc_output.reset (new IO (*this, _("LTC Out"), IO::Output));
377 if (state_tree && (child = find_named_node (*state_tree->root(), "LTC-In")) != 0) {
378 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
381 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
382 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
384 reconnect_ltc_input ();
387 if (state_tree && (child = find_named_node (*state_tree->root(), "LTC-Out")) != 0) {
388 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
391 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
392 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
394 reconnect_ltc_output ();
397 _click_io.reset (new ClickIO (*this, "click"));
398 _click_gain.reset (new Amp (*this));
399 _click_gain->activate ();
401 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
403 /* existing state for Click */
406 if (Stateful::loading_state_version < 3000) {
407 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
409 const XMLNodeList& children (child->children());
410 XMLNodeList::const_iterator i = children.begin();
411 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
413 if (i != children.end()) {
414 c = _click_gain->set_state (**i, Stateful::loading_state_version);
420 _clicking = Config->get_clicking ();
424 error << _("could not setup Click I/O") << endmsg;
431 /* default state for Click: dual-mono to first 2 physical outputs */
434 _engine.get_physical_outputs (DataType::AUDIO, outs);
436 for (uint32_t physport = 0; physport < 2; ++physport) {
437 if (outs.size() > physport) {
438 if (_click_io->add_port (outs[physport], this)) {
439 // relax, even though its an error
444 if (_click_io->n_ports () > ChanCount::ZERO) {
445 _clicking = Config->get_clicking ();
450 catch (failed_constructor& err) {
451 error << _("cannot setup Click I/O") << endmsg;
454 BootMessage (_("Compute I/O Latencies"));
457 // XXX HOW TO ALERT UI TO THIS ? DO WE NEED TO?
460 BootMessage (_("Set up standard connections"));
462 vector<string> inputs[DataType::num_types];
463 vector<string> outputs[DataType::num_types];
464 for (uint32_t i = 0; i < DataType::num_types; ++i) {
465 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
466 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
469 /* Create a set of Bundle objects that map
470 to the physical I/O currently available. We create both
471 mono and stereo bundles, so that the common cases of mono
472 and stereo tracks get bundles to put in their mixer strip
473 in / out menus. There may be a nicer way of achieving that;
474 it doesn't really scale that well to higher channel counts
477 /* mono output bundles */
479 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
481 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
483 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
484 c->add_channel (_("mono"), DataType::AUDIO);
485 c->set_port (0, outputs[DataType::AUDIO][np]);
490 /* stereo output bundles */
492 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
493 if (np + 1 < outputs[DataType::AUDIO].size()) {
495 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
496 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
497 c->add_channel (_("L"), DataType::AUDIO);
498 c->set_port (0, outputs[DataType::AUDIO][np]);
499 c->add_channel (_("R"), DataType::AUDIO);
500 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
506 /* mono input bundles */
508 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
510 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
512 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
513 c->add_channel (_("mono"), DataType::AUDIO);
514 c->set_port (0, inputs[DataType::AUDIO][np]);
519 /* stereo input bundles */
521 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
522 if (np + 1 < inputs[DataType::AUDIO].size()) {
524 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
526 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
527 c->add_channel (_("L"), DataType::AUDIO);
528 c->set_port (0, inputs[DataType::AUDIO][np]);
529 c->add_channel (_("R"), DataType::AUDIO);
530 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
536 /* MIDI input bundles */
538 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
539 string n = inputs[DataType::MIDI][np];
540 boost::erase_first (n, X_("alsa_pcm:"));
542 boost::shared_ptr<Bundle> c (new Bundle (n, false));
543 c->add_channel ("", DataType::MIDI);
544 c->set_port (0, inputs[DataType::MIDI][np]);
548 /* MIDI output bundles */
550 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
551 string n = outputs[DataType::MIDI][np];
552 boost::erase_first (n, X_("alsa_pcm:"));
554 boost::shared_ptr<Bundle> c (new Bundle (n, true));
555 c->add_channel ("", DataType::MIDI);
556 c->set_port (0, outputs[DataType::MIDI][np]);
560 BootMessage (_("Setup signal flow and plugins"));
562 /* Reset all panners */
564 Delivery::reset_panners ();
566 /* this will cause the CPM to instantiate any protocols that are in use
567 * (or mandatory), which will pass it this Session, and then call
568 * set_state() on each instantiated protocol to match stored state.
571 ControlProtocolManager::instance().set_session (this);
573 /* This must be done after the ControlProtocolManager set_session above,
574 as it will set states for ports which the ControlProtocolManager creates.
577 MIDI::Manager::instance()->set_port_states (Config->midi_port_states ());
579 /* And this must be done after the MIDI::Manager::set_port_states as
580 * it will try to make connections whose details are loaded by set_port_states.
585 /* Let control protocols know that we are now all connected, so they
586 * could start talking to surfaces if they want to.
589 ControlProtocolManager::instance().midi_connectivity_established ();
591 if (_is_new && !no_auto_connect()) {
592 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock());
593 auto_connect_master_bus ();
596 _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
598 /* update latencies */
600 initialize_latencies ();
602 /* hook us up to the engine */
604 BootMessage (_("Connect to engine"));
605 _engine.set_session (this);
606 _engine.reset_timebase ();
610 Session::auto_connect_master_bus ()
612 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
616 /* if requested auto-connect the outputs to the first N physical ports.
619 uint32_t limit = _master_out->n_outputs().n_total();
620 vector<string> outputs[DataType::num_types];
622 for (uint32_t i = 0; i < DataType::num_types; ++i) {
623 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
626 for (uint32_t n = 0; n < limit; ++n) {
627 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
629 if (outputs[p->type()].size() > n) {
630 connect_to = outputs[p->type()][n];
633 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
634 if (_master_out->output()->connect (p, connect_to, this)) {
635 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
644 Session::remove_monitor_section ()
650 /* force reversion to Solo-In-Place */
651 Config->set_solo_control_is_listen_control (false);
654 /* Hold process lock while doing this so that we don't hear bits and
655 * pieces of audio as we work on each route.
658 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
660 /* Connect tracks to monitor section. Note that in an
661 existing session, the internal sends will already exist, but we want the
662 routes to notice that they connect to the control out specifically.
666 boost::shared_ptr<RouteList> r = routes.reader ();
667 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
669 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
671 if ((*x)->is_monitor()) {
673 } else if ((*x)->is_master()) {
676 (*x)->remove_aux_or_listen (_monitor_out);
681 remove_route (_monitor_out);
682 auto_connect_master_bus ();
686 Session::add_monitor_section ()
690 if (_monitor_out || !_master_out) {
694 boost::shared_ptr<Route> r (new Route (*this, _("monitor"), Route::MonitorOut, DataType::AUDIO));
700 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
701 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
704 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
705 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
706 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
710 add_routes (rl, false, false, false);
712 assert (_monitor_out);
714 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
715 are undefined, at best.
718 uint32_t limit = _monitor_out->n_inputs().n_audio();
722 /* connect the inputs to the master bus outputs. this
723 * represents a separate data feed from the internal sends from
724 * each route. as of jan 2011, it allows the monitor section to
725 * conditionally ignore either the internal sends or the normal
726 * input feed, but we should really find a better way to do
730 _master_out->output()->disconnect (this);
732 for (uint32_t n = 0; n < limit; ++n) {
733 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
734 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
737 string connect_to = o->name();
738 if (_monitor_out->input()->connect (p, connect_to, this)) {
739 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
747 /* if monitor section is not connected, connect it to physical outs
750 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
752 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
754 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
757 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
759 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
760 Config->get_monitor_bus_preferred_bundle())
766 /* Monitor bus is audio only */
768 uint32_t mod = n_physical_outputs.get (DataType::AUDIO);
769 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
770 vector<string> outputs[DataType::num_types];
772 for (uint32_t i = 0; i < DataType::num_types; ++i) {
773 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
779 for (uint32_t n = 0; n < limit; ++n) {
781 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
783 if (outputs[DataType::AUDIO].size() > (n % mod)) {
784 connect_to = outputs[DataType::AUDIO][n % mod];
787 if (!connect_to.empty()) {
788 if (_monitor_out->output()->connect (p, connect_to, this)) {
789 error << string_compose (
790 _("cannot connect control output %1 to %2"),
801 /* Hold process lock while doing this so that we don't hear bits and
802 * pieces of audio as we work on each route.
805 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
807 /* Connect tracks to monitor section. Note that in an
808 existing session, the internal sends will already exist, but we want the
809 routes to notice that they connect to the control out specifically.
813 boost::shared_ptr<RouteList> rls = routes.reader ();
815 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
817 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
819 if ((*x)->is_monitor()) {
821 } else if ((*x)->is_master()) {
824 (*x)->enable_monitor_send ();
830 Session::hookup_io ()
832 /* stop graph reordering notifications from
833 causing resorts, etc.
836 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
840 /* we delay creating the auditioner till now because
841 it makes its own connections to ports.
845 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
847 throw failed_constructor ();
849 a->use_new_diskstream ();
853 catch (failed_constructor& err) {
854 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
858 /* load bundles, which we may have postponed earlier on */
859 if (_bundle_xml_node) {
860 load_bundles (*_bundle_xml_node);
861 delete _bundle_xml_node;
864 /* Tell all IO objects to connect themselves together */
866 IO::enable_connecting ();
867 MIDI::JackMIDIPort::MakeConnections ();
869 /* Anyone who cares about input state, wake up and do something */
871 IOConnectionsComplete (); /* EMIT SIGNAL */
873 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
875 /* now handle the whole enchilada as if it was one
881 /* update the full solo state, which can't be
882 correctly determined on a per-route basis, but
883 needs the global overview that only the session
887 update_route_solo_state ();
891 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
893 boost::shared_ptr<Track> track = wp.lock ();
898 boost::shared_ptr<Playlist> playlist;
900 if ((playlist = track->playlist()) != 0) {
901 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
902 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
903 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
908 Session::record_enabling_legal () const
910 /* this used to be in here, but survey says.... we don't need to restrict it */
911 // if (record_status() == Recording) {
915 if (Config->get_all_safe()) {
922 Session::set_track_monitor_input_status (bool yn)
924 boost::shared_ptr<RouteList> rl = routes.reader ();
925 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
926 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
927 if (tr && tr->record_enabled ()) {
928 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
929 tr->request_jack_monitors_input (yn);
935 Session::auto_punch_start_changed (Location* location)
937 replace_event (SessionEvent::PunchIn, location->start());
939 if (get_record_enabled() && config.get_punch_in()) {
940 /* capture start has been changed, so save new pending state */
941 save_state ("", true);
946 Session::auto_punch_end_changed (Location* location)
948 framepos_t when_to_stop = location->end();
949 // when_to_stop += _worst_output_latency + _worst_input_latency;
950 replace_event (SessionEvent::PunchOut, when_to_stop);
954 Session::auto_punch_changed (Location* location)
956 framepos_t when_to_stop = location->end();
958 replace_event (SessionEvent::PunchIn, location->start());
959 //when_to_stop += _worst_output_latency + _worst_input_latency;
960 replace_event (SessionEvent::PunchOut, when_to_stop);
963 /** @param loc A loop location.
964 * @param pos Filled in with the start time of the required fade-out (in session frames).
965 * @param length Filled in with the length of the required fade-out.
968 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
970 pos = max (loc->start(), loc->end() - 64);
971 length = loc->end() - pos;
975 Session::auto_loop_changed (Location* location)
977 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
980 auto_loop_declick_range (location, dcp, dcl);
981 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
983 if (transport_rolling() && play_loop) {
986 // if (_transport_frame > location->end()) {
988 if (_transport_frame < location->start() || _transport_frame > location->end()) {
989 // relocate to beginning of loop
990 clear_events (SessionEvent::LocateRoll);
992 request_locate (location->start(), true);
995 else if (Config->get_seamless_loop() && !loop_changing) {
997 // schedule a locate-roll to refill the diskstreams at the
999 loop_changing = true;
1001 if (location->end() > last_loopend) {
1002 clear_events (SessionEvent::LocateRoll);
1003 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1010 last_loopend = location->end();
1014 Session::set_auto_punch_location (Location* location)
1018 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1019 punch_connections.drop_connections();
1020 existing->set_auto_punch (false, this);
1021 remove_event (existing->start(), SessionEvent::PunchIn);
1022 clear_events (SessionEvent::PunchOut);
1023 auto_punch_location_changed (0);
1028 if (location == 0) {
1032 if (location->end() <= location->start()) {
1033 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1037 punch_connections.drop_connections ();
1039 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
1040 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
1041 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
1043 location->set_auto_punch (true, this);
1045 auto_punch_changed (location);
1047 auto_punch_location_changed (location);
1051 Session::set_auto_loop_location (Location* location)
1055 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1056 loop_connections.drop_connections ();
1057 existing->set_auto_loop (false, this);
1058 remove_event (existing->end(), SessionEvent::AutoLoop);
1061 auto_loop_declick_range (existing, dcp, dcl);
1062 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1063 auto_loop_location_changed (0);
1068 if (location == 0) {
1072 if (location->end() <= location->start()) {
1073 error << _("Session: you can't use a mark for auto loop") << endmsg;
1077 last_loopend = location->end();
1079 loop_connections.drop_connections ();
1081 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1082 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1083 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1085 location->set_auto_loop (true, this);
1087 /* take care of our stuff first */
1089 auto_loop_changed (location);
1091 /* now tell everyone else */
1093 auto_loop_location_changed (location);
1097 Session::locations_added (Location *)
1103 Session::locations_changed ()
1105 _locations->apply (*this, &Session::handle_locations_changed);
1109 Session::handle_locations_changed (Locations::LocationList& locations)
1111 Locations::LocationList::iterator i;
1113 bool set_loop = false;
1114 bool set_punch = false;
1116 for (i = locations.begin(); i != locations.end(); ++i) {
1120 if (location->is_auto_punch()) {
1121 set_auto_punch_location (location);
1124 if (location->is_auto_loop()) {
1125 set_auto_loop_location (location);
1129 if (location->is_session_range()) {
1130 _session_range_location = location;
1135 set_auto_loop_location (0);
1138 set_auto_punch_location (0);
1145 Session::enable_record ()
1147 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1148 /* no recording at anything except normal speed */
1153 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1155 if (rs == Recording) {
1159 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1161 _last_record_location = _transport_frame;
1162 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1164 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1165 set_track_monitor_input_status (true);
1168 RecordStateChanged ();
1175 Session::disable_record (bool rt_context, bool force)
1179 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1181 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1182 g_atomic_int_set (&_record_status, Disabled);
1183 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1185 if (rs == Recording) {
1186 g_atomic_int_set (&_record_status, Enabled);
1190 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1191 set_track_monitor_input_status (false);
1194 RecordStateChanged (); /* emit signal */
1197 remove_pending_capture_state ();
1203 Session::step_back_from_record ()
1205 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1207 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1208 set_track_monitor_input_status (false);
1211 RecordStateChanged (); /* emit signal */
1216 Session::maybe_enable_record ()
1218 if (_step_editors > 0) {
1222 g_atomic_int_set (&_record_status, Enabled);
1224 /* This function is currently called from somewhere other than an RT thread.
1225 This save_state() call therefore doesn't impact anything. Doing it here
1226 means that we save pending state of which sources the next record will use,
1227 which gives us some chance of recovering from a crash during the record.
1230 save_state ("", true);
1232 if (_transport_speed) {
1233 if (!config.get_punch_in()) {
1237 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1238 RecordStateChanged (); /* EMIT SIGNAL */
1245 Session::audible_frame () const
1251 /* the first of these two possible settings for "offset"
1252 mean that the audible frame is stationary until
1253 audio emerges from the latency compensation
1256 the second means that the audible frame is stationary
1257 until audio would emerge from a physical port
1258 in the absence of any plugin latency compensation
1261 offset = worst_playback_latency ();
1263 if (offset > current_block_size) {
1264 offset -= current_block_size;
1266 /* XXX is this correct? if we have no external
1267 physical connections and everything is internal
1268 then surely this is zero? still, how
1269 likely is that anyway?
1271 offset = current_block_size;
1274 if (synced_to_jack()) {
1275 tf = _engine.transport_frame();
1277 tf = _transport_frame;
1282 if (!non_realtime_work_pending()) {
1286 /* Check to see if we have passed the first guaranteed
1287 audible frame past our last start position. if not,
1288 return that last start point because in terms
1289 of audible frames, we have not moved yet.
1291 `Start position' in this context means the time we last
1292 either started, located, or changed transport direction.
1295 if (_transport_speed > 0.0f) {
1297 if (!play_loop || !have_looped) {
1298 if (tf < _last_roll_or_reversal_location + offset) {
1299 return _last_roll_or_reversal_location;
1307 } else if (_transport_speed < 0.0f) {
1309 /* XXX wot? no backward looping? */
1311 if (tf > _last_roll_or_reversal_location - offset) {
1312 return _last_roll_or_reversal_location;
1324 Session::set_frame_rate (framecnt_t frames_per_second)
1326 /** \fn void Session::set_frame_size(framecnt_t)
1327 the AudioEngine object that calls this guarantees
1328 that it will not be called while we are also in
1329 ::process(). Its fine to do things that block
1333 _base_frame_rate = frames_per_second;
1337 Automatable::set_automation_interval (ceil ((double) frames_per_second * (0.001 * Config->get_automation_interval())));
1341 // XXX we need some equivalent to this, somehow
1342 // SndFileSource::setup_standard_crossfades (frames_per_second);
1346 /* XXX need to reset/reinstantiate all LADSPA plugins */
1350 Session::set_block_size (pframes_t nframes)
1352 /* the AudioEngine guarantees
1353 that it will not be called while we are also in
1354 ::process(). It is therefore fine to do things that block
1359 current_block_size = nframes;
1363 boost::shared_ptr<RouteList> r = routes.reader ();
1365 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1366 (*i)->set_block_size (nframes);
1369 boost::shared_ptr<RouteList> rl = routes.reader ();
1370 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1371 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1373 tr->set_block_size (nframes);
1377 set_worst_io_latencies ();
1383 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1385 boost::shared_ptr<Route> r2;
1387 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1388 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1392 /* make a copy of the existing list of routes that feed r1 */
1394 Route::FedBy existing (r1->fed_by());
1396 /* for each route that feeds r1, recurse, marking it as feeding
1400 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1401 if (!(r2 = i->r.lock ())) {
1402 /* (*i) went away, ignore it */
1406 /* r2 is a route that feeds r1 which somehow feeds base. mark
1407 base as being fed by r2
1410 rbase->add_fed_by (r2, i->sends_only);
1414 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1418 if (r1->feeds (r2) && r2->feeds (r1)) {
1422 /* now recurse, so that we can mark base as being fed by
1423 all routes that feed r2
1426 trace_terminal (r2, rbase);
1433 Session::resort_routes ()
1435 /* don't do anything here with signals emitted
1436 by Routes during initial setup or while we
1437 are being destroyed.
1440 if (_state_of_the_state & (InitialConnecting | Deletion)) {
1445 RCUWriter<RouteList> writer (routes);
1446 boost::shared_ptr<RouteList> r = writer.get_copy ();
1447 resort_routes_using (r);
1448 /* writer goes out of scope and forces update */
1452 boost::shared_ptr<RouteList> rl = routes.reader ();
1453 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1454 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1456 const Route::FedBy& fb ((*i)->fed_by());
1458 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1459 boost::shared_ptr<Route> sf = f->r.lock();
1461 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1469 /** This is called whenever we need to rebuild the graph of how we will process
1471 * @param r List of routes, in any order.
1475 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1477 /* We are going to build a directed graph of our routes;
1478 this is where the edges of that graph are put.
1483 /* Go through all routes doing two things:
1485 * 1. Collect the edges of the route graph. Each of these edges
1486 * is a pair of routes, one of which directly feeds the other
1487 * either by a JACK connection or by an internal send.
1489 * 2. Begin the process of making routes aware of which other
1490 * routes directly or indirectly feed them. This information
1491 * is used by the solo code.
1494 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1496 /* Clear out the route's list of direct or indirect feeds */
1497 (*i)->clear_fed_by ();
1499 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
1501 bool via_sends_only;
1503 /* See if this *j feeds *i according to the current state of the JACK
1504 connections and internal sends.
1506 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
1507 /* add the edge to the graph (part #1) */
1508 edges.add (*j, *i, via_sends_only);
1509 /* tell the route (for part #2) */
1510 (*i)->add_fed_by (*j, via_sends_only);
1515 /* Attempt a topological sort of the route graph */
1516 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
1518 if (sorted_routes) {
1519 /* We got a satisfactory topological sort, so there is no feedback;
1522 Note: the process graph rechain does not require a
1523 topologically-sorted list, but hey ho.
1525 if (_process_graph) {
1526 _process_graph->rechain (sorted_routes, edges);
1529 _current_route_graph = edges;
1531 /* Complete the building of the routes' lists of what directly
1532 or indirectly feeds them.
1534 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1535 trace_terminal (*i, *i);
1538 *r = *sorted_routes;
1541 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1542 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1543 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1544 (*i)->name(), (*i)->order_key (MixerSort)));
1548 SuccessfulGraphSort (); /* EMIT SIGNAL */
1551 /* The topological sort failed, so we have a problem. Tell everyone
1552 and stick to the old graph; this will continue to be processed, so
1553 until the feedback is fixed, what is played back will not quite
1554 reflect what is actually connected. Note also that we do not
1555 do trace_terminal here, as it would fail due to an endless recursion,
1556 so the solo code will think that everything is still connected
1560 FeedbackDetected (); /* EMIT SIGNAL */
1565 /** Find a route name starting with \a base, maybe followed by the
1566 * lowest \a id. \a id will always be added if \a definitely_add_number
1567 * is true on entry; otherwise it will only be added if required
1568 * to make the name unique.
1570 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1571 * The available route name with the lowest ID will be used, and \a id
1572 * will be set to the ID.
1574 * \return false if a route name could not be found, and \a track_name
1575 * and \a id do not reflect a free route name.
1578 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1580 if (!definitely_add_number && route_by_name (base) == 0) {
1581 /* juse use the base */
1582 snprintf (name, name_len, "%s", base.c_str());
1587 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1589 if (route_by_name (name) == 0) {
1595 } while (id < (UINT_MAX-1));
1600 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
1602 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
1604 in = ChanCount::ZERO;
1605 out = ChanCount::ZERO;
1607 boost::shared_ptr<RouteList> r = routes.reader ();
1609 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1610 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1611 if (tr && !tr->is_hidden()) {
1612 in += tr->n_inputs();
1613 out += tr->n_outputs();
1618 /** Caller must not hold process lock
1619 * @param name_template string to use for the start of the name, or "" to use "MIDI".
1620 * @param instrument plugin info for the instrument to insert pre-fader, if any
1622 list<boost::shared_ptr<MidiTrack> >
1623 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
1624 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1626 char track_name[32];
1627 uint32_t track_id = 0;
1629 RouteList new_routes;
1630 list<boost::shared_ptr<MidiTrack> > ret;
1632 cerr << "Adding MIDI track with in = " << input << " out = " << output << endl;
1634 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
1637 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1638 error << "cannot find name for new midi track" << endmsg;
1642 boost::shared_ptr<MidiTrack> track;
1645 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1647 if (track->init ()) {
1651 track->use_new_diskstream();
1653 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1654 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1657 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1658 if (track->input()->ensure_io (input, false, this)) {
1659 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
1663 if (track->output()->ensure_io (output, false, this)) {
1664 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
1669 track->non_realtime_input_change();
1672 route_group->add (track);
1675 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1677 if (Config->get_remote_model() == UserOrdered) {
1678 track->set_remote_control_id (next_control_id());
1681 new_routes.push_back (track);
1682 ret.push_back (track);
1685 catch (failed_constructor &err) {
1686 error << _("Session: could not create new midi track.") << endmsg;
1690 catch (AudioEngine::PortRegistrationFailure& pfe) {
1692 error << string_compose (_("No more JACK ports are available. You will need to stop %1 and restart JACK with ports if you need this many tracks."), PROGRAM_NAME) << endmsg;
1700 if (!new_routes.empty()) {
1701 add_routes (new_routes, true, true, true);
1704 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
1705 PluginPtr plugin = instrument->load (*this);
1706 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
1707 (*r)->add_processor (p, PreFader);
1717 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
1719 boost::shared_ptr<Route> midi_track (wmt.lock());
1725 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
1727 if (change.after.n_audio() <= change.before.n_audio()) {
1731 /* new audio ports: make sure the audio goes somewhere useful,
1732 unless the user has no-auto-connect selected.
1734 The existing ChanCounts don't matter for this call as they are only
1735 to do with matching input and output indices, and we are only changing
1741 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
1745 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1746 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1747 * @param output_start As \a input_start, but for outputs.
1750 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
1751 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
1753 if (!IO::connecting_legal) {
1757 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1763 /* If both inputs and outputs are auto-connected to physical ports,
1764 use the max of input and output offsets to ensure auto-connected
1765 port numbers always match up (e.g. the first audio input and the
1766 first audio output of the route will have the same physical
1767 port number). Otherwise just use the lowest input or output
1771 DEBUG_TRACE (DEBUG::Graph,
1772 string_compose("Auto-connect: existing in = %1 out = %2\n",
1773 existing_inputs, existing_outputs));
1775 const bool in_out_physical =
1776 (Config->get_input_auto_connect() & AutoConnectPhysical)
1777 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1780 const ChanCount in_offset = in_out_physical
1781 ? ChanCount::max(existing_inputs, existing_outputs)
1784 const ChanCount out_offset = in_out_physical
1785 ? ChanCount::max(existing_inputs, existing_outputs)
1788 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1789 vector<string> physinputs;
1790 vector<string> physoutputs;
1792 _engine.get_physical_outputs (*t, physoutputs);
1793 _engine.get_physical_inputs (*t, physinputs);
1795 if (!physinputs.empty() && connect_inputs) {
1796 uint32_t nphysical_in = physinputs.size();
1798 DEBUG_TRACE (DEBUG::Graph,
1799 string_compose("There are %1 physical inputs of type %2\n",
1802 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1805 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1806 DEBUG_TRACE (DEBUG::Graph,
1807 string_compose("Get index %1 + %2 % %3 = %4\n",
1808 in_offset.get(*t), i, nphysical_in,
1809 (in_offset.get(*t) + i) % nphysical_in));
1810 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1813 DEBUG_TRACE (DEBUG::Graph,
1814 string_compose("Connect route %1 IN to %2\n",
1815 route->name(), port));
1817 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
1821 ChanCount one_added (*t, 1);
1822 existing_inputs += one_added;
1826 if (!physoutputs.empty()) {
1827 uint32_t nphysical_out = physoutputs.size();
1828 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
1831 if ((*t) == DataType::MIDI || Config->get_output_auto_connect() & AutoConnectPhysical) {
1832 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1833 } else if ((*t) == DataType::AUDIO && Config->get_output_auto_connect() & AutoConnectMaster) {
1834 /* master bus is audio only */
1835 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1836 port = _master_out->input()->ports().port(*t,
1837 i % _master_out->input()->n_ports().get(*t))->name();
1841 DEBUG_TRACE (DEBUG::Graph,
1842 string_compose("Connect route %1 OUT to %2\n",
1843 route->name(), port));
1845 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
1849 ChanCount one_added (*t, 1);
1850 existing_outputs += one_added;
1856 /** Caller must not hold process lock
1857 * @param name_template string to use for the start of the name, or "" to use "Audio".
1859 list< boost::shared_ptr<AudioTrack> >
1860 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
1861 uint32_t how_many, string name_template)
1863 char track_name[32];
1864 uint32_t track_id = 0;
1866 RouteList new_routes;
1867 list<boost::shared_ptr<AudioTrack> > ret;
1869 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
1872 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1873 error << "cannot find name for new audio track" << endmsg;
1877 boost::shared_ptr<AudioTrack> track;
1880 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
1882 if (track->init ()) {
1886 track->use_new_diskstream();
1888 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1889 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1892 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1894 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1895 error << string_compose (
1896 _("cannot configure %1 in/%2 out configuration for new audio track"),
1897 input_channels, output_channels)
1902 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1903 error << string_compose (
1904 _("cannot configure %1 in/%2 out configuration for new audio track"),
1905 input_channels, output_channels)
1912 route_group->add (track);
1915 track->non_realtime_input_change();
1917 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1918 if (Config->get_remote_model() == UserOrdered) {
1919 track->set_remote_control_id (next_control_id());
1922 new_routes.push_back (track);
1923 ret.push_back (track);
1926 catch (failed_constructor &err) {
1927 error << _("Session: could not create new audio track.") << endmsg;
1931 catch (AudioEngine::PortRegistrationFailure& pfe) {
1933 error << pfe.what() << endmsg;
1941 if (!new_routes.empty()) {
1942 add_routes (new_routes, true, true, true);
1948 /** Caller must not hold process lock.
1949 * @param name_template string to use for the start of the name, or "" to use "Bus".
1952 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
1955 uint32_t bus_id = 0;
1959 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
1962 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
1963 error << "cannot find name for new audio bus" << endmsg;
1968 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
1974 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1975 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
1978 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1980 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1981 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1982 input_channels, output_channels)
1988 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1989 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1990 input_channels, output_channels)
1997 route_group->add (bus);
1999 if (Config->get_remote_model() == UserOrdered) {
2000 bus->set_remote_control_id (next_control_id());
2003 bus->add_internal_return ();
2005 ret.push_back (bus);
2009 catch (failed_constructor &err) {
2010 error << _("Session: could not create new audio route.") << endmsg;
2014 catch (AudioEngine::PortRegistrationFailure& pfe) {
2015 error << pfe.what() << endmsg;
2025 add_routes (ret, false, true, true); // autoconnect outputs only
2033 Session::new_route_from_template (uint32_t how_many, const std::string& template_path)
2036 uint32_t control_id;
2038 uint32_t number = 0;
2040 if (!tree.read (template_path.c_str())) {
2044 XMLNode* node = tree.root();
2046 IO::disable_connecting ();
2048 control_id = next_control_id ();
2052 XMLNode node_copy (*node);
2054 /* Remove IDs of everything so that new ones are used */
2055 node_copy.remove_property_recursively (X_("id"));
2058 string const route_name = node_copy.property(X_("name"))->value ();
2060 /* generate a new name by adding a number to the end of the template name */
2062 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2063 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2067 /* set this name in the XML description that we are about to use */
2068 Route::set_name_in_state (node_copy, name);
2070 /* trim bitslots from listen sends so that new ones are used */
2071 XMLNodeList children = node_copy.children ();
2072 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2073 if ((*i)->name() == X_("Processor")) {
2074 XMLProperty* role = (*i)->property (X_("role"));
2075 if (role && role->value() == X_("Listen")) {
2076 (*i)->remove_property (X_("bitslot"));
2081 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2084 error << _("Session: cannot create track/bus from template description") << endmsg;
2088 if (boost::dynamic_pointer_cast<Track>(route)) {
2089 /* force input/output change signals so that the new diskstream
2090 picks up the configuration of the route. During session
2091 loading this normally happens in a different way.
2094 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2096 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2097 change.after = route->input()->n_ports();
2098 route->input()->changed (change, this);
2099 change.after = route->output()->n_ports();
2100 route->output()->changed (change, this);
2103 route->set_remote_control_id (control_id);
2106 ret.push_back (route);
2109 catch (failed_constructor &err) {
2110 error << _("Session: could not create new route from template") << endmsg;
2114 catch (AudioEngine::PortRegistrationFailure& pfe) {
2115 error << pfe.what() << endmsg;
2124 add_routes (ret, true, true, true);
2125 IO::enable_connecting ();
2132 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
2134 ChanCount existing_inputs;
2135 ChanCount existing_outputs;
2136 uint32_t order = next_control_id();
2138 count_existing_track_channels (existing_inputs, existing_outputs);
2141 RCUWriter<RouteList> writer (routes);
2142 boost::shared_ptr<RouteList> r = writer.get_copy ();
2143 r->insert (r->end(), new_routes.begin(), new_routes.end());
2145 /* if there is no control out and we're not in the middle of loading,
2146 resort the graph here. if there is a control out, we will resort
2147 toward the end of this method. if we are in the middle of loading,
2148 we will resort when done.
2151 if (!_monitor_out && IO::connecting_legal) {
2152 resort_routes_using (r);
2156 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2158 boost::weak_ptr<Route> wpr (*x);
2159 boost::shared_ptr<Route> r (*x);
2161 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2162 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2163 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2164 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2165 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2166 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2168 if (r->is_master()) {
2172 if (r->is_monitor()) {
2176 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2178 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2179 track_playlist_changed (boost::weak_ptr<Track> (tr));
2180 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2182 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2184 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2185 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2189 if (input_auto_connect || output_auto_connect) {
2190 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
2193 /* order keys are a GUI responsibility but we need to set up
2194 reasonable defaults because they also affect the remote control
2195 ID in most situations.
2198 if (!r->has_order_key (EditorSort)) {
2199 if (r->is_hidden()) {
2200 /* use an arbitrarily high value */
2201 r->set_order_key (EditorSort, UINT_MAX);
2202 r->set_order_key (MixerSort, UINT_MAX);
2204 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
2205 r->set_order_key (EditorSort, order);
2206 r->set_order_key (MixerSort, order);
2212 if (_monitor_out && IO::connecting_legal) {
2215 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
2217 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2218 if ((*x)->is_monitor()) {
2220 } else if ((*x)->is_master()) {
2223 (*x)->enable_monitor_send ();
2234 save_state (_current_snapshot_name);
2237 RouteAdded (new_routes); /* EMIT SIGNAL */
2241 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2243 boost::shared_ptr<RouteList> r = routes.reader ();
2244 boost::shared_ptr<Send> s;
2246 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2247 if ((s = (*i)->internal_send_for (dest)) != 0) {
2248 s->amp()->gain_control()->set_value (0.0);
2254 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2256 boost::shared_ptr<RouteList> r = routes.reader ();
2257 boost::shared_ptr<Send> s;
2259 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2260 if ((s = (*i)->internal_send_for (dest)) != 0) {
2261 s->amp()->gain_control()->set_value (1.0);
2267 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2269 boost::shared_ptr<RouteList> r = routes.reader ();
2270 boost::shared_ptr<Send> s;
2272 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2273 if ((s = (*i)->internal_send_for (dest)) != 0) {
2274 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2279 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2281 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2283 boost::shared_ptr<RouteList> r = routes.reader ();
2284 boost::shared_ptr<RouteList> t (new RouteList);
2286 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2287 /* no MIDI sends because there are no MIDI busses yet */
2288 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2293 add_internal_sends (dest, p, t);
2297 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2299 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2300 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
2305 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
2307 add_internal_send (dest, sender->before_processor_for_index (index), sender);
2311 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
2313 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
2317 if (!dest->internal_return()) {
2318 dest->add_internal_return ();
2321 sender->add_aux_send (dest, before);
2327 Session::remove_route (boost::shared_ptr<Route> route)
2329 if (route == _master_out) {
2333 route->set_solo (false, this);
2336 RCUWriter<RouteList> writer (routes);
2337 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2341 /* deleting the master out seems like a dumb
2342 idea, but its more of a UI policy issue
2346 if (route == _master_out) {
2347 _master_out = boost::shared_ptr<Route> ();
2350 if (route == _monitor_out) {
2351 _monitor_out.reset ();
2354 /* writer goes out of scope, forces route list update */
2357 update_route_solo_state ();
2359 // We need to disconnect the route's inputs and outputs
2361 route->input()->disconnect (0);
2362 route->output()->disconnect (0);
2364 /* if the route had internal sends sending to it, remove them */
2365 if (route->internal_return()) {
2367 boost::shared_ptr<RouteList> r = routes.reader ();
2368 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2369 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2371 (*i)->remove_processor (s);
2376 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2377 if (mt && mt->step_editing()) {
2378 if (_step_editors > 0) {
2383 update_latency_compensation ();
2386 /* Re-sort routes to remove the graph's current references to the one that is
2387 * going away, then flush old references out of the graph.
2391 if (_process_graph) {
2392 _process_graph->clear_other_chain ();
2395 /* get rid of it from the dead wood collection in the route list manager */
2397 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2401 /* try to cause everyone to drop their references */
2403 route->drop_references ();
2405 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2407 /* save the new state of the world */
2409 if (save_state (_current_snapshot_name)) {
2410 save_history (_current_snapshot_name);
2415 Session::route_mute_changed (void* /*src*/)
2421 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2423 boost::shared_ptr<Route> route = wpr.lock();
2425 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2429 if (route->listening_via_monitor ()) {
2431 if (Config->get_exclusive_solo()) {
2432 /* new listen: disable all other listen */
2433 boost::shared_ptr<RouteList> r = routes.reader ();
2434 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2435 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2438 (*i)->set_listen (false, this);
2444 } else if (_listen_cnt > 0) {
2449 update_route_solo_state ();
2452 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2454 boost::shared_ptr<Route> route = wpr.lock ();
2457 /* should not happen */
2458 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2462 bool send_changed = false;
2464 if (route->solo_isolated()) {
2465 if (_solo_isolated_cnt == 0) {
2466 send_changed = true;
2468 _solo_isolated_cnt++;
2469 } else if (_solo_isolated_cnt > 0) {
2470 _solo_isolated_cnt--;
2471 if (_solo_isolated_cnt == 0) {
2472 send_changed = true;
2477 IsolatedChanged (); /* EMIT SIGNAL */
2482 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2484 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
2486 if (!self_solo_change) {
2487 // session doesn't care about changes to soloed-by-others
2491 if (solo_update_disabled) {
2493 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
2497 boost::shared_ptr<Route> route = wpr.lock ();
2500 boost::shared_ptr<RouteList> r = routes.reader ();
2503 if (route->self_soloed()) {
2509 RouteGroup* rg = route->route_group ();
2510 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
2512 if (delta == 1 && Config->get_exclusive_solo()) {
2514 /* new solo: disable all other solos, but not the group if its solo-enabled */
2516 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2517 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2518 (leave_group_alone && ((*i)->route_group() == rg))) {
2521 (*i)->set_solo (false, this);
2525 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
2527 solo_update_disabled = true;
2529 RouteList uninvolved;
2531 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
2533 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2534 bool via_sends_only;
2535 bool in_signal_flow;
2537 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2538 (leave_group_alone && ((*i)->route_group() == rg))) {
2542 in_signal_flow = false;
2544 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
2546 if ((*i)->feeds (route, &via_sends_only)) {
2547 if (!via_sends_only) {
2548 if (!route->soloed_by_others_upstream()) {
2549 (*i)->mod_solo_by_others_downstream (delta);
2552 in_signal_flow = true;
2554 DEBUG_TRACE (DEBUG::Solo, "\tno feed from\n");
2557 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
2559 if (route->feeds (*i, &via_sends_only)) {
2560 /* propagate solo upstream only if routing other than
2561 sends is involved, but do consider the other route
2562 (*i) to be part of the signal flow even if only
2565 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
2569 route->soloed_by_others_downstream(),
2570 route->soloed_by_others_upstream()));
2571 if (!via_sends_only) {
2572 if (!route->soloed_by_others_downstream()) {
2573 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
2574 (*i)->mod_solo_by_others_upstream (delta);
2577 in_signal_flow = true;
2579 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
2582 if (!in_signal_flow) {
2583 uninvolved.push_back (*i);
2587 solo_update_disabled = false;
2588 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
2590 update_route_solo_state (r);
2592 /* now notify that the mute state of the routes not involved in the signal
2593 pathway of the just-solo-changed route may have altered.
2596 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2597 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1\n", (*i)->name()));
2598 (*i)->mute_changed (this);
2601 SoloChanged (); /* EMIT SIGNAL */
2606 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2608 /* now figure out if anything that matters is soloed (or is "listening")*/
2610 bool something_soloed = false;
2611 uint32_t listeners = 0;
2612 uint32_t isolated = 0;
2615 r = routes.reader();
2618 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2619 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2620 something_soloed = true;
2623 if (!(*i)->is_hidden() && (*i)->listening_via_monitor()) {
2624 if (Config->get_solo_control_is_listen_control()) {
2627 (*i)->set_listen (false, this);
2631 if ((*i)->solo_isolated()) {
2636 if (something_soloed != _non_soloed_outs_muted) {
2637 _non_soloed_outs_muted = something_soloed;
2638 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2641 _listen_cnt = listeners;
2643 if (isolated != _solo_isolated_cnt) {
2644 _solo_isolated_cnt = isolated;
2645 IsolatedChanged (); /* EMIT SIGNAL */
2649 boost::shared_ptr<RouteList>
2650 Session::get_routes_with_internal_returns() const
2652 boost::shared_ptr<RouteList> r = routes.reader ();
2653 boost::shared_ptr<RouteList> rl (new RouteList);
2655 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2656 if ((*i)->internal_return ()) {
2664 Session::io_name_is_legal (const std::string& name)
2666 boost::shared_ptr<RouteList> r = routes.reader ();
2668 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2669 if ((*i)->name() == name) {
2673 if ((*i)->has_io_processor_named (name)) {
2682 Session::set_exclusive_input_active (boost::shared_ptr<Route> rt, bool /*others_on*/)
2685 vector<string> connections;
2687 PortSet& ps (rt->input()->ports());
2689 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
2690 p->get_connections (connections);
2693 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
2694 routes_using_input_from (*s, rl);
2697 /* scan all relevant routes to see if others are on or off */
2699 bool others_are_already_on = false;
2701 for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
2703 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2705 if (mt->input_active()) {
2706 others_are_already_on = true;
2713 /* globally reverse other routes */
2715 for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
2717 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2719 mt->set_input_active (!others_are_already_on);
2726 Session::routes_using_input_from (const string& str, RouteList& rl)
2728 boost::shared_ptr<RouteList> r = routes.reader ();
2730 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2731 if ((*i)->input()->connected_to (str)) {
2737 boost::shared_ptr<Route>
2738 Session::route_by_name (string name)
2740 boost::shared_ptr<RouteList> r = routes.reader ();
2742 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2743 if ((*i)->name() == name) {
2748 return boost::shared_ptr<Route> ((Route*) 0);
2751 boost::shared_ptr<Route>
2752 Session::route_by_id (PBD::ID id)
2754 boost::shared_ptr<RouteList> r = routes.reader ();
2756 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2757 if ((*i)->id() == id) {
2762 return boost::shared_ptr<Route> ((Route*) 0);
2765 boost::shared_ptr<Track>
2766 Session::track_by_diskstream_id (PBD::ID id)
2768 boost::shared_ptr<RouteList> r = routes.reader ();
2770 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2771 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
2772 if (t && t->using_diskstream_id (id)) {
2777 return boost::shared_ptr<Track> ();
2780 boost::shared_ptr<Route>
2781 Session::route_by_remote_id (uint32_t id)
2783 boost::shared_ptr<RouteList> r = routes.reader ();
2785 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2786 if ((*i)->remote_control_id() == id) {
2791 return boost::shared_ptr<Route> ((Route*) 0);
2795 Session::playlist_region_added (boost::weak_ptr<Region> w)
2797 boost::shared_ptr<Region> r = w.lock ();
2802 /* These are the operations that are currently in progress... */
2803 list<GQuark> curr = _current_trans_quarks;
2806 /* ...and these are the operations during which we want to update
2807 the session range location markers.
2810 ops.push_back (Operations::capture);
2811 ops.push_back (Operations::paste);
2812 ops.push_back (Operations::duplicate_region);
2813 ops.push_back (Operations::insert_file);
2814 ops.push_back (Operations::insert_region);
2815 ops.push_back (Operations::drag_region_brush);
2816 ops.push_back (Operations::region_drag);
2817 ops.push_back (Operations::selection_grab);
2818 ops.push_back (Operations::region_fill);
2819 ops.push_back (Operations::fill_selection);
2820 ops.push_back (Operations::create_region);
2821 ops.push_back (Operations::region_copy);
2822 ops.push_back (Operations::fixed_time_region_copy);
2825 /* See if any of the current operations match the ones that we want */
2827 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
2829 /* If so, update the session range markers */
2831 maybe_update_session_range (r->position (), r->last_frame ());
2835 /** Update the session range markers if a is before the current start or
2836 * b is after the current end.
2839 Session::maybe_update_session_range (framepos_t a, framepos_t b)
2841 if (_state_of_the_state & Loading) {
2845 if (_session_range_location == 0) {
2847 add_session_range_location (a, b);
2851 if (a < _session_range_location->start()) {
2852 _session_range_location->set_start (a);
2855 if (b > _session_range_location->end()) {
2856 _session_range_location->set_end (b);
2862 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
2864 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2865 maybe_update_session_range (i->to, i->to + i->length);
2870 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
2872 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2873 maybe_update_session_range (i->from, i->to);
2877 /* Region management */
2879 boost::shared_ptr<Region>
2880 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2882 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2883 RegionFactory::RegionMap::const_iterator i;
2884 boost::shared_ptr<Region> region;
2886 Glib::Threads::Mutex::Lock lm (region_lock);
2888 for (i = regions.begin(); i != regions.end(); ++i) {
2892 if (region->whole_file()) {
2894 if (child->source_equivalent (region)) {
2900 return boost::shared_ptr<Region> ();
2904 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2906 set<boost::shared_ptr<Region> > relevant_regions;
2908 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2909 RegionFactory::get_regions_using_source (*s, relevant_regions);
2912 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2913 set<boost::shared_ptr<Region> >::iterator tmp;
2918 playlists->destroy_region (*r);
2919 RegionFactory::map_remove (*r);
2921 (*r)->drop_sources ();
2922 (*r)->drop_references ();
2924 relevant_regions.erase (r);
2929 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
2932 Glib::Threads::Mutex::Lock ls (source_lock);
2933 /* remove from the main source list */
2934 sources.erase ((*s)->id());
2937 (*s)->mark_for_remove ();
2938 (*s)->drop_references ();
2947 Session::remove_last_capture ()
2949 list<boost::shared_ptr<Source> > srcs;
2951 boost::shared_ptr<RouteList> rl = routes.reader ();
2952 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2953 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2958 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
2961 srcs.insert (srcs.end(), l.begin(), l.end());
2966 destroy_sources (srcs);
2968 save_state (_current_snapshot_name);
2973 /* Source Management */
2976 Session::add_source (boost::shared_ptr<Source> source)
2978 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
2979 pair<SourceMap::iterator,bool> result;
2981 entry.first = source->id();
2982 entry.second = source;
2985 Glib::Threads::Mutex::Lock lm (source_lock);
2986 result = sources.insert (entry);
2989 if (result.second) {
2991 /* yay, new source */
2993 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
2996 if (!fs->within_session()) {
2997 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
3003 boost::shared_ptr<AudioFileSource> afs;
3005 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
3006 if (Config->get_auto_analyse_audio()) {
3007 Analyser::queue_source_for_analysis (source, false);
3011 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
3016 Session::remove_source (boost::weak_ptr<Source> src)
3018 if (_state_of_the_state & Deletion) {
3022 SourceMap::iterator i;
3023 boost::shared_ptr<Source> source = src.lock();
3030 Glib::Threads::Mutex::Lock lm (source_lock);
3032 if ((i = sources.find (source->id())) != sources.end()) {
3037 if (!(_state_of_the_state & InCleanup)) {
3039 /* save state so we don't end up with a session file
3040 referring to non-existent sources.
3043 save_state (_current_snapshot_name);
3047 boost::shared_ptr<Source>
3048 Session::source_by_id (const PBD::ID& id)
3050 Glib::Threads::Mutex::Lock lm (source_lock);
3051 SourceMap::iterator i;
3052 boost::shared_ptr<Source> source;
3054 if ((i = sources.find (id)) != sources.end()) {
3061 boost::shared_ptr<Source>
3062 Session::source_by_path_and_channel (const string& path, uint16_t chn)
3064 Glib::Threads::Mutex::Lock lm (source_lock);
3066 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3067 boost::shared_ptr<AudioFileSource> afs
3068 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
3070 if (afs && afs->path() == path && chn == afs->channel()) {
3074 return boost::shared_ptr<Source>();
3078 Session::count_sources_by_origin (const string& path)
3081 Glib::Threads::Mutex::Lock lm (source_lock);
3083 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3084 boost::shared_ptr<FileSource> fs
3085 = boost::dynamic_pointer_cast<FileSource>(i->second);
3087 if (fs && fs->origin() == path) {
3097 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
3100 string old_basename = PBD::basename_nosuffix (oldname);
3101 string new_legalized = legalize_for_path (newname);
3103 /* note: we know (or assume) the old path is already valid */
3107 /* destructive file sources have a name of the form:
3109 /path/to/Tnnnn-NAME(%[LR])?.wav
3111 the task here is to replace NAME with the new name.
3116 string::size_type dash;
3118 dir = Glib::path_get_dirname (path);
3119 path = Glib::path_get_basename (path);
3121 /* '-' is not a legal character for the NAME part of the path */
3123 if ((dash = path.find_last_of ('-')) == string::npos) {
3127 prefix = path.substr (0, dash);
3131 path += new_legalized;
3132 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3133 path = Glib::build_filename (dir, path);
3137 /* non-destructive file sources have a name of the form:
3139 /path/to/NAME-nnnnn(%[LR])?.ext
3141 the task here is to replace NAME with the new name.
3146 string::size_type dash;
3147 string::size_type postfix;
3149 dir = Glib::path_get_dirname (path);
3150 path = Glib::path_get_basename (path);
3152 /* '-' is not a legal character for the NAME part of the path */
3154 if ((dash = path.find_last_of ('-')) == string::npos) {
3158 suffix = path.substr (dash+1);
3160 // Suffix is now everything after the dash. Now we need to eliminate
3161 // the nnnnn part, which is done by either finding a '%' or a '.'
3163 postfix = suffix.find_last_of ("%");
3164 if (postfix == string::npos) {
3165 postfix = suffix.find_last_of ('.');
3168 if (postfix != string::npos) {
3169 suffix = suffix.substr (postfix);
3171 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
3175 const uint32_t limit = 10000;
3176 char buf[PATH_MAX+1];
3178 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
3180 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
3182 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
3183 path = Glib::build_filename (dir, buf);
3191 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
3200 /** Return the full path (in some session directory) for a new within-session source.
3201 * \a name must be a session-unique name that does not contain slashes
3202 * (e.g. as returned by new_*_source_name)
3205 Session::new_source_path_from_name (DataType type, const string& name)
3207 assert(name.find("/") == string::npos);
3209 SessionDirectory sdir(get_best_session_directory_for_new_source());
3212 if (type == DataType::AUDIO) {
3213 p = sdir.sound_path();
3214 } else if (type == DataType::MIDI) {
3215 p = sdir.midi_path();
3217 error << "Unknown source type, unable to create file path" << endmsg;
3221 return Glib::build_filename (p, name);
3225 Session::peak_path (string base) const
3227 return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
3230 /** Return a unique name based on \a base for a new internal audio source */
3232 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
3235 char buf[PATH_MAX+1];
3236 const uint32_t limit = 10000;
3238 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3241 legalized = legalize_for_path (base);
3243 // Find a "version" of the base name that doesn't exist in any of the possible directories.
3244 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3246 vector<space_and_path>::iterator i;
3247 uint32_t existing = 0;
3249 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3254 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3255 cnt, legalized.c_str(), ext.c_str());
3256 } else if (nchan == 2) {
3258 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
3259 cnt, legalized.c_str(), ext.c_str());
3261 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
3262 cnt, legalized.c_str(), ext.c_str());
3264 } else if (nchan < 26) {
3265 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
3266 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
3268 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3269 cnt, legalized.c_str(), ext.c_str());
3275 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3276 } else if (nchan == 2) {
3278 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
3280 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
3282 } else if (nchan < 26) {
3283 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
3285 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3289 SessionDirectory sdir((*i).path);
3291 string spath = sdir.sound_path();
3293 /* note that we search *without* the extension so that
3294 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3295 in the event that this new name is required for
3296 a file format change.
3299 if (matching_unsuffixed_filename_exists_in (spath, buf)) {
3305 if (existing == 0) {
3310 error << string_compose(
3311 _("There are already %1 recordings for %2, which I consider too many."),
3312 limit, base) << endmsg;
3314 throw failed_constructor();
3318 return Glib::path_get_basename (buf);
3321 /** Create a new within-session audio source */
3322 boost::shared_ptr<AudioFileSource>
3323 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
3325 const string name = new_audio_source_name (n, n_chans, chan, destructive);
3326 const string path = new_source_path_from_name(DataType::AUDIO, name);
3328 return boost::dynamic_pointer_cast<AudioFileSource> (
3329 SourceFactory::createWritable (DataType::AUDIO, *this, path, string(), destructive, frame_rate()));
3332 /** Return a unique name based on \a base for a new internal MIDI source */
3334 Session::new_midi_source_name (const string& base)
3337 char buf[PATH_MAX+1];
3338 const uint32_t limit = 10000;
3342 legalized = legalize_for_path (base);
3344 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3345 for (cnt = 1; cnt <= limit; ++cnt) {
3347 vector<space_and_path>::iterator i;
3348 uint32_t existing = 0;
3350 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3352 SessionDirectory sdir((*i).path);
3354 std::string p = Glib::build_filename (sdir.midi_path(), legalized);
3356 snprintf (buf, sizeof(buf), "%s-%u.mid", p.c_str(), cnt);
3358 if (Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
3363 if (existing == 0) {
3368 error << string_compose(
3369 _("There are already %1 recordings for %2, which I consider too many."),
3370 limit, base) << endmsg;
3372 throw failed_constructor();
3376 return Glib::path_get_basename(buf);
3380 /** Create a new within-session MIDI source */
3381 boost::shared_ptr<MidiSource>
3382 Session::create_midi_source_for_session (Track* track, string const & n)
3384 /* try to use the existing write source for the track, to keep numbering sane
3388 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3392 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3395 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3396 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3400 const string name = new_midi_source_name (n);
3401 const string path = new_source_path_from_name (DataType::MIDI, name);
3403 return boost::dynamic_pointer_cast<SMFSource> (
3404 SourceFactory::createWritable (
3405 DataType::MIDI, *this, path, string(), false, frame_rate()));
3410 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3412 if (playlist->hidden()) {
3416 playlists->add (playlist);
3419 playlist->release();
3426 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3428 if (_state_of_the_state & Deletion) {
3432 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3438 playlists->remove (playlist);
3444 Session::set_audition (boost::shared_ptr<Region> r)
3446 pending_audition_region = r;
3447 add_post_transport_work (PostTransportAudition);
3448 _butler->schedule_transport_work ();
3452 Session::audition_playlist ()
3454 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3455 ev->region.reset ();
3460 Session::non_realtime_set_audition ()
3462 assert (pending_audition_region);
3463 auditioner->audition_region (pending_audition_region);
3464 pending_audition_region.reset ();
3465 AuditionActive (true); /* EMIT SIGNAL */
3469 Session::audition_region (boost::shared_ptr<Region> r)
3471 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3477 Session::cancel_audition ()
3479 if (auditioner->auditioning()) {
3480 auditioner->cancel_audition ();
3481 AuditionActive (false); /* EMIT SIGNAL */
3486 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3488 if (a->is_monitor()) {
3491 if (b->is_monitor()) {
3494 return a->order_key (MixerSort) < b->order_key (MixerSort);
3498 Session::is_auditioning () const
3500 /* can be called before we have an auditioner object */
3502 return auditioner->auditioning();
3509 Session::graph_reordered ()
3511 /* don't do this stuff if we are setting up connections
3512 from a set_state() call or creating new tracks. Ditto for deletion.
3515 if (_state_of_the_state & (InitialConnecting|Deletion)) {
3519 /* every track/bus asked for this to be handled but it was deferred because
3520 we were connecting. do it now.
3523 request_input_change_handling ();
3527 /* force all diskstreams to update their capture offset values to
3528 reflect any changes in latencies within the graph.
3531 boost::shared_ptr<RouteList> rl = routes.reader ();
3532 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3533 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3535 tr->set_capture_offset ();
3540 /** @return Number of frames that there is disk space available to write,
3543 boost::optional<framecnt_t>
3544 Session::available_capture_duration ()
3546 Glib::Threads::Mutex::Lock lm (space_lock);
3548 if (_total_free_4k_blocks_uncertain) {
3549 return boost::optional<framecnt_t> ();
3552 float sample_bytes_on_disk = 4.0; // keep gcc happy
3554 switch (config.get_native_file_data_format()) {
3556 sample_bytes_on_disk = 4.0;
3560 sample_bytes_on_disk = 3.0;
3564 sample_bytes_on_disk = 2.0;
3568 /* impossible, but keep some gcc versions happy */
3569 fatal << string_compose (_("programming error: %1"),
3570 X_("illegal native file data format"))
3575 double scale = 4096.0 / sample_bytes_on_disk;
3577 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3578 return max_framecnt;
3581 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3585 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3588 RCUWriter<BundleList> writer (_bundles);
3589 boost::shared_ptr<BundleList> b = writer.get_copy ();
3590 b->push_back (bundle);
3593 BundleAdded (bundle); /* EMIT SIGNAL */
3599 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3601 bool removed = false;
3604 RCUWriter<BundleList> writer (_bundles);
3605 boost::shared_ptr<BundleList> b = writer.get_copy ();
3606 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3608 if (i != b->end()) {
3615 BundleRemoved (bundle); /* EMIT SIGNAL */
3621 boost::shared_ptr<Bundle>
3622 Session::bundle_by_name (string name) const
3624 boost::shared_ptr<BundleList> b = _bundles.reader ();
3626 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3627 if ((*i)->name() == name) {
3632 return boost::shared_ptr<Bundle> ();
3636 Session::tempo_map_changed (const PropertyChange&)
3640 playlists->update_after_tempo_map_change ();
3642 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3648 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3650 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3651 (*i)->recompute_frames_from_bbt ();
3655 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3656 * the given count with the current block size.
3659 Session::ensure_buffers (ChanCount howmany)
3661 BufferManager::ensure_buffers (howmany);
3665 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3667 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3668 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3673 Session::next_insert_id ()
3675 /* this doesn't really loop forever. just think about it */
3678 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3679 if (!insert_bitset[n]) {
3680 insert_bitset[n] = true;
3686 /* none available, so resize and try again */
3688 insert_bitset.resize (insert_bitset.size() + 16, false);
3693 Session::next_send_id ()
3695 /* this doesn't really loop forever. just think about it */
3698 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3699 if (!send_bitset[n]) {
3700 send_bitset[n] = true;
3706 /* none available, so resize and try again */
3708 send_bitset.resize (send_bitset.size() + 16, false);
3713 Session::next_aux_send_id ()
3715 /* this doesn't really loop forever. just think about it */
3718 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
3719 if (!aux_send_bitset[n]) {
3720 aux_send_bitset[n] = true;
3726 /* none available, so resize and try again */
3728 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
3733 Session::next_return_id ()
3735 /* this doesn't really loop forever. just think about it */
3738 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3739 if (!return_bitset[n]) {
3740 return_bitset[n] = true;
3746 /* none available, so resize and try again */
3748 return_bitset.resize (return_bitset.size() + 16, false);
3753 Session::mark_send_id (uint32_t id)
3755 if (id >= send_bitset.size()) {
3756 send_bitset.resize (id+16, false);
3758 if (send_bitset[id]) {
3759 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3761 send_bitset[id] = true;
3765 Session::mark_aux_send_id (uint32_t id)
3767 if (id >= aux_send_bitset.size()) {
3768 aux_send_bitset.resize (id+16, false);
3770 if (aux_send_bitset[id]) {
3771 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
3773 aux_send_bitset[id] = true;
3777 Session::mark_return_id (uint32_t id)
3779 if (id >= return_bitset.size()) {
3780 return_bitset.resize (id+16, false);
3782 if (return_bitset[id]) {
3783 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3785 return_bitset[id] = true;
3789 Session::mark_insert_id (uint32_t id)
3791 if (id >= insert_bitset.size()) {
3792 insert_bitset.resize (id+16, false);
3794 if (insert_bitset[id]) {
3795 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3797 insert_bitset[id] = true;
3801 Session::unmark_send_id (uint32_t id)
3803 if (id < send_bitset.size()) {
3804 send_bitset[id] = false;
3809 Session::unmark_aux_send_id (uint32_t id)
3811 if (id < aux_send_bitset.size()) {
3812 aux_send_bitset[id] = false;
3817 Session::unmark_return_id (uint32_t id)
3819 if (id < return_bitset.size()) {
3820 return_bitset[id] = false;
3825 Session::unmark_insert_id (uint32_t id)
3827 if (id < insert_bitset.size()) {
3828 insert_bitset[id] = false;
3833 Session::reset_native_file_format ()
3835 boost::shared_ptr<RouteList> rl = routes.reader ();
3836 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3837 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3839 /* don't save state as we do this, there's no point
3842 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3843 tr->reset_write_sources (false);
3844 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3850 Session::route_name_unique (string n) const
3852 boost::shared_ptr<RouteList> r = routes.reader ();
3854 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3855 if ((*i)->name() == n) {
3864 Session::route_name_internal (string n) const
3866 if (auditioner && auditioner->name() == n) {
3870 if (_click_io && _click_io->name() == n) {
3878 Session::freeze_all (InterThreadInfo& itt)
3880 boost::shared_ptr<RouteList> r = routes.reader ();
3882 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3884 boost::shared_ptr<Track> t;
3886 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3887 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3897 boost::shared_ptr<Region>
3898 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
3899 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3900 InterThreadInfo& itt,
3901 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
3904 boost::shared_ptr<Region> result;
3905 boost::shared_ptr<Playlist> playlist;
3906 boost::shared_ptr<AudioFileSource> fsource;
3908 char buf[PATH_MAX+1];
3909 ChanCount diskstream_channels (track.n_channels());
3910 framepos_t position;
3911 framecnt_t this_chunk;
3914 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3915 const string sound_dir = sdir.sound_path();
3916 framepos_t len = end - start;
3917 bool need_block_size_reset = false;
3919 ChanCount const max_proc = track.max_processor_streams ();
3922 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3923 end, start) << endmsg;
3927 const framecnt_t chunk_size = (256 * 1024)/4;
3929 // block all process callback handling
3931 block_processing ();
3933 /* call tree *MUST* hold route_lock */
3935 if ((playlist = track.playlist()) == 0) {
3939 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3941 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
3943 for (x = 0; x < 99999; ++x) {
3944 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());
3945 if (!Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
3951 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3956 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
3957 SourceFactory::createWritable (DataType::AUDIO, *this, buf, string(), false, frame_rate()));
3960 catch (failed_constructor& err) {
3961 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
3965 srcs.push_back (fsource);
3968 /* tell redirects that care that we are about to use a much larger
3969 * blocksize. this will flush all plugins too, so that they are ready
3970 * to be used for this process.
3973 need_block_size_reset = true;
3974 track.set_block_size (chunk_size);
3979 /* create a set of reasonably-sized buffers */
3980 buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
3981 buffers.set_count (max_proc);
3983 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3984 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3986 afs->prepare_for_peakfile_writes ();
3989 while (to_do && !itt.cancel) {
3991 this_chunk = min (to_do, chunk_size);
3993 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export)) {
3998 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
3999 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4002 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
4008 start += this_chunk;
4009 to_do -= this_chunk;
4011 itt.progress = (float) (1.0 - ((double) to_do / len));
4020 xnow = localtime (&now);
4022 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
4023 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4026 afs->update_header (position, *xnow, now);
4027 afs->flush_header ();
4031 /* construct a region to represent the bounced material */
4035 plist.add (Properties::start, 0);
4036 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4037 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4039 result = RegionFactory::create (srcs, plist);
4045 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4046 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4049 afs->mark_for_remove ();
4052 (*src)->drop_references ();
4056 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4057 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4060 afs->done_with_peakfile_writes ();
4065 if (need_block_size_reset) {
4066 track.set_block_size (get_block_size());
4069 unblock_processing ();
4075 Session::gain_automation_buffer() const
4077 return ProcessThread::gain_automation_buffer ();
4081 Session::send_gain_automation_buffer() const
4083 return ProcessThread::send_gain_automation_buffer ();
4087 Session::pan_automation_buffer() const
4089 return ProcessThread::pan_automation_buffer ();
4093 Session::get_silent_buffers (ChanCount count)
4095 return ProcessThread::get_silent_buffers (count);
4099 Session::get_scratch_buffers (ChanCount count)
4101 return ProcessThread::get_scratch_buffers (count);
4105 Session::get_mix_buffers (ChanCount count)
4107 return ProcessThread::get_mix_buffers (count);
4111 Session::ntracks () const
4114 boost::shared_ptr<RouteList> r = routes.reader ();
4116 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4117 if (boost::dynamic_pointer_cast<Track> (*i)) {
4126 Session::nbusses () const
4129 boost::shared_ptr<RouteList> r = routes.reader ();
4131 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4132 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
4141 Session::add_automation_list(AutomationList *al)
4143 automation_lists[al->id()] = al;
4146 /** @return true if there is at least one record-enabled track, otherwise false */
4148 Session::have_rec_enabled_track () const
4150 return g_atomic_int_get (&_have_rec_enabled_track) == 1;
4153 /** Update the state of our rec-enabled tracks flag */
4155 Session::update_have_rec_enabled_track ()
4157 boost::shared_ptr<RouteList> rl = routes.reader ();
4158 RouteList::iterator i = rl->begin();
4159 while (i != rl->end ()) {
4161 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4162 if (tr && tr->record_enabled ()) {
4169 int const old = g_atomic_int_get (&_have_rec_enabled_track);
4171 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4173 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4174 RecordStateChanged (); /* EMIT SIGNAL */
4179 Session::listen_position_changed ()
4181 boost::shared_ptr<RouteList> r = routes.reader ();
4183 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4184 (*i)->listen_position_changed ();
4189 Session::solo_control_mode_changed ()
4191 /* cancel all solo or all listen when solo control mode changes */
4194 set_solo (get_routes(), false);
4195 } else if (listening()) {
4196 set_listen (get_routes(), false);
4200 /** Called when a property of one of our route groups changes */
4202 Session::route_group_property_changed (RouteGroup* rg)
4204 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4207 /** Called when a route is added to one of our route groups */
4209 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4211 RouteAddedToRouteGroup (rg, r);
4214 /** Called when a route is removed from one of our route groups */
4216 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4218 RouteRemovedFromRouteGroup (rg, r);
4221 boost::shared_ptr<RouteList>
4222 Session::get_routes_with_regions_at (framepos_t const p) const
4224 boost::shared_ptr<RouteList> r = routes.reader ();
4225 boost::shared_ptr<RouteList> rl (new RouteList);
4227 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4228 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4233 boost::shared_ptr<Playlist> pl = tr->playlist ();
4238 if (pl->has_region_at (p)) {
4247 Session::goto_end ()
4249 if (_session_range_location) {
4250 request_locate (_session_range_location->end(), false);
4252 request_locate (0, false);
4257 Session::goto_start ()
4259 if (_session_range_location) {
4260 request_locate (_session_range_location->start(), false);
4262 request_locate (0, false);
4267 Session::current_start_frame () const
4269 return _session_range_location ? _session_range_location->start() : 0;
4273 Session::current_end_frame () const
4275 return _session_range_location ? _session_range_location->end() : 0;
4279 Session::add_session_range_location (framepos_t start, framepos_t end)
4281 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4282 _locations->add (_session_range_location);
4286 Session::step_edit_status_change (bool yn)
4292 send = (_step_editors == 0);
4297 send = (_step_editors == 1);
4300 if (_step_editors > 0) {
4306 StepEditStatusChange (val);
4312 Session::start_time_changed (framepos_t old)
4314 /* Update the auto loop range to match the session range
4315 (unless the auto loop range has been changed by the user)
4318 Location* s = _locations->session_range_location ();
4323 Location* l = _locations->auto_loop_location ();
4325 if (l && l->start() == old) {
4326 l->set_start (s->start(), true);
4331 Session::end_time_changed (framepos_t old)
4333 /* Update the auto loop range to match the session range
4334 (unless the auto loop range has been changed by the user)
4337 Location* s = _locations->session_range_location ();
4342 Location* l = _locations->auto_loop_location ();
4344 if (l && l->end() == old) {
4345 l->set_end (s->end(), true);
4350 Session::source_search_path (DataType type) const
4354 if (session_dirs.size() == 1) {
4356 case DataType::AUDIO:
4357 s.push_back ( _session_dir->sound_path());
4359 case DataType::MIDI:
4360 s.push_back (_session_dir->midi_path());
4364 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4365 SessionDirectory sdir (i->path);
4367 case DataType::AUDIO:
4368 s.push_back (sdir.sound_path());
4370 case DataType::MIDI:
4371 s.push_back (sdir.midi_path());
4377 if (type == DataType::AUDIO) {
4378 const string sound_path_2X = _session_dir->sound_path_2X();
4379 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
4380 s.push_back (sound_path_2X);
4384 /* now check the explicit (possibly user-specified) search path
4387 vector<string> dirs;
4390 case DataType::AUDIO:
4391 split (config.get_audio_search_path (), dirs, ':');
4393 case DataType::MIDI:
4394 split (config.get_midi_search_path (), dirs, ':');
4398 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4400 vector<string>::iterator si;
4402 for (si = s.begin(); si != s.end(); ++si) {
4408 if (si == s.end()) {
4415 for (vector<string>::iterator si = s.begin(); si != s.end(); ++si) {
4416 if (!search_path.empty()) {
4426 Session::ensure_search_path_includes (const string& path, DataType type)
4429 vector<string> dirs;
4436 case DataType::AUDIO:
4437 search_path = config.get_audio_search_path ();
4439 case DataType::MIDI:
4440 search_path = config.get_midi_search_path ();
4444 split (search_path, dirs, ':');
4446 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4447 /* No need to add this new directory if it has the same inode as
4448 an existing one; checking inode rather than name prevents duplicated
4449 directories when we are using symlinks.
4451 On Windows, I think we could just do if (*i == path) here.
4453 if (PBD::equivalent_paths (*i, path)) {
4458 if (!search_path.empty()) {
4462 search_path += path;
4465 case DataType::AUDIO:
4466 config.set_audio_search_path (search_path);
4468 case DataType::MIDI:
4469 config.set_midi_search_path (search_path);
4474 boost::shared_ptr<Speakers>
4475 Session::get_speakers()
4481 Session::unknown_processors () const
4485 boost::shared_ptr<RouteList> r = routes.reader ();
4486 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4487 list<string> t = (*i)->unknown_processors ();
4488 copy (t.begin(), t.end(), back_inserter (p));
4498 Session::update_latency (bool playback)
4500 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
4502 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4506 boost::shared_ptr<RouteList> r = routes.reader ();
4507 framecnt_t max_latency = 0;
4510 /* reverse the list so that we work backwards from the last route to run to the first */
4511 RouteList* rl = routes.reader().get();
4512 r.reset (new RouteList (*rl));
4513 reverse (r->begin(), r->end());
4516 /* compute actual latency values for the given direction and store them all in per-port
4517 structures. this will also publish the same values (to JACK) so that computation of latency
4518 for routes can consistently use public latency values.
4521 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4522 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
4525 /* because we latency compensate playback, our published playback latencies should
4526 be the same for all output ports - all material played back by ardour has
4527 the same latency, whether its caused by plugins or by latency compensation. since
4528 these may differ from the values computed above, reset all playback port latencies
4532 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
4534 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4535 (*i)->set_public_port_latencies (max_latency, playback);
4540 post_playback_latency ();
4544 post_capture_latency ();
4547 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
4551 Session::post_playback_latency ()
4553 set_worst_playback_latency ();
4555 boost::shared_ptr<RouteList> r = routes.reader ();
4557 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4558 if (!(*i)->is_hidden() && ((*i)->active())) {
4559 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
4563 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4564 (*i)->set_latency_compensation (_worst_track_latency);
4569 Session::post_capture_latency ()
4571 set_worst_capture_latency ();
4573 /* reflect any changes in capture latencies into capture offsets
4576 boost::shared_ptr<RouteList> rl = routes.reader();
4577 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4578 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4580 tr->set_capture_offset ();
4586 Session::initialize_latencies ()
4589 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
4590 update_latency (false);
4591 update_latency (true);
4594 set_worst_io_latencies ();
4598 Session::set_worst_io_latencies ()
4600 set_worst_playback_latency ();
4601 set_worst_capture_latency ();
4605 Session::set_worst_playback_latency ()
4607 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4611 _worst_output_latency = 0;
4613 if (!_engine.connected()) {
4617 boost::shared_ptr<RouteList> r = routes.reader ();
4619 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4620 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
4623 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
4627 Session::set_worst_capture_latency ()
4629 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4633 _worst_input_latency = 0;
4635 if (!_engine.connected()) {
4639 boost::shared_ptr<RouteList> r = routes.reader ();
4641 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4642 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
4645 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
4649 Session::update_latency_compensation (bool force_whole_graph)
4651 bool some_track_latency_changed = false;
4653 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4657 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
4659 _worst_track_latency = 0;
4661 boost::shared_ptr<RouteList> r = routes.reader ();
4663 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4664 if (!(*i)->is_hidden() && ((*i)->active())) {
4666 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
4667 some_track_latency_changed = true;
4669 _worst_track_latency = max (tl, _worst_track_latency);
4673 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
4674 (some_track_latency_changed ? "yes" : "no")));
4676 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
4678 if (some_track_latency_changed || force_whole_graph) {
4679 _engine.update_latencies ();
4683 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4684 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4688 tr->set_capture_offset ();
4693 Session::session_name_is_legal (const string& path)
4695 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
4697 for (int i = 0; illegal_chars[i]; ++i) {
4698 if (path.find (illegal_chars[i]) != string::npos) {
4699 return illegal_chars[i];
4707 Session::next_control_id () const
4711 /* the monitor bus remote ID is in a different
4712 * "namespace" than regular routes. its existence doesn't
4713 * affect normal (low) numbered routes.
4720 return nroutes() - subtract;
4724 Session::notify_remote_id_change ()
4726 if (deletion_in_progress()) {
4730 switch (Config->get_remote_model()) {
4733 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
4741 Session::sync_order_keys (RouteSortOrderKey sort_key_changed)
4743 if (deletion_in_progress()) {
4747 /* tell everyone that something has happened to the sort keys
4748 and let them sync up with the change(s)
4749 this will give objects that manage the sort order keys the
4750 opportunity to keep them in sync if they wish to.
4753 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("Sync Order Keys, based on %1\n", enum_2_string (sort_key_changed)));
4755 Route::SyncOrderKeys (sort_key_changed); /* EMIT SIGNAL */
4757 DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
4761 Session::operation_in_progress (GQuark op) const
4763 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
4766 boost::shared_ptr<Port>
4767 Session::ltc_input_port () const
4769 return _ltc_input->nth (0);
4772 boost::shared_ptr<Port>
4773 Session::ltc_output_port () const
4775 return _ltc_output->nth (0);
4779 Session::reconnect_ltc_input ()
4783 string src = Config->get_ltc_source_port();
4785 _ltc_input->disconnect (this);
4787 if (src != _("None") && !src.empty()) {
4788 _ltc_input->nth (0)->connect (src);
4794 Session::reconnect_ltc_output ()
4799 string src = Config->get_ltc_sink_port();
4801 _ltc_output->disconnect (this);
4803 if (src != _("None") && !src.empty()) {
4804 _ltc_output->nth (0)->connect (src);