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/unwind.h"
50 #include "ardour/amp.h"
51 #include "ardour/analyser.h"
52 #include "ardour/audio_buffer.h"
53 #include "ardour/audio_diskstream.h"
54 #include "ardour/audio_port.h"
55 #include "ardour/audio_track.h"
56 #include "ardour/audioengine.h"
57 #include "ardour/audiofilesource.h"
58 #include "ardour/auditioner.h"
59 #include "ardour/buffer_manager.h"
60 #include "ardour/buffer_set.h"
61 #include "ardour/bundle.h"
62 #include "ardour/butler.h"
63 #include "ardour/click.h"
64 #include "ardour/control_protocol_manager.h"
65 #include "ardour/data_type.h"
66 #include "ardour/debug.h"
67 #include "ardour/filename_extensions.h"
68 #include "ardour/graph.h"
69 #include "ardour/midi_track.h"
70 #include "ardour/midi_ui.h"
71 #include "ardour/named_selection.h"
72 #include "ardour/operations.h"
73 #include "ardour/playlist.h"
74 #include "ardour/plugin.h"
75 #include "ardour/plugin_insert.h"
76 #include "ardour/process_thread.h"
77 #include "ardour/rc_configuration.h"
78 #include "ardour/recent_sessions.h"
79 #include "ardour/region.h"
80 #include "ardour/region_factory.h"
81 #include "ardour/route_graph.h"
82 #include "ardour/route_group.h"
83 #include "ardour/send.h"
84 #include "ardour/session.h"
85 #include "ardour/session_directory.h"
86 #include "ardour/session_playlists.h"
87 #include "ardour/smf_source.h"
88 #include "ardour/source_factory.h"
89 #include "ardour/utils.h"
91 #include "midi++/port.h"
92 #include "midi++/jack_midi_port.h"
93 #include "midi++/mmc.h"
94 #include "midi++/manager.h"
105 using namespace ARDOUR;
108 bool Session::_disable_all_loaded_plugins = false;
110 PBD::Signal1<void,std::string> Session::Dialog;
111 PBD::Signal0<int> Session::AskAboutPendingState;
112 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
113 PBD::Signal0<void> Session::SendFeedback;
114 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
116 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
117 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
118 PBD::Signal2<void,std::string, std::string> Session::Exported;
119 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
120 PBD::Signal0<void> Session::Quit;
121 PBD::Signal0<void> Session::FeedbackDetected;
122 PBD::Signal0<void> Session::SuccessfulGraphSort;
124 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
125 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
127 /** @param snapshot_name Snapshot name, without .ardour suffix */
128 Session::Session (AudioEngine &eng,
129 const string& fullpath,
130 const string& snapshot_name,
131 BusProfile* bus_profile,
134 , _target_transport_speed (0.0)
135 , _requested_return_frame (-1)
136 , _session_dir (new SessionDirectory(fullpath))
138 , _state_of_the_state (Clean)
139 , _butler (new Butler (*this))
140 , _post_transport_work (0)
141 , _send_timecode_update (false)
142 , _all_route_group (new RouteGroup (*this, "all"))
143 , routes (new RouteList)
144 , _total_free_4k_blocks (0)
145 , _total_free_4k_blocks_uncertain (false)
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 /* deregister all ports - there will be no process or any other
237 * callbacks from the engine any more.
240 Port::PortDrop (); /* EMIT SIGNAL */
242 /* clear history so that no references to objects are held any more */
246 /* clear state tree so that no references to objects are held any more */
250 /* reset dynamic state version back to default */
252 Stateful::loading_state_version = 0;
254 _butler->drop_references ();
258 delete midi_control_ui;
259 delete _all_route_group;
261 if (click_data != default_click) {
262 delete [] click_data;
265 if (click_emphasis_data != default_click_emphasis) {
266 delete [] click_emphasis_data;
271 /* clear out any pending dead wood from RCU managed objects */
276 AudioDiskstream::free_working_buffers();
278 /* tell everyone who is still standing that we're about to die */
281 /* tell everyone to drop references and delete objects as we go */
283 DEBUG_TRACE (DEBUG::Destruction, "delete named selections\n");
284 named_selections.clear ();
286 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
287 RegionFactory::delete_all_regions ();
289 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
291 /* reset these three references to special routes before we do the usual route delete thing */
294 _master_out.reset ();
295 _monitor_out.reset ();
298 RCUWriter<RouteList> writer (routes);
299 boost::shared_ptr<RouteList> r = writer.get_copy ();
301 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
302 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
303 (*i)->drop_references ();
307 /* writer goes out of scope and updates master */
311 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
312 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
313 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
314 i->second->drop_references ();
319 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
320 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
325 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
330 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
332 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
333 boost_debug_list_ptrs ();
338 Session::when_engine_running ()
340 string first_physical_output;
342 BootMessage (_("Set block size and sample rate"));
344 set_block_size (_engine.frames_per_cycle());
345 set_frame_rate (_engine.frame_rate());
347 BootMessage (_("Using configuration"));
349 boost::function<void (std::string)> ff (boost::bind (&Session::config_changed, this, _1, false));
350 boost::function<void (std::string)> ft (boost::bind (&Session::config_changed, this, _1, true));
352 Config->map_parameters (ff);
353 config.map_parameters (ft);
355 /* every time we reconnect, recompute worst case output latencies */
357 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
359 if (synced_to_jack()) {
360 _engine.transport_stop ();
363 if (config.get_jack_time_master()) {
364 _engine.transport_locate (_transport_frame);
372 _click_io.reset (new ClickIO (*this, "click"));
373 _click_gain.reset (new Amp (*this));
374 _click_gain->activate ();
376 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
378 /* existing state for Click */
381 if (Stateful::loading_state_version < 3000) {
382 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
384 const XMLNodeList& children (child->children());
385 XMLNodeList::const_iterator i = children.begin();
386 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
388 if (i != children.end()) {
389 c = _click_gain->set_state (**i, Stateful::loading_state_version);
395 _clicking = Config->get_clicking ();
399 error << _("could not setup Click I/O") << endmsg;
406 /* default state for Click: dual-mono to first 2 physical outputs */
409 _engine.get_physical_outputs (DataType::AUDIO, outs);
411 for (uint32_t physport = 0; physport < 2; ++physport) {
412 if (outs.size() > physport) {
413 if (_click_io->add_port (outs[physport], this)) {
414 // relax, even though its an error
419 if (_click_io->n_ports () > ChanCount::ZERO) {
420 _clicking = Config->get_clicking ();
425 catch (failed_constructor& err) {
426 error << _("cannot setup Click I/O") << endmsg;
429 BootMessage (_("Compute I/O Latencies"));
432 // XXX HOW TO ALERT UI TO THIS ? DO WE NEED TO?
435 BootMessage (_("Set up standard connections"));
437 vector<string> inputs[DataType::num_types];
438 vector<string> outputs[DataType::num_types];
439 for (uint32_t i = 0; i < DataType::num_types; ++i) {
440 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
441 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
444 /* Create a set of Bundle objects that map
445 to the physical I/O currently available. We create both
446 mono and stereo bundles, so that the common cases of mono
447 and stereo tracks get bundles to put in their mixer strip
448 in / out menus. There may be a nicer way of achieving that;
449 it doesn't really scale that well to higher channel counts
452 /* mono output bundles */
454 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
456 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
458 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
459 c->add_channel (_("mono"), DataType::AUDIO);
460 c->set_port (0, outputs[DataType::AUDIO][np]);
465 /* stereo output bundles */
467 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
468 if (np + 1 < outputs[DataType::AUDIO].size()) {
470 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
471 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
472 c->add_channel (_("L"), DataType::AUDIO);
473 c->set_port (0, outputs[DataType::AUDIO][np]);
474 c->add_channel (_("R"), DataType::AUDIO);
475 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
481 /* mono input bundles */
483 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
485 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
487 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
488 c->add_channel (_("mono"), DataType::AUDIO);
489 c->set_port (0, inputs[DataType::AUDIO][np]);
494 /* stereo input bundles */
496 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
497 if (np + 1 < inputs[DataType::AUDIO].size()) {
499 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
501 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
502 c->add_channel (_("L"), DataType::AUDIO);
503 c->set_port (0, inputs[DataType::AUDIO][np]);
504 c->add_channel (_("R"), DataType::AUDIO);
505 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
511 /* MIDI input bundles */
513 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
514 string n = inputs[DataType::MIDI][np];
515 boost::erase_first (n, X_("alsa_pcm:"));
517 boost::shared_ptr<Bundle> c (new Bundle (n, false));
518 c->add_channel ("", DataType::MIDI);
519 c->set_port (0, inputs[DataType::MIDI][np]);
523 /* MIDI output bundles */
525 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
526 string n = outputs[DataType::MIDI][np];
527 boost::erase_first (n, X_("alsa_pcm:"));
529 boost::shared_ptr<Bundle> c (new Bundle (n, true));
530 c->add_channel ("", DataType::MIDI);
531 c->set_port (0, outputs[DataType::MIDI][np]);
535 BootMessage (_("Setup signal flow and plugins"));
537 /* Reset all panners */
539 Delivery::reset_panners ();
541 /* this will cause the CPM to instantiate any protocols that are in use
542 * (or mandatory), which will pass it this Session, and then call
543 * set_state() on each instantiated protocol to match stored state.
546 ControlProtocolManager::instance().set_session (this);
548 /* This must be done after the ControlProtocolManager set_session above,
549 as it will set states for ports which the ControlProtocolManager creates.
552 MIDI::Manager::instance()->set_port_states (Config->midi_port_states ());
554 /* And this must be done after the MIDI::Manager::set_port_states as
555 * it will try to make connections whose details are loaded by set_port_states.
560 /* Let control protocols know that we are now all connected, so they
561 * could start talking to surfaces if they want to.
564 ControlProtocolManager::instance().midi_connectivity_established ();
566 if (_is_new && !no_auto_connect()) {
567 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock());
568 auto_connect_master_bus ();
571 _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
573 /* update latencies */
575 initialize_latencies ();
577 /* hook us up to the engine */
579 BootMessage (_("Connect to engine"));
580 _engine.set_session (this);
584 Session::auto_connect_master_bus ()
586 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
590 /* if requested auto-connect the outputs to the first N physical ports.
593 uint32_t limit = _master_out->n_outputs().n_total();
594 vector<string> outputs[DataType::num_types];
596 for (uint32_t i = 0; i < DataType::num_types; ++i) {
597 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
600 for (uint32_t n = 0; n < limit; ++n) {
601 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
603 if (outputs[p->type()].size() > n) {
604 connect_to = outputs[p->type()][n];
607 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
608 if (_master_out->output()->connect (p, connect_to, this)) {
609 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
618 Session::remove_monitor_section ()
624 /* force reversion to Solo-In-Place */
625 Config->set_solo_control_is_listen_control (false);
628 /* Hold process lock while doing this so that we don't hear bits and
629 * pieces of audio as we work on each route.
632 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
634 /* Connect tracks to monitor section. Note that in an
635 existing session, the internal sends will already exist, but we want the
636 routes to notice that they connect to the control out specifically.
640 boost::shared_ptr<RouteList> r = routes.reader ();
641 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
643 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
645 if ((*x)->is_monitor()) {
647 } else if ((*x)->is_master()) {
650 (*x)->remove_aux_or_listen (_monitor_out);
655 remove_route (_monitor_out);
656 auto_connect_master_bus ();
660 Session::add_monitor_section ()
664 if (_monitor_out || !_master_out) {
668 boost::shared_ptr<Route> r (new Route (*this, _("monitor"), Route::MonitorOut, DataType::AUDIO));
674 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
675 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
678 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
679 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
680 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
684 add_routes (rl, false, false, false);
686 assert (_monitor_out);
688 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
689 are undefined, at best.
692 uint32_t limit = _monitor_out->n_inputs().n_audio();
696 /* connect the inputs to the master bus outputs. this
697 * represents a separate data feed from the internal sends from
698 * each route. as of jan 2011, it allows the monitor section to
699 * conditionally ignore either the internal sends or the normal
700 * input feed, but we should really find a better way to do
704 _master_out->output()->disconnect (this);
706 for (uint32_t n = 0; n < limit; ++n) {
707 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
708 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
711 string connect_to = o->name();
712 if (_monitor_out->input()->connect (p, connect_to, this)) {
713 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
721 /* if monitor section is not connected, connect it to physical outs
724 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
726 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
728 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
731 _monitor_out->output()->connect_ports_to_bundle (b, this);
733 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
734 Config->get_monitor_bus_preferred_bundle())
740 /* Monitor bus is audio only */
742 uint32_t mod = n_physical_outputs.get (DataType::AUDIO);
743 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
744 vector<string> outputs[DataType::num_types];
746 for (uint32_t i = 0; i < DataType::num_types; ++i) {
747 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
753 for (uint32_t n = 0; n < limit; ++n) {
755 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
757 if (outputs[DataType::AUDIO].size() > (n % mod)) {
758 connect_to = outputs[DataType::AUDIO][n % mod];
761 if (!connect_to.empty()) {
762 if (_monitor_out->output()->connect (p, connect_to, this)) {
763 error << string_compose (
764 _("cannot connect control output %1 to %2"),
775 /* Hold process lock while doing this so that we don't hear bits and
776 * pieces of audio as we work on each route.
779 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
781 /* Connect tracks to monitor section. Note that in an
782 existing session, the internal sends will already exist, but we want the
783 routes to notice that they connect to the control out specifically.
787 boost::shared_ptr<RouteList> rls = routes.reader ();
789 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
791 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
793 if ((*x)->is_monitor()) {
795 } else if ((*x)->is_master()) {
798 (*x)->enable_monitor_send ();
804 Session::hookup_io ()
806 /* stop graph reordering notifications from
807 causing resorts, etc.
810 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
814 /* we delay creating the auditioner till now because
815 it makes its own connections to ports.
819 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
821 throw failed_constructor ();
823 a->use_new_diskstream ();
827 catch (failed_constructor& err) {
828 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
832 /* load bundles, which we may have postponed earlier on */
833 if (_bundle_xml_node) {
834 load_bundles (*_bundle_xml_node);
835 delete _bundle_xml_node;
838 /* Tell all IO objects to connect themselves together */
840 IO::enable_connecting ();
841 MIDI::JackMIDIPort::MakeConnections ();
843 /* Anyone who cares about input state, wake up and do something */
845 IOConnectionsComplete (); /* EMIT SIGNAL */
847 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
849 /* now handle the whole enchilada as if it was one
855 /* update the full solo state, which can't be
856 correctly determined on a per-route basis, but
857 needs the global overview that only the session
861 update_route_solo_state ();
865 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
867 boost::shared_ptr<Track> track = wp.lock ();
872 boost::shared_ptr<Playlist> playlist;
874 if ((playlist = track->playlist()) != 0) {
875 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
876 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
877 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
882 Session::record_enabling_legal () const
884 /* this used to be in here, but survey says.... we don't need to restrict it */
885 // if (record_status() == Recording) {
889 if (Config->get_all_safe()) {
896 Session::set_track_monitor_input_status (bool yn)
898 boost::shared_ptr<RouteList> rl = routes.reader ();
899 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
900 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
901 if (tr && tr->record_enabled ()) {
902 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
903 tr->request_jack_monitors_input (yn);
909 Session::auto_punch_start_changed (Location* location)
911 replace_event (SessionEvent::PunchIn, location->start());
913 if (get_record_enabled() && config.get_punch_in()) {
914 /* capture start has been changed, so save new pending state */
915 save_state ("", true);
920 Session::auto_punch_end_changed (Location* location)
922 framepos_t when_to_stop = location->end();
923 // when_to_stop += _worst_output_latency + _worst_input_latency;
924 replace_event (SessionEvent::PunchOut, when_to_stop);
928 Session::auto_punch_changed (Location* location)
930 framepos_t when_to_stop = location->end();
932 replace_event (SessionEvent::PunchIn, location->start());
933 //when_to_stop += _worst_output_latency + _worst_input_latency;
934 replace_event (SessionEvent::PunchOut, when_to_stop);
937 /** @param loc A loop location.
938 * @param pos Filled in with the start time of the required fade-out (in session frames).
939 * @param length Filled in with the length of the required fade-out.
942 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
944 pos = max (loc->start(), loc->end() - 64);
945 length = loc->end() - pos;
949 Session::auto_loop_changed (Location* location)
951 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
954 auto_loop_declick_range (location, dcp, dcl);
955 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
957 if (transport_rolling() && play_loop) {
960 // if (_transport_frame > location->end()) {
962 if (_transport_frame < location->start() || _transport_frame > location->end()) {
963 // relocate to beginning of loop
964 clear_events (SessionEvent::LocateRoll);
966 request_locate (location->start(), true);
969 else if (Config->get_seamless_loop() && !loop_changing) {
971 // schedule a locate-roll to refill the diskstreams at the
973 loop_changing = true;
975 if (location->end() > last_loopend) {
976 clear_events (SessionEvent::LocateRoll);
977 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
984 last_loopend = location->end();
988 Session::set_auto_punch_location (Location* location)
992 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
993 punch_connections.drop_connections();
994 existing->set_auto_punch (false, this);
995 remove_event (existing->start(), SessionEvent::PunchIn);
996 clear_events (SessionEvent::PunchOut);
997 auto_punch_location_changed (0);
1002 if (location == 0) {
1006 if (location->end() <= location->start()) {
1007 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1011 punch_connections.drop_connections ();
1013 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
1014 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
1015 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
1017 location->set_auto_punch (true, this);
1019 auto_punch_changed (location);
1021 auto_punch_location_changed (location);
1025 Session::set_auto_loop_location (Location* location)
1029 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1030 loop_connections.drop_connections ();
1031 existing->set_auto_loop (false, this);
1032 remove_event (existing->end(), SessionEvent::AutoLoop);
1035 auto_loop_declick_range (existing, dcp, dcl);
1036 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1037 auto_loop_location_changed (0);
1042 if (location == 0) {
1046 if (location->end() <= location->start()) {
1047 error << _("Session: you can't use a mark for auto loop") << endmsg;
1051 last_loopend = location->end();
1053 loop_connections.drop_connections ();
1055 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1056 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1057 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1059 location->set_auto_loop (true, this);
1061 /* take care of our stuff first */
1063 auto_loop_changed (location);
1065 /* now tell everyone else */
1067 auto_loop_location_changed (location);
1071 Session::locations_added (Location *)
1077 Session::locations_changed ()
1079 _locations->apply (*this, &Session::handle_locations_changed);
1083 Session::handle_locations_changed (Locations::LocationList& locations)
1085 Locations::LocationList::iterator i;
1087 bool set_loop = false;
1088 bool set_punch = false;
1090 for (i = locations.begin(); i != locations.end(); ++i) {
1094 if (location->is_auto_punch()) {
1095 set_auto_punch_location (location);
1098 if (location->is_auto_loop()) {
1099 set_auto_loop_location (location);
1103 if (location->is_session_range()) {
1104 _session_range_location = location;
1109 set_auto_loop_location (0);
1112 set_auto_punch_location (0);
1119 Session::enable_record ()
1121 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1122 /* no recording at anything except normal speed */
1127 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1129 if (rs == Recording) {
1133 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1135 _last_record_location = _transport_frame;
1136 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1138 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1139 set_track_monitor_input_status (true);
1142 RecordStateChanged ();
1149 Session::disable_record (bool rt_context, bool force)
1153 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1155 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1156 g_atomic_int_set (&_record_status, Disabled);
1157 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1159 if (rs == Recording) {
1160 g_atomic_int_set (&_record_status, Enabled);
1164 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1165 set_track_monitor_input_status (false);
1168 RecordStateChanged (); /* emit signal */
1171 remove_pending_capture_state ();
1177 Session::step_back_from_record ()
1179 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1181 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1182 set_track_monitor_input_status (false);
1185 RecordStateChanged (); /* emit signal */
1190 Session::maybe_enable_record ()
1192 if (_step_editors > 0) {
1196 g_atomic_int_set (&_record_status, Enabled);
1198 /* This function is currently called from somewhere other than an RT thread.
1199 This save_state() call therefore doesn't impact anything. Doing it here
1200 means that we save pending state of which sources the next record will use,
1201 which gives us some chance of recovering from a crash during the record.
1204 save_state ("", true);
1206 if (_transport_speed) {
1207 if (!config.get_punch_in()) {
1211 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1212 RecordStateChanged (); /* EMIT SIGNAL */
1219 Session::audible_frame () const
1225 /* the first of these two possible settings for "offset"
1226 mean that the audible frame is stationary until
1227 audio emerges from the latency compensation
1230 the second means that the audible frame is stationary
1231 until audio would emerge from a physical port
1232 in the absence of any plugin latency compensation
1235 offset = worst_playback_latency ();
1237 if (offset > current_block_size) {
1238 offset -= current_block_size;
1240 /* XXX is this correct? if we have no external
1241 physical connections and everything is internal
1242 then surely this is zero? still, how
1243 likely is that anyway?
1245 offset = current_block_size;
1248 if (synced_to_jack()) {
1249 tf = _engine.transport_frame();
1251 tf = _transport_frame;
1256 if (!non_realtime_work_pending()) {
1260 /* Check to see if we have passed the first guaranteed
1261 audible frame past our last start position. if not,
1262 return that last start point because in terms
1263 of audible frames, we have not moved yet.
1265 `Start position' in this context means the time we last
1266 either started or changed transport direction.
1269 if (_transport_speed > 0.0f) {
1271 if (!play_loop || !have_looped) {
1272 if (tf < _last_roll_or_reversal_location + offset) {
1273 return _last_roll_or_reversal_location;
1281 } else if (_transport_speed < 0.0f) {
1283 /* XXX wot? no backward looping? */
1285 if (tf > _last_roll_or_reversal_location - offset) {
1286 return _last_roll_or_reversal_location;
1298 Session::set_frame_rate (framecnt_t frames_per_second)
1300 /** \fn void Session::set_frame_size(framecnt_t)
1301 the AudioEngine object that calls this guarantees
1302 that it will not be called while we are also in
1303 ::process(). Its fine to do things that block
1307 _base_frame_rate = frames_per_second;
1311 Automatable::set_automation_interval (ceil ((double) frames_per_second * (0.001 * Config->get_automation_interval())));
1315 // XXX we need some equivalent to this, somehow
1316 // SndFileSource::setup_standard_crossfades (frames_per_second);
1320 /* XXX need to reset/reinstantiate all LADSPA plugins */
1324 Session::set_block_size (pframes_t nframes)
1326 /* the AudioEngine guarantees
1327 that it will not be called while we are also in
1328 ::process(). It is therefore fine to do things that block
1333 current_block_size = nframes;
1337 boost::shared_ptr<RouteList> r = routes.reader ();
1339 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1340 (*i)->set_block_size (nframes);
1343 boost::shared_ptr<RouteList> rl = routes.reader ();
1344 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1345 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1347 tr->set_block_size (nframes);
1351 set_worst_io_latencies ();
1357 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1359 boost::shared_ptr<Route> r2;
1361 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1362 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1366 /* make a copy of the existing list of routes that feed r1 */
1368 Route::FedBy existing (r1->fed_by());
1370 /* for each route that feeds r1, recurse, marking it as feeding
1374 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1375 if (!(r2 = i->r.lock ())) {
1376 /* (*i) went away, ignore it */
1380 /* r2 is a route that feeds r1 which somehow feeds base. mark
1381 base as being fed by r2
1384 rbase->add_fed_by (r2, i->sends_only);
1388 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1392 if (r1->feeds (r2) && r2->feeds (r1)) {
1396 /* now recurse, so that we can mark base as being fed by
1397 all routes that feed r2
1400 trace_terminal (r2, rbase);
1407 Session::resort_routes ()
1409 /* don't do anything here with signals emitted
1410 by Routes during initial setup or while we
1411 are being destroyed.
1414 if (_state_of_the_state & (InitialConnecting | Deletion)) {
1419 RCUWriter<RouteList> writer (routes);
1420 boost::shared_ptr<RouteList> r = writer.get_copy ();
1421 resort_routes_using (r);
1422 /* writer goes out of scope and forces update */
1426 boost::shared_ptr<RouteList> rl = routes.reader ();
1427 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1428 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1430 const Route::FedBy& fb ((*i)->fed_by());
1432 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1433 boost::shared_ptr<Route> sf = f->r.lock();
1435 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1443 /** This is called whenever we need to rebuild the graph of how we will process
1445 * @param r List of routes, in any order.
1449 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1451 /* We are going to build a directed graph of our routes;
1452 this is where the edges of that graph are put.
1457 /* Go through all routes doing two things:
1459 * 1. Collect the edges of the route graph. Each of these edges
1460 * is a pair of routes, one of which directly feeds the other
1461 * either by a JACK connection or by an internal send.
1463 * 2. Begin the process of making routes aware of which other
1464 * routes directly or indirectly feed them. This information
1465 * is used by the solo code.
1468 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1470 /* Clear out the route's list of direct or indirect feeds */
1471 (*i)->clear_fed_by ();
1473 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
1475 bool via_sends_only;
1477 /* See if this *j feeds *i according to the current state of the JACK
1478 connections and internal sends.
1480 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
1481 /* add the edge to the graph (part #1) */
1482 edges.add (*j, *i, via_sends_only);
1483 /* tell the route (for part #2) */
1484 (*i)->add_fed_by (*j, via_sends_only);
1489 /* Attempt a topological sort of the route graph */
1490 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
1492 if (sorted_routes) {
1493 /* We got a satisfactory topological sort, so there is no feedback;
1496 Note: the process graph rechain does not require a
1497 topologically-sorted list, but hey ho.
1499 if (_process_graph) {
1500 _process_graph->rechain (sorted_routes, edges);
1503 _current_route_graph = edges;
1505 /* Complete the building of the routes' lists of what directly
1506 or indirectly feeds them.
1508 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1509 trace_terminal (*i, *i);
1512 *r = *sorted_routes;
1515 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1516 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1517 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1518 (*i)->name(), (*i)->order_key (MixerSort)));
1522 SuccessfulGraphSort (); /* EMIT SIGNAL */
1525 /* The topological sort failed, so we have a problem. Tell everyone
1526 and stick to the old graph; this will continue to be processed, so
1527 until the feedback is fixed, what is played back will not quite
1528 reflect what is actually connected. Note also that we do not
1529 do trace_terminal here, as it would fail due to an endless recursion,
1530 so the solo code will think that everything is still connected
1534 FeedbackDetected (); /* EMIT SIGNAL */
1539 /** Find a route name starting with \a base, maybe followed by the
1540 * lowest \a id. \a id will always be added if \a definitely_add_number
1541 * is true on entry; otherwise it will only be added if required
1542 * to make the name unique.
1544 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1545 * The available route name with the lowest ID will be used, and \a id
1546 * will be set to the ID.
1548 * \return false if a route name could not be found, and \a track_name
1549 * and \a id do not reflect a free route name.
1552 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1554 if (!definitely_add_number && route_by_name (base) == 0) {
1555 /* juse use the base */
1556 snprintf (name, name_len, "%s", base.c_str());
1561 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1563 if (route_by_name (name) == 0) {
1569 } while (id < (UINT_MAX-1));
1574 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
1576 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
1578 in = ChanCount::ZERO;
1579 out = ChanCount::ZERO;
1581 boost::shared_ptr<RouteList> r = routes.reader ();
1583 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1584 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1585 if (tr && !tr->is_hidden()) {
1586 in += tr->n_inputs();
1587 out += tr->n_outputs();
1592 /** Caller must not hold process lock
1593 * @param name_template string to use for the start of the name, or "" to use "MIDI".
1594 * @param instrument plugin info for the instrument to insert pre-fader, if any
1596 list<boost::shared_ptr<MidiTrack> >
1597 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
1598 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1600 char track_name[32];
1601 uint32_t track_id = 0;
1603 RouteList new_routes;
1604 list<boost::shared_ptr<MidiTrack> > ret;
1606 cerr << "Adding MIDI track with in = " << input << " out = " << output << endl;
1608 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
1611 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1612 error << "cannot find name for new midi track" << endmsg;
1616 boost::shared_ptr<MidiTrack> track;
1619 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1621 if (track->init ()) {
1625 track->use_new_diskstream();
1627 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1628 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1631 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1632 if (track->input()->ensure_io (input, false, this)) {
1633 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
1637 if (track->output()->ensure_io (output, false, this)) {
1638 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
1643 track->non_realtime_input_change();
1646 route_group->add (track);
1649 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1651 if (Config->get_remote_model() == UserOrdered) {
1652 track->set_remote_control_id (next_control_id());
1655 new_routes.push_back (track);
1656 ret.push_back (track);
1659 catch (failed_constructor &err) {
1660 error << _("Session: could not create new midi track.") << endmsg;
1664 catch (AudioEngine::PortRegistrationFailure& pfe) {
1666 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;
1674 if (!new_routes.empty()) {
1675 add_routes (new_routes, true, true, true);
1678 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
1679 PluginPtr plugin = instrument->load (*this);
1680 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
1681 (*r)->add_processor (p, PreFader);
1691 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
1693 boost::shared_ptr<Route> midi_track (wmt.lock());
1699 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
1701 if (change.after.n_audio() <= change.before.n_audio()) {
1705 /* new audio ports: make sure the audio goes somewhere useful,
1706 unless the user has no-auto-connect selected.
1708 The existing ChanCounts don't matter for this call as they are only
1709 to do with matching input and output indices, and we are only changing
1715 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
1719 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1720 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1721 * @param output_start As \a input_start, but for outputs.
1724 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
1725 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
1727 if (!IO::connecting_legal) {
1731 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::NOT_LOCK);
1737 /* If both inputs and outputs are auto-connected to physical ports,
1738 use the max of input and output offsets to ensure auto-connected
1739 port numbers always match up (e.g. the first audio input and the
1740 first audio output of the route will have the same physical
1741 port number). Otherwise just use the lowest input or output
1745 DEBUG_TRACE (DEBUG::Graph,
1746 string_compose("Auto-connect: existing in = %1 out = %2\n",
1747 existing_inputs, existing_outputs));
1749 const bool in_out_physical =
1750 (Config->get_input_auto_connect() & AutoConnectPhysical)
1751 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1754 const ChanCount in_offset = in_out_physical
1755 ? ChanCount::max(existing_inputs, existing_outputs)
1758 const ChanCount out_offset = in_out_physical
1759 ? ChanCount::max(existing_inputs, existing_outputs)
1762 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1763 vector<string> physinputs;
1764 vector<string> physoutputs;
1766 _engine.get_physical_outputs (*t, physoutputs);
1767 _engine.get_physical_inputs (*t, physinputs);
1769 if (!physinputs.empty() && connect_inputs) {
1770 uint32_t nphysical_in = physinputs.size();
1772 DEBUG_TRACE (DEBUG::Graph,
1773 string_compose("There are %1 physical inputs of type %2\n",
1776 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1779 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1780 DEBUG_TRACE (DEBUG::Graph,
1781 string_compose("Get index %1 + %2 % %3 = %4\n",
1782 in_offset.get(*t), i, nphysical_in,
1783 (in_offset.get(*t) + i) % nphysical_in));
1784 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1787 DEBUG_TRACE (DEBUG::Graph,
1788 string_compose("Connect route %1 IN to %2\n",
1789 route->name(), port));
1791 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
1795 ChanCount one_added (*t, 1);
1796 existing_inputs += one_added;
1800 if (!physoutputs.empty()) {
1801 uint32_t nphysical_out = physoutputs.size();
1802 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
1805 if ((*t) == DataType::MIDI || Config->get_output_auto_connect() & AutoConnectPhysical) {
1806 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1807 } else if ((*t) == DataType::AUDIO && Config->get_output_auto_connect() & AutoConnectMaster) {
1808 /* master bus is audio only */
1809 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1810 port = _master_out->input()->ports().port(*t,
1811 i % _master_out->input()->n_ports().get(*t))->name();
1815 DEBUG_TRACE (DEBUG::Graph,
1816 string_compose("Connect route %1 OUT to %2\n",
1817 route->name(), port));
1819 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
1823 ChanCount one_added (*t, 1);
1824 existing_outputs += one_added;
1830 /** Caller must not hold process lock
1831 * @param name_template string to use for the start of the name, or "" to use "Audio".
1833 list< boost::shared_ptr<AudioTrack> >
1834 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
1835 uint32_t how_many, string name_template)
1837 char track_name[32];
1838 uint32_t track_id = 0;
1840 RouteList new_routes;
1841 list<boost::shared_ptr<AudioTrack> > ret;
1843 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
1846 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1847 error << "cannot find name for new audio track" << endmsg;
1851 boost::shared_ptr<AudioTrack> track;
1854 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
1856 if (track->init ()) {
1860 track->use_new_diskstream();
1862 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1863 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1866 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1868 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1869 error << string_compose (
1870 _("cannot configure %1 in/%2 out configuration for new audio track"),
1871 input_channels, output_channels)
1876 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1877 error << string_compose (
1878 _("cannot configure %1 in/%2 out configuration for new audio track"),
1879 input_channels, output_channels)
1886 route_group->add (track);
1889 track->non_realtime_input_change();
1891 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1892 if (Config->get_remote_model() == UserOrdered) {
1893 track->set_remote_control_id (next_control_id());
1896 new_routes.push_back (track);
1897 ret.push_back (track);
1900 catch (failed_constructor &err) {
1901 error << _("Session: could not create new audio track.") << endmsg;
1905 catch (AudioEngine::PortRegistrationFailure& pfe) {
1907 error << pfe.what() << endmsg;
1915 if (!new_routes.empty()) {
1916 add_routes (new_routes, true, true, true);
1922 /** Caller must not hold process lock.
1923 * @param name_template string to use for the start of the name, or "" to use "Bus".
1926 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
1929 uint32_t bus_id = 0;
1933 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
1936 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
1937 error << "cannot find name for new audio bus" << endmsg;
1942 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
1948 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1949 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
1952 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1954 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1955 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1956 input_channels, output_channels)
1962 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1963 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1964 input_channels, output_channels)
1971 route_group->add (bus);
1973 if (Config->get_remote_model() == UserOrdered) {
1974 bus->set_remote_control_id (next_control_id());
1977 bus->add_internal_return ();
1979 ret.push_back (bus);
1983 catch (failed_constructor &err) {
1984 error << _("Session: could not create new audio route.") << endmsg;
1988 catch (AudioEngine::PortRegistrationFailure& pfe) {
1989 error << pfe.what() << endmsg;
1999 add_routes (ret, false, true, true); // autoconnect outputs only
2007 Session::new_route_from_template (uint32_t how_many, const std::string& template_path)
2010 uint32_t control_id;
2012 uint32_t number = 0;
2014 if (!tree.read (template_path.c_str())) {
2018 XMLNode* node = tree.root();
2020 IO::disable_connecting ();
2022 control_id = next_control_id ();
2026 XMLNode node_copy (*node);
2028 /* Remove IDs of everything so that new ones are used */
2029 node_copy.remove_property_recursively (X_("id"));
2032 string const route_name = node_copy.property(X_("name"))->value ();
2034 /* generate a new name by adding a number to the end of the template name */
2036 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2037 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2041 /* set this name in the XML description that we are about to use */
2042 Route::set_name_in_state (node_copy, name);
2044 /* trim bitslots from listen sends so that new ones are used */
2045 XMLNodeList children = node_copy.children ();
2046 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2047 if ((*i)->name() == X_("Processor")) {
2048 XMLProperty* role = (*i)->property (X_("role"));
2049 if (role && role->value() == X_("Listen")) {
2050 (*i)->remove_property (X_("bitslot"));
2055 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2058 error << _("Session: cannot create track/bus from template description") << endmsg;
2062 if (boost::dynamic_pointer_cast<Track>(route)) {
2063 /* force input/output change signals so that the new diskstream
2064 picks up the configuration of the route. During session
2065 loading this normally happens in a different way.
2068 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2070 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2071 change.after = route->input()->n_ports();
2072 route->input()->changed (change, this);
2073 change.after = route->output()->n_ports();
2074 route->output()->changed (change, this);
2077 route->set_remote_control_id (control_id);
2080 ret.push_back (route);
2083 catch (failed_constructor &err) {
2084 error << _("Session: could not create new route from template") << endmsg;
2088 catch (AudioEngine::PortRegistrationFailure& pfe) {
2089 error << pfe.what() << endmsg;
2098 add_routes (ret, true, true, true);
2099 IO::enable_connecting ();
2106 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
2108 ChanCount existing_inputs;
2109 ChanCount existing_outputs;
2111 count_existing_track_channels (existing_inputs, existing_outputs);
2114 RCUWriter<RouteList> writer (routes);
2115 boost::shared_ptr<RouteList> r = writer.get_copy ();
2116 r->insert (r->end(), new_routes.begin(), new_routes.end());
2118 /* if there is no control out and we're not in the middle of loading,
2119 resort the graph here. if there is a control out, we will resort
2120 toward the end of this method. if we are in the middle of loading,
2121 we will resort when done.
2124 if (!_monitor_out && IO::connecting_legal) {
2125 resort_routes_using (r);
2129 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2131 boost::weak_ptr<Route> wpr (*x);
2132 boost::shared_ptr<Route> r (*x);
2134 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2135 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2136 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2137 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2138 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2139 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2140 r->order_key_changed.connect_same_thread (*this, boost::bind (&Session::route_order_key_changed, this));
2142 if (r->is_master()) {
2146 if (r->is_monitor()) {
2150 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2152 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2153 track_playlist_changed (boost::weak_ptr<Track> (tr));
2154 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2156 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2158 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2159 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2163 if (input_auto_connect || output_auto_connect) {
2164 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
2168 if (_monitor_out && IO::connecting_legal) {
2171 Glib::Mutex::Lock lm (_engine.process_lock());
2173 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2174 if ((*x)->is_monitor()) {
2176 } else if ((*x)->is_master()) {
2179 (*x)->enable_monitor_send ();
2190 save_state (_current_snapshot_name);
2193 RouteAdded (new_routes); /* EMIT SIGNAL */
2194 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
2198 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2200 boost::shared_ptr<RouteList> r = routes.reader ();
2201 boost::shared_ptr<Send> s;
2203 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2204 if ((s = (*i)->internal_send_for (dest)) != 0) {
2205 s->amp()->gain_control()->set_value (0.0);
2211 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2213 boost::shared_ptr<RouteList> r = routes.reader ();
2214 boost::shared_ptr<Send> s;
2216 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2217 if ((s = (*i)->internal_send_for (dest)) != 0) {
2218 s->amp()->gain_control()->set_value (1.0);
2224 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2226 boost::shared_ptr<RouteList> r = routes.reader ();
2227 boost::shared_ptr<Send> s;
2229 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2230 if ((s = (*i)->internal_send_for (dest)) != 0) {
2231 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2236 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2238 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2240 boost::shared_ptr<RouteList> r = routes.reader ();
2241 boost::shared_ptr<RouteList> t (new RouteList);
2243 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2244 /* no MIDI sends because there are no MIDI busses yet */
2245 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2250 add_internal_sends (dest, p, t);
2254 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2256 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2257 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
2262 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
2264 add_internal_send (dest, sender->before_processor_for_index (index), sender);
2268 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
2270 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
2274 if (!dest->internal_return()) {
2275 dest->add_internal_return ();
2278 sender->add_aux_send (dest, before);
2284 Session::remove_route (boost::shared_ptr<Route> route)
2286 if (route == _master_out) {
2290 route->set_solo (false, this);
2293 RCUWriter<RouteList> writer (routes);
2294 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2298 /* deleting the master out seems like a dumb
2299 idea, but its more of a UI policy issue
2303 if (route == _master_out) {
2304 _master_out = boost::shared_ptr<Route> ();
2307 if (route == _monitor_out) {
2308 _monitor_out.reset ();
2311 /* writer goes out of scope, forces route list update */
2314 update_route_solo_state ();
2316 // We need to disconnect the route's inputs and outputs
2318 route->input()->disconnect (0);
2319 route->output()->disconnect (0);
2321 /* if the route had internal sends sending to it, remove them */
2322 if (route->internal_return()) {
2324 boost::shared_ptr<RouteList> r = routes.reader ();
2325 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2326 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2328 (*i)->remove_processor (s);
2333 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2334 if (mt && mt->step_editing()) {
2335 if (_step_editors > 0) {
2340 update_latency_compensation ();
2343 /* Re-sort routes to remove the graph's current references to the one that is
2344 * going away, then flush old references out of the graph.
2348 if (_process_graph) {
2349 _process_graph->clear_other_chain ();
2352 /* get rid of it from the dead wood collection in the route list manager */
2354 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2358 /* try to cause everyone to drop their references */
2360 route->drop_references ();
2362 sync_order_keys (UndefinedSort);
2364 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2366 /* save the new state of the world */
2368 if (save_state (_current_snapshot_name)) {
2369 save_history (_current_snapshot_name);
2374 Session::route_mute_changed (void* /*src*/)
2380 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2382 boost::shared_ptr<Route> route = wpr.lock();
2384 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2388 if (route->listening_via_monitor ()) {
2390 if (Config->get_exclusive_solo()) {
2391 /* new listen: disable all other listen */
2392 boost::shared_ptr<RouteList> r = routes.reader ();
2393 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2394 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2397 (*i)->set_listen (false, this);
2403 } else if (_listen_cnt > 0) {
2408 update_route_solo_state ();
2411 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2413 boost::shared_ptr<Route> route = wpr.lock ();
2416 /* should not happen */
2417 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2421 bool send_changed = false;
2423 if (route->solo_isolated()) {
2424 if (_solo_isolated_cnt == 0) {
2425 send_changed = true;
2427 _solo_isolated_cnt++;
2428 } else if (_solo_isolated_cnt > 0) {
2429 _solo_isolated_cnt--;
2430 if (_solo_isolated_cnt == 0) {
2431 send_changed = true;
2436 IsolatedChanged (); /* EMIT SIGNAL */
2441 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2443 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
2445 if (!self_solo_change) {
2446 // session doesn't care about changes to soloed-by-others
2450 if (solo_update_disabled) {
2452 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
2456 boost::shared_ptr<Route> route = wpr.lock ();
2459 boost::shared_ptr<RouteList> r = routes.reader ();
2462 if (route->self_soloed()) {
2468 RouteGroup* rg = route->route_group ();
2469 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
2471 if (delta == 1 && Config->get_exclusive_solo()) {
2473 /* new solo: disable all other solos, but not the group if its solo-enabled */
2475 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2476 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2477 (leave_group_alone && ((*i)->route_group() == rg))) {
2480 (*i)->set_solo (false, this);
2484 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
2486 solo_update_disabled = true;
2488 RouteList uninvolved;
2490 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
2492 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2493 bool via_sends_only;
2494 bool in_signal_flow;
2496 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2497 (leave_group_alone && ((*i)->route_group() == rg))) {
2501 in_signal_flow = false;
2503 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
2505 if ((*i)->feeds (route, &via_sends_only)) {
2506 if (!via_sends_only) {
2507 if (!route->soloed_by_others_upstream()) {
2508 (*i)->mod_solo_by_others_downstream (delta);
2511 in_signal_flow = true;
2513 DEBUG_TRACE (DEBUG::Solo, "\tno feed from\n");
2516 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
2518 if (route->feeds (*i, &via_sends_only)) {
2519 /* propagate solo upstream only if routing other than
2520 sends is involved, but do consider the other route
2521 (*i) to be part of the signal flow even if only
2524 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
2528 route->soloed_by_others_downstream(),
2529 route->soloed_by_others_upstream()));
2530 if (!via_sends_only) {
2531 if (!route->soloed_by_others_downstream()) {
2532 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
2533 (*i)->mod_solo_by_others_upstream (delta);
2536 in_signal_flow = true;
2538 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
2541 if (!in_signal_flow) {
2542 uninvolved.push_back (*i);
2546 solo_update_disabled = false;
2547 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
2549 update_route_solo_state (r);
2551 /* now notify that the mute state of the routes not involved in the signal
2552 pathway of the just-solo-changed route may have altered.
2555 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2556 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1\n", (*i)->name()));
2557 (*i)->mute_changed (this);
2560 SoloChanged (); /* EMIT SIGNAL */
2565 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2567 /* now figure out if anything that matters is soloed (or is "listening")*/
2569 bool something_soloed = false;
2570 uint32_t listeners = 0;
2571 uint32_t isolated = 0;
2574 r = routes.reader();
2577 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2578 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2579 something_soloed = true;
2582 if (!(*i)->is_hidden() && (*i)->listening_via_monitor()) {
2583 if (Config->get_solo_control_is_listen_control()) {
2586 (*i)->set_listen (false, this);
2590 if ((*i)->solo_isolated()) {
2595 if (something_soloed != _non_soloed_outs_muted) {
2596 _non_soloed_outs_muted = something_soloed;
2597 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2600 _listen_cnt = listeners;
2602 if (isolated != _solo_isolated_cnt) {
2603 _solo_isolated_cnt = isolated;
2604 IsolatedChanged (); /* EMIT SIGNAL */
2608 boost::shared_ptr<RouteList>
2609 Session::get_routes_with_internal_returns() const
2611 boost::shared_ptr<RouteList> r = routes.reader ();
2612 boost::shared_ptr<RouteList> rl (new RouteList);
2614 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2615 if ((*i)->internal_return ()) {
2623 Session::io_name_is_legal (const std::string& name)
2625 boost::shared_ptr<RouteList> r = routes.reader ();
2627 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2628 if ((*i)->name() == name) {
2632 if ((*i)->has_io_processor_named (name)) {
2641 Session::set_exclusive_input_active (boost::shared_ptr<Route> rt, bool /*others_on*/)
2644 vector<string> connections;
2646 PortSet& ps (rt->input()->ports());
2648 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
2649 p->get_connections (connections);
2652 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
2653 routes_using_input_from (*s, rl);
2656 /* scan all relevant routes to see if others are on or off */
2658 bool others_are_already_on = false;
2660 for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
2662 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2664 if (mt->input_active()) {
2665 others_are_already_on = true;
2672 /* globally reverse other routes */
2674 for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
2676 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2678 mt->set_input_active (!others_are_already_on);
2685 Session::routes_using_input_from (const string& str, RouteList& rl)
2687 boost::shared_ptr<RouteList> r = routes.reader ();
2689 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2690 if ((*i)->input()->connected_to (str)) {
2696 boost::shared_ptr<Route>
2697 Session::route_by_name (string name)
2699 boost::shared_ptr<RouteList> r = routes.reader ();
2701 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2702 if ((*i)->name() == name) {
2707 return boost::shared_ptr<Route> ((Route*) 0);
2710 boost::shared_ptr<Route>
2711 Session::route_by_id (PBD::ID id)
2713 boost::shared_ptr<RouteList> r = routes.reader ();
2715 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2716 if ((*i)->id() == id) {
2721 return boost::shared_ptr<Route> ((Route*) 0);
2724 boost::shared_ptr<Track>
2725 Session::track_by_diskstream_id (PBD::ID id)
2727 boost::shared_ptr<RouteList> r = routes.reader ();
2729 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2730 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
2731 if (t && t->using_diskstream_id (id)) {
2736 return boost::shared_ptr<Track> ();
2739 boost::shared_ptr<Route>
2740 Session::route_by_remote_id (uint32_t id)
2742 boost::shared_ptr<RouteList> r = routes.reader ();
2744 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2745 if ((*i)->remote_control_id() == id) {
2750 return boost::shared_ptr<Route> ((Route*) 0);
2754 Session::playlist_region_added (boost::weak_ptr<Region> w)
2756 boost::shared_ptr<Region> r = w.lock ();
2761 /* These are the operations that are currently in progress... */
2762 list<GQuark> curr = _current_trans_quarks;
2765 /* ...and these are the operations during which we want to update
2766 the session range location markers.
2769 ops.push_back (Operations::capture);
2770 ops.push_back (Operations::paste);
2771 ops.push_back (Operations::duplicate_region);
2772 ops.push_back (Operations::insert_file);
2773 ops.push_back (Operations::insert_region);
2774 ops.push_back (Operations::drag_region_brush);
2775 ops.push_back (Operations::region_drag);
2776 ops.push_back (Operations::selection_grab);
2777 ops.push_back (Operations::region_fill);
2778 ops.push_back (Operations::fill_selection);
2779 ops.push_back (Operations::create_region);
2780 ops.push_back (Operations::region_copy);
2781 ops.push_back (Operations::fixed_time_region_copy);
2784 /* See if any of the current operations match the ones that we want */
2786 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
2788 /* If so, update the session range markers */
2790 maybe_update_session_range (r->position (), r->last_frame ());
2794 /** Update the session range markers if a is before the current start or
2795 * b is after the current end.
2798 Session::maybe_update_session_range (framepos_t a, framepos_t b)
2800 if (_state_of_the_state & Loading) {
2804 if (_session_range_location == 0) {
2806 add_session_range_location (a, b);
2810 if (a < _session_range_location->start()) {
2811 _session_range_location->set_start (a);
2814 if (b > _session_range_location->end()) {
2815 _session_range_location->set_end (b);
2821 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
2823 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2824 maybe_update_session_range (i->to, i->to + i->length);
2829 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
2831 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2832 maybe_update_session_range (i->from, i->to);
2836 /* Region management */
2838 boost::shared_ptr<Region>
2839 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2841 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2842 RegionFactory::RegionMap::const_iterator i;
2843 boost::shared_ptr<Region> region;
2845 Glib::Mutex::Lock lm (region_lock);
2847 for (i = regions.begin(); i != regions.end(); ++i) {
2851 if (region->whole_file()) {
2853 if (child->source_equivalent (region)) {
2859 return boost::shared_ptr<Region> ();
2863 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2865 set<boost::shared_ptr<Region> > relevant_regions;
2867 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2868 RegionFactory::get_regions_using_source (*s, relevant_regions);
2871 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2872 set<boost::shared_ptr<Region> >::iterator tmp;
2877 playlists->destroy_region (*r);
2878 RegionFactory::map_remove (*r);
2880 (*r)->drop_sources ();
2881 (*r)->drop_references ();
2883 relevant_regions.erase (r);
2888 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
2891 Glib::Mutex::Lock ls (source_lock);
2892 /* remove from the main source list */
2893 sources.erase ((*s)->id());
2896 (*s)->mark_for_remove ();
2897 (*s)->drop_references ();
2906 Session::remove_last_capture ()
2908 list<boost::shared_ptr<Source> > srcs;
2910 boost::shared_ptr<RouteList> rl = routes.reader ();
2911 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2912 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2917 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
2920 srcs.insert (srcs.end(), l.begin(), l.end());
2925 destroy_sources (srcs);
2927 save_state (_current_snapshot_name);
2932 /* Source Management */
2935 Session::add_source (boost::shared_ptr<Source> source)
2937 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
2938 pair<SourceMap::iterator,bool> result;
2940 entry.first = source->id();
2941 entry.second = source;
2944 Glib::Mutex::Lock lm (source_lock);
2945 result = sources.insert (entry);
2948 if (result.second) {
2950 /* yay, new source */
2952 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
2955 if (!fs->within_session()) {
2956 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
2962 boost::shared_ptr<AudioFileSource> afs;
2964 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
2965 if (Config->get_auto_analyse_audio()) {
2966 Analyser::queue_source_for_analysis (source, false);
2970 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
2975 Session::remove_source (boost::weak_ptr<Source> src)
2977 if (_state_of_the_state & Deletion) {
2981 SourceMap::iterator i;
2982 boost::shared_ptr<Source> source = src.lock();
2989 Glib::Mutex::Lock lm (source_lock);
2991 if ((i = sources.find (source->id())) != sources.end()) {
2996 if (!(_state_of_the_state & InCleanup)) {
2998 /* save state so we don't end up with a session file
2999 referring to non-existent sources.
3002 save_state (_current_snapshot_name);
3006 boost::shared_ptr<Source>
3007 Session::source_by_id (const PBD::ID& id)
3009 Glib::Mutex::Lock lm (source_lock);
3010 SourceMap::iterator i;
3011 boost::shared_ptr<Source> source;
3013 if ((i = sources.find (id)) != sources.end()) {
3020 boost::shared_ptr<Source>
3021 Session::source_by_path_and_channel (const string& path, uint16_t chn)
3023 Glib::Mutex::Lock lm (source_lock);
3025 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3026 boost::shared_ptr<AudioFileSource> afs
3027 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
3029 if (afs && afs->path() == path && chn == afs->channel()) {
3033 return boost::shared_ptr<Source>();
3037 Session::count_sources_by_origin (const string& path)
3040 Glib::Mutex::Lock lm (source_lock);
3042 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3043 boost::shared_ptr<FileSource> fs
3044 = boost::dynamic_pointer_cast<FileSource>(i->second);
3046 if (fs && fs->origin() == path) {
3056 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
3059 string old_basename = PBD::basename_nosuffix (oldname);
3060 string new_legalized = legalize_for_path (newname);
3062 /* note: we know (or assume) the old path is already valid */
3066 /* destructive file sources have a name of the form:
3068 /path/to/Tnnnn-NAME(%[LR])?.wav
3070 the task here is to replace NAME with the new name.
3075 string::size_type dash;
3077 dir = Glib::path_get_dirname (path);
3078 path = Glib::path_get_basename (path);
3080 /* '-' is not a legal character for the NAME part of the path */
3082 if ((dash = path.find_last_of ('-')) == string::npos) {
3086 prefix = path.substr (0, dash);
3090 path += new_legalized;
3091 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3092 path = Glib::build_filename (dir, path);
3096 /* non-destructive file sources have a name of the form:
3098 /path/to/NAME-nnnnn(%[LR])?.ext
3100 the task here is to replace NAME with the new name.
3105 string::size_type dash;
3106 string::size_type postfix;
3108 dir = Glib::path_get_dirname (path);
3109 path = Glib::path_get_basename (path);
3111 /* '-' is not a legal character for the NAME part of the path */
3113 if ((dash = path.find_last_of ('-')) == string::npos) {
3117 suffix = path.substr (dash+1);
3119 // Suffix is now everything after the dash. Now we need to eliminate
3120 // the nnnnn part, which is done by either finding a '%' or a '.'
3122 postfix = suffix.find_last_of ("%");
3123 if (postfix == string::npos) {
3124 postfix = suffix.find_last_of ('.');
3127 if (postfix != string::npos) {
3128 suffix = suffix.substr (postfix);
3130 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
3134 const uint32_t limit = 10000;
3135 char buf[PATH_MAX+1];
3137 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
3139 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
3141 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
3142 path = Glib::build_filename (dir, buf);
3150 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
3159 /** Return the full path (in some session directory) for a new within-session source.
3160 * \a name must be a session-unique name that does not contain slashes
3161 * (e.g. as returned by new_*_source_name)
3164 Session::new_source_path_from_name (DataType type, const string& name)
3166 assert(name.find("/") == string::npos);
3168 SessionDirectory sdir(get_best_session_directory_for_new_source());
3171 if (type == DataType::AUDIO) {
3172 p = sdir.sound_path();
3173 } else if (type == DataType::MIDI) {
3174 p = sdir.midi_path();
3176 error << "Unknown source type, unable to create file path" << endmsg;
3180 return Glib::build_filename (p, name);
3184 Session::peak_path (string base) const
3186 return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
3189 /** Return a unique name based on \a base for a new internal audio source */
3191 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
3194 char buf[PATH_MAX+1];
3195 const uint32_t limit = 10000;
3197 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3200 legalized = legalize_for_path (base);
3202 // Find a "version" of the base name that doesn't exist in any of the possible directories.
3203 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3205 vector<space_and_path>::iterator i;
3206 uint32_t existing = 0;
3208 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3213 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3214 cnt, legalized.c_str(), ext.c_str());
3215 } else if (nchan == 2) {
3217 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
3218 cnt, legalized.c_str(), ext.c_str());
3220 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
3221 cnt, legalized.c_str(), ext.c_str());
3223 } else if (nchan < 26) {
3224 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
3225 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
3227 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3228 cnt, legalized.c_str(), ext.c_str());
3234 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3235 } else if (nchan == 2) {
3237 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
3239 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
3241 } else if (nchan < 26) {
3242 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
3244 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3248 SessionDirectory sdir((*i).path);
3250 string spath = sdir.sound_path();
3252 /* note that we search *without* the extension so that
3253 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3254 in the event that this new name is required for
3255 a file format change.
3258 if (matching_unsuffixed_filename_exists_in (spath, buf)) {
3264 if (existing == 0) {
3269 error << string_compose(
3270 _("There are already %1 recordings for %2, which I consider too many."),
3271 limit, base) << endmsg;
3273 throw failed_constructor();
3277 return Glib::path_get_basename (buf);
3280 /** Create a new within-session audio source */
3281 boost::shared_ptr<AudioFileSource>
3282 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
3284 const string name = new_audio_source_name (n, n_chans, chan, destructive);
3285 const string path = new_source_path_from_name(DataType::AUDIO, name);
3287 return boost::dynamic_pointer_cast<AudioFileSource> (
3288 SourceFactory::createWritable (DataType::AUDIO, *this, path, string(), destructive, frame_rate()));
3291 /** Return a unique name based on \a base for a new internal MIDI source */
3293 Session::new_midi_source_name (const string& base)
3296 char buf[PATH_MAX+1];
3297 const uint32_t limit = 10000;
3301 legalized = legalize_for_path (base);
3303 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3304 for (cnt = 1; cnt <= limit; ++cnt) {
3306 vector<space_and_path>::iterator i;
3307 uint32_t existing = 0;
3309 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3311 SessionDirectory sdir((*i).path);
3313 std::string p = Glib::build_filename (sdir.midi_path(), legalized);
3315 snprintf (buf, sizeof(buf), "%s-%u.mid", p.c_str(), cnt);
3317 if (Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
3322 if (existing == 0) {
3327 error << string_compose(
3328 _("There are already %1 recordings for %2, which I consider too many."),
3329 limit, base) << endmsg;
3331 throw failed_constructor();
3335 return Glib::path_get_basename(buf);
3339 /** Create a new within-session MIDI source */
3340 boost::shared_ptr<MidiSource>
3341 Session::create_midi_source_for_session (Track* track, string const & n)
3343 /* try to use the existing write source for the track, to keep numbering sane
3347 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3351 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3354 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3355 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3359 const string name = new_midi_source_name (n);
3360 const string path = new_source_path_from_name (DataType::MIDI, name);
3362 return boost::dynamic_pointer_cast<SMFSource> (
3363 SourceFactory::createWritable (
3364 DataType::MIDI, *this, path, string(), false, frame_rate()));
3369 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3371 if (playlist->hidden()) {
3375 playlists->add (playlist);
3378 playlist->release();
3385 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3387 if (_state_of_the_state & Deletion) {
3391 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3397 playlists->remove (playlist);
3403 Session::set_audition (boost::shared_ptr<Region> r)
3405 pending_audition_region = r;
3406 add_post_transport_work (PostTransportAudition);
3407 _butler->schedule_transport_work ();
3411 Session::audition_playlist ()
3413 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3414 ev->region.reset ();
3419 Session::non_realtime_set_audition ()
3421 assert (pending_audition_region);
3422 auditioner->audition_region (pending_audition_region);
3423 pending_audition_region.reset ();
3424 AuditionActive (true); /* EMIT SIGNAL */
3428 Session::audition_region (boost::shared_ptr<Region> r)
3430 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3436 Session::cancel_audition ()
3438 if (auditioner->auditioning()) {
3439 auditioner->cancel_audition ();
3440 AuditionActive (false); /* EMIT SIGNAL */
3445 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3447 if (a->is_monitor()) {
3450 if (b->is_monitor()) {
3453 return a->order_key (MixerSort) < b->order_key (MixerSort);
3457 Session::is_auditioning () const
3459 /* can be called before we have an auditioner object */
3461 return auditioner->auditioning();
3468 Session::graph_reordered ()
3470 /* don't do this stuff if we are setting up connections
3471 from a set_state() call or creating new tracks. Ditto for deletion.
3474 if (_state_of_the_state & (InitialConnecting|Deletion)) {
3478 /* every track/bus asked for this to be handled but it was deferred because
3479 we were connecting. do it now.
3482 request_input_change_handling ();
3486 /* force all diskstreams to update their capture offset values to
3487 reflect any changes in latencies within the graph.
3490 boost::shared_ptr<RouteList> rl = routes.reader ();
3491 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3492 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3494 tr->set_capture_offset ();
3499 /** @return Number of frames that there is disk space available to write,
3502 boost::optional<framecnt_t>
3503 Session::available_capture_duration ()
3505 if (_total_free_4k_blocks_uncertain) {
3506 return boost::optional<framecnt_t> ();
3509 float sample_bytes_on_disk = 4.0; // keep gcc happy
3511 switch (config.get_native_file_data_format()) {
3513 sample_bytes_on_disk = 4.0;
3517 sample_bytes_on_disk = 3.0;
3521 sample_bytes_on_disk = 2.0;
3525 /* impossible, but keep some gcc versions happy */
3526 fatal << string_compose (_("programming error: %1"),
3527 X_("illegal native file data format"))
3532 double scale = 4096.0 / sample_bytes_on_disk;
3534 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3535 return max_framecnt;
3538 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3542 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3545 RCUWriter<BundleList> writer (_bundles);
3546 boost::shared_ptr<BundleList> b = writer.get_copy ();
3547 b->push_back (bundle);
3550 BundleAdded (bundle); /* EMIT SIGNAL */
3556 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3558 bool removed = false;
3561 RCUWriter<BundleList> writer (_bundles);
3562 boost::shared_ptr<BundleList> b = writer.get_copy ();
3563 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3565 if (i != b->end()) {
3572 BundleRemoved (bundle); /* EMIT SIGNAL */
3578 boost::shared_ptr<Bundle>
3579 Session::bundle_by_name (string name) const
3581 boost::shared_ptr<BundleList> b = _bundles.reader ();
3583 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3584 if ((*i)->name() == name) {
3589 return boost::shared_ptr<Bundle> ();
3593 Session::tempo_map_changed (const PropertyChange&)
3597 playlists->update_after_tempo_map_change ();
3599 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3605 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3607 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3608 (*i)->recompute_frames_from_bbt ();
3612 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3613 * the given count with the current block size.
3616 Session::ensure_buffers (ChanCount howmany)
3618 BufferManager::ensure_buffers (howmany);
3622 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3624 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3625 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3630 Session::next_insert_id ()
3632 /* this doesn't really loop forever. just think about it */
3635 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3636 if (!insert_bitset[n]) {
3637 insert_bitset[n] = true;
3643 /* none available, so resize and try again */
3645 insert_bitset.resize (insert_bitset.size() + 16, false);
3650 Session::next_send_id ()
3652 /* this doesn't really loop forever. just think about it */
3655 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3656 if (!send_bitset[n]) {
3657 send_bitset[n] = true;
3663 /* none available, so resize and try again */
3665 send_bitset.resize (send_bitset.size() + 16, false);
3670 Session::next_aux_send_id ()
3672 /* this doesn't really loop forever. just think about it */
3675 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
3676 if (!aux_send_bitset[n]) {
3677 aux_send_bitset[n] = true;
3683 /* none available, so resize and try again */
3685 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
3690 Session::next_return_id ()
3692 /* this doesn't really loop forever. just think about it */
3695 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3696 if (!return_bitset[n]) {
3697 return_bitset[n] = true;
3703 /* none available, so resize and try again */
3705 return_bitset.resize (return_bitset.size() + 16, false);
3710 Session::mark_send_id (uint32_t id)
3712 if (id >= send_bitset.size()) {
3713 send_bitset.resize (id+16, false);
3715 if (send_bitset[id]) {
3716 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3718 send_bitset[id] = true;
3722 Session::mark_aux_send_id (uint32_t id)
3724 if (id >= aux_send_bitset.size()) {
3725 aux_send_bitset.resize (id+16, false);
3727 if (aux_send_bitset[id]) {
3728 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
3730 aux_send_bitset[id] = true;
3734 Session::mark_return_id (uint32_t id)
3736 if (id >= return_bitset.size()) {
3737 return_bitset.resize (id+16, false);
3739 if (return_bitset[id]) {
3740 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3742 return_bitset[id] = true;
3746 Session::mark_insert_id (uint32_t id)
3748 if (id >= insert_bitset.size()) {
3749 insert_bitset.resize (id+16, false);
3751 if (insert_bitset[id]) {
3752 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3754 insert_bitset[id] = true;
3758 Session::unmark_send_id (uint32_t id)
3760 if (id < send_bitset.size()) {
3761 send_bitset[id] = false;
3766 Session::unmark_aux_send_id (uint32_t id)
3768 if (id < aux_send_bitset.size()) {
3769 aux_send_bitset[id] = false;
3774 Session::unmark_return_id (uint32_t id)
3776 if (id < return_bitset.size()) {
3777 return_bitset[id] = false;
3782 Session::unmark_insert_id (uint32_t id)
3784 if (id < insert_bitset.size()) {
3785 insert_bitset[id] = false;
3790 /* Named Selection management */
3792 boost::shared_ptr<NamedSelection>
3793 Session::named_selection_by_name (string name)
3795 Glib::Mutex::Lock lm (named_selection_lock);
3796 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
3797 if ((*i)->name == name) {
3801 return boost::shared_ptr<NamedSelection>();
3805 Session::add_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3808 Glib::Mutex::Lock lm (named_selection_lock);
3809 named_selections.insert (named_selections.begin(), named_selection);
3814 NamedSelectionAdded (); /* EMIT SIGNAL */
3818 Session::remove_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3820 bool removed = false;
3823 Glib::Mutex::Lock lm (named_selection_lock);
3825 NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
3827 if (i != named_selections.end()) {
3828 named_selections.erase (i);
3835 NamedSelectionRemoved (); /* EMIT SIGNAL */
3840 Session::reset_native_file_format ()
3842 boost::shared_ptr<RouteList> rl = routes.reader ();
3843 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3844 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3846 /* don't save state as we do this, there's no point
3849 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3850 tr->reset_write_sources (false);
3851 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3857 Session::route_name_unique (string n) const
3859 boost::shared_ptr<RouteList> r = routes.reader ();
3861 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3862 if ((*i)->name() == n) {
3871 Session::route_name_internal (string n) const
3873 if (auditioner && auditioner->name() == n) {
3877 if (_click_io && _click_io->name() == n) {
3885 Session::freeze_all (InterThreadInfo& itt)
3887 boost::shared_ptr<RouteList> r = routes.reader ();
3889 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3891 boost::shared_ptr<Track> t;
3893 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3894 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3904 boost::shared_ptr<Region>
3905 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
3906 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3907 InterThreadInfo& itt,
3908 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
3911 boost::shared_ptr<Region> result;
3912 boost::shared_ptr<Playlist> playlist;
3913 boost::shared_ptr<AudioFileSource> fsource;
3915 char buf[PATH_MAX+1];
3916 ChanCount diskstream_channels (track.n_channels());
3917 framepos_t position;
3918 framecnt_t this_chunk;
3921 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3922 const string sound_dir = sdir.sound_path();
3923 framepos_t len = end - start;
3924 bool need_block_size_reset = false;
3926 ChanCount const max_proc = track.max_processor_streams ();
3929 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3930 end, start) << endmsg;
3934 const framecnt_t chunk_size = (256 * 1024)/4;
3936 // block all process callback handling
3938 block_processing ();
3940 /* call tree *MUST* hold route_lock */
3942 if ((playlist = track.playlist()) == 0) {
3946 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3948 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
3950 for (x = 0; x < 99999; ++x) {
3951 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());
3952 if (!Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
3958 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3963 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
3964 SourceFactory::createWritable (DataType::AUDIO, *this, buf, string(), false, frame_rate()));
3967 catch (failed_constructor& err) {
3968 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
3972 srcs.push_back (fsource);
3975 /* tell redirects that care that we are about to use a much larger
3976 * blocksize. this will flush all plugins too, so that they are ready
3977 * to be used for this process.
3980 need_block_size_reset = true;
3981 track.set_block_size (chunk_size);
3986 /* create a set of reasonably-sized buffers */
3987 buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
3988 buffers.set_count (max_proc);
3990 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3991 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3993 afs->prepare_for_peakfile_writes ();
3996 while (to_do && !itt.cancel) {
3998 this_chunk = min (to_do, chunk_size);
4000 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export)) {
4005 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4006 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4009 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
4015 start += this_chunk;
4016 to_do -= this_chunk;
4018 itt.progress = (float) (1.0 - ((double) to_do / len));
4027 xnow = localtime (&now);
4029 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
4030 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4033 afs->update_header (position, *xnow, now);
4034 afs->flush_header ();
4038 /* construct a region to represent the bounced material */
4042 plist.add (Properties::start, 0);
4043 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4044 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4046 result = RegionFactory::create (srcs, plist);
4052 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4053 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4056 afs->mark_for_remove ();
4059 (*src)->drop_references ();
4063 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4064 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4067 afs->done_with_peakfile_writes ();
4072 if (need_block_size_reset) {
4073 track.set_block_size (get_block_size());
4076 unblock_processing ();
4082 Session::gain_automation_buffer() const
4084 return ProcessThread::gain_automation_buffer ();
4088 Session::send_gain_automation_buffer() const
4090 return ProcessThread::send_gain_automation_buffer ();
4094 Session::pan_automation_buffer() const
4096 return ProcessThread::pan_automation_buffer ();
4100 Session::get_silent_buffers (ChanCount count)
4102 return ProcessThread::get_silent_buffers (count);
4106 Session::get_scratch_buffers (ChanCount count)
4108 return ProcessThread::get_scratch_buffers (count);
4112 Session::get_mix_buffers (ChanCount count)
4114 return ProcessThread::get_mix_buffers (count);
4118 Session::ntracks () const
4121 boost::shared_ptr<RouteList> r = routes.reader ();
4123 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4124 if (boost::dynamic_pointer_cast<Track> (*i)) {
4133 Session::nbusses () const
4136 boost::shared_ptr<RouteList> r = routes.reader ();
4138 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4139 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
4148 Session::add_automation_list(AutomationList *al)
4150 automation_lists[al->id()] = al;
4154 Session::sync_order_keys (RouteSortOrderKey base)
4156 if (deletion_in_progress()) {
4160 if (!Config->get_sync_all_route_ordering()) {
4161 /* leave order keys as they are */
4165 boost::shared_ptr<RouteList> r = routes.reader ();
4167 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4168 (*i)->sync_order_keys (base);
4171 Route::SyncOrderKeys (base); // EMIT SIGNAL
4174 /** @return true if there is at least one record-enabled track, otherwise false */
4176 Session::have_rec_enabled_track () const
4178 return g_atomic_int_get (&_have_rec_enabled_track) == 1;
4181 /** Update the state of our rec-enabled tracks flag */
4183 Session::update_have_rec_enabled_track ()
4185 boost::shared_ptr<RouteList> rl = routes.reader ();
4186 RouteList::iterator i = rl->begin();
4187 while (i != rl->end ()) {
4189 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4190 if (tr && tr->record_enabled ()) {
4197 int const old = g_atomic_int_get (&_have_rec_enabled_track);
4199 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4201 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4202 RecordStateChanged (); /* EMIT SIGNAL */
4207 Session::listen_position_changed ()
4209 boost::shared_ptr<RouteList> r = routes.reader ();
4211 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4212 (*i)->listen_position_changed ();
4217 Session::solo_control_mode_changed ()
4219 /* cancel all solo or all listen when solo control mode changes */
4222 set_solo (get_routes(), false);
4223 } else if (listening()) {
4224 set_listen (get_routes(), false);
4228 /** Called when a property of one of our route groups changes */
4230 Session::route_group_property_changed (RouteGroup* rg)
4232 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4235 /** Called when a route is added to one of our route groups */
4237 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4239 RouteAddedToRouteGroup (rg, r);
4242 /** Called when a route is removed from one of our route groups */
4244 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4246 RouteRemovedFromRouteGroup (rg, r);
4250 Session::get_available_sync_options () const
4252 vector<SyncSource> ret;
4254 ret.push_back (JACK);
4255 ret.push_back (MTC);
4256 ret.push_back (MIDIClock);
4261 boost::shared_ptr<RouteList>
4262 Session::get_routes_with_regions_at (framepos_t const p) const
4264 boost::shared_ptr<RouteList> r = routes.reader ();
4265 boost::shared_ptr<RouteList> rl (new RouteList);
4267 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4268 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4273 boost::shared_ptr<Playlist> pl = tr->playlist ();
4278 if (pl->has_region_at (p)) {
4287 Session::goto_end ()
4289 if (_session_range_location) {
4290 request_locate (_session_range_location->end(), false);
4292 request_locate (0, false);
4297 Session::goto_start ()
4299 if (_session_range_location) {
4300 request_locate (_session_range_location->start(), false);
4302 request_locate (0, false);
4307 Session::current_start_frame () const
4309 return _session_range_location ? _session_range_location->start() : 0;
4313 Session::current_end_frame () const
4315 return _session_range_location ? _session_range_location->end() : 0;
4319 Session::add_session_range_location (framepos_t start, framepos_t end)
4321 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4322 _locations->add (_session_range_location);
4325 /** Called when one of our routes' order keys has changed */
4327 Session::route_order_key_changed ()
4329 RouteOrderKeyChanged (); /* EMIT SIGNAL */
4333 Session::step_edit_status_change (bool yn)
4339 send = (_step_editors == 0);
4344 send = (_step_editors == 1);
4347 if (_step_editors > 0) {
4353 StepEditStatusChange (val);
4359 Session::start_time_changed (framepos_t old)
4361 /* Update the auto loop range to match the session range
4362 (unless the auto loop range has been changed by the user)
4365 Location* s = _locations->session_range_location ();
4370 Location* l = _locations->auto_loop_location ();
4372 if (l && l->start() == old) {
4373 l->set_start (s->start(), true);
4378 Session::end_time_changed (framepos_t old)
4380 /* Update the auto loop range to match the session range
4381 (unless the auto loop range has been changed by the user)
4384 Location* s = _locations->session_range_location ();
4389 Location* l = _locations->auto_loop_location ();
4391 if (l && l->end() == old) {
4392 l->set_end (s->end(), true);
4397 Session::source_search_path (DataType type) const
4401 if (session_dirs.size() == 1) {
4403 case DataType::AUDIO:
4404 s.push_back ( _session_dir->sound_path());
4406 case DataType::MIDI:
4407 s.push_back (_session_dir->midi_path());
4411 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4412 SessionDirectory sdir (i->path);
4414 case DataType::AUDIO:
4415 s.push_back (sdir.sound_path());
4417 case DataType::MIDI:
4418 s.push_back (sdir.midi_path());
4424 /* now check the explicit (possibly user-specified) search path
4427 vector<string> dirs;
4430 case DataType::AUDIO:
4431 split (config.get_audio_search_path (), dirs, ':');
4433 case DataType::MIDI:
4434 split (config.get_midi_search_path (), dirs, ':');
4438 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4440 vector<string>::iterator si;
4442 for (si = s.begin(); si != s.end(); ++si) {
4448 if (si == s.end()) {
4455 for (vector<string>::iterator si = s.begin(); si != s.end(); ++si) {
4456 if (!search_path.empty()) {
4466 Session::ensure_search_path_includes (const string& path, DataType type)
4469 vector<string> dirs;
4476 case DataType::AUDIO:
4477 search_path = config.get_audio_search_path ();
4479 case DataType::MIDI:
4480 search_path = config.get_midi_search_path ();
4484 split (search_path, dirs, ':');
4486 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4487 /* No need to add this new directory if it has the same inode as
4488 an existing one; checking inode rather than name prevents duplicated
4489 directories when we are using symlinks.
4491 On Windows, I think we could just do if (*i == path) here.
4493 if (PBD::equivalent_paths (*i, path)) {
4498 if (!search_path.empty()) {
4502 search_path += path;
4505 case DataType::AUDIO:
4506 config.set_audio_search_path (search_path);
4508 case DataType::MIDI:
4509 config.set_midi_search_path (search_path);
4514 boost::shared_ptr<Speakers>
4515 Session::get_speakers()
4521 Session::unknown_processors () const
4525 boost::shared_ptr<RouteList> r = routes.reader ();
4526 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4527 list<string> t = (*i)->unknown_processors ();
4528 copy (t.begin(), t.end(), back_inserter (p));
4538 Session::update_latency (bool playback)
4540 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
4542 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4546 boost::shared_ptr<RouteList> r = routes.reader ();
4547 framecnt_t max_latency = 0;
4550 /* reverse the list so that we work backwards from the last route to run to the first */
4551 RouteList* rl = routes.reader().get();
4552 r.reset (new RouteList (*rl));
4553 reverse (r->begin(), r->end());
4556 /* compute actual latency values for the given direction and store them all in per-port
4557 structures. this will also publish the same values (to JACK) so that computation of latency
4558 for routes can consistently use public latency values.
4561 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4562 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
4565 /* because we latency compensate playback, our published playback latencies should
4566 be the same for all output ports - all material played back by ardour has
4567 the same latency, whether its caused by plugins or by latency compensation. since
4568 these may differ from the values computed above, reset all playback port latencies
4572 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
4574 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4575 (*i)->set_public_port_latencies (max_latency, playback);
4580 post_playback_latency ();
4584 post_capture_latency ();
4587 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
4591 Session::post_playback_latency ()
4593 set_worst_playback_latency ();
4595 boost::shared_ptr<RouteList> r = routes.reader ();
4597 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4598 if (!(*i)->is_hidden() && ((*i)->active())) {
4599 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
4603 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4604 (*i)->set_latency_compensation (_worst_track_latency);
4609 Session::post_capture_latency ()
4611 set_worst_capture_latency ();
4613 /* reflect any changes in capture latencies into capture offsets
4616 boost::shared_ptr<RouteList> rl = routes.reader();
4617 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4618 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4620 tr->set_capture_offset ();
4626 Session::initialize_latencies ()
4629 Glib::Mutex::Lock lm (_engine.process_lock());
4630 update_latency (false);
4631 update_latency (true);
4634 set_worst_io_latencies ();
4638 Session::set_worst_io_latencies ()
4640 set_worst_playback_latency ();
4641 set_worst_capture_latency ();
4645 Session::set_worst_playback_latency ()
4647 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4651 _worst_output_latency = 0;
4653 if (!_engine.connected()) {
4657 boost::shared_ptr<RouteList> r = routes.reader ();
4659 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4660 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
4663 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
4667 Session::set_worst_capture_latency ()
4669 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4673 _worst_input_latency = 0;
4675 if (!_engine.connected()) {
4679 boost::shared_ptr<RouteList> r = routes.reader ();
4681 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4682 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
4685 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
4689 Session::update_latency_compensation (bool force_whole_graph)
4691 bool some_track_latency_changed = false;
4693 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4697 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
4699 _worst_track_latency = 0;
4701 boost::shared_ptr<RouteList> r = routes.reader ();
4703 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4704 if (!(*i)->is_hidden() && ((*i)->active())) {
4706 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
4707 some_track_latency_changed = true;
4709 _worst_track_latency = max (tl, _worst_track_latency);
4713 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
4714 (some_track_latency_changed ? "yes" : "no")));
4716 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
4718 if (some_track_latency_changed || force_whole_graph) {
4719 _engine.update_latencies ();
4723 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4724 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4728 tr->set_capture_offset ();
4733 Session::session_name_is_legal (const string& path)
4735 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
4737 for (int i = 0; illegal_chars[i]; ++i) {
4738 if (path.find (illegal_chars[i]) != string::npos) {
4739 return illegal_chars[i];
4747 Session::next_control_id () const
4751 /* the master and monitor bus remote ID's occupy a different
4752 * "namespace" than regular routes. their existence doesn't
4753 * affect normal (low) numbered routes.
4764 /* remote control IDs are based either on this
4765 value, or signal order, which is zero-based. so we have
4766 to ensure consistency of zero-based-ness for both
4767 sources of the number.
4769 we actually add 1 to the value to form an actual
4770 remote control ID, which is 1-based.
4773 cerr << "Next control ID will be " << ntracks() + (nbusses() - subtract) << endl;
4774 return ntracks() + (nbusses() - subtract);
4778 Session::operation_in_progress (GQuark op) const
4780 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());