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 , _bundles (new BundleList)
147 , _bundle_xml_node (0)
149 , _click_io ((IO*) 0)
151 , click_emphasis_data (0)
153 , _have_rec_enabled_track (false)
154 , _suspend_timecode_transmission (0)
156 _locations = new Locations (*this);
158 if (how_many_dsp_threads () > 1) {
159 /* For now, only create the graph if we are using >1 DSP threads, as
160 it is a bit slower than the old code with 1 thread.
162 _process_graph.reset (new Graph (*this));
165 playlists.reset (new SessionPlaylists);
167 _all_route_group->set_active (true, this);
169 interpolation.add_channel_to (0, 0);
171 if (!eng.connected()) {
172 throw failed_constructor();
175 n_physical_outputs = _engine.n_physical_outputs ();
176 n_physical_inputs = _engine.n_physical_inputs ();
178 first_stage_init (fullpath, snapshot_name);
180 _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
183 if (create (mix_template, bus_profile)) {
185 throw failed_constructor ();
189 if (second_stage_init ()) {
191 throw failed_constructor ();
194 store_recent_sessions(_name, _path);
196 bool was_dirty = dirty();
198 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
200 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
201 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
204 DirtyChanged (); /* EMIT SIGNAL */
207 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
208 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
224 vector<void*> debug_pointers;
226 /* if we got to here, leaving pending capture state around
230 remove_pending_capture_state ();
232 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
234 _engine.remove_session ();
236 /* clear history so that no references to objects are held any more */
240 /* clear state tree so that no references to objects are held any more */
244 /* reset dynamic state version back to default */
246 Stateful::loading_state_version = 0;
248 _butler->drop_references ();
250 delete midi_control_ui;
251 delete _all_route_group;
253 if (click_data != default_click) {
254 delete [] click_data;
257 if (click_emphasis_data != default_click_emphasis) {
258 delete [] click_emphasis_data;
263 /* clear out any pending dead wood from RCU managed objects */
268 AudioDiskstream::free_working_buffers();
270 /* tell everyone who is still standing that we're about to die */
273 /* tell everyone to drop references and delete objects as we go */
275 DEBUG_TRACE (DEBUG::Destruction, "delete named selections\n");
276 named_selections.clear ();
278 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
279 RegionFactory::delete_all_regions ();
281 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
283 /* reset these three references to special routes before we do the usual route delete thing */
286 _master_out.reset ();
287 _monitor_out.reset ();
290 RCUWriter<RouteList> writer (routes);
291 boost::shared_ptr<RouteList> r = writer.get_copy ();
293 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
294 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
295 (*i)->drop_references ();
299 /* writer goes out of scope and updates master */
303 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
304 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
305 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
306 i->second->drop_references ();
311 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
312 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
317 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
322 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
324 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
325 boost_debug_list_ptrs ();
330 Session::when_engine_running ()
332 string first_physical_output;
334 BootMessage (_("Set block size and sample rate"));
336 set_block_size (_engine.frames_per_cycle());
337 set_frame_rate (_engine.frame_rate());
339 BootMessage (_("Using configuration"));
341 boost::function<void (std::string)> ff (boost::bind (&Session::config_changed, this, _1, false));
342 boost::function<void (std::string)> ft (boost::bind (&Session::config_changed, this, _1, true));
344 Config->map_parameters (ff);
345 config.map_parameters (ft);
347 /* every time we reconnect, recompute worst case output latencies */
349 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
351 if (synced_to_jack()) {
352 _engine.transport_stop ();
355 if (config.get_jack_time_master()) {
356 _engine.transport_locate (_transport_frame);
364 _click_io.reset (new ClickIO (*this, "click"));
365 _click_gain.reset (new Amp (*this));
366 _click_gain->activate ();
368 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
370 /* existing state for Click */
373 if (Stateful::loading_state_version < 3000) {
374 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
376 const XMLNodeList& children (child->children());
377 XMLNodeList::const_iterator i = children.begin();
378 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
380 if (i != children.end()) {
381 c = _click_gain->set_state (**i, Stateful::loading_state_version);
387 _clicking = Config->get_clicking ();
391 error << _("could not setup Click I/O") << endmsg;
398 /* default state for Click: dual-mono to first 2 physical outputs */
401 _engine.get_physical_outputs (DataType::AUDIO, outs);
403 for (uint32_t physport = 0; physport < 2; ++physport) {
404 if (outs.size() > physport) {
405 if (_click_io->add_port (outs[physport], this)) {
406 // relax, even though its an error
411 if (_click_io->n_ports () > ChanCount::ZERO) {
412 _clicking = Config->get_clicking ();
417 catch (failed_constructor& err) {
418 error << _("cannot setup Click I/O") << endmsg;
421 BootMessage (_("Compute I/O Latencies"));
424 // XXX HOW TO ALERT UI TO THIS ? DO WE NEED TO?
427 BootMessage (_("Set up standard connections"));
429 vector<string> inputs[DataType::num_types];
430 vector<string> outputs[DataType::num_types];
431 for (uint32_t i = 0; i < DataType::num_types; ++i) {
432 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
433 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
436 /* Create a set of Bundle objects that map
437 to the physical I/O currently available. We create both
438 mono and stereo bundles, so that the common cases of mono
439 and stereo tracks get bundles to put in their mixer strip
440 in / out menus. There may be a nicer way of achieving that;
441 it doesn't really scale that well to higher channel counts
444 /* mono output bundles */
446 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
448 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
450 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
451 c->add_channel (_("mono"), DataType::AUDIO);
452 c->set_port (0, outputs[DataType::AUDIO][np]);
457 /* stereo output bundles */
459 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
460 if (np + 1 < outputs[DataType::AUDIO].size()) {
462 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
463 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
464 c->add_channel (_("L"), DataType::AUDIO);
465 c->set_port (0, outputs[DataType::AUDIO][np]);
466 c->add_channel (_("R"), DataType::AUDIO);
467 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
473 /* mono input bundles */
475 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
477 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
479 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
480 c->add_channel (_("mono"), DataType::AUDIO);
481 c->set_port (0, inputs[DataType::AUDIO][np]);
486 /* stereo input bundles */
488 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
489 if (np + 1 < inputs[DataType::AUDIO].size()) {
491 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
493 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
494 c->add_channel (_("L"), DataType::AUDIO);
495 c->set_port (0, inputs[DataType::AUDIO][np]);
496 c->add_channel (_("R"), DataType::AUDIO);
497 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
503 /* MIDI input bundles */
505 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
506 string n = inputs[DataType::MIDI][np];
507 boost::erase_first (n, X_("alsa_pcm:"));
509 boost::shared_ptr<Bundle> c (new Bundle (n, false));
510 c->add_channel ("", DataType::MIDI);
511 c->set_port (0, inputs[DataType::MIDI][np]);
515 /* MIDI output bundles */
517 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
518 string n = outputs[DataType::MIDI][np];
519 boost::erase_first (n, X_("alsa_pcm:"));
521 boost::shared_ptr<Bundle> c (new Bundle (n, true));
522 c->add_channel ("", DataType::MIDI);
523 c->set_port (0, outputs[DataType::MIDI][np]);
527 BootMessage (_("Setup signal flow and plugins"));
529 /* Reset all panners */
531 Delivery::reset_panners ();
533 /* this will cause the CPM to instantiate any protocols that are in use
534 * (or mandatory), which will pass it this Session, and then call
535 * set_state() on each instantiated protocol to match stored state.
538 ControlProtocolManager::instance().set_session (this);
540 /* This must be done after the ControlProtocolManager set_session above,
541 as it will set states for ports which the ControlProtocolManager creates.
544 MIDI::Manager::instance()->set_port_states (Config->midi_port_states ());
546 /* And this must be done after the MIDI::Manager::set_port_states as
547 * it will try to make connections whose details are loaded by set_port_states.
552 /* Let control protocols know that we are now all connected, so they
553 * could start talking to surfaces if they want to.
556 ControlProtocolManager::instance().midi_connectivity_established ();
558 if (_is_new && !no_auto_connect()) {
559 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock());
560 auto_connect_master_bus ();
563 _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
565 /* update latencies */
567 initialize_latencies ();
569 /* hook us up to the engine */
571 BootMessage (_("Connect to engine"));
572 _engine.set_session (this);
576 Session::auto_connect_master_bus ()
578 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
582 /* if requested auto-connect the outputs to the first N physical ports.
585 uint32_t limit = _master_out->n_outputs().n_total();
586 vector<string> outputs[DataType::num_types];
588 for (uint32_t i = 0; i < DataType::num_types; ++i) {
589 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
592 for (uint32_t n = 0; n < limit; ++n) {
593 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
595 if (outputs[p->type()].size() > n) {
596 connect_to = outputs[p->type()][n];
599 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
600 if (_master_out->output()->connect (p, connect_to, this)) {
601 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
610 Session::remove_monitor_section ()
616 /* force reversion to Solo-In-Place */
617 Config->set_solo_control_is_listen_control (false);
620 /* Hold process lock while doing this so that we don't hear bits and
621 * pieces of audio as we work on each route.
624 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
626 /* Connect tracks to monitor section. Note that in an
627 existing session, the internal sends will already exist, but we want the
628 routes to notice that they connect to the control out specifically.
632 boost::shared_ptr<RouteList> r = routes.reader ();
633 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
635 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
637 if ((*x)->is_monitor()) {
639 } else if ((*x)->is_master()) {
642 (*x)->remove_aux_or_listen (_monitor_out);
647 remove_route (_monitor_out);
648 auto_connect_master_bus ();
652 Session::add_monitor_section ()
656 if (_monitor_out || !_master_out) {
660 boost::shared_ptr<Route> r (new Route (*this, _("monitor"), Route::MonitorOut, DataType::AUDIO));
666 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
667 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
670 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
671 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
672 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
676 add_routes (rl, false, false, false);
678 assert (_monitor_out);
680 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
681 are undefined, at best.
684 uint32_t limit = _monitor_out->n_inputs().n_audio();
688 /* connect the inputs to the master bus outputs. this
689 * represents a separate data feed from the internal sends from
690 * each route. as of jan 2011, it allows the monitor section to
691 * conditionally ignore either the internal sends or the normal
692 * input feed, but we should really find a better way to do
696 _master_out->output()->disconnect (this);
698 for (uint32_t n = 0; n < limit; ++n) {
699 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
700 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
703 string connect_to = o->name();
704 if (_monitor_out->input()->connect (p, connect_to, this)) {
705 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
713 /* if monitor section is not connected, connect it to physical outs
716 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
718 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
720 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
723 _monitor_out->output()->connect_ports_to_bundle (b, this);
725 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
726 Config->get_monitor_bus_preferred_bundle())
732 /* Monitor bus is audio only */
734 uint32_t mod = n_physical_outputs.get (DataType::AUDIO);
735 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
736 vector<string> outputs[DataType::num_types];
738 for (uint32_t i = 0; i < DataType::num_types; ++i) {
739 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
745 for (uint32_t n = 0; n < limit; ++n) {
747 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
749 if (outputs[DataType::AUDIO].size() > (n % mod)) {
750 connect_to = outputs[DataType::AUDIO][n % mod];
753 if (!connect_to.empty()) {
754 if (_monitor_out->output()->connect (p, connect_to, this)) {
755 error << string_compose (
756 _("cannot connect control output %1 to %2"),
767 /* Hold process lock while doing this so that we don't hear bits and
768 * pieces of audio as we work on each route.
771 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
773 /* Connect tracks to monitor section. Note that in an
774 existing session, the internal sends will already exist, but we want the
775 routes to notice that they connect to the control out specifically.
779 boost::shared_ptr<RouteList> rls = routes.reader ();
781 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
783 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
785 if ((*x)->is_monitor()) {
787 } else if ((*x)->is_master()) {
790 (*x)->enable_monitor_send ();
796 Session::hookup_io ()
798 /* stop graph reordering notifications from
799 causing resorts, etc.
802 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
806 /* we delay creating the auditioner till now because
807 it makes its own connections to ports.
811 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
813 throw failed_constructor ();
815 a->use_new_diskstream ();
819 catch (failed_constructor& err) {
820 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
824 /* load bundles, which we may have postponed earlier on */
825 if (_bundle_xml_node) {
826 load_bundles (*_bundle_xml_node);
827 delete _bundle_xml_node;
830 /* Tell all IO objects to connect themselves together */
832 IO::enable_connecting ();
833 MIDI::JackMIDIPort::MakeConnections ();
835 /* Anyone who cares about input state, wake up and do something */
837 IOConnectionsComplete (); /* EMIT SIGNAL */
839 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
841 /* now handle the whole enchilada as if it was one
847 /* update the full solo state, which can't be
848 correctly determined on a per-route basis, but
849 needs the global overview that only the session
853 update_route_solo_state ();
857 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
859 boost::shared_ptr<Track> track = wp.lock ();
864 boost::shared_ptr<Playlist> playlist;
866 if ((playlist = track->playlist()) != 0) {
867 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
868 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
869 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
874 Session::record_enabling_legal () const
876 /* this used to be in here, but survey says.... we don't need to restrict it */
877 // if (record_status() == Recording) {
881 if (Config->get_all_safe()) {
888 Session::set_track_monitor_input_status (bool yn)
890 boost::shared_ptr<RouteList> rl = routes.reader ();
891 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
892 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
893 if (tr && tr->record_enabled ()) {
894 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
895 tr->request_jack_monitors_input (yn);
901 Session::auto_punch_start_changed (Location* location)
903 replace_event (SessionEvent::PunchIn, location->start());
905 if (get_record_enabled() && config.get_punch_in()) {
906 /* capture start has been changed, so save new pending state */
907 save_state ("", true);
912 Session::auto_punch_end_changed (Location* location)
914 framepos_t when_to_stop = location->end();
915 // when_to_stop += _worst_output_latency + _worst_input_latency;
916 replace_event (SessionEvent::PunchOut, when_to_stop);
920 Session::auto_punch_changed (Location* location)
922 framepos_t when_to_stop = location->end();
924 replace_event (SessionEvent::PunchIn, location->start());
925 //when_to_stop += _worst_output_latency + _worst_input_latency;
926 replace_event (SessionEvent::PunchOut, when_to_stop);
930 Session::auto_loop_changed (Location* location)
932 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
934 if (transport_rolling() && play_loop) {
937 // if (_transport_frame > location->end()) {
939 if (_transport_frame < location->start() || _transport_frame > location->end()) {
940 // relocate to beginning of loop
941 clear_events (SessionEvent::LocateRoll);
943 request_locate (location->start(), true);
946 else if (Config->get_seamless_loop() && !loop_changing) {
948 // schedule a locate-roll to refill the diskstreams at the
950 loop_changing = true;
952 if (location->end() > last_loopend) {
953 clear_events (SessionEvent::LocateRoll);
954 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
961 last_loopend = location->end();
965 Session::set_auto_punch_location (Location* location)
969 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
970 punch_connections.drop_connections();
971 existing->set_auto_punch (false, this);
972 remove_event (existing->start(), SessionEvent::PunchIn);
973 clear_events (SessionEvent::PunchOut);
974 auto_punch_location_changed (0);
983 if (location->end() <= location->start()) {
984 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
988 punch_connections.drop_connections ();
990 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
991 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
992 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
994 location->set_auto_punch (true, this);
996 auto_punch_changed (location);
998 auto_punch_location_changed (location);
1002 Session::set_auto_loop_location (Location* location)
1006 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1007 loop_connections.drop_connections ();
1008 existing->set_auto_loop (false, this);
1009 remove_event (existing->end(), SessionEvent::AutoLoop);
1010 auto_loop_location_changed (0);
1015 if (location == 0) {
1019 if (location->end() <= location->start()) {
1020 error << _("Session: you can't use a mark for auto loop") << endmsg;
1024 last_loopend = location->end();
1026 loop_connections.drop_connections ();
1028 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1029 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1030 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1032 location->set_auto_loop (true, this);
1034 /* take care of our stuff first */
1036 auto_loop_changed (location);
1038 /* now tell everyone else */
1040 auto_loop_location_changed (location);
1044 Session::locations_added (Location *)
1050 Session::locations_changed ()
1052 _locations->apply (*this, &Session::handle_locations_changed);
1056 Session::handle_locations_changed (Locations::LocationList& locations)
1058 Locations::LocationList::iterator i;
1060 bool set_loop = false;
1061 bool set_punch = false;
1063 for (i = locations.begin(); i != locations.end(); ++i) {
1067 if (location->is_auto_punch()) {
1068 set_auto_punch_location (location);
1071 if (location->is_auto_loop()) {
1072 set_auto_loop_location (location);
1076 if (location->is_session_range()) {
1077 _session_range_location = location;
1082 set_auto_loop_location (0);
1085 set_auto_punch_location (0);
1092 Session::enable_record ()
1094 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1095 /* no recording at anything except normal speed */
1100 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1102 if (rs == Recording) {
1106 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1108 _last_record_location = _transport_frame;
1109 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1111 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1112 set_track_monitor_input_status (true);
1115 RecordStateChanged ();
1122 Session::disable_record (bool rt_context, bool force)
1126 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1128 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1129 g_atomic_int_set (&_record_status, Disabled);
1130 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1132 if (rs == Recording) {
1133 g_atomic_int_set (&_record_status, Enabled);
1137 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1138 set_track_monitor_input_status (false);
1141 RecordStateChanged (); /* emit signal */
1144 remove_pending_capture_state ();
1150 Session::step_back_from_record ()
1152 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1154 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1155 set_track_monitor_input_status (false);
1158 RecordStateChanged (); /* emit signal */
1163 Session::maybe_enable_record ()
1165 if (_step_editors > 0) {
1169 g_atomic_int_set (&_record_status, Enabled);
1171 /* This function is currently called from somewhere other than an RT thread.
1172 This save_state() call therefore doesn't impact anything. Doing it here
1173 means that we save pending state of which sources the next record will use,
1174 which gives us some chance of recovering from a crash during the record.
1177 save_state ("", true);
1179 if (_transport_speed) {
1180 if (!config.get_punch_in()) {
1184 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1185 RecordStateChanged (); /* EMIT SIGNAL */
1192 Session::audible_frame () const
1198 /* the first of these two possible settings for "offset"
1199 mean that the audible frame is stationary until
1200 audio emerges from the latency compensation
1203 the second means that the audible frame is stationary
1204 until audio would emerge from a physical port
1205 in the absence of any plugin latency compensation
1208 offset = worst_playback_latency ();
1210 if (offset > current_block_size) {
1211 offset -= current_block_size;
1213 /* XXX is this correct? if we have no external
1214 physical connections and everything is internal
1215 then surely this is zero? still, how
1216 likely is that anyway?
1218 offset = current_block_size;
1221 if (synced_to_jack()) {
1222 tf = _engine.transport_frame();
1224 tf = _transport_frame;
1229 if (!non_realtime_work_pending()) {
1233 /* Check to see if we have passed the first guaranteed
1234 audible frame past our last start position. if not,
1235 return that last start point because in terms
1236 of audible frames, we have not moved yet.
1238 `Start position' in this context means the time we last
1239 either started or changed transport direction.
1242 if (_transport_speed > 0.0f) {
1244 if (!play_loop || !have_looped) {
1245 if (tf < _last_roll_or_reversal_location + offset) {
1246 return _last_roll_or_reversal_location;
1254 } else if (_transport_speed < 0.0f) {
1256 /* XXX wot? no backward looping? */
1258 if (tf > _last_roll_or_reversal_location - offset) {
1259 return _last_roll_or_reversal_location;
1271 Session::set_frame_rate (framecnt_t frames_per_second)
1273 /** \fn void Session::set_frame_size(framecnt_t)
1274 the AudioEngine object that calls this guarantees
1275 that it will not be called while we are also in
1276 ::process(). Its fine to do things that block
1280 _base_frame_rate = frames_per_second;
1284 Automatable::set_automation_interval (ceil ((double) frames_per_second * (0.001 * Config->get_automation_interval())));
1288 // XXX we need some equivalent to this, somehow
1289 // SndFileSource::setup_standard_crossfades (frames_per_second);
1293 /* XXX need to reset/reinstantiate all LADSPA plugins */
1297 Session::set_block_size (pframes_t nframes)
1299 /* the AudioEngine guarantees
1300 that it will not be called while we are also in
1301 ::process(). It is therefore fine to do things that block
1306 current_block_size = nframes;
1310 boost::shared_ptr<RouteList> r = routes.reader ();
1312 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1313 (*i)->set_block_size (nframes);
1316 boost::shared_ptr<RouteList> rl = routes.reader ();
1317 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1318 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1320 tr->set_block_size (nframes);
1324 set_worst_io_latencies ();
1330 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1332 boost::shared_ptr<Route> r2;
1334 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1335 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1339 /* make a copy of the existing list of routes that feed r1 */
1341 Route::FedBy existing (r1->fed_by());
1343 /* for each route that feeds r1, recurse, marking it as feeding
1347 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1348 if (!(r2 = i->r.lock ())) {
1349 /* (*i) went away, ignore it */
1353 /* r2 is a route that feeds r1 which somehow feeds base. mark
1354 base as being fed by r2
1357 rbase->add_fed_by (r2, i->sends_only);
1361 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1365 if (r1->feeds (r2) && r2->feeds (r1)) {
1369 /* now recurse, so that we can mark base as being fed by
1370 all routes that feed r2
1373 trace_terminal (r2, rbase);
1380 Session::resort_routes ()
1382 /* don't do anything here with signals emitted
1383 by Routes during initial setup or while we
1384 are being destroyed.
1387 if (_state_of_the_state & (InitialConnecting | Deletion)) {
1392 RCUWriter<RouteList> writer (routes);
1393 boost::shared_ptr<RouteList> r = writer.get_copy ();
1394 resort_routes_using (r);
1395 /* writer goes out of scope and forces update */
1399 boost::shared_ptr<RouteList> rl = routes.reader ();
1400 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1401 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1403 const Route::FedBy& fb ((*i)->fed_by());
1405 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1406 boost::shared_ptr<Route> sf = f->r.lock();
1408 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1416 /** This is called whenever we need to rebuild the graph of how we will process
1418 * @param r List of routes, in any order.
1422 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1424 /* We are going to build a directed graph of our routes;
1425 this is where the edges of that graph are put.
1430 /* Go through all routes doing two things:
1432 * 1. Collect the edges of the route graph. Each of these edges
1433 * is a pair of routes, one of which directly feeds the other
1434 * either by a JACK connection or by an internal send.
1436 * 2. Begin the process of making routes aware of which other
1437 * routes directly or indirectly feed them. This information
1438 * is used by the solo code.
1441 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1443 /* Clear out the route's list of direct or indirect feeds */
1444 (*i)->clear_fed_by ();
1446 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
1448 bool via_sends_only;
1450 /* See if this *j feeds *i according to the current state of the JACK
1451 connections and internal sends.
1453 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
1454 /* add the edge to the graph (part #1) */
1455 edges.add (*j, *i, via_sends_only);
1456 /* tell the route (for part #2) */
1457 (*i)->add_fed_by (*j, via_sends_only);
1462 /* Attempt a topological sort of the route graph */
1463 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
1465 if (sorted_routes) {
1466 /* We got a satisfactory topological sort, so there is no feedback;
1469 Note: the process graph rechain does not require a
1470 topologically-sorted list, but hey ho.
1472 if (_process_graph) {
1473 _process_graph->rechain (sorted_routes, edges);
1476 _current_route_graph = edges;
1478 /* Complete the building of the routes' lists of what directly
1479 or indirectly feeds them.
1481 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1482 trace_terminal (*i, *i);
1488 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1489 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1490 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1491 (*i)->name(), (*i)->order_key ("signal")));
1495 SuccessfulGraphSort (); /* EMIT SIGNAL */
1498 /* The topological sort failed, so we have a problem. Tell everyone
1499 and stick to the old graph; this will continue to be processed, so
1500 until the feedback is fixed, what is played back will not quite
1501 reflect what is actually connected. Note also that we do not
1502 do trace_terminal here, as it would fail due to an endless recursion,
1503 so the solo code will think that everything is still connected
1507 FeedbackDetected (); /* EMIT SIGNAL */
1512 /** Find a route name starting with \a base, maybe followed by the
1513 * lowest \a id. \a id will always be added if \a definitely_add_number
1514 * is true on entry; otherwise it will only be added if required
1515 * to make the name unique.
1517 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1518 * The available route name with the lowest ID will be used, and \a id
1519 * will be set to the ID.
1521 * \return false if a route name could not be found, and \a track_name
1522 * and \a id do not reflect a free route name.
1525 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1527 if (!definitely_add_number && route_by_name (base) == 0) {
1528 /* juse use the base */
1529 snprintf (name, name_len, "%s", base.c_str());
1534 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1536 if (route_by_name (name) == 0) {
1542 } while (id < (UINT_MAX-1));
1547 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
1549 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
1551 in = ChanCount::ZERO;
1552 out = ChanCount::ZERO;
1554 boost::shared_ptr<RouteList> r = routes.reader ();
1556 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1557 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1558 if (tr && !tr->is_hidden()) {
1559 in += tr->n_inputs();
1560 out += tr->n_outputs();
1565 /** Caller must not hold process lock
1566 * @param name_template string to use for the start of the name, or "" to use "MIDI".
1567 * @param instrument plugin info for the instrument to insert pre-fader, if any
1569 list<boost::shared_ptr<MidiTrack> >
1570 Session::new_midi_track (boost::shared_ptr<PluginInfo> instrument, TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1572 char track_name[32];
1573 uint32_t track_id = 0;
1575 RouteList new_routes;
1576 list<boost::shared_ptr<MidiTrack> > ret;
1577 uint32_t control_id;
1579 control_id = next_control_id ();
1581 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
1584 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1585 error << "cannot find name for new midi track" << endmsg;
1589 boost::shared_ptr<MidiTrack> track;
1592 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1594 if (track->init ()) {
1598 track->use_new_diskstream();
1600 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1601 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1604 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1605 if (track->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1606 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1610 if (track->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1611 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1616 track->non_realtime_input_change();
1619 route_group->add (track);
1622 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1623 track->set_remote_control_id (control_id);
1625 new_routes.push_back (track);
1626 ret.push_back (track);
1629 catch (failed_constructor &err) {
1630 error << _("Session: could not create new midi track.") << endmsg;
1634 catch (AudioEngine::PortRegistrationFailure& pfe) {
1636 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;
1644 if (!new_routes.empty()) {
1645 add_routes (new_routes, true, true, true);
1648 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
1649 PluginPtr plugin = instrument->load (*this);
1650 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
1651 (*r)->add_processor (p, PreFader);
1661 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
1663 boost::shared_ptr<Route> midi_track (wmt.lock());
1669 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
1671 if (change.after.n_audio() <= change.before.n_audio()) {
1675 /* new audio ports: make sure the audio goes somewhere useful,
1676 unless the user has no-auto-connect selected.
1678 The existing ChanCounts don't matter for this call as they are only
1679 to do with matching input and output indices, and we are only changing
1685 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
1689 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1690 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1691 * @param output_start As \a input_start, but for outputs.
1694 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
1695 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
1697 if (!IO::connecting_legal) {
1701 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::NOT_LOCK);
1707 /* If both inputs and outputs are auto-connected to physical ports,
1708 use the max of input and output offsets to ensure auto-connected
1709 port numbers always match up (e.g. the first audio input and the
1710 first audio output of the route will have the same physical
1711 port number). Otherwise just use the lowest input or output
1715 DEBUG_TRACE (DEBUG::Graph,
1716 string_compose("Auto-connect: existing in = %1 out = %2\n",
1717 existing_inputs, existing_outputs));
1719 const bool in_out_physical =
1720 (Config->get_input_auto_connect() & AutoConnectPhysical)
1721 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1724 const ChanCount in_offset = in_out_physical
1725 ? ChanCount::max(existing_inputs, existing_outputs)
1728 const ChanCount out_offset = in_out_physical
1729 ? ChanCount::max(existing_inputs, existing_outputs)
1732 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1733 vector<string> physinputs;
1734 vector<string> physoutputs;
1736 _engine.get_physical_outputs (*t, physoutputs);
1737 _engine.get_physical_inputs (*t, physinputs);
1739 if (!physinputs.empty() && connect_inputs) {
1740 uint32_t nphysical_in = physinputs.size();
1742 DEBUG_TRACE (DEBUG::Graph,
1743 string_compose("There are %1 physical inputs of type %2\n",
1746 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1749 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1750 DEBUG_TRACE (DEBUG::Graph,
1751 string_compose("Get index %1 + %2 % %3 = %4\n",
1752 in_offset.get(*t), i, nphysical_in,
1753 (in_offset.get(*t) + i) % nphysical_in));
1754 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1757 DEBUG_TRACE (DEBUG::Graph,
1758 string_compose("Connect route %1 IN to %2\n",
1759 route->name(), port));
1761 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
1765 ChanCount one_added (*t, 1);
1766 existing_inputs += one_added;
1770 if (!physoutputs.empty()) {
1771 uint32_t nphysical_out = physoutputs.size();
1772 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
1775 if ((*t) == DataType::MIDI || Config->get_output_auto_connect() & AutoConnectPhysical) {
1776 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1777 } else if ((*t) == DataType::AUDIO && Config->get_output_auto_connect() & AutoConnectMaster) {
1778 /* master bus is audio only */
1779 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1780 port = _master_out->input()->ports().port(*t,
1781 i % _master_out->input()->n_ports().get(*t))->name();
1785 DEBUG_TRACE (DEBUG::Graph,
1786 string_compose("Connect route %1 OUT to %2\n",
1787 route->name(), port));
1789 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
1793 ChanCount one_added (*t, 1);
1794 existing_outputs += one_added;
1800 /** Caller must not hold process lock
1801 * @param name_template string to use for the start of the name, or "" to use "Audio".
1803 list< boost::shared_ptr<AudioTrack> >
1804 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
1805 uint32_t how_many, string name_template)
1807 char track_name[32];
1808 uint32_t track_id = 0;
1810 RouteList new_routes;
1811 list<boost::shared_ptr<AudioTrack> > ret;
1812 uint32_t control_id;
1814 control_id = next_control_id ();
1816 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
1819 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1820 error << "cannot find name for new audio track" << endmsg;
1824 boost::shared_ptr<AudioTrack> track;
1827 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
1829 if (track->init ()) {
1833 track->use_new_diskstream();
1835 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1836 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1839 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1841 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1842 error << string_compose (
1843 _("cannot configure %1 in/%2 out configuration for new audio track"),
1844 input_channels, output_channels)
1849 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1850 error << string_compose (
1851 _("cannot configure %1 in/%2 out configuration for new audio track"),
1852 input_channels, output_channels)
1859 route_group->add (track);
1862 track->non_realtime_input_change();
1864 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1865 track->set_remote_control_id (control_id);
1868 new_routes.push_back (track);
1869 ret.push_back (track);
1872 catch (failed_constructor &err) {
1873 error << _("Session: could not create new audio track.") << endmsg;
1877 catch (AudioEngine::PortRegistrationFailure& pfe) {
1879 error << pfe.what() << endmsg;
1887 if (!new_routes.empty()) {
1888 add_routes (new_routes, true, true, true);
1895 Session::set_remote_control_ids ()
1897 RemoteModel m = Config->get_remote_model();
1898 bool emit_signal = false;
1900 boost::shared_ptr<RouteList> r = routes.reader ();
1902 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1903 if (MixerOrdered == m) {
1904 int32_t order = (*i)->order_key(N_("signal"));
1905 (*i)->set_remote_control_id (order+1, false);
1907 } else if (EditorOrdered == m) {
1908 int32_t order = (*i)->order_key(N_("editor"));
1909 (*i)->set_remote_control_id (order+1, false);
1911 } else if (UserOrdered == m) {
1912 //do nothing ... only changes to remote id's are initiated by user
1917 Route::RemoteControlIDChange();
1921 /** Caller must not hold process lock.
1922 * @param name_template string to use for the start of the name, or "" to use "Bus".
1925 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
1928 uint32_t bus_id = 0;
1931 uint32_t control_id;
1933 control_id = next_control_id ();
1935 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
1938 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
1939 error << "cannot find name for new audio bus" << endmsg;
1944 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
1950 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1951 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
1954 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1956 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1957 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1958 input_channels, output_channels)
1964 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1965 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1966 input_channels, output_channels)
1973 route_group->add (bus);
1975 bus->set_remote_control_id (control_id);
1978 bus->add_internal_return ();
1980 ret.push_back (bus);
1984 catch (failed_constructor &err) {
1985 error << _("Session: could not create new audio route.") << endmsg;
1989 catch (AudioEngine::PortRegistrationFailure& pfe) {
1990 error << pfe.what() << endmsg;
2000 add_routes (ret, false, true, true); // autoconnect outputs only
2008 Session::new_route_from_template (uint32_t how_many, const std::string& template_path)
2011 uint32_t control_id;
2013 uint32_t number = 0;
2015 if (!tree.read (template_path.c_str())) {
2019 XMLNode* node = tree.root();
2021 IO::disable_connecting ();
2023 control_id = next_control_id ();
2027 XMLNode node_copy (*node);
2029 /* Remove IDs of everything so that new ones are used */
2030 node_copy.remove_property_recursively (X_("id"));
2033 string const route_name = node_copy.property(X_("name"))->value ();
2035 /* generate a new name by adding a number to the end of the template name */
2037 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2038 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2042 /* set this name in the XML description that we are about to use */
2043 Route::set_name_in_state (node_copy, name);
2045 /* trim bitslots from listen sends so that new ones are used */
2046 XMLNodeList children = node_copy.children ();
2047 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2048 if ((*i)->name() == X_("Processor")) {
2049 XMLProperty* role = (*i)->property (X_("role"));
2050 if (role && role->value() == X_("Listen")) {
2051 (*i)->remove_property (X_("bitslot"));
2056 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2059 error << _("Session: cannot create track/bus from template description") << endmsg;
2063 if (boost::dynamic_pointer_cast<Track>(route)) {
2064 /* force input/output change signals so that the new diskstream
2065 picks up the configuration of the route. During session
2066 loading this normally happens in a different way.
2069 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2071 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2072 change.after = route->input()->n_ports();
2073 route->input()->changed (change, this);
2074 change.after = route->output()->n_ports();
2075 route->output()->changed (change, this);
2078 route->set_remote_control_id (control_id);
2081 ret.push_back (route);
2084 catch (failed_constructor &err) {
2085 error << _("Session: could not create new route from template") << endmsg;
2089 catch (AudioEngine::PortRegistrationFailure& pfe) {
2090 error << pfe.what() << endmsg;
2099 add_routes (ret, true, true, true);
2100 IO::enable_connecting ();
2107 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
2109 ChanCount existing_inputs;
2110 ChanCount existing_outputs;
2112 count_existing_track_channels (existing_inputs, existing_outputs);
2115 RCUWriter<RouteList> writer (routes);
2116 boost::shared_ptr<RouteList> r = writer.get_copy ();
2117 r->insert (r->end(), new_routes.begin(), new_routes.end());
2119 /* if there is no control out and we're not in the middle of loading,
2120 resort the graph here. if there is a control out, we will resort
2121 toward the end of this method. if we are in the middle of loading,
2122 we will resort when done.
2125 if (!_monitor_out && IO::connecting_legal) {
2126 resort_routes_using (r);
2130 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2132 boost::weak_ptr<Route> wpr (*x);
2133 boost::shared_ptr<Route> r (*x);
2135 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2136 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2137 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2138 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2139 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2140 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2141 r->order_key_changed.connect_same_thread (*this, boost::bind (&Session::route_order_key_changed, this));
2143 if (r->is_master()) {
2147 if (r->is_monitor()) {
2151 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2153 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2154 track_playlist_changed (boost::weak_ptr<Track> (tr));
2155 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2157 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2159 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2160 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2164 if (input_auto_connect || output_auto_connect) {
2165 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
2169 if (_monitor_out && IO::connecting_legal) {
2172 Glib::Mutex::Lock lm (_engine.process_lock());
2174 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2175 if ((*x)->is_monitor()) {
2177 } else if ((*x)->is_master()) {
2180 (*x)->enable_monitor_send ();
2191 save_state (_current_snapshot_name);
2194 RouteAdded (new_routes); /* EMIT SIGNAL */
2195 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
2199 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2201 boost::shared_ptr<RouteList> r = routes.reader ();
2202 boost::shared_ptr<Send> s;
2204 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2205 if ((s = (*i)->internal_send_for (dest)) != 0) {
2206 s->amp()->gain_control()->set_value (0.0);
2212 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2214 boost::shared_ptr<RouteList> r = routes.reader ();
2215 boost::shared_ptr<Send> s;
2217 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2218 if ((s = (*i)->internal_send_for (dest)) != 0) {
2219 s->amp()->gain_control()->set_value (1.0);
2225 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2227 boost::shared_ptr<RouteList> r = routes.reader ();
2228 boost::shared_ptr<Send> s;
2230 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2231 if ((s = (*i)->internal_send_for (dest)) != 0) {
2232 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2237 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2239 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2241 boost::shared_ptr<RouteList> r = routes.reader ();
2242 boost::shared_ptr<RouteList> t (new RouteList);
2244 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2245 /* no MIDI sends because there are no MIDI busses yet */
2246 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2251 add_internal_sends (dest, p, t);
2255 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2257 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2258 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
2263 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
2265 add_internal_send (dest, sender->before_processor_for_index (index), sender);
2269 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
2271 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
2275 if (!dest->internal_return()) {
2276 dest->add_internal_return ();
2279 sender->add_aux_send (dest, before);
2285 Session::remove_route (boost::shared_ptr<Route> route)
2287 if (route == _master_out) {
2291 route->set_solo (false, this);
2294 RCUWriter<RouteList> writer (routes);
2295 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2299 /* deleting the master out seems like a dumb
2300 idea, but its more of a UI policy issue
2304 if (route == _master_out) {
2305 _master_out = boost::shared_ptr<Route> ();
2308 if (route == _monitor_out) {
2309 _monitor_out.reset ();
2312 /* writer goes out of scope, forces route list update */
2315 update_route_solo_state ();
2317 // We need to disconnect the route's inputs and outputs
2319 route->input()->disconnect (0);
2320 route->output()->disconnect (0);
2322 /* if the route had internal sends sending to it, remove them */
2323 if (route->internal_return()) {
2325 boost::shared_ptr<RouteList> r = routes.reader ();
2326 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2327 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2329 (*i)->remove_processor (s);
2334 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2335 if (mt && mt->step_editing()) {
2336 if (_step_editors > 0) {
2341 update_latency_compensation ();
2344 /* Re-sort routes to remove the graph's current references to the one that is
2345 * going away, then flush old references out of the graph.
2349 if (_process_graph) {
2350 _process_graph->clear_other_chain ();
2353 /* get rid of it from the dead wood collection in the route list manager */
2355 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2359 /* try to cause everyone to drop their references */
2361 route->drop_references ();
2363 sync_order_keys (N_("session"));
2365 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2367 /* save the new state of the world */
2369 if (save_state (_current_snapshot_name)) {
2370 save_history (_current_snapshot_name);
2375 Session::route_mute_changed (void* /*src*/)
2381 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2383 boost::shared_ptr<Route> route = wpr.lock();
2385 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2389 if (route->listening_via_monitor ()) {
2391 if (Config->get_exclusive_solo()) {
2392 /* new listen: disable all other listen */
2393 boost::shared_ptr<RouteList> r = routes.reader ();
2394 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2395 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2398 (*i)->set_listen (false, this);
2404 } else if (_listen_cnt > 0) {
2409 update_route_solo_state ();
2412 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2414 boost::shared_ptr<Route> route = wpr.lock ();
2417 /* should not happen */
2418 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2422 bool send_changed = false;
2424 if (route->solo_isolated()) {
2425 if (_solo_isolated_cnt == 0) {
2426 send_changed = true;
2428 _solo_isolated_cnt++;
2429 } else if (_solo_isolated_cnt > 0) {
2430 _solo_isolated_cnt--;
2431 if (_solo_isolated_cnt == 0) {
2432 send_changed = true;
2437 IsolatedChanged (); /* EMIT SIGNAL */
2442 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2444 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
2446 if (!self_solo_change) {
2447 // session doesn't care about changes to soloed-by-others
2451 if (solo_update_disabled) {
2453 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
2457 boost::shared_ptr<Route> route = wpr.lock ();
2460 boost::shared_ptr<RouteList> r = routes.reader ();
2463 if (route->self_soloed()) {
2469 RouteGroup* rg = route->route_group ();
2470 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
2472 if (delta == 1 && Config->get_exclusive_solo()) {
2474 /* new solo: disable all other solos, but not the group if its solo-enabled */
2476 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2477 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2478 (leave_group_alone && ((*i)->route_group() == rg))) {
2481 (*i)->set_solo (false, this);
2485 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
2487 solo_update_disabled = true;
2489 RouteList uninvolved;
2491 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
2493 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2494 bool via_sends_only;
2495 bool in_signal_flow;
2497 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2498 (leave_group_alone && ((*i)->route_group() == rg))) {
2502 in_signal_flow = false;
2504 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
2506 if ((*i)->feeds (route, &via_sends_only)) {
2507 if (!via_sends_only) {
2508 if (!route->soloed_by_others_upstream()) {
2509 (*i)->mod_solo_by_others_downstream (delta);
2512 in_signal_flow = true;
2514 DEBUG_TRACE (DEBUG::Solo, "\tno feed from\n");
2517 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
2519 if (route->feeds (*i, &via_sends_only)) {
2520 /* propagate solo upstream only if routing other than
2521 sends is involved, but do consider the other route
2522 (*i) to be part of the signal flow even if only
2525 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
2529 route->soloed_by_others_downstream(),
2530 route->soloed_by_others_upstream()));
2531 if (!via_sends_only) {
2532 if (!route->soloed_by_others_downstream()) {
2533 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
2534 (*i)->mod_solo_by_others_upstream (delta);
2537 in_signal_flow = true;
2539 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
2542 if (!in_signal_flow) {
2543 uninvolved.push_back (*i);
2547 solo_update_disabled = false;
2548 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
2550 update_route_solo_state (r);
2552 /* now notify that the mute state of the routes not involved in the signal
2553 pathway of the just-solo-changed route may have altered.
2556 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2557 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1\n", (*i)->name()));
2558 (*i)->mute_changed (this);
2561 SoloChanged (); /* EMIT SIGNAL */
2566 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2568 /* now figure out if anything that matters is soloed (or is "listening")*/
2570 bool something_soloed = false;
2571 uint32_t listeners = 0;
2572 uint32_t isolated = 0;
2575 r = routes.reader();
2578 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2579 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2580 something_soloed = true;
2583 if (!(*i)->is_hidden() && (*i)->listening_via_monitor()) {
2584 if (Config->get_solo_control_is_listen_control()) {
2587 (*i)->set_listen (false, this);
2591 if ((*i)->solo_isolated()) {
2596 if (something_soloed != _non_soloed_outs_muted) {
2597 _non_soloed_outs_muted = something_soloed;
2598 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2601 _listen_cnt = listeners;
2603 if (isolated != _solo_isolated_cnt) {
2604 _solo_isolated_cnt = isolated;
2605 IsolatedChanged (); /* EMIT SIGNAL */
2609 boost::shared_ptr<RouteList>
2610 Session::get_routes_with_internal_returns() const
2612 boost::shared_ptr<RouteList> r = routes.reader ();
2613 boost::shared_ptr<RouteList> rl (new RouteList);
2615 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2616 if ((*i)->internal_return ()) {
2624 Session::io_name_is_legal (const std::string& name)
2626 boost::shared_ptr<RouteList> r = routes.reader ();
2628 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2629 if ((*i)->name() == name) {
2633 if ((*i)->has_io_processor_named (name)) {
2642 Session::set_exclusive_input_active (boost::shared_ptr<Route> rt, bool /*others_on*/)
2645 vector<string> connections;
2647 PortSet& ps (rt->input()->ports());
2649 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
2650 p->get_connections (connections);
2653 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
2654 routes_using_input_from (*s, rl);
2657 /* scan all relevant routes to see if others are on or off */
2659 bool others_are_already_on = false;
2661 for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
2663 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2665 if (mt->input_active()) {
2666 others_are_already_on = true;
2673 /* globally reverse other routes */
2675 for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
2677 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2679 mt->set_input_active (!others_are_already_on);
2686 Session::routes_using_input_from (const string& str, RouteList& rl)
2688 boost::shared_ptr<RouteList> r = routes.reader ();
2690 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2691 if ((*i)->input()->connected_to (str)) {
2697 boost::shared_ptr<Route>
2698 Session::route_by_name (string name)
2700 boost::shared_ptr<RouteList> r = routes.reader ();
2702 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2703 if ((*i)->name() == name) {
2708 return boost::shared_ptr<Route> ((Route*) 0);
2711 boost::shared_ptr<Route>
2712 Session::route_by_id (PBD::ID id)
2714 boost::shared_ptr<RouteList> r = routes.reader ();
2716 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2717 if ((*i)->id() == id) {
2722 return boost::shared_ptr<Route> ((Route*) 0);
2725 boost::shared_ptr<Track>
2726 Session::track_by_diskstream_id (PBD::ID id)
2728 boost::shared_ptr<RouteList> r = routes.reader ();
2730 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2731 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
2732 if (t && t->using_diskstream_id (id)) {
2737 return boost::shared_ptr<Track> ();
2740 boost::shared_ptr<Route>
2741 Session::route_by_remote_id (uint32_t id)
2743 boost::shared_ptr<RouteList> r = routes.reader ();
2745 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2746 if ((*i)->remote_control_id() == id) {
2751 return boost::shared_ptr<Route> ((Route*) 0);
2755 Session::playlist_region_added (boost::weak_ptr<Region> w)
2757 boost::shared_ptr<Region> r = w.lock ();
2762 /* These are the operations that are currently in progress... */
2763 list<GQuark> curr = _current_trans_quarks;
2766 /* ...and these are the operations during which we want to update
2767 the session range location markers.
2770 ops.push_back (Operations::capture);
2771 ops.push_back (Operations::paste);
2772 ops.push_back (Operations::duplicate_region);
2773 ops.push_back (Operations::insert_file);
2774 ops.push_back (Operations::insert_region);
2775 ops.push_back (Operations::drag_region_brush);
2776 ops.push_back (Operations::region_drag);
2777 ops.push_back (Operations::selection_grab);
2778 ops.push_back (Operations::region_fill);
2779 ops.push_back (Operations::fill_selection);
2780 ops.push_back (Operations::create_region);
2781 ops.push_back (Operations::region_copy);
2782 ops.push_back (Operations::fixed_time_region_copy);
2785 /* See if any of the current operations match the ones that we want */
2787 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
2789 /* If so, update the session range markers */
2791 maybe_update_session_range (r->position (), r->last_frame ());
2795 /** Update the session range markers if a is before the current start or
2796 * b is after the current end.
2799 Session::maybe_update_session_range (framepos_t a, framepos_t b)
2801 if (_state_of_the_state & Loading) {
2805 if (_session_range_location == 0) {
2807 add_session_range_location (a, b);
2811 if (a < _session_range_location->start()) {
2812 _session_range_location->set_start (a);
2815 if (b > _session_range_location->end()) {
2816 _session_range_location->set_end (b);
2822 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
2824 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2825 maybe_update_session_range (i->to, i->to + i->length);
2830 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
2832 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2833 maybe_update_session_range (i->from, i->to);
2837 /* Region management */
2839 boost::shared_ptr<Region>
2840 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2842 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2843 RegionFactory::RegionMap::const_iterator i;
2844 boost::shared_ptr<Region> region;
2846 Glib::Mutex::Lock lm (region_lock);
2848 for (i = regions.begin(); i != regions.end(); ++i) {
2852 if (region->whole_file()) {
2854 if (child->source_equivalent (region)) {
2860 return boost::shared_ptr<Region> ();
2864 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2866 set<boost::shared_ptr<Region> > relevant_regions;
2868 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2869 RegionFactory::get_regions_using_source (*s, relevant_regions);
2872 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2873 set<boost::shared_ptr<Region> >::iterator tmp;
2878 playlists->destroy_region (*r);
2879 RegionFactory::map_remove (*r);
2881 (*r)->drop_sources ();
2882 (*r)->drop_references ();
2884 relevant_regions.erase (r);
2889 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
2892 Glib::Mutex::Lock ls (source_lock);
2893 /* remove from the main source list */
2894 sources.erase ((*s)->id());
2897 (*s)->mark_for_remove ();
2898 (*s)->drop_references ();
2907 Session::remove_last_capture ()
2909 list<boost::shared_ptr<Source> > srcs;
2911 boost::shared_ptr<RouteList> rl = routes.reader ();
2912 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2913 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2918 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
2921 srcs.insert (srcs.end(), l.begin(), l.end());
2926 destroy_sources (srcs);
2928 save_state (_current_snapshot_name);
2933 /* Source Management */
2936 Session::add_source (boost::shared_ptr<Source> source)
2938 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
2939 pair<SourceMap::iterator,bool> result;
2941 entry.first = source->id();
2942 entry.second = source;
2945 Glib::Mutex::Lock lm (source_lock);
2946 result = sources.insert (entry);
2949 if (result.second) {
2951 /* yay, new source */
2953 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
2956 if (!fs->within_session()) {
2957 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
2963 boost::shared_ptr<AudioFileSource> afs;
2965 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
2966 if (Config->get_auto_analyse_audio()) {
2967 Analyser::queue_source_for_analysis (source, false);
2971 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
2976 Session::remove_source (boost::weak_ptr<Source> src)
2978 if (_state_of_the_state & Deletion) {
2982 SourceMap::iterator i;
2983 boost::shared_ptr<Source> source = src.lock();
2990 Glib::Mutex::Lock lm (source_lock);
2992 if ((i = sources.find (source->id())) != sources.end()) {
2997 if (!(_state_of_the_state & InCleanup)) {
2999 /* save state so we don't end up with a session file
3000 referring to non-existent sources.
3003 save_state (_current_snapshot_name);
3007 boost::shared_ptr<Source>
3008 Session::source_by_id (const PBD::ID& id)
3010 Glib::Mutex::Lock lm (source_lock);
3011 SourceMap::iterator i;
3012 boost::shared_ptr<Source> source;
3014 if ((i = sources.find (id)) != sources.end()) {
3021 boost::shared_ptr<Source>
3022 Session::source_by_path_and_channel (const string& path, uint16_t chn)
3024 Glib::Mutex::Lock lm (source_lock);
3026 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3027 boost::shared_ptr<AudioFileSource> afs
3028 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
3030 if (afs && afs->path() == path && chn == afs->channel()) {
3034 return boost::shared_ptr<Source>();
3038 Session::count_sources_by_origin (const string& path)
3041 Glib::Mutex::Lock lm (source_lock);
3043 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3044 boost::shared_ptr<FileSource> fs
3045 = boost::dynamic_pointer_cast<FileSource>(i->second);
3047 if (fs && fs->origin() == path) {
3057 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
3060 string old_basename = PBD::basename_nosuffix (oldname);
3061 string new_legalized = legalize_for_path (newname);
3063 /* note: we know (or assume) the old path is already valid */
3067 /* destructive file sources have a name of the form:
3069 /path/to/Tnnnn-NAME(%[LR])?.wav
3071 the task here is to replace NAME with the new name.
3076 string::size_type dash;
3078 dir = Glib::path_get_dirname (path);
3079 path = Glib::path_get_basename (path);
3081 /* '-' is not a legal character for the NAME part of the path */
3083 if ((dash = path.find_last_of ('-')) == string::npos) {
3087 prefix = path.substr (0, dash);
3091 path += new_legalized;
3092 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3093 path = Glib::build_filename (dir, path);
3097 /* non-destructive file sources have a name of the form:
3099 /path/to/NAME-nnnnn(%[LR])?.ext
3101 the task here is to replace NAME with the new name.
3106 string::size_type dash;
3107 string::size_type postfix;
3109 dir = Glib::path_get_dirname (path);
3110 path = Glib::path_get_basename (path);
3112 /* '-' is not a legal character for the NAME part of the path */
3114 if ((dash = path.find_last_of ('-')) == string::npos) {
3118 suffix = path.substr (dash+1);
3120 // Suffix is now everything after the dash. Now we need to eliminate
3121 // the nnnnn part, which is done by either finding a '%' or a '.'
3123 postfix = suffix.find_last_of ("%");
3124 if (postfix == string::npos) {
3125 postfix = suffix.find_last_of ('.');
3128 if (postfix != string::npos) {
3129 suffix = suffix.substr (postfix);
3131 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
3135 const uint32_t limit = 10000;
3136 char buf[PATH_MAX+1];
3138 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
3140 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
3142 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
3143 path = Glib::build_filename (dir, buf);
3151 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
3160 /** Return the full path (in some session directory) for a new within-session source.
3161 * \a name must be a session-unique name that does not contain slashes
3162 * (e.g. as returned by new_*_source_name)
3165 Session::new_source_path_from_name (DataType type, const string& name)
3167 assert(name.find("/") == string::npos);
3169 SessionDirectory sdir(get_best_session_directory_for_new_source());
3172 if (type == DataType::AUDIO) {
3173 p = sdir.sound_path();
3174 } else if (type == DataType::MIDI) {
3175 p = sdir.midi_path();
3177 error << "Unknown source type, unable to create file path" << endmsg;
3182 return p.to_string();
3186 Session::peak_path (string base) const
3188 sys::path peakfile_path(_session_dir->peak_path());
3189 peakfile_path /= base + peakfile_suffix;
3190 return peakfile_path.to_string();
3193 /** Return a unique name based on \a base for a new internal audio source */
3195 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
3198 char buf[PATH_MAX+1];
3199 const uint32_t limit = 10000;
3201 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3204 legalized = legalize_for_path (base);
3206 // Find a "version" of the base name that doesn't exist in any of the possible directories.
3207 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3209 vector<space_and_path>::iterator i;
3210 uint32_t existing = 0;
3212 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3217 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3218 cnt, legalized.c_str(), ext.c_str());
3219 } else if (nchan == 2) {
3221 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
3222 cnt, legalized.c_str(), ext.c_str());
3224 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
3225 cnt, legalized.c_str(), ext.c_str());
3227 } else if (nchan < 26) {
3228 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
3229 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
3231 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3232 cnt, legalized.c_str(), ext.c_str());
3238 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3239 } else if (nchan == 2) {
3241 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
3243 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
3245 } else if (nchan < 26) {
3246 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
3248 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3252 SessionDirectory sdir((*i).path);
3254 string spath = sdir.sound_path().to_string();
3256 /* note that we search *without* the extension so that
3257 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3258 in the event that this new name is required for
3259 a file format change.
3262 if (matching_unsuffixed_filename_exists_in (spath, buf)) {
3268 if (existing == 0) {
3273 error << string_compose(
3274 _("There are already %1 recordings for %2, which I consider too many."),
3275 limit, base) << endmsg;
3277 throw failed_constructor();
3281 return Glib::path_get_basename (buf);
3284 /** Create a new within-session audio source */
3285 boost::shared_ptr<AudioFileSource>
3286 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
3288 const string name = new_audio_source_name (n, n_chans, chan, destructive);
3289 const string path = new_source_path_from_name(DataType::AUDIO, name);
3291 return boost::dynamic_pointer_cast<AudioFileSource> (
3292 SourceFactory::createWritable (DataType::AUDIO, *this, path, string(), destructive, frame_rate()));
3295 /** Return a unique name based on \a base for a new internal MIDI source */
3297 Session::new_midi_source_name (const string& base)
3300 char buf[PATH_MAX+1];
3301 const uint32_t limit = 10000;
3305 legalized = legalize_for_path (base);
3307 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3308 for (cnt = 1; cnt <= limit; ++cnt) {
3310 vector<space_and_path>::iterator i;
3311 uint32_t existing = 0;
3313 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3315 SessionDirectory sdir((*i).path);
3317 sys::path p = sdir.midi_path();
3320 snprintf (buf, sizeof(buf), "%s-%u.mid", p.to_string().c_str(), cnt);
3322 if (sys::exists (buf)) {
3327 if (existing == 0) {
3332 error << string_compose(
3333 _("There are already %1 recordings for %2, which I consider too many."),
3334 limit, base) << endmsg;
3336 throw failed_constructor();
3340 return Glib::path_get_basename(buf);
3344 /** Create a new within-session MIDI source */
3345 boost::shared_ptr<MidiSource>
3346 Session::create_midi_source_for_session (Track* track, string const & n)
3348 /* try to use the existing write source for the track, to keep numbering sane
3352 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3356 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3359 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3360 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3364 const string name = new_midi_source_name (n);
3365 const string path = new_source_path_from_name (DataType::MIDI, name);
3367 return boost::dynamic_pointer_cast<SMFSource> (
3368 SourceFactory::createWritable (
3369 DataType::MIDI, *this, path, string(), false, frame_rate()));
3374 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3376 if (playlist->hidden()) {
3380 playlists->add (playlist);
3383 playlist->release();
3390 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3392 if (_state_of_the_state & Deletion) {
3396 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3402 playlists->remove (playlist);
3408 Session::set_audition (boost::shared_ptr<Region> r)
3410 pending_audition_region = r;
3411 add_post_transport_work (PostTransportAudition);
3412 _butler->schedule_transport_work ();
3416 Session::audition_playlist ()
3418 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3419 ev->region.reset ();
3424 Session::non_realtime_set_audition ()
3426 assert (pending_audition_region);
3427 auditioner->audition_region (pending_audition_region);
3428 pending_audition_region.reset ();
3429 AuditionActive (true); /* EMIT SIGNAL */
3433 Session::audition_region (boost::shared_ptr<Region> r)
3435 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3441 Session::cancel_audition ()
3443 if (auditioner->auditioning()) {
3444 auditioner->cancel_audition ();
3445 AuditionActive (false); /* EMIT SIGNAL */
3450 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3452 if (a->is_monitor()) {
3455 if (b->is_monitor()) {
3458 return a->order_key(N_("signal")) < b->order_key(N_("signal"));
3462 Session::is_auditioning () const
3464 /* can be called before we have an auditioner object */
3466 return auditioner->auditioning();
3473 Session::graph_reordered ()
3475 /* don't do this stuff if we are setting up connections
3476 from a set_state() call or creating new tracks. Ditto for deletion.
3479 if (_state_of_the_state & (InitialConnecting|Deletion)) {
3483 /* every track/bus asked for this to be handled but it was deferred because
3484 we were connecting. do it now.
3487 request_input_change_handling ();
3491 /* force all diskstreams to update their capture offset values to
3492 reflect any changes in latencies within the graph.
3495 boost::shared_ptr<RouteList> rl = routes.reader ();
3496 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3497 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3499 tr->set_capture_offset ();
3505 Session::available_capture_duration ()
3507 float sample_bytes_on_disk = 4.0; // keep gcc happy
3509 switch (config.get_native_file_data_format()) {
3511 sample_bytes_on_disk = 4.0;
3515 sample_bytes_on_disk = 3.0;
3519 sample_bytes_on_disk = 2.0;
3523 /* impossible, but keep some gcc versions happy */
3524 fatal << string_compose (_("programming error: %1"),
3525 X_("illegal native file data format"))
3530 double scale = 4096.0 / sample_bytes_on_disk;
3532 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3533 return max_framecnt;
3536 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3540 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3543 RCUWriter<BundleList> writer (_bundles);
3544 boost::shared_ptr<BundleList> b = writer.get_copy ();
3545 b->push_back (bundle);
3548 BundleAdded (bundle); /* EMIT SIGNAL */
3554 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3556 bool removed = false;
3559 RCUWriter<BundleList> writer (_bundles);
3560 boost::shared_ptr<BundleList> b = writer.get_copy ();
3561 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3563 if (i != b->end()) {
3570 BundleRemoved (bundle); /* EMIT SIGNAL */
3576 boost::shared_ptr<Bundle>
3577 Session::bundle_by_name (string name) const
3579 boost::shared_ptr<BundleList> b = _bundles.reader ();
3581 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3582 if ((*i)->name() == name) {
3587 return boost::shared_ptr<Bundle> ();
3591 Session::tempo_map_changed (const PropertyChange&)
3595 playlists->update_after_tempo_map_change ();
3597 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3603 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3605 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3606 (*i)->recompute_frames_from_bbt ();
3610 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3611 * the given count with the current block size.
3614 Session::ensure_buffers (ChanCount howmany)
3616 BufferManager::ensure_buffers (howmany);
3620 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3622 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3623 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3628 Session::next_insert_id ()
3630 /* this doesn't really loop forever. just think about it */
3633 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3634 if (!insert_bitset[n]) {
3635 insert_bitset[n] = true;
3641 /* none available, so resize and try again */
3643 insert_bitset.resize (insert_bitset.size() + 16, false);
3648 Session::next_send_id ()
3650 /* this doesn't really loop forever. just think about it */
3653 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3654 if (!send_bitset[n]) {
3655 send_bitset[n] = true;
3661 /* none available, so resize and try again */
3663 send_bitset.resize (send_bitset.size() + 16, false);
3668 Session::next_aux_send_id ()
3670 /* this doesn't really loop forever. just think about it */
3673 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
3674 if (!aux_send_bitset[n]) {
3675 aux_send_bitset[n] = true;
3681 /* none available, so resize and try again */
3683 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
3688 Session::next_return_id ()
3690 /* this doesn't really loop forever. just think about it */
3693 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3694 if (!return_bitset[n]) {
3695 return_bitset[n] = true;
3701 /* none available, so resize and try again */
3703 return_bitset.resize (return_bitset.size() + 16, false);
3708 Session::mark_send_id (uint32_t id)
3710 if (id >= send_bitset.size()) {
3711 send_bitset.resize (id+16, false);
3713 if (send_bitset[id]) {
3714 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3716 send_bitset[id] = true;
3720 Session::mark_aux_send_id (uint32_t id)
3722 if (id >= aux_send_bitset.size()) {
3723 aux_send_bitset.resize (id+16, false);
3725 if (aux_send_bitset[id]) {
3726 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
3728 aux_send_bitset[id] = true;
3732 Session::mark_return_id (uint32_t id)
3734 if (id >= return_bitset.size()) {
3735 return_bitset.resize (id+16, false);
3737 if (return_bitset[id]) {
3738 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3740 return_bitset[id] = true;
3744 Session::mark_insert_id (uint32_t id)
3746 if (id >= insert_bitset.size()) {
3747 insert_bitset.resize (id+16, false);
3749 if (insert_bitset[id]) {
3750 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3752 insert_bitset[id] = true;
3756 Session::unmark_send_id (uint32_t id)
3758 if (id < send_bitset.size()) {
3759 send_bitset[id] = false;
3764 Session::unmark_aux_send_id (uint32_t id)
3766 if (id < aux_send_bitset.size()) {
3767 aux_send_bitset[id] = false;
3772 Session::unmark_return_id (uint32_t id)
3774 if (id < return_bitset.size()) {
3775 return_bitset[id] = false;
3780 Session::unmark_insert_id (uint32_t id)
3782 if (id < insert_bitset.size()) {
3783 insert_bitset[id] = false;
3788 /* Named Selection management */
3790 boost::shared_ptr<NamedSelection>
3791 Session::named_selection_by_name (string name)
3793 Glib::Mutex::Lock lm (named_selection_lock);
3794 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
3795 if ((*i)->name == name) {
3799 return boost::shared_ptr<NamedSelection>();
3803 Session::add_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3806 Glib::Mutex::Lock lm (named_selection_lock);
3807 named_selections.insert (named_selections.begin(), named_selection);
3812 NamedSelectionAdded (); /* EMIT SIGNAL */
3816 Session::remove_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3818 bool removed = false;
3821 Glib::Mutex::Lock lm (named_selection_lock);
3823 NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
3825 if (i != named_selections.end()) {
3826 named_selections.erase (i);
3833 NamedSelectionRemoved (); /* EMIT SIGNAL */
3838 Session::reset_native_file_format ()
3840 boost::shared_ptr<RouteList> rl = routes.reader ();
3841 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3842 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3844 /* don't save state as we do this, there's no point
3847 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3848 tr->reset_write_sources (false);
3849 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3855 Session::route_name_unique (string n) const
3857 boost::shared_ptr<RouteList> r = routes.reader ();
3859 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3860 if ((*i)->name() == n) {
3869 Session::route_name_internal (string n) const
3871 if (auditioner && auditioner->name() == n) {
3875 if (_click_io && _click_io->name() == n) {
3883 Session::freeze_all (InterThreadInfo& itt)
3885 boost::shared_ptr<RouteList> r = routes.reader ();
3887 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3889 boost::shared_ptr<Track> t;
3891 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3892 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3902 boost::shared_ptr<Region>
3903 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
3904 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3905 InterThreadInfo& itt,
3906 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
3909 boost::shared_ptr<Region> result;
3910 boost::shared_ptr<Playlist> playlist;
3911 boost::shared_ptr<AudioFileSource> fsource;
3913 char buf[PATH_MAX+1];
3914 ChanCount diskstream_channels (track.n_channels());
3915 framepos_t position;
3916 framecnt_t this_chunk;
3919 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3920 const string sound_dir = sdir.sound_path().to_string();
3921 framepos_t len = end - start;
3922 bool need_block_size_reset = false;
3924 ChanCount const max_proc = track.max_processor_streams ();
3927 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3928 end, start) << endmsg;
3932 const framecnt_t chunk_size = (256 * 1024)/4;
3934 // block all process callback handling
3936 block_processing ();
3938 /* call tree *MUST* hold route_lock */
3940 if ((playlist = track.playlist()) == 0) {
3944 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3946 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
3948 for (x = 0; x < 99999; ++x) {
3949 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());
3950 if (!Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
3956 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3961 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
3962 SourceFactory::createWritable (DataType::AUDIO, *this, buf, string(), false, frame_rate()));
3965 catch (failed_constructor& err) {
3966 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
3970 srcs.push_back (fsource);
3973 /* tell redirects that care that we are about to use a much larger
3974 * blocksize. this will flush all plugins too, so that they are ready
3975 * to be used for this process.
3978 need_block_size_reset = true;
3979 track.set_block_size (chunk_size);
3984 /* create a set of reasonably-sized buffers */
3985 buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
3986 buffers.set_count (max_proc);
3988 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3989 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3991 afs->prepare_for_peakfile_writes ();
3994 while (to_do && !itt.cancel) {
3996 this_chunk = min (to_do, chunk_size);
3998 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export)) {
4003 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4004 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4007 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
4013 start += this_chunk;
4014 to_do -= this_chunk;
4016 itt.progress = (float) (1.0 - ((double) to_do / len));
4025 xnow = localtime (&now);
4027 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
4028 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4031 afs->update_header (position, *xnow, now);
4032 afs->flush_header ();
4036 /* construct a region to represent the bounced material */
4040 plist.add (Properties::start, 0);
4041 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4042 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4044 result = RegionFactory::create (srcs, plist);
4050 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4051 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4054 afs->mark_for_remove ();
4057 (*src)->drop_references ();
4061 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4062 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4065 afs->done_with_peakfile_writes ();
4070 if (need_block_size_reset) {
4071 track.set_block_size (get_block_size());
4074 unblock_processing ();
4080 Session::gain_automation_buffer() const
4082 return ProcessThread::gain_automation_buffer ();
4086 Session::pan_automation_buffer() const
4088 return ProcessThread::pan_automation_buffer ();
4092 Session::get_silent_buffers (ChanCount count)
4094 return ProcessThread::get_silent_buffers (count);
4098 Session::get_scratch_buffers (ChanCount count)
4100 return ProcessThread::get_scratch_buffers (count);
4104 Session::get_mix_buffers (ChanCount count)
4106 return ProcessThread::get_mix_buffers (count);
4110 Session::ntracks () const
4113 boost::shared_ptr<RouteList> r = routes.reader ();
4115 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4116 if (boost::dynamic_pointer_cast<Track> (*i)) {
4125 Session::nbusses () const
4128 boost::shared_ptr<RouteList> r = routes.reader ();
4130 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4131 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
4140 Session::add_automation_list(AutomationList *al)
4142 automation_lists[al->id()] = al;
4146 Session::sync_order_keys (std::string const & base)
4148 if (deletion_in_progress()) {
4152 if (!Config->get_sync_all_route_ordering()) {
4153 /* leave order keys as they are */
4157 boost::shared_ptr<RouteList> r = routes.reader ();
4159 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4160 (*i)->sync_order_keys (base);
4163 Route::SyncOrderKeys (base); // EMIT SIGNAL
4165 /* this might not do anything */
4167 set_remote_control_ids ();
4170 /** @return true if there is at least one record-enabled track, otherwise false */
4172 Session::have_rec_enabled_track () const
4174 return g_atomic_int_get (&_have_rec_enabled_track) == 1;
4177 /** Update the state of our rec-enabled tracks flag */
4179 Session::update_have_rec_enabled_track ()
4181 boost::shared_ptr<RouteList> rl = routes.reader ();
4182 RouteList::iterator i = rl->begin();
4183 while (i != rl->end ()) {
4185 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4186 if (tr && tr->record_enabled ()) {
4193 int const old = g_atomic_int_get (&_have_rec_enabled_track);
4195 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4197 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4198 RecordStateChanged (); /* EMIT SIGNAL */
4203 Session::listen_position_changed ()
4205 boost::shared_ptr<RouteList> r = routes.reader ();
4207 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4208 (*i)->listen_position_changed ();
4213 Session::solo_control_mode_changed ()
4215 /* cancel all solo or all listen when solo control mode changes */
4218 set_solo (get_routes(), false);
4219 } else if (listening()) {
4220 set_listen (get_routes(), false);
4224 /** Called when a property of one of our route groups changes */
4226 Session::route_group_property_changed (RouteGroup* rg)
4228 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4231 /** Called when a route is added to one of our route groups */
4233 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4235 RouteAddedToRouteGroup (rg, r);
4238 /** Called when a route is removed from one of our route groups */
4240 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4242 RouteRemovedFromRouteGroup (rg, r);
4246 Session::get_available_sync_options () const
4248 vector<SyncSource> ret;
4250 ret.push_back (JACK);
4251 ret.push_back (MTC);
4252 ret.push_back (MIDIClock);
4257 boost::shared_ptr<RouteList>
4258 Session::get_routes_with_regions_at (framepos_t const p) const
4260 boost::shared_ptr<RouteList> r = routes.reader ();
4261 boost::shared_ptr<RouteList> rl (new RouteList);
4263 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4264 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4269 boost::shared_ptr<Playlist> pl = tr->playlist ();
4274 if (pl->has_region_at (p)) {
4283 Session::goto_end ()
4285 if (_session_range_location) {
4286 request_locate (_session_range_location->end(), false);
4288 request_locate (0, false);
4293 Session::goto_start ()
4295 if (_session_range_location) {
4296 request_locate (_session_range_location->start(), false);
4298 request_locate (0, false);
4303 Session::current_start_frame () const
4305 return _session_range_location ? _session_range_location->start() : 0;
4309 Session::current_end_frame () const
4311 return _session_range_location ? _session_range_location->end() : 0;
4315 Session::add_session_range_location (framepos_t start, framepos_t end)
4317 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4318 _locations->add (_session_range_location);
4321 /** Called when one of our routes' order keys has changed */
4323 Session::route_order_key_changed ()
4325 RouteOrderKeyChanged (); /* EMIT SIGNAL */
4329 Session::step_edit_status_change (bool yn)
4335 send = (_step_editors == 0);
4340 send = (_step_editors == 1);
4343 if (_step_editors > 0) {
4349 StepEditStatusChange (val);
4355 Session::start_time_changed (framepos_t old)
4357 /* Update the auto loop range to match the session range
4358 (unless the auto loop range has been changed by the user)
4361 Location* s = _locations->session_range_location ();
4366 Location* l = _locations->auto_loop_location ();
4368 if (l && l->start() == old) {
4369 l->set_start (s->start(), true);
4374 Session::end_time_changed (framepos_t old)
4376 /* Update the auto loop range to match the session range
4377 (unless the auto loop range has been changed by the user)
4380 Location* s = _locations->session_range_location ();
4385 Location* l = _locations->auto_loop_location ();
4387 if (l && l->end() == old) {
4388 l->set_end (s->end(), true);
4393 Session::source_search_path (DataType type) const
4397 if (session_dirs.size() == 1) {
4399 case DataType::AUDIO:
4400 s.push_back ( _session_dir->sound_path().to_string());
4402 case DataType::MIDI:
4403 s.push_back (_session_dir->midi_path().to_string());
4407 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4408 SessionDirectory sdir (i->path);
4410 case DataType::AUDIO:
4411 s.push_back (sdir.sound_path().to_string());
4413 case DataType::MIDI:
4414 s.push_back (sdir.midi_path().to_string());
4420 /* now check the explicit (possibly user-specified) search path
4423 vector<string> dirs;
4426 case DataType::AUDIO:
4427 split (config.get_audio_search_path (), dirs, ':');
4429 case DataType::MIDI:
4430 split (config.get_midi_search_path (), dirs, ':');
4434 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4436 vector<string>::iterator si;
4438 for (si = s.begin(); si != s.end(); ++si) {
4444 if (si == s.end()) {
4451 for (vector<string>::iterator si = s.begin(); si != s.end(); ++si) {
4452 if (!search_path.empty()) {
4462 Session::ensure_search_path_includes (const string& path, DataType type)
4465 vector<string> dirs;
4472 case DataType::AUDIO:
4473 search_path = config.get_audio_search_path ();
4475 case DataType::MIDI:
4476 search_path = config.get_midi_search_path ();
4480 split (search_path, dirs, ':');
4482 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4483 /* No need to add this new directory if it has the same inode as
4484 an existing one; checking inode rather than name prevents duplicated
4485 directories when we are using symlinks.
4487 On Windows, I think we could just do if (*i == path) here.
4489 if (PBD::sys::inodes_same (*i, path)) {
4494 if (!search_path.empty()) {
4498 search_path += path;
4501 case DataType::AUDIO:
4502 config.set_audio_search_path (search_path);
4504 case DataType::MIDI:
4505 config.set_midi_search_path (search_path);
4510 boost::shared_ptr<Speakers>
4511 Session::get_speakers()
4517 Session::unknown_processors () const
4521 boost::shared_ptr<RouteList> r = routes.reader ();
4522 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4523 list<string> t = (*i)->unknown_processors ();
4524 copy (t.begin(), t.end(), back_inserter (p));
4534 Session::update_latency (bool playback)
4536 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
4538 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4542 boost::shared_ptr<RouteList> r = routes.reader ();
4543 framecnt_t max_latency = 0;
4546 /* reverse the list so that we work backwards from the last route to run to the first */
4547 RouteList* rl = routes.reader().get();
4548 r.reset (new RouteList (*rl));
4549 reverse (r->begin(), r->end());
4552 /* compute actual latency values for the given direction and store them all in per-port
4553 structures. this will also publish the same values (to JACK) so that computation of latency
4554 for routes can consistently use public latency values.
4557 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4558 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
4561 /* because we latency compensate playback, our published playback latencies should
4562 be the same for all output ports - all material played back by ardour has
4563 the same latency, whether its caused by plugins or by latency compensation. since
4564 these may differ from the values computed above, reset all playback port latencies
4568 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
4570 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4571 (*i)->set_public_port_latencies (max_latency, playback);
4576 post_playback_latency ();
4580 post_capture_latency ();
4583 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
4587 Session::post_playback_latency ()
4589 set_worst_playback_latency ();
4591 boost::shared_ptr<RouteList> r = routes.reader ();
4593 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4594 if (!(*i)->is_hidden() && ((*i)->active())) {
4595 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
4599 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4600 (*i)->set_latency_compensation (_worst_track_latency);
4605 Session::post_capture_latency ()
4607 set_worst_capture_latency ();
4609 /* reflect any changes in capture latencies into capture offsets
4612 boost::shared_ptr<RouteList> rl = routes.reader();
4613 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4614 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4616 tr->set_capture_offset ();
4622 Session::initialize_latencies ()
4625 Glib::Mutex::Lock lm (_engine.process_lock());
4626 update_latency (false);
4627 update_latency (true);
4630 set_worst_io_latencies ();
4634 Session::set_worst_io_latencies ()
4636 set_worst_playback_latency ();
4637 set_worst_capture_latency ();
4641 Session::set_worst_playback_latency ()
4643 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4647 _worst_output_latency = 0;
4649 if (!_engine.connected()) {
4653 boost::shared_ptr<RouteList> r = routes.reader ();
4655 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4656 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
4659 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
4663 Session::set_worst_capture_latency ()
4665 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4669 _worst_input_latency = 0;
4671 if (!_engine.connected()) {
4675 boost::shared_ptr<RouteList> r = routes.reader ();
4677 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4678 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
4681 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
4685 Session::update_latency_compensation (bool force_whole_graph)
4687 bool some_track_latency_changed = false;
4689 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4693 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
4695 _worst_track_latency = 0;
4697 boost::shared_ptr<RouteList> r = routes.reader ();
4699 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4700 if (!(*i)->is_hidden() && ((*i)->active())) {
4702 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
4703 some_track_latency_changed = true;
4705 _worst_track_latency = max (tl, _worst_track_latency);
4709 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
4710 (some_track_latency_changed ? "yes" : "no")));
4712 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
4714 if (some_track_latency_changed || force_whole_graph) {
4715 _engine.update_latencies ();
4719 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4720 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4724 tr->set_capture_offset ();
4729 Session::session_name_is_legal (const string& path)
4731 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
4733 for (int i = 0; illegal_chars[i]; ++i) {
4734 if (path.find (illegal_chars[i]) != string::npos) {
4735 return illegal_chars[i];
4743 Session::next_control_id () const
4745 return ntracks() + nbusses() + 1;