2 Copyright (C) 1999-2010 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #include <cstdio> /* sprintf(3) ... grrr */
33 #include <glibmm/thread.h>
34 #include <glibmm/miscutils.h>
35 #include <glibmm/fileutils.h>
37 #include <boost/algorithm/string/erase.hpp>
39 #include "pbd/error.h"
40 #include "pbd/boost_debug.h"
41 #include "pbd/pathscanner.h"
42 #include "pbd/stl_delete.h"
43 #include "pbd/basename.h"
44 #include "pbd/stacktrace.h"
45 #include "pbd/file_utils.h"
46 #include "pbd/convert.h"
47 #include "pbd/strsplit.h"
48 #include "pbd/strsplit.h"
49 #include "pbd/unwind.h"
51 #include "ardour/amp.h"
52 #include "ardour/analyser.h"
53 #include "ardour/audio_buffer.h"
54 #include "ardour/audio_diskstream.h"
55 #include "ardour/audio_port.h"
56 #include "ardour/audio_track.h"
57 #include "ardour/audioengine.h"
58 #include "ardour/audiofilesource.h"
59 #include "ardour/auditioner.h"
60 #include "ardour/buffer_manager.h"
61 #include "ardour/buffer_set.h"
62 #include "ardour/bundle.h"
63 #include "ardour/butler.h"
64 #include "ardour/click.h"
65 #include "ardour/control_protocol_manager.h"
66 #include "ardour/data_type.h"
67 #include "ardour/debug.h"
68 #include "ardour/filename_extensions.h"
69 #include "ardour/graph.h"
70 #include "ardour/midi_track.h"
71 #include "ardour/midi_ui.h"
72 #include "ardour/named_selection.h"
73 #include "ardour/operations.h"
74 #include "ardour/playlist.h"
75 #include "ardour/plugin.h"
76 #include "ardour/plugin_insert.h"
77 #include "ardour/process_thread.h"
78 #include "ardour/rc_configuration.h"
79 #include "ardour/recent_sessions.h"
80 #include "ardour/region.h"
81 #include "ardour/region_factory.h"
82 #include "ardour/route_graph.h"
83 #include "ardour/route_group.h"
84 #include "ardour/send.h"
85 #include "ardour/session.h"
86 #include "ardour/session_directory.h"
87 #include "ardour/session_playlists.h"
88 #include "ardour/smf_source.h"
89 #include "ardour/source_factory.h"
90 #include "ardour/utils.h"
92 #include "midi++/port.h"
93 #include "midi++/jack_midi_port.h"
94 #include "midi++/mmc.h"
95 #include "midi++/manager.h"
106 using namespace ARDOUR;
109 bool Session::_disable_all_loaded_plugins = false;
111 PBD::Signal1<void,std::string> Session::Dialog;
112 PBD::Signal0<int> Session::AskAboutPendingState;
113 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
114 PBD::Signal0<void> Session::SendFeedback;
115 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
117 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
118 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
119 PBD::Signal2<void,std::string, std::string> Session::Exported;
120 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
121 PBD::Signal0<void> Session::Quit;
122 PBD::Signal0<void> Session::FeedbackDetected;
123 PBD::Signal0<void> Session::SuccessfulGraphSort;
125 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
126 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
128 /** @param snapshot_name Snapshot name, without .ardour prefix */
129 Session::Session (AudioEngine &eng,
130 const string& fullpath,
131 const string& snapshot_name,
132 BusProfile* bus_profile,
135 , _target_transport_speed (0.0)
136 , _requested_return_frame (-1)
137 , _session_dir (new SessionDirectory(fullpath))
139 , _state_of_the_state (Clean)
140 , _butler (new Butler (*this))
141 , _post_transport_work (0)
142 , _send_timecode_update (false)
143 , _all_route_group (new RouteGroup (*this, "all"))
144 , routes (new RouteList)
145 , _total_free_4k_blocks (0)
146 , _total_free_4k_blocks_uncertain (false)
147 , _bundles (new BundleList)
148 , _bundle_xml_node (0)
150 , _click_io ((IO*) 0)
152 , click_emphasis_data (0)
154 , _have_rec_enabled_track (false)
155 , _suspend_timecode_transmission (0)
157 _locations = new Locations (*this);
159 if (how_many_dsp_threads () > 1) {
160 /* For now, only create the graph if we are using >1 DSP threads, as
161 it is a bit slower than the old code with 1 thread.
163 _process_graph.reset (new Graph (*this));
166 playlists.reset (new SessionPlaylists);
168 _all_route_group->set_active (true, this);
170 interpolation.add_channel_to (0, 0);
172 if (!eng.connected()) {
173 throw failed_constructor();
176 n_physical_outputs = _engine.n_physical_outputs ();
177 n_physical_inputs = _engine.n_physical_inputs ();
179 first_stage_init (fullpath, snapshot_name);
181 _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
184 if (create (mix_template, bus_profile)) {
186 throw failed_constructor ();
190 if (second_stage_init ()) {
192 throw failed_constructor ();
195 store_recent_sessions(_name, _path);
197 bool was_dirty = dirty();
199 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
201 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
202 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
205 DirtyChanged (); /* EMIT SIGNAL */
208 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
209 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
225 vector<void*> debug_pointers;
227 /* if we got to here, leaving pending capture state around
231 remove_pending_capture_state ();
233 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
235 _engine.remove_session ();
237 /* clear history so that no references to objects are held any more */
241 /* clear state tree so that no references to objects are held any more */
245 /* reset dynamic state version back to default */
247 Stateful::loading_state_version = 0;
249 _butler->drop_references ();
251 delete midi_control_ui;
252 delete _all_route_group;
254 if (click_data != default_click) {
255 delete [] click_data;
258 if (click_emphasis_data != default_click_emphasis) {
259 delete [] click_emphasis_data;
264 /* clear out any pending dead wood from RCU managed objects */
269 AudioDiskstream::free_working_buffers();
271 /* tell everyone who is still standing that we're about to die */
274 /* tell everyone to drop references and delete objects as we go */
276 DEBUG_TRACE (DEBUG::Destruction, "delete named selections\n");
277 named_selections.clear ();
279 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
280 RegionFactory::delete_all_regions ();
282 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
284 /* reset these three references to special routes before we do the usual route delete thing */
287 _master_out.reset ();
288 _monitor_out.reset ();
291 RCUWriter<RouteList> writer (routes);
292 boost::shared_ptr<RouteList> r = writer.get_copy ();
294 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
295 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
296 (*i)->drop_references ();
300 /* writer goes out of scope and updates master */
304 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
305 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
306 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
307 i->second->drop_references ();
312 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
313 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
318 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
323 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
325 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
326 boost_debug_list_ptrs ();
331 Session::when_engine_running ()
333 string first_physical_output;
335 BootMessage (_("Set block size and sample rate"));
337 set_block_size (_engine.frames_per_cycle());
338 set_frame_rate (_engine.frame_rate());
340 BootMessage (_("Using configuration"));
342 boost::function<void (std::string)> ff (boost::bind (&Session::config_changed, this, _1, false));
343 boost::function<void (std::string)> ft (boost::bind (&Session::config_changed, this, _1, true));
345 Config->map_parameters (ff);
346 config.map_parameters (ft);
348 /* every time we reconnect, recompute worst case output latencies */
350 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
352 if (synced_to_jack()) {
353 _engine.transport_stop ();
356 if (config.get_jack_time_master()) {
357 _engine.transport_locate (_transport_frame);
365 _click_io.reset (new ClickIO (*this, "click"));
366 _click_gain.reset (new Amp (*this));
367 _click_gain->activate ();
369 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
371 /* existing state for Click */
374 if (Stateful::loading_state_version < 3000) {
375 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
377 const XMLNodeList& children (child->children());
378 XMLNodeList::const_iterator i = children.begin();
379 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
381 if (i != children.end()) {
382 c = _click_gain->set_state (**i, Stateful::loading_state_version);
388 _clicking = Config->get_clicking ();
392 error << _("could not setup Click I/O") << endmsg;
399 /* default state for Click: dual-mono to first 2 physical outputs */
402 _engine.get_physical_outputs (DataType::AUDIO, outs);
404 for (uint32_t physport = 0; physport < 2; ++physport) {
405 if (outs.size() > physport) {
406 if (_click_io->add_port (outs[physport], this)) {
407 // relax, even though its an error
412 if (_click_io->n_ports () > ChanCount::ZERO) {
413 _clicking = Config->get_clicking ();
418 catch (failed_constructor& err) {
419 error << _("cannot setup Click I/O") << endmsg;
422 BootMessage (_("Compute I/O Latencies"));
425 // XXX HOW TO ALERT UI TO THIS ? DO WE NEED TO?
428 BootMessage (_("Set up standard connections"));
430 vector<string> inputs[DataType::num_types];
431 vector<string> outputs[DataType::num_types];
432 for (uint32_t i = 0; i < DataType::num_types; ++i) {
433 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
434 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
437 /* Create a set of Bundle objects that map
438 to the physical I/O currently available. We create both
439 mono and stereo bundles, so that the common cases of mono
440 and stereo tracks get bundles to put in their mixer strip
441 in / out menus. There may be a nicer way of achieving that;
442 it doesn't really scale that well to higher channel counts
445 /* mono output bundles */
447 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
449 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
451 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
452 c->add_channel (_("mono"), DataType::AUDIO);
453 c->set_port (0, outputs[DataType::AUDIO][np]);
458 /* stereo output bundles */
460 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
461 if (np + 1 < outputs[DataType::AUDIO].size()) {
463 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
464 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
465 c->add_channel (_("L"), DataType::AUDIO);
466 c->set_port (0, outputs[DataType::AUDIO][np]);
467 c->add_channel (_("R"), DataType::AUDIO);
468 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
474 /* mono input bundles */
476 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
478 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
480 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
481 c->add_channel (_("mono"), DataType::AUDIO);
482 c->set_port (0, inputs[DataType::AUDIO][np]);
487 /* stereo input bundles */
489 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
490 if (np + 1 < inputs[DataType::AUDIO].size()) {
492 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
494 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
495 c->add_channel (_("L"), DataType::AUDIO);
496 c->set_port (0, inputs[DataType::AUDIO][np]);
497 c->add_channel (_("R"), DataType::AUDIO);
498 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
504 /* MIDI input bundles */
506 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
507 string n = inputs[DataType::MIDI][np];
508 boost::erase_first (n, X_("alsa_pcm:"));
510 boost::shared_ptr<Bundle> c (new Bundle (n, false));
511 c->add_channel ("", DataType::MIDI);
512 c->set_port (0, inputs[DataType::MIDI][np]);
516 /* MIDI output bundles */
518 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
519 string n = outputs[DataType::MIDI][np];
520 boost::erase_first (n, X_("alsa_pcm:"));
522 boost::shared_ptr<Bundle> c (new Bundle (n, true));
523 c->add_channel ("", DataType::MIDI);
524 c->set_port (0, outputs[DataType::MIDI][np]);
528 BootMessage (_("Setup signal flow and plugins"));
530 /* Reset all panners */
532 Delivery::reset_panners ();
534 /* this will cause the CPM to instantiate any protocols that are in use
535 * (or mandatory), which will pass it this Session, and then call
536 * set_state() on each instantiated protocol to match stored state.
539 ControlProtocolManager::instance().set_session (this);
541 /* This must be done after the ControlProtocolManager set_session above,
542 as it will set states for ports which the ControlProtocolManager creates.
545 MIDI::Manager::instance()->set_port_states (Config->midi_port_states ());
547 /* And this must be done after the MIDI::Manager::set_port_states as
548 * it will try to make connections whose details are loaded by set_port_states.
553 /* Let control protocols know that we are now all connected, so they
554 * could start talking to surfaces if they want to.
557 ControlProtocolManager::instance().midi_connectivity_established ();
559 if (_is_new && !no_auto_connect()) {
560 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock());
561 auto_connect_master_bus ();
564 _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
566 /* update latencies */
568 initialize_latencies ();
570 /* hook us up to the engine */
572 BootMessage (_("Connect to engine"));
573 _engine.set_session (this);
577 Session::auto_connect_master_bus ()
579 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
583 /* if requested auto-connect the outputs to the first N physical ports.
586 uint32_t limit = _master_out->n_outputs().n_total();
587 vector<string> outputs[DataType::num_types];
589 for (uint32_t i = 0; i < DataType::num_types; ++i) {
590 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
593 for (uint32_t n = 0; n < limit; ++n) {
594 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
596 if (outputs[p->type()].size() > n) {
597 connect_to = outputs[p->type()][n];
600 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
601 if (_master_out->output()->connect (p, connect_to, this)) {
602 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
611 Session::remove_monitor_section ()
617 /* force reversion to Solo-In-Place */
618 Config->set_solo_control_is_listen_control (false);
621 /* Hold process lock while doing this so that we don't hear bits and
622 * pieces of audio as we work on each route.
625 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
627 /* Connect tracks to monitor section. Note that in an
628 existing session, the internal sends will already exist, but we want the
629 routes to notice that they connect to the control out specifically.
633 boost::shared_ptr<RouteList> r = routes.reader ();
634 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
636 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
638 if ((*x)->is_monitor()) {
640 } else if ((*x)->is_master()) {
643 (*x)->remove_aux_or_listen (_monitor_out);
648 remove_route (_monitor_out);
649 auto_connect_master_bus ();
653 Session::add_monitor_section ()
657 if (_monitor_out || !_master_out) {
661 boost::shared_ptr<Route> r (new Route (*this, _("monitor"), Route::MonitorOut, DataType::AUDIO));
667 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
668 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
671 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
672 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
673 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
677 add_routes (rl, false, false, false);
679 assert (_monitor_out);
681 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
682 are undefined, at best.
685 uint32_t limit = _monitor_out->n_inputs().n_audio();
689 /* connect the inputs to the master bus outputs. this
690 * represents a separate data feed from the internal sends from
691 * each route. as of jan 2011, it allows the monitor section to
692 * conditionally ignore either the internal sends or the normal
693 * input feed, but we should really find a better way to do
697 _master_out->output()->disconnect (this);
699 for (uint32_t n = 0; n < limit; ++n) {
700 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
701 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
704 string connect_to = o->name();
705 if (_monitor_out->input()->connect (p, connect_to, this)) {
706 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
714 /* if monitor section is not connected, connect it to physical outs
717 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
719 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
721 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
724 _monitor_out->output()->connect_ports_to_bundle (b, this);
726 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
727 Config->get_monitor_bus_preferred_bundle())
733 /* Monitor bus is audio only */
735 uint32_t mod = n_physical_outputs.get (DataType::AUDIO);
736 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
737 vector<string> outputs[DataType::num_types];
739 for (uint32_t i = 0; i < DataType::num_types; ++i) {
740 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
746 for (uint32_t n = 0; n < limit; ++n) {
748 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
750 if (outputs[DataType::AUDIO].size() > (n % mod)) {
751 connect_to = outputs[DataType::AUDIO][n % mod];
754 if (!connect_to.empty()) {
755 if (_monitor_out->output()->connect (p, connect_to, this)) {
756 error << string_compose (
757 _("cannot connect control output %1 to %2"),
768 /* Hold process lock while doing this so that we don't hear bits and
769 * pieces of audio as we work on each route.
772 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
774 /* Connect tracks to monitor section. Note that in an
775 existing session, the internal sends will already exist, but we want the
776 routes to notice that they connect to the control out specifically.
780 boost::shared_ptr<RouteList> rls = routes.reader ();
782 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
784 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
786 if ((*x)->is_monitor()) {
788 } else if ((*x)->is_master()) {
791 (*x)->enable_monitor_send ();
797 Session::hookup_io ()
799 /* stop graph reordering notifications from
800 causing resorts, etc.
803 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
807 /* we delay creating the auditioner till now because
808 it makes its own connections to ports.
812 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
814 throw failed_constructor ();
816 a->use_new_diskstream ();
820 catch (failed_constructor& err) {
821 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
825 /* load bundles, which we may have postponed earlier on */
826 if (_bundle_xml_node) {
827 load_bundles (*_bundle_xml_node);
828 delete _bundle_xml_node;
831 /* Tell all IO objects to connect themselves together */
833 IO::enable_connecting ();
834 MIDI::JackMIDIPort::MakeConnections ();
836 /* Anyone who cares about input state, wake up and do something */
838 IOConnectionsComplete (); /* EMIT SIGNAL */
840 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
842 /* now handle the whole enchilada as if it was one
848 /* update the full solo state, which can't be
849 correctly determined on a per-route basis, but
850 needs the global overview that only the session
854 update_route_solo_state ();
858 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
860 boost::shared_ptr<Track> track = wp.lock ();
865 boost::shared_ptr<Playlist> playlist;
867 if ((playlist = track->playlist()) != 0) {
868 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
869 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
870 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
875 Session::record_enabling_legal () const
877 /* this used to be in here, but survey says.... we don't need to restrict it */
878 // if (record_status() == Recording) {
882 if (Config->get_all_safe()) {
889 Session::set_track_monitor_input_status (bool yn)
891 boost::shared_ptr<RouteList> rl = routes.reader ();
892 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
893 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
894 if (tr && tr->record_enabled ()) {
895 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
896 tr->request_jack_monitors_input (yn);
902 Session::auto_punch_start_changed (Location* location)
904 replace_event (SessionEvent::PunchIn, location->start());
906 if (get_record_enabled() && config.get_punch_in()) {
907 /* capture start has been changed, so save new pending state */
908 save_state ("", true);
913 Session::auto_punch_end_changed (Location* location)
915 framepos_t when_to_stop = location->end();
916 // when_to_stop += _worst_output_latency + _worst_input_latency;
917 replace_event (SessionEvent::PunchOut, when_to_stop);
921 Session::auto_punch_changed (Location* location)
923 framepos_t when_to_stop = location->end();
925 replace_event (SessionEvent::PunchIn, location->start());
926 //when_to_stop += _worst_output_latency + _worst_input_latency;
927 replace_event (SessionEvent::PunchOut, when_to_stop);
931 Session::auto_loop_changed (Location* location)
933 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
935 if (transport_rolling() && play_loop) {
938 // if (_transport_frame > location->end()) {
940 if (_transport_frame < location->start() || _transport_frame > location->end()) {
941 // relocate to beginning of loop
942 clear_events (SessionEvent::LocateRoll);
944 request_locate (location->start(), true);
947 else if (Config->get_seamless_loop() && !loop_changing) {
949 // schedule a locate-roll to refill the diskstreams at the
951 loop_changing = true;
953 if (location->end() > last_loopend) {
954 clear_events (SessionEvent::LocateRoll);
955 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
962 last_loopend = location->end();
966 Session::set_auto_punch_location (Location* location)
970 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
971 punch_connections.drop_connections();
972 existing->set_auto_punch (false, this);
973 remove_event (existing->start(), SessionEvent::PunchIn);
974 clear_events (SessionEvent::PunchOut);
975 auto_punch_location_changed (0);
984 if (location->end() <= location->start()) {
985 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
989 punch_connections.drop_connections ();
991 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
992 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
993 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
995 location->set_auto_punch (true, this);
997 auto_punch_changed (location);
999 auto_punch_location_changed (location);
1003 Session::set_auto_loop_location (Location* location)
1007 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1008 loop_connections.drop_connections ();
1009 existing->set_auto_loop (false, this);
1010 remove_event (existing->end(), SessionEvent::AutoLoop);
1011 auto_loop_location_changed (0);
1016 if (location == 0) {
1020 if (location->end() <= location->start()) {
1021 error << _("Session: you can't use a mark for auto loop") << endmsg;
1025 last_loopend = location->end();
1027 loop_connections.drop_connections ();
1029 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1030 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1031 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1033 location->set_auto_loop (true, this);
1035 /* take care of our stuff first */
1037 auto_loop_changed (location);
1039 /* now tell everyone else */
1041 auto_loop_location_changed (location);
1045 Session::locations_added (Location *)
1051 Session::locations_changed ()
1053 _locations->apply (*this, &Session::handle_locations_changed);
1057 Session::handle_locations_changed (Locations::LocationList& locations)
1059 Locations::LocationList::iterator i;
1061 bool set_loop = false;
1062 bool set_punch = false;
1064 for (i = locations.begin(); i != locations.end(); ++i) {
1068 if (location->is_auto_punch()) {
1069 set_auto_punch_location (location);
1072 if (location->is_auto_loop()) {
1073 set_auto_loop_location (location);
1077 if (location->is_session_range()) {
1078 _session_range_location = location;
1083 set_auto_loop_location (0);
1086 set_auto_punch_location (0);
1093 Session::enable_record ()
1095 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1096 /* no recording at anything except normal speed */
1101 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1103 if (rs == Recording) {
1107 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1109 _last_record_location = _transport_frame;
1110 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1112 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1113 set_track_monitor_input_status (true);
1116 RecordStateChanged ();
1123 Session::disable_record (bool rt_context, bool force)
1127 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1129 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1130 g_atomic_int_set (&_record_status, Disabled);
1131 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1133 if (rs == Recording) {
1134 g_atomic_int_set (&_record_status, Enabled);
1138 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1139 set_track_monitor_input_status (false);
1142 RecordStateChanged (); /* emit signal */
1145 remove_pending_capture_state ();
1151 Session::step_back_from_record ()
1153 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1155 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1156 set_track_monitor_input_status (false);
1159 RecordStateChanged (); /* emit signal */
1164 Session::maybe_enable_record ()
1166 if (_step_editors > 0) {
1170 g_atomic_int_set (&_record_status, Enabled);
1172 /* This function is currently called from somewhere other than an RT thread.
1173 This save_state() call therefore doesn't impact anything. Doing it here
1174 means that we save pending state of which sources the next record will use,
1175 which gives us some chance of recovering from a crash during the record.
1178 save_state ("", true);
1180 if (_transport_speed) {
1181 if (!config.get_punch_in()) {
1185 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1186 RecordStateChanged (); /* EMIT SIGNAL */
1193 Session::audible_frame () const
1199 /* the first of these two possible settings for "offset"
1200 mean that the audible frame is stationary until
1201 audio emerges from the latency compensation
1204 the second means that the audible frame is stationary
1205 until audio would emerge from a physical port
1206 in the absence of any plugin latency compensation
1209 offset = worst_playback_latency ();
1211 if (offset > current_block_size) {
1212 offset -= current_block_size;
1214 /* XXX is this correct? if we have no external
1215 physical connections and everything is internal
1216 then surely this is zero? still, how
1217 likely is that anyway?
1219 offset = current_block_size;
1222 if (synced_to_jack()) {
1223 tf = _engine.transport_frame();
1225 tf = _transport_frame;
1230 if (!non_realtime_work_pending()) {
1234 /* Check to see if we have passed the first guaranteed
1235 audible frame past our last start position. if not,
1236 return that last start point because in terms
1237 of audible frames, we have not moved yet.
1239 `Start position' in this context means the time we last
1240 either started or changed transport direction.
1243 if (_transport_speed > 0.0f) {
1245 if (!play_loop || !have_looped) {
1246 if (tf < _last_roll_or_reversal_location + offset) {
1247 return _last_roll_or_reversal_location;
1255 } else if (_transport_speed < 0.0f) {
1257 /* XXX wot? no backward looping? */
1259 if (tf > _last_roll_or_reversal_location - offset) {
1260 return _last_roll_or_reversal_location;
1272 Session::set_frame_rate (framecnt_t frames_per_second)
1274 /** \fn void Session::set_frame_size(framecnt_t)
1275 the AudioEngine object that calls this guarantees
1276 that it will not be called while we are also in
1277 ::process(). Its fine to do things that block
1281 _base_frame_rate = frames_per_second;
1285 Automatable::set_automation_interval (ceil ((double) frames_per_second * (0.001 * Config->get_automation_interval())));
1289 // XXX we need some equivalent to this, somehow
1290 // SndFileSource::setup_standard_crossfades (frames_per_second);
1294 /* XXX need to reset/reinstantiate all LADSPA plugins */
1298 Session::set_block_size (pframes_t nframes)
1300 /* the AudioEngine guarantees
1301 that it will not be called while we are also in
1302 ::process(). It is therefore fine to do things that block
1307 current_block_size = nframes;
1311 boost::shared_ptr<RouteList> r = routes.reader ();
1313 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1314 (*i)->set_block_size (nframes);
1317 boost::shared_ptr<RouteList> rl = routes.reader ();
1318 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1319 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1321 tr->set_block_size (nframes);
1325 set_worst_io_latencies ();
1331 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1333 boost::shared_ptr<Route> r2;
1335 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1336 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1340 /* make a copy of the existing list of routes that feed r1 */
1342 Route::FedBy existing (r1->fed_by());
1344 /* for each route that feeds r1, recurse, marking it as feeding
1348 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1349 if (!(r2 = i->r.lock ())) {
1350 /* (*i) went away, ignore it */
1354 /* r2 is a route that feeds r1 which somehow feeds base. mark
1355 base as being fed by r2
1358 rbase->add_fed_by (r2, i->sends_only);
1362 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1366 if (r1->feeds (r2) && r2->feeds (r1)) {
1370 /* now recurse, so that we can mark base as being fed by
1371 all routes that feed r2
1374 trace_terminal (r2, rbase);
1381 Session::resort_routes ()
1383 /* don't do anything here with signals emitted
1384 by Routes during initial setup or while we
1385 are being destroyed.
1388 if (_state_of_the_state & (InitialConnecting | Deletion)) {
1393 RCUWriter<RouteList> writer (routes);
1394 boost::shared_ptr<RouteList> r = writer.get_copy ();
1395 resort_routes_using (r);
1396 /* writer goes out of scope and forces update */
1400 boost::shared_ptr<RouteList> rl = routes.reader ();
1401 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1402 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1404 const Route::FedBy& fb ((*i)->fed_by());
1406 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1407 boost::shared_ptr<Route> sf = f->r.lock();
1409 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1417 /** This is called whenever we need to rebuild the graph of how we will process
1419 * @param r List of routes, in any order.
1423 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1425 /* We are going to build a directed graph of our routes;
1426 this is where the edges of that graph are put.
1431 /* Go through all routes doing two things:
1433 * 1. Collect the edges of the route graph. Each of these edges
1434 * is a pair of routes, one of which directly feeds the other
1435 * either by a JACK connection or by an internal send.
1437 * 2. Begin the process of making routes aware of which other
1438 * routes directly or indirectly feed them. This information
1439 * is used by the solo code.
1442 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1444 /* Clear out the route's list of direct or indirect feeds */
1445 (*i)->clear_fed_by ();
1447 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
1449 bool via_sends_only;
1451 /* See if this *j feeds *i according to the current state of the JACK
1452 connections and internal sends.
1454 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
1455 /* add the edge to the graph (part #1) */
1456 edges.add (*j, *i, via_sends_only);
1457 /* tell the route (for part #2) */
1458 (*i)->add_fed_by (*j, via_sends_only);
1463 /* Attempt a topological sort of the route graph */
1464 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
1466 if (sorted_routes) {
1467 /* We got a satisfactory topological sort, so there is no feedback;
1470 Note: the process graph rechain does not require a
1471 topologically-sorted list, but hey ho.
1473 if (_process_graph) {
1474 _process_graph->rechain (sorted_routes, edges);
1477 _current_route_graph = edges;
1479 /* Complete the building of the routes' lists of what directly
1480 or indirectly feeds them.
1482 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1483 trace_terminal (*i, *i);
1489 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1490 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1491 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1492 (*i)->name(), (*i)->order_key ("signal")));
1496 SuccessfulGraphSort (); /* EMIT SIGNAL */
1499 /* The topological sort failed, so we have a problem. Tell everyone
1500 and stick to the old graph; this will continue to be processed, so
1501 until the feedback is fixed, what is played back will not quite
1502 reflect what is actually connected. Note also that we do not
1503 do trace_terminal here, as it would fail due to an endless recursion,
1504 so the solo code will think that everything is still connected
1508 FeedbackDetected (); /* EMIT SIGNAL */
1513 /** Find a route name starting with \a base, maybe followed by the
1514 * lowest \a id. \a id will always be added if \a definitely_add_number
1515 * is true on entry; otherwise it will only be added if required
1516 * to make the name unique.
1518 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1519 * The available route name with the lowest ID will be used, and \a id
1520 * will be set to the ID.
1522 * \return false if a route name could not be found, and \a track_name
1523 * and \a id do not reflect a free route name.
1526 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1528 if (!definitely_add_number && route_by_name (base) == 0) {
1529 /* juse use the base */
1530 snprintf (name, name_len, "%s", base.c_str());
1535 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1537 if (route_by_name (name) == 0) {
1543 } while (id < (UINT_MAX-1));
1548 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
1550 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
1552 in = ChanCount::ZERO;
1553 out = ChanCount::ZERO;
1555 boost::shared_ptr<RouteList> r = routes.reader ();
1557 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1558 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1559 if (tr && !tr->is_hidden()) {
1560 in += tr->n_inputs();
1561 out += tr->n_outputs();
1566 /** Caller must not hold process lock
1567 * @param name_template string to use for the start of the name, or "" to use "MIDI".
1568 * @param instrument plugin info for the instrument to insert pre-fader, if any
1570 list<boost::shared_ptr<MidiTrack> >
1571 Session::new_midi_track (boost::shared_ptr<PluginInfo> instrument, TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1573 char track_name[32];
1574 uint32_t track_id = 0;
1576 RouteList new_routes;
1577 list<boost::shared_ptr<MidiTrack> > ret;
1578 uint32_t control_id;
1580 control_id = next_control_id ();
1582 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
1585 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1586 error << "cannot find name for new midi track" << endmsg;
1590 boost::shared_ptr<MidiTrack> track;
1593 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1595 if (track->init ()) {
1599 track->use_new_diskstream();
1601 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1602 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1605 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1606 if (track->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1607 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1611 if (track->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1612 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1617 track->non_realtime_input_change();
1620 route_group->add (track);
1623 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1624 track->set_remote_control_id (control_id);
1626 new_routes.push_back (track);
1627 ret.push_back (track);
1630 catch (failed_constructor &err) {
1631 error << _("Session: could not create new midi track.") << endmsg;
1635 catch (AudioEngine::PortRegistrationFailure& pfe) {
1637 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;
1645 if (!new_routes.empty()) {
1646 add_routes (new_routes, true, true, true);
1649 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
1650 PluginPtr plugin = instrument->load (*this);
1651 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
1652 (*r)->add_processor (p, PreFader);
1662 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
1664 boost::shared_ptr<Route> midi_track (wmt.lock());
1670 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
1672 if (change.after.n_audio() <= change.before.n_audio()) {
1676 /* new audio ports: make sure the audio goes somewhere useful,
1677 unless the user has no-auto-connect selected.
1679 The existing ChanCounts don't matter for this call as they are only
1680 to do with matching input and output indices, and we are only changing
1686 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
1690 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1691 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1692 * @param output_start As \a input_start, but for outputs.
1695 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
1696 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
1698 if (!IO::connecting_legal) {
1702 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::NOT_LOCK);
1708 /* If both inputs and outputs are auto-connected to physical ports,
1709 use the max of input and output offsets to ensure auto-connected
1710 port numbers always match up (e.g. the first audio input and the
1711 first audio output of the route will have the same physical
1712 port number). Otherwise just use the lowest input or output
1716 DEBUG_TRACE (DEBUG::Graph,
1717 string_compose("Auto-connect: existing in = %1 out = %2\n",
1718 existing_inputs, existing_outputs));
1720 const bool in_out_physical =
1721 (Config->get_input_auto_connect() & AutoConnectPhysical)
1722 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1725 const ChanCount in_offset = in_out_physical
1726 ? ChanCount::max(existing_inputs, existing_outputs)
1729 const ChanCount out_offset = in_out_physical
1730 ? ChanCount::max(existing_inputs, existing_outputs)
1733 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1734 vector<string> physinputs;
1735 vector<string> physoutputs;
1737 _engine.get_physical_outputs (*t, physoutputs);
1738 _engine.get_physical_inputs (*t, physinputs);
1740 if (!physinputs.empty() && connect_inputs) {
1741 uint32_t nphysical_in = physinputs.size();
1743 DEBUG_TRACE (DEBUG::Graph,
1744 string_compose("There are %1 physical inputs of type %2\n",
1747 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1750 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1751 DEBUG_TRACE (DEBUG::Graph,
1752 string_compose("Get index %1 + %2 % %3 = %4\n",
1753 in_offset.get(*t), i, nphysical_in,
1754 (in_offset.get(*t) + i) % nphysical_in));
1755 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1758 DEBUG_TRACE (DEBUG::Graph,
1759 string_compose("Connect route %1 IN to %2\n",
1760 route->name(), port));
1762 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
1766 ChanCount one_added (*t, 1);
1767 existing_inputs += one_added;
1771 if (!physoutputs.empty()) {
1772 uint32_t nphysical_out = physoutputs.size();
1773 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
1776 if ((*t) == DataType::MIDI || Config->get_output_auto_connect() & AutoConnectPhysical) {
1777 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1778 } else if ((*t) == DataType::AUDIO && Config->get_output_auto_connect() & AutoConnectMaster) {
1779 /* master bus is audio only */
1780 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1781 port = _master_out->input()->ports().port(*t,
1782 i % _master_out->input()->n_ports().get(*t))->name();
1786 DEBUG_TRACE (DEBUG::Graph,
1787 string_compose("Connect route %1 OUT to %2\n",
1788 route->name(), port));
1790 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
1794 ChanCount one_added (*t, 1);
1795 existing_outputs += one_added;
1801 /** Caller must not hold process lock
1802 * @param name_template string to use for the start of the name, or "" to use "Audio".
1804 list< boost::shared_ptr<AudioTrack> >
1805 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
1806 uint32_t how_many, string name_template)
1808 char track_name[32];
1809 uint32_t track_id = 0;
1811 RouteList new_routes;
1812 list<boost::shared_ptr<AudioTrack> > ret;
1813 uint32_t control_id;
1815 control_id = next_control_id ();
1817 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
1820 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1821 error << "cannot find name for new audio track" << endmsg;
1825 boost::shared_ptr<AudioTrack> track;
1828 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
1830 if (track->init ()) {
1834 track->use_new_diskstream();
1836 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1837 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1840 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1842 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1843 error << string_compose (
1844 _("cannot configure %1 in/%2 out configuration for new audio track"),
1845 input_channels, output_channels)
1850 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1851 error << string_compose (
1852 _("cannot configure %1 in/%2 out configuration for new audio track"),
1853 input_channels, output_channels)
1860 route_group->add (track);
1863 track->non_realtime_input_change();
1865 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1866 track->set_remote_control_id (control_id);
1869 new_routes.push_back (track);
1870 ret.push_back (track);
1873 catch (failed_constructor &err) {
1874 error << _("Session: could not create new audio track.") << endmsg;
1878 catch (AudioEngine::PortRegistrationFailure& pfe) {
1880 error << pfe.what() << endmsg;
1888 if (!new_routes.empty()) {
1889 add_routes (new_routes, true, true, true);
1896 Session::set_remote_control_ids ()
1898 RemoteModel m = Config->get_remote_model();
1899 bool emit_signal = false;
1901 boost::shared_ptr<RouteList> r = routes.reader ();
1903 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1904 if (MixerOrdered == m) {
1905 int32_t order = (*i)->order_key(N_("signal"));
1906 (*i)->set_remote_control_id (order+1, false);
1908 } else if (EditorOrdered == m) {
1909 int32_t order = (*i)->order_key(N_("editor"));
1910 (*i)->set_remote_control_id (order+1, false);
1912 } else if (UserOrdered == m) {
1913 //do nothing ... only changes to remote id's are initiated by user
1918 Route::RemoteControlIDChange();
1922 /** Caller must not hold process lock.
1923 * @param name_template string to use for the start of the name, or "" to use "Bus".
1926 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
1929 uint32_t bus_id = 0;
1932 uint32_t control_id;
1934 control_id = next_control_id ();
1936 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
1939 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
1940 error << "cannot find name for new audio bus" << endmsg;
1945 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
1951 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1952 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
1955 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1957 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1958 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1959 input_channels, output_channels)
1965 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1966 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1967 input_channels, output_channels)
1974 route_group->add (bus);
1976 bus->set_remote_control_id (control_id);
1979 bus->add_internal_return ();
1981 ret.push_back (bus);
1985 catch (failed_constructor &err) {
1986 error << _("Session: could not create new audio route.") << endmsg;
1990 catch (AudioEngine::PortRegistrationFailure& pfe) {
1991 error << pfe.what() << endmsg;
2001 add_routes (ret, false, true, true); // autoconnect outputs only
2009 Session::new_route_from_template (uint32_t how_many, const std::string& template_path)
2012 uint32_t control_id;
2014 uint32_t number = 0;
2016 if (!tree.read (template_path.c_str())) {
2020 XMLNode* node = tree.root();
2022 IO::disable_connecting ();
2024 control_id = next_control_id ();
2028 XMLNode node_copy (*node);
2030 /* Remove IDs of everything so that new ones are used */
2031 node_copy.remove_property_recursively (X_("id"));
2034 string const route_name = node_copy.property(X_("name"))->value ();
2036 /* generate a new name by adding a number to the end of the template name */
2038 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2039 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2043 /* set this name in the XML description that we are about to use */
2044 Route::set_name_in_state (node_copy, name);
2046 /* trim bitslots from listen sends so that new ones are used */
2047 XMLNodeList children = node_copy.children ();
2048 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2049 if ((*i)->name() == X_("Processor")) {
2050 XMLProperty* role = (*i)->property (X_("role"));
2051 if (role && role->value() == X_("Listen")) {
2052 (*i)->remove_property (X_("bitslot"));
2057 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2060 error << _("Session: cannot create track/bus from template description") << endmsg;
2064 if (boost::dynamic_pointer_cast<Track>(route)) {
2065 /* force input/output change signals so that the new diskstream
2066 picks up the configuration of the route. During session
2067 loading this normally happens in a different way.
2070 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2072 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2073 change.after = route->input()->n_ports();
2074 route->input()->changed (change, this);
2075 change.after = route->output()->n_ports();
2076 route->output()->changed (change, this);
2079 route->set_remote_control_id (control_id);
2082 ret.push_back (route);
2085 catch (failed_constructor &err) {
2086 error << _("Session: could not create new route from template") << endmsg;
2090 catch (AudioEngine::PortRegistrationFailure& pfe) {
2091 error << pfe.what() << endmsg;
2100 add_routes (ret, true, true, true);
2101 IO::enable_connecting ();
2108 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
2110 ChanCount existing_inputs;
2111 ChanCount existing_outputs;
2113 count_existing_track_channels (existing_inputs, existing_outputs);
2116 RCUWriter<RouteList> writer (routes);
2117 boost::shared_ptr<RouteList> r = writer.get_copy ();
2118 r->insert (r->end(), new_routes.begin(), new_routes.end());
2120 /* if there is no control out and we're not in the middle of loading,
2121 resort the graph here. if there is a control out, we will resort
2122 toward the end of this method. if we are in the middle of loading,
2123 we will resort when done.
2126 if (!_monitor_out && IO::connecting_legal) {
2127 resort_routes_using (r);
2131 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2133 boost::weak_ptr<Route> wpr (*x);
2134 boost::shared_ptr<Route> r (*x);
2136 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2137 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2138 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2139 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2140 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2141 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2142 r->order_key_changed.connect_same_thread (*this, boost::bind (&Session::route_order_key_changed, this));
2144 if (r->is_master()) {
2148 if (r->is_monitor()) {
2152 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2154 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2155 track_playlist_changed (boost::weak_ptr<Track> (tr));
2156 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2158 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2160 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2161 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2165 if (input_auto_connect || output_auto_connect) {
2166 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
2170 if (_monitor_out && IO::connecting_legal) {
2173 Glib::Mutex::Lock lm (_engine.process_lock());
2175 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2176 if ((*x)->is_monitor()) {
2178 } else if ((*x)->is_master()) {
2181 (*x)->enable_monitor_send ();
2192 save_state (_current_snapshot_name);
2195 RouteAdded (new_routes); /* EMIT SIGNAL */
2196 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
2200 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2202 boost::shared_ptr<RouteList> r = routes.reader ();
2203 boost::shared_ptr<Send> s;
2205 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2206 if ((s = (*i)->internal_send_for (dest)) != 0) {
2207 s->amp()->gain_control()->set_value (0.0);
2213 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2215 boost::shared_ptr<RouteList> r = routes.reader ();
2216 boost::shared_ptr<Send> s;
2218 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2219 if ((s = (*i)->internal_send_for (dest)) != 0) {
2220 s->amp()->gain_control()->set_value (1.0);
2226 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2228 boost::shared_ptr<RouteList> r = routes.reader ();
2229 boost::shared_ptr<Send> s;
2231 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2232 if ((s = (*i)->internal_send_for (dest)) != 0) {
2233 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2238 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2240 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2242 boost::shared_ptr<RouteList> r = routes.reader ();
2243 boost::shared_ptr<RouteList> t (new RouteList);
2245 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2246 /* no MIDI sends because there are no MIDI busses yet */
2247 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2252 add_internal_sends (dest, p, t);
2256 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2258 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2259 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
2264 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
2266 add_internal_send (dest, sender->before_processor_for_index (index), sender);
2270 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
2272 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
2276 if (!dest->internal_return()) {
2277 dest->add_internal_return ();
2280 sender->add_aux_send (dest, before);
2286 Session::remove_route (boost::shared_ptr<Route> route)
2288 if (route == _master_out) {
2292 route->set_solo (false, this);
2295 RCUWriter<RouteList> writer (routes);
2296 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2300 /* deleting the master out seems like a dumb
2301 idea, but its more of a UI policy issue
2305 if (route == _master_out) {
2306 _master_out = boost::shared_ptr<Route> ();
2309 if (route == _monitor_out) {
2310 _monitor_out.reset ();
2313 /* writer goes out of scope, forces route list update */
2316 update_route_solo_state ();
2318 // We need to disconnect the route's inputs and outputs
2320 route->input()->disconnect (0);
2321 route->output()->disconnect (0);
2323 /* if the route had internal sends sending to it, remove them */
2324 if (route->internal_return()) {
2326 boost::shared_ptr<RouteList> r = routes.reader ();
2327 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2328 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2330 (*i)->remove_processor (s);
2335 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2336 if (mt && mt->step_editing()) {
2337 if (_step_editors > 0) {
2342 update_latency_compensation ();
2345 /* Re-sort routes to remove the graph's current references to the one that is
2346 * going away, then flush old references out of the graph.
2350 if (_process_graph) {
2351 _process_graph->clear_other_chain ();
2354 /* get rid of it from the dead wood collection in the route list manager */
2356 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2360 /* try to cause everyone to drop their references */
2362 route->drop_references ();
2364 sync_order_keys (N_("session"));
2366 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2368 /* save the new state of the world */
2370 if (save_state (_current_snapshot_name)) {
2371 save_history (_current_snapshot_name);
2376 Session::route_mute_changed (void* /*src*/)
2382 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2384 boost::shared_ptr<Route> route = wpr.lock();
2386 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2390 if (route->listening_via_monitor ()) {
2392 if (Config->get_exclusive_solo()) {
2393 /* new listen: disable all other listen */
2394 boost::shared_ptr<RouteList> r = routes.reader ();
2395 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2396 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2399 (*i)->set_listen (false, this);
2405 } else if (_listen_cnt > 0) {
2410 update_route_solo_state ();
2413 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2415 boost::shared_ptr<Route> route = wpr.lock ();
2418 /* should not happen */
2419 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2423 bool send_changed = false;
2425 if (route->solo_isolated()) {
2426 if (_solo_isolated_cnt == 0) {
2427 send_changed = true;
2429 _solo_isolated_cnt++;
2430 } else if (_solo_isolated_cnt > 0) {
2431 _solo_isolated_cnt--;
2432 if (_solo_isolated_cnt == 0) {
2433 send_changed = true;
2438 IsolatedChanged (); /* EMIT SIGNAL */
2443 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2445 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
2447 if (!self_solo_change) {
2448 // session doesn't care about changes to soloed-by-others
2452 if (solo_update_disabled) {
2454 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
2458 boost::shared_ptr<Route> route = wpr.lock ();
2461 boost::shared_ptr<RouteList> r = routes.reader ();
2464 if (route->self_soloed()) {
2470 RouteGroup* rg = route->route_group ();
2471 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
2473 if (delta == 1 && Config->get_exclusive_solo()) {
2475 /* new solo: disable all other solos, but not the group if its solo-enabled */
2477 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2478 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2479 (leave_group_alone && ((*i)->route_group() == rg))) {
2482 (*i)->set_solo (false, this);
2486 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
2488 solo_update_disabled = true;
2490 RouteList uninvolved;
2492 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
2494 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2495 bool via_sends_only;
2496 bool in_signal_flow;
2498 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2499 (leave_group_alone && ((*i)->route_group() == rg))) {
2503 in_signal_flow = false;
2505 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
2507 if ((*i)->feeds (route, &via_sends_only)) {
2508 if (!via_sends_only) {
2509 if (!route->soloed_by_others_upstream()) {
2510 (*i)->mod_solo_by_others_downstream (delta);
2513 in_signal_flow = true;
2515 DEBUG_TRACE (DEBUG::Solo, "\tno feed from\n");
2518 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
2520 if (route->feeds (*i, &via_sends_only)) {
2521 /* propagate solo upstream only if routing other than
2522 sends is involved, but do consider the other route
2523 (*i) to be part of the signal flow even if only
2526 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
2530 route->soloed_by_others_downstream(),
2531 route->soloed_by_others_upstream()));
2532 if (!via_sends_only) {
2533 if (!route->soloed_by_others_downstream()) {
2534 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
2535 (*i)->mod_solo_by_others_upstream (delta);
2538 in_signal_flow = true;
2540 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
2543 if (!in_signal_flow) {
2544 uninvolved.push_back (*i);
2548 solo_update_disabled = false;
2549 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
2551 update_route_solo_state (r);
2553 /* now notify that the mute state of the routes not involved in the signal
2554 pathway of the just-solo-changed route may have altered.
2557 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2558 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1\n", (*i)->name()));
2559 (*i)->mute_changed (this);
2562 SoloChanged (); /* EMIT SIGNAL */
2567 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2569 /* now figure out if anything that matters is soloed (or is "listening")*/
2571 bool something_soloed = false;
2572 uint32_t listeners = 0;
2573 uint32_t isolated = 0;
2576 r = routes.reader();
2579 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2580 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2581 something_soloed = true;
2584 if (!(*i)->is_hidden() && (*i)->listening_via_monitor()) {
2585 if (Config->get_solo_control_is_listen_control()) {
2588 (*i)->set_listen (false, this);
2592 if ((*i)->solo_isolated()) {
2597 if (something_soloed != _non_soloed_outs_muted) {
2598 _non_soloed_outs_muted = something_soloed;
2599 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2602 _listen_cnt = listeners;
2604 if (isolated != _solo_isolated_cnt) {
2605 _solo_isolated_cnt = isolated;
2606 IsolatedChanged (); /* EMIT SIGNAL */
2610 boost::shared_ptr<RouteList>
2611 Session::get_routes_with_internal_returns() const
2613 boost::shared_ptr<RouteList> r = routes.reader ();
2614 boost::shared_ptr<RouteList> rl (new RouteList);
2616 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2617 if ((*i)->internal_return ()) {
2625 Session::io_name_is_legal (const std::string& name)
2627 boost::shared_ptr<RouteList> r = routes.reader ();
2629 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2630 if ((*i)->name() == name) {
2634 if ((*i)->has_io_processor_named (name)) {
2643 Session::set_exclusive_input_active (boost::shared_ptr<Route> rt, bool /*others_on*/)
2646 vector<string> connections;
2648 PortSet& ps (rt->input()->ports());
2650 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
2651 p->get_connections (connections);
2654 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
2655 routes_using_input_from (*s, rl);
2658 /* scan all relevant routes to see if others are on or off */
2660 bool others_are_already_on = false;
2662 for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
2664 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2666 if (mt->input_active()) {
2667 others_are_already_on = true;
2674 /* globally reverse other routes */
2676 for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
2678 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2680 mt->set_input_active (!others_are_already_on);
2687 Session::routes_using_input_from (const string& str, RouteList& rl)
2689 boost::shared_ptr<RouteList> r = routes.reader ();
2691 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2692 if ((*i)->input()->connected_to (str)) {
2698 boost::shared_ptr<Route>
2699 Session::route_by_name (string name)
2701 boost::shared_ptr<RouteList> r = routes.reader ();
2703 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2704 if ((*i)->name() == name) {
2709 return boost::shared_ptr<Route> ((Route*) 0);
2712 boost::shared_ptr<Route>
2713 Session::route_by_id (PBD::ID id)
2715 boost::shared_ptr<RouteList> r = routes.reader ();
2717 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2718 if ((*i)->id() == id) {
2723 return boost::shared_ptr<Route> ((Route*) 0);
2726 boost::shared_ptr<Track>
2727 Session::track_by_diskstream_id (PBD::ID id)
2729 boost::shared_ptr<RouteList> r = routes.reader ();
2731 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2732 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
2733 if (t && t->using_diskstream_id (id)) {
2738 return boost::shared_ptr<Track> ();
2741 boost::shared_ptr<Route>
2742 Session::route_by_remote_id (uint32_t id)
2744 boost::shared_ptr<RouteList> r = routes.reader ();
2746 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2747 if ((*i)->remote_control_id() == id) {
2752 return boost::shared_ptr<Route> ((Route*) 0);
2756 Session::playlist_region_added (boost::weak_ptr<Region> w)
2758 boost::shared_ptr<Region> r = w.lock ();
2763 /* These are the operations that are currently in progress... */
2764 list<GQuark> curr = _current_trans_quarks;
2767 /* ...and these are the operations during which we want to update
2768 the session range location markers.
2771 ops.push_back (Operations::capture);
2772 ops.push_back (Operations::paste);
2773 ops.push_back (Operations::duplicate_region);
2774 ops.push_back (Operations::insert_file);
2775 ops.push_back (Operations::insert_region);
2776 ops.push_back (Operations::drag_region_brush);
2777 ops.push_back (Operations::region_drag);
2778 ops.push_back (Operations::selection_grab);
2779 ops.push_back (Operations::region_fill);
2780 ops.push_back (Operations::fill_selection);
2781 ops.push_back (Operations::create_region);
2782 ops.push_back (Operations::region_copy);
2783 ops.push_back (Operations::fixed_time_region_copy);
2786 /* See if any of the current operations match the ones that we want */
2788 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
2790 /* If so, update the session range markers */
2792 maybe_update_session_range (r->position (), r->last_frame ());
2796 /** Update the session range markers if a is before the current start or
2797 * b is after the current end.
2800 Session::maybe_update_session_range (framepos_t a, framepos_t b)
2802 if (_state_of_the_state & Loading) {
2806 if (_session_range_location == 0) {
2808 add_session_range_location (a, b);
2812 if (a < _session_range_location->start()) {
2813 _session_range_location->set_start (a);
2816 if (b > _session_range_location->end()) {
2817 _session_range_location->set_end (b);
2823 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
2825 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2826 maybe_update_session_range (i->to, i->to + i->length);
2831 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
2833 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2834 maybe_update_session_range (i->from, i->to);
2838 /* Region management */
2840 boost::shared_ptr<Region>
2841 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2843 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2844 RegionFactory::RegionMap::const_iterator i;
2845 boost::shared_ptr<Region> region;
2847 Glib::Mutex::Lock lm (region_lock);
2849 for (i = regions.begin(); i != regions.end(); ++i) {
2853 if (region->whole_file()) {
2855 if (child->source_equivalent (region)) {
2861 return boost::shared_ptr<Region> ();
2865 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2867 set<boost::shared_ptr<Region> > relevant_regions;
2869 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2870 RegionFactory::get_regions_using_source (*s, relevant_regions);
2873 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2874 set<boost::shared_ptr<Region> >::iterator tmp;
2879 playlists->destroy_region (*r);
2880 RegionFactory::map_remove (*r);
2882 (*r)->drop_sources ();
2883 (*r)->drop_references ();
2885 relevant_regions.erase (r);
2890 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
2893 Glib::Mutex::Lock ls (source_lock);
2894 /* remove from the main source list */
2895 sources.erase ((*s)->id());
2898 (*s)->mark_for_remove ();
2899 (*s)->drop_references ();
2908 Session::remove_last_capture ()
2910 list<boost::shared_ptr<Source> > srcs;
2912 boost::shared_ptr<RouteList> rl = routes.reader ();
2913 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2914 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2919 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
2922 srcs.insert (srcs.end(), l.begin(), l.end());
2927 destroy_sources (srcs);
2929 save_state (_current_snapshot_name);
2934 /* Source Management */
2937 Session::add_source (boost::shared_ptr<Source> source)
2939 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
2940 pair<SourceMap::iterator,bool> result;
2942 entry.first = source->id();
2943 entry.second = source;
2946 Glib::Mutex::Lock lm (source_lock);
2947 result = sources.insert (entry);
2950 if (result.second) {
2952 /* yay, new source */
2954 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
2957 if (!fs->within_session()) {
2958 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
2964 boost::shared_ptr<AudioFileSource> afs;
2966 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
2967 if (Config->get_auto_analyse_audio()) {
2968 Analyser::queue_source_for_analysis (source, false);
2972 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
2977 Session::remove_source (boost::weak_ptr<Source> src)
2979 if (_state_of_the_state & Deletion) {
2983 SourceMap::iterator i;
2984 boost::shared_ptr<Source> source = src.lock();
2991 Glib::Mutex::Lock lm (source_lock);
2993 if ((i = sources.find (source->id())) != sources.end()) {
2998 if (!(_state_of_the_state & InCleanup)) {
3000 /* save state so we don't end up with a session file
3001 referring to non-existent sources.
3004 save_state (_current_snapshot_name);
3008 boost::shared_ptr<Source>
3009 Session::source_by_id (const PBD::ID& id)
3011 Glib::Mutex::Lock lm (source_lock);
3012 SourceMap::iterator i;
3013 boost::shared_ptr<Source> source;
3015 if ((i = sources.find (id)) != sources.end()) {
3022 boost::shared_ptr<Source>
3023 Session::source_by_path_and_channel (const string& path, uint16_t chn)
3025 Glib::Mutex::Lock lm (source_lock);
3027 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3028 boost::shared_ptr<AudioFileSource> afs
3029 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
3031 if (afs && afs->path() == path && chn == afs->channel()) {
3035 return boost::shared_ptr<Source>();
3039 Session::count_sources_by_origin (const string& path)
3042 Glib::Mutex::Lock lm (source_lock);
3044 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3045 boost::shared_ptr<FileSource> fs
3046 = boost::dynamic_pointer_cast<FileSource>(i->second);
3048 if (fs && fs->origin() == path) {
3058 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
3061 string old_basename = PBD::basename_nosuffix (oldname);
3062 string new_legalized = legalize_for_path (newname);
3064 /* note: we know (or assume) the old path is already valid */
3068 /* destructive file sources have a name of the form:
3070 /path/to/Tnnnn-NAME(%[LR])?.wav
3072 the task here is to replace NAME with the new name.
3077 string::size_type dash;
3079 dir = Glib::path_get_dirname (path);
3080 path = Glib::path_get_basename (path);
3082 /* '-' is not a legal character for the NAME part of the path */
3084 if ((dash = path.find_last_of ('-')) == string::npos) {
3088 prefix = path.substr (0, dash);
3092 path += new_legalized;
3093 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3094 path = Glib::build_filename (dir, path);
3098 /* non-destructive file sources have a name of the form:
3100 /path/to/NAME-nnnnn(%[LR])?.ext
3102 the task here is to replace NAME with the new name.
3107 string::size_type dash;
3108 string::size_type postfix;
3110 dir = Glib::path_get_dirname (path);
3111 path = Glib::path_get_basename (path);
3113 /* '-' is not a legal character for the NAME part of the path */
3115 if ((dash = path.find_last_of ('-')) == string::npos) {
3119 suffix = path.substr (dash+1);
3121 // Suffix is now everything after the dash. Now we need to eliminate
3122 // the nnnnn part, which is done by either finding a '%' or a '.'
3124 postfix = suffix.find_last_of ("%");
3125 if (postfix == string::npos) {
3126 postfix = suffix.find_last_of ('.');
3129 if (postfix != string::npos) {
3130 suffix = suffix.substr (postfix);
3132 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
3136 const uint32_t limit = 10000;
3137 char buf[PATH_MAX+1];
3139 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
3141 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
3143 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
3144 path = Glib::build_filename (dir, buf);
3152 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
3161 /** Return the full path (in some session directory) for a new within-session source.
3162 * \a name must be a session-unique name that does not contain slashes
3163 * (e.g. as returned by new_*_source_name)
3166 Session::new_source_path_from_name (DataType type, const string& name)
3168 assert(name.find("/") == string::npos);
3170 SessionDirectory sdir(get_best_session_directory_for_new_source());
3173 if (type == DataType::AUDIO) {
3174 p = sdir.sound_path();
3175 } else if (type == DataType::MIDI) {
3176 p = sdir.midi_path();
3178 error << "Unknown source type, unable to create file path" << endmsg;
3183 return p.to_string();
3187 Session::peak_path (string base) const
3189 sys::path peakfile_path(_session_dir->peak_path());
3190 peakfile_path /= base + peakfile_suffix;
3191 return peakfile_path.to_string();
3194 /** Return a unique name based on \a base for a new internal audio source */
3196 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
3199 char buf[PATH_MAX+1];
3200 const uint32_t limit = 10000;
3202 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3205 legalized = legalize_for_path (base);
3207 // Find a "version" of the base name that doesn't exist in any of the possible directories.
3208 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3210 vector<space_and_path>::iterator i;
3211 uint32_t existing = 0;
3213 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3218 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3219 cnt, legalized.c_str(), ext.c_str());
3220 } else if (nchan == 2) {
3222 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
3223 cnt, legalized.c_str(), ext.c_str());
3225 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
3226 cnt, legalized.c_str(), ext.c_str());
3228 } else if (nchan < 26) {
3229 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
3230 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
3232 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3233 cnt, legalized.c_str(), ext.c_str());
3239 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3240 } else if (nchan == 2) {
3242 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
3244 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
3246 } else if (nchan < 26) {
3247 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
3249 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3253 SessionDirectory sdir((*i).path);
3255 string spath = sdir.sound_path().to_string();
3257 /* note that we search *without* the extension so that
3258 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3259 in the event that this new name is required for
3260 a file format change.
3263 if (matching_unsuffixed_filename_exists_in (spath, buf)) {
3269 if (existing == 0) {
3274 error << string_compose(
3275 _("There are already %1 recordings for %2, which I consider too many."),
3276 limit, base) << endmsg;
3278 throw failed_constructor();
3282 return Glib::path_get_basename (buf);
3285 /** Create a new within-session audio source */
3286 boost::shared_ptr<AudioFileSource>
3287 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
3289 const string name = new_audio_source_name (n, n_chans, chan, destructive);
3290 const string path = new_source_path_from_name(DataType::AUDIO, name);
3292 return boost::dynamic_pointer_cast<AudioFileSource> (
3293 SourceFactory::createWritable (DataType::AUDIO, *this, path, string(), destructive, frame_rate()));
3296 /** Return a unique name based on \a base for a new internal MIDI source */
3298 Session::new_midi_source_name (const string& base)
3301 char buf[PATH_MAX+1];
3302 const uint32_t limit = 10000;
3306 legalized = legalize_for_path (base);
3308 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3309 for (cnt = 1; cnt <= limit; ++cnt) {
3311 vector<space_and_path>::iterator i;
3312 uint32_t existing = 0;
3314 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3316 SessionDirectory sdir((*i).path);
3318 sys::path p = sdir.midi_path();
3321 snprintf (buf, sizeof(buf), "%s-%u.mid", p.to_string().c_str(), cnt);
3323 if (sys::exists (buf)) {
3328 if (existing == 0) {
3333 error << string_compose(
3334 _("There are already %1 recordings for %2, which I consider too many."),
3335 limit, base) << endmsg;
3337 throw failed_constructor();
3341 return Glib::path_get_basename(buf);
3345 /** Create a new within-session MIDI source */
3346 boost::shared_ptr<MidiSource>
3347 Session::create_midi_source_for_session (Track* track, string const & n)
3349 /* try to use the existing write source for the track, to keep numbering sane
3353 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3357 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3360 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3361 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3365 const string name = new_midi_source_name (n);
3366 const string path = new_source_path_from_name (DataType::MIDI, name);
3368 return boost::dynamic_pointer_cast<SMFSource> (
3369 SourceFactory::createWritable (
3370 DataType::MIDI, *this, path, string(), false, frame_rate()));
3375 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3377 if (playlist->hidden()) {
3381 playlists->add (playlist);
3384 playlist->release();
3391 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3393 if (_state_of_the_state & Deletion) {
3397 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3403 playlists->remove (playlist);
3409 Session::set_audition (boost::shared_ptr<Region> r)
3411 pending_audition_region = r;
3412 add_post_transport_work (PostTransportAudition);
3413 _butler->schedule_transport_work ();
3417 Session::audition_playlist ()
3419 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3420 ev->region.reset ();
3425 Session::non_realtime_set_audition ()
3427 assert (pending_audition_region);
3428 auditioner->audition_region (pending_audition_region);
3429 pending_audition_region.reset ();
3430 AuditionActive (true); /* EMIT SIGNAL */
3434 Session::audition_region (boost::shared_ptr<Region> r)
3436 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3442 Session::cancel_audition ()
3444 if (auditioner->auditioning()) {
3445 auditioner->cancel_audition ();
3446 AuditionActive (false); /* EMIT SIGNAL */
3451 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3453 if (a->is_monitor()) {
3456 if (b->is_monitor()) {
3459 return a->order_key(N_("signal")) < b->order_key(N_("signal"));
3463 Session::is_auditioning () const
3465 /* can be called before we have an auditioner object */
3467 return auditioner->auditioning();
3474 Session::graph_reordered ()
3476 /* don't do this stuff if we are setting up connections
3477 from a set_state() call or creating new tracks. Ditto for deletion.
3480 if (_state_of_the_state & (InitialConnecting|Deletion)) {
3484 /* every track/bus asked for this to be handled but it was deferred because
3485 we were connecting. do it now.
3488 request_input_change_handling ();
3492 /* force all diskstreams to update their capture offset values to
3493 reflect any changes in latencies within the graph.
3496 boost::shared_ptr<RouteList> rl = routes.reader ();
3497 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3498 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3500 tr->set_capture_offset ();
3505 /** @return Number of frames that there is disk space available to write,
3508 boost::optional<framecnt_t>
3509 Session::available_capture_duration ()
3511 if (_total_free_4k_blocks_uncertain) {
3512 return boost::optional<framecnt_t> ();
3515 float sample_bytes_on_disk = 4.0; // keep gcc happy
3517 switch (config.get_native_file_data_format()) {
3519 sample_bytes_on_disk = 4.0;
3523 sample_bytes_on_disk = 3.0;
3527 sample_bytes_on_disk = 2.0;
3531 /* impossible, but keep some gcc versions happy */
3532 fatal << string_compose (_("programming error: %1"),
3533 X_("illegal native file data format"))
3538 double scale = 4096.0 / sample_bytes_on_disk;
3540 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3541 return max_framecnt;
3544 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3548 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3551 RCUWriter<BundleList> writer (_bundles);
3552 boost::shared_ptr<BundleList> b = writer.get_copy ();
3553 b->push_back (bundle);
3556 BundleAdded (bundle); /* EMIT SIGNAL */
3562 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3564 bool removed = false;
3567 RCUWriter<BundleList> writer (_bundles);
3568 boost::shared_ptr<BundleList> b = writer.get_copy ();
3569 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3571 if (i != b->end()) {
3578 BundleRemoved (bundle); /* EMIT SIGNAL */
3584 boost::shared_ptr<Bundle>
3585 Session::bundle_by_name (string name) const
3587 boost::shared_ptr<BundleList> b = _bundles.reader ();
3589 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3590 if ((*i)->name() == name) {
3595 return boost::shared_ptr<Bundle> ();
3599 Session::tempo_map_changed (const PropertyChange&)
3603 playlists->update_after_tempo_map_change ();
3605 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3611 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3613 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3614 (*i)->recompute_frames_from_bbt ();
3618 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3619 * the given count with the current block size.
3622 Session::ensure_buffers (ChanCount howmany)
3624 BufferManager::ensure_buffers (howmany);
3628 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3630 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3631 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3636 Session::next_insert_id ()
3638 /* this doesn't really loop forever. just think about it */
3641 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3642 if (!insert_bitset[n]) {
3643 insert_bitset[n] = true;
3649 /* none available, so resize and try again */
3651 insert_bitset.resize (insert_bitset.size() + 16, false);
3656 Session::next_send_id ()
3658 /* this doesn't really loop forever. just think about it */
3661 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3662 if (!send_bitset[n]) {
3663 send_bitset[n] = true;
3669 /* none available, so resize and try again */
3671 send_bitset.resize (send_bitset.size() + 16, false);
3676 Session::next_aux_send_id ()
3678 /* this doesn't really loop forever. just think about it */
3681 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
3682 if (!aux_send_bitset[n]) {
3683 aux_send_bitset[n] = true;
3689 /* none available, so resize and try again */
3691 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
3696 Session::next_return_id ()
3698 /* this doesn't really loop forever. just think about it */
3701 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3702 if (!return_bitset[n]) {
3703 return_bitset[n] = true;
3709 /* none available, so resize and try again */
3711 return_bitset.resize (return_bitset.size() + 16, false);
3716 Session::mark_send_id (uint32_t id)
3718 if (id >= send_bitset.size()) {
3719 send_bitset.resize (id+16, false);
3721 if (send_bitset[id]) {
3722 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3724 send_bitset[id] = true;
3728 Session::mark_aux_send_id (uint32_t id)
3730 if (id >= aux_send_bitset.size()) {
3731 aux_send_bitset.resize (id+16, false);
3733 if (aux_send_bitset[id]) {
3734 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
3736 aux_send_bitset[id] = true;
3740 Session::mark_return_id (uint32_t id)
3742 if (id >= return_bitset.size()) {
3743 return_bitset.resize (id+16, false);
3745 if (return_bitset[id]) {
3746 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3748 return_bitset[id] = true;
3752 Session::mark_insert_id (uint32_t id)
3754 if (id >= insert_bitset.size()) {
3755 insert_bitset.resize (id+16, false);
3757 if (insert_bitset[id]) {
3758 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3760 insert_bitset[id] = true;
3764 Session::unmark_send_id (uint32_t id)
3766 if (id < send_bitset.size()) {
3767 send_bitset[id] = false;
3772 Session::unmark_aux_send_id (uint32_t id)
3774 if (id < aux_send_bitset.size()) {
3775 aux_send_bitset[id] = false;
3780 Session::unmark_return_id (uint32_t id)
3782 if (id < return_bitset.size()) {
3783 return_bitset[id] = false;
3788 Session::unmark_insert_id (uint32_t id)
3790 if (id < insert_bitset.size()) {
3791 insert_bitset[id] = false;
3796 /* Named Selection management */
3798 boost::shared_ptr<NamedSelection>
3799 Session::named_selection_by_name (string name)
3801 Glib::Mutex::Lock lm (named_selection_lock);
3802 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
3803 if ((*i)->name == name) {
3807 return boost::shared_ptr<NamedSelection>();
3811 Session::add_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3814 Glib::Mutex::Lock lm (named_selection_lock);
3815 named_selections.insert (named_selections.begin(), named_selection);
3820 NamedSelectionAdded (); /* EMIT SIGNAL */
3824 Session::remove_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3826 bool removed = false;
3829 Glib::Mutex::Lock lm (named_selection_lock);
3831 NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
3833 if (i != named_selections.end()) {
3834 named_selections.erase (i);
3841 NamedSelectionRemoved (); /* EMIT SIGNAL */
3846 Session::reset_native_file_format ()
3848 boost::shared_ptr<RouteList> rl = routes.reader ();
3849 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3850 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3852 /* don't save state as we do this, there's no point
3855 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3856 tr->reset_write_sources (false);
3857 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3863 Session::route_name_unique (string n) const
3865 boost::shared_ptr<RouteList> r = routes.reader ();
3867 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3868 if ((*i)->name() == n) {
3877 Session::route_name_internal (string n) const
3879 if (auditioner && auditioner->name() == n) {
3883 if (_click_io && _click_io->name() == n) {
3891 Session::freeze_all (InterThreadInfo& itt)
3893 boost::shared_ptr<RouteList> r = routes.reader ();
3895 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3897 boost::shared_ptr<Track> t;
3899 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3900 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3910 boost::shared_ptr<Region>
3911 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
3912 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3913 InterThreadInfo& itt,
3914 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
3917 boost::shared_ptr<Region> result;
3918 boost::shared_ptr<Playlist> playlist;
3919 boost::shared_ptr<AudioFileSource> fsource;
3921 char buf[PATH_MAX+1];
3922 ChanCount diskstream_channels (track.n_channels());
3923 framepos_t position;
3924 framecnt_t this_chunk;
3927 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3928 const string sound_dir = sdir.sound_path().to_string();
3929 framepos_t len = end - start;
3930 bool need_block_size_reset = false;
3932 ChanCount const max_proc = track.max_processor_streams ();
3935 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3936 end, start) << endmsg;
3940 const framecnt_t chunk_size = (256 * 1024)/4;
3942 // block all process callback handling
3944 block_processing ();
3946 /* call tree *MUST* hold route_lock */
3948 if ((playlist = track.playlist()) == 0) {
3952 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3954 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
3956 for (x = 0; x < 99999; ++x) {
3957 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());
3958 if (!Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
3964 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3969 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
3970 SourceFactory::createWritable (DataType::AUDIO, *this, buf, string(), false, frame_rate()));
3973 catch (failed_constructor& err) {
3974 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
3978 srcs.push_back (fsource);
3981 /* tell redirects that care that we are about to use a much larger
3982 * blocksize. this will flush all plugins too, so that they are ready
3983 * to be used for this process.
3986 need_block_size_reset = true;
3987 track.set_block_size (chunk_size);
3992 /* create a set of reasonably-sized buffers */
3993 buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
3994 buffers.set_count (max_proc);
3996 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3997 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3999 afs->prepare_for_peakfile_writes ();
4002 while (to_do && !itt.cancel) {
4004 this_chunk = min (to_do, chunk_size);
4006 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export)) {
4011 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4012 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4015 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
4021 start += this_chunk;
4022 to_do -= this_chunk;
4024 itt.progress = (float) (1.0 - ((double) to_do / len));
4033 xnow = localtime (&now);
4035 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
4036 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4039 afs->update_header (position, *xnow, now);
4040 afs->flush_header ();
4044 /* construct a region to represent the bounced material */
4048 plist.add (Properties::start, 0);
4049 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4050 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4052 result = RegionFactory::create (srcs, plist);
4058 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4059 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4062 afs->mark_for_remove ();
4065 (*src)->drop_references ();
4069 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4070 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4073 afs->done_with_peakfile_writes ();
4078 if (need_block_size_reset) {
4079 track.set_block_size (get_block_size());
4082 unblock_processing ();
4088 Session::gain_automation_buffer() const
4090 return ProcessThread::gain_automation_buffer ();
4094 Session::send_gain_automation_buffer() const
4096 return ProcessThread::send_gain_automation_buffer ();
4100 Session::pan_automation_buffer() const
4102 return ProcessThread::pan_automation_buffer ();
4106 Session::get_silent_buffers (ChanCount count)
4108 return ProcessThread::get_silent_buffers (count);
4112 Session::get_scratch_buffers (ChanCount count)
4114 return ProcessThread::get_scratch_buffers (count);
4118 Session::get_mix_buffers (ChanCount count)
4120 return ProcessThread::get_mix_buffers (count);
4124 Session::ntracks () const
4127 boost::shared_ptr<RouteList> r = routes.reader ();
4129 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4130 if (boost::dynamic_pointer_cast<Track> (*i)) {
4139 Session::nbusses () const
4142 boost::shared_ptr<RouteList> r = routes.reader ();
4144 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4145 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
4154 Session::add_automation_list(AutomationList *al)
4156 automation_lists[al->id()] = al;
4160 Session::sync_order_keys (std::string const & base)
4162 if (deletion_in_progress()) {
4166 if (!Config->get_sync_all_route_ordering()) {
4167 /* leave order keys as they are */
4171 boost::shared_ptr<RouteList> r = routes.reader ();
4173 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4174 (*i)->sync_order_keys (base);
4177 Route::SyncOrderKeys (base); // EMIT SIGNAL
4179 /* this might not do anything */
4181 set_remote_control_ids ();
4184 /** @return true if there is at least one record-enabled track, otherwise false */
4186 Session::have_rec_enabled_track () const
4188 return g_atomic_int_get (&_have_rec_enabled_track) == 1;
4191 /** Update the state of our rec-enabled tracks flag */
4193 Session::update_have_rec_enabled_track ()
4195 boost::shared_ptr<RouteList> rl = routes.reader ();
4196 RouteList::iterator i = rl->begin();
4197 while (i != rl->end ()) {
4199 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4200 if (tr && tr->record_enabled ()) {
4207 int const old = g_atomic_int_get (&_have_rec_enabled_track);
4209 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4211 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4212 RecordStateChanged (); /* EMIT SIGNAL */
4217 Session::listen_position_changed ()
4219 boost::shared_ptr<RouteList> r = routes.reader ();
4221 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4222 (*i)->listen_position_changed ();
4227 Session::solo_control_mode_changed ()
4229 /* cancel all solo or all listen when solo control mode changes */
4232 set_solo (get_routes(), false);
4233 } else if (listening()) {
4234 set_listen (get_routes(), false);
4238 /** Called when a property of one of our route groups changes */
4240 Session::route_group_property_changed (RouteGroup* rg)
4242 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4245 /** Called when a route is added to one of our route groups */
4247 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4249 RouteAddedToRouteGroup (rg, r);
4252 /** Called when a route is removed from one of our route groups */
4254 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4256 RouteRemovedFromRouteGroup (rg, r);
4260 Session::get_available_sync_options () const
4262 vector<SyncSource> ret;
4264 ret.push_back (JACK);
4265 ret.push_back (MTC);
4266 ret.push_back (MIDIClock);
4271 boost::shared_ptr<RouteList>
4272 Session::get_routes_with_regions_at (framepos_t const p) const
4274 boost::shared_ptr<RouteList> r = routes.reader ();
4275 boost::shared_ptr<RouteList> rl (new RouteList);
4277 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4278 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4283 boost::shared_ptr<Playlist> pl = tr->playlist ();
4288 if (pl->has_region_at (p)) {
4297 Session::goto_end ()
4299 if (_session_range_location) {
4300 request_locate (_session_range_location->end(), false);
4302 request_locate (0, false);
4307 Session::goto_start ()
4309 if (_session_range_location) {
4310 request_locate (_session_range_location->start(), false);
4312 request_locate (0, false);
4317 Session::current_start_frame () const
4319 return _session_range_location ? _session_range_location->start() : 0;
4323 Session::current_end_frame () const
4325 return _session_range_location ? _session_range_location->end() : 0;
4329 Session::add_session_range_location (framepos_t start, framepos_t end)
4331 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4332 _locations->add (_session_range_location);
4335 /** Called when one of our routes' order keys has changed */
4337 Session::route_order_key_changed ()
4339 RouteOrderKeyChanged (); /* EMIT SIGNAL */
4343 Session::step_edit_status_change (bool yn)
4349 send = (_step_editors == 0);
4354 send = (_step_editors == 1);
4357 if (_step_editors > 0) {
4363 StepEditStatusChange (val);
4369 Session::start_time_changed (framepos_t old)
4371 /* Update the auto loop range to match the session range
4372 (unless the auto loop range has been changed by the user)
4375 Location* s = _locations->session_range_location ();
4380 Location* l = _locations->auto_loop_location ();
4382 if (l && l->start() == old) {
4383 l->set_start (s->start(), true);
4388 Session::end_time_changed (framepos_t old)
4390 /* Update the auto loop range to match the session range
4391 (unless the auto loop range has been changed by the user)
4394 Location* s = _locations->session_range_location ();
4399 Location* l = _locations->auto_loop_location ();
4401 if (l && l->end() == old) {
4402 l->set_end (s->end(), true);
4407 Session::source_search_path (DataType type) const
4411 if (session_dirs.size() == 1) {
4413 case DataType::AUDIO:
4414 s.push_back ( _session_dir->sound_path().to_string());
4416 case DataType::MIDI:
4417 s.push_back (_session_dir->midi_path().to_string());
4421 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4422 SessionDirectory sdir (i->path);
4424 case DataType::AUDIO:
4425 s.push_back (sdir.sound_path().to_string());
4427 case DataType::MIDI:
4428 s.push_back (sdir.midi_path().to_string());
4434 /* now check the explicit (possibly user-specified) search path
4437 vector<string> dirs;
4440 case DataType::AUDIO:
4441 split (config.get_audio_search_path (), dirs, ':');
4443 case DataType::MIDI:
4444 split (config.get_midi_search_path (), dirs, ':');
4448 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4450 vector<string>::iterator si;
4452 for (si = s.begin(); si != s.end(); ++si) {
4458 if (si == s.end()) {
4465 for (vector<string>::iterator si = s.begin(); si != s.end(); ++si) {
4466 if (!search_path.empty()) {
4476 Session::ensure_search_path_includes (const string& path, DataType type)
4479 vector<string> dirs;
4486 case DataType::AUDIO:
4487 search_path = config.get_audio_search_path ();
4489 case DataType::MIDI:
4490 search_path = config.get_midi_search_path ();
4494 split (search_path, dirs, ':');
4496 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4497 /* No need to add this new directory if it has the same inode as
4498 an existing one; checking inode rather than name prevents duplicated
4499 directories when we are using symlinks.
4501 On Windows, I think we could just do if (*i == path) here.
4503 if (PBD::sys::inodes_same (*i, path)) {
4508 if (!search_path.empty()) {
4512 search_path += path;
4515 case DataType::AUDIO:
4516 config.set_audio_search_path (search_path);
4518 case DataType::MIDI:
4519 config.set_midi_search_path (search_path);
4524 boost::shared_ptr<Speakers>
4525 Session::get_speakers()
4531 Session::unknown_processors () const
4535 boost::shared_ptr<RouteList> r = routes.reader ();
4536 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4537 list<string> t = (*i)->unknown_processors ();
4538 copy (t.begin(), t.end(), back_inserter (p));
4548 Session::update_latency (bool playback)
4550 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
4552 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4556 boost::shared_ptr<RouteList> r = routes.reader ();
4557 framecnt_t max_latency = 0;
4560 /* reverse the list so that we work backwards from the last route to run to the first */
4561 RouteList* rl = routes.reader().get();
4562 r.reset (new RouteList (*rl));
4563 reverse (r->begin(), r->end());
4566 /* compute actual latency values for the given direction and store them all in per-port
4567 structures. this will also publish the same values (to JACK) so that computation of latency
4568 for routes can consistently use public latency values.
4571 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4572 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
4575 /* because we latency compensate playback, our published playback latencies should
4576 be the same for all output ports - all material played back by ardour has
4577 the same latency, whether its caused by plugins or by latency compensation. since
4578 these may differ from the values computed above, reset all playback port latencies
4582 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
4584 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4585 (*i)->set_public_port_latencies (max_latency, playback);
4590 post_playback_latency ();
4594 post_capture_latency ();
4597 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
4601 Session::post_playback_latency ()
4603 set_worst_playback_latency ();
4605 boost::shared_ptr<RouteList> r = routes.reader ();
4607 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4608 if (!(*i)->is_hidden() && ((*i)->active())) {
4609 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
4613 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4614 (*i)->set_latency_compensation (_worst_track_latency);
4619 Session::post_capture_latency ()
4621 set_worst_capture_latency ();
4623 /* reflect any changes in capture latencies into capture offsets
4626 boost::shared_ptr<RouteList> rl = routes.reader();
4627 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4628 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4630 tr->set_capture_offset ();
4636 Session::initialize_latencies ()
4639 Glib::Mutex::Lock lm (_engine.process_lock());
4640 update_latency (false);
4641 update_latency (true);
4644 set_worst_io_latencies ();
4648 Session::set_worst_io_latencies ()
4650 set_worst_playback_latency ();
4651 set_worst_capture_latency ();
4655 Session::set_worst_playback_latency ()
4657 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4661 _worst_output_latency = 0;
4663 if (!_engine.connected()) {
4667 boost::shared_ptr<RouteList> r = routes.reader ();
4669 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4670 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
4673 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
4677 Session::set_worst_capture_latency ()
4679 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4683 _worst_input_latency = 0;
4685 if (!_engine.connected()) {
4689 boost::shared_ptr<RouteList> r = routes.reader ();
4691 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4692 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
4695 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
4699 Session::update_latency_compensation (bool force_whole_graph)
4701 bool some_track_latency_changed = false;
4703 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4707 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
4709 _worst_track_latency = 0;
4711 boost::shared_ptr<RouteList> r = routes.reader ();
4713 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4714 if (!(*i)->is_hidden() && ((*i)->active())) {
4716 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
4717 some_track_latency_changed = true;
4719 _worst_track_latency = max (tl, _worst_track_latency);
4723 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
4724 (some_track_latency_changed ? "yes" : "no")));
4726 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
4728 if (some_track_latency_changed || force_whole_graph) {
4729 _engine.update_latencies ();
4733 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4734 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4738 tr->set_capture_offset ();
4743 Session::session_name_is_legal (const string& path)
4745 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
4747 for (int i = 0; illegal_chars[i]; ++i) {
4748 if (path.find (illegal_chars[i]) != string::npos) {
4749 return illegal_chars[i];
4757 Session::next_control_id () const
4759 return ntracks() + nbusses() + 1;
4763 Session::operation_in_progress (GQuark op) const
4765 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());