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 ("signal")));
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;
1605 uint32_t control_id;
1607 cerr << "Adding MIDI track with in = " << input << " out = " << output << endl;
1609 control_id = next_control_id ();
1611 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
1614 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1615 error << "cannot find name for new midi track" << endmsg;
1619 boost::shared_ptr<MidiTrack> track;
1622 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1624 if (track->init ()) {
1628 track->use_new_diskstream();
1630 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1631 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1634 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1635 if (track->input()->ensure_io (input, false, this)) {
1636 error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
1640 if (track->output()->ensure_io (output, false, this)) {
1641 error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
1646 track->non_realtime_input_change();
1649 route_group->add (track);
1652 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1653 track->set_remote_control_id (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;
1842 uint32_t control_id;
1844 control_id = next_control_id ();
1846 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
1849 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1850 error << "cannot find name for new audio track" << endmsg;
1854 boost::shared_ptr<AudioTrack> track;
1857 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
1859 if (track->init ()) {
1863 track->use_new_diskstream();
1865 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1866 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1869 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1871 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1872 error << string_compose (
1873 _("cannot configure %1 in/%2 out configuration for new audio track"),
1874 input_channels, output_channels)
1879 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1880 error << string_compose (
1881 _("cannot configure %1 in/%2 out configuration for new audio track"),
1882 input_channels, output_channels)
1889 route_group->add (track);
1892 track->non_realtime_input_change();
1894 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1895 track->set_remote_control_id (control_id);
1898 new_routes.push_back (track);
1899 ret.push_back (track);
1902 catch (failed_constructor &err) {
1903 error << _("Session: could not create new audio track.") << endmsg;
1907 catch (AudioEngine::PortRegistrationFailure& pfe) {
1909 error << pfe.what() << endmsg;
1917 if (!new_routes.empty()) {
1918 add_routes (new_routes, true, true, true);
1925 Session::set_remote_control_ids ()
1927 RemoteModel m = Config->get_remote_model();
1928 bool emit_signal = false;
1930 boost::shared_ptr<RouteList> r = routes.reader ();
1932 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1933 if (MixerOrdered == m) {
1934 int32_t order = (*i)->order_key(N_("signal"));
1935 (*i)->set_remote_control_id (order+1, false);
1937 } else if (EditorOrdered == m) {
1938 int32_t order = (*i)->order_key(N_("editor"));
1939 (*i)->set_remote_control_id (order+1, false);
1941 } else if (UserOrdered == m) {
1942 //do nothing ... only changes to remote id's are initiated by user
1947 Route::RemoteControlIDChange();
1951 /** Caller must not hold process lock.
1952 * @param name_template string to use for the start of the name, or "" to use "Bus".
1955 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
1958 uint32_t bus_id = 0;
1961 uint32_t control_id;
1963 control_id = next_control_id ();
1965 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
1968 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
1969 error << "cannot find name for new audio bus" << endmsg;
1974 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
1980 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1981 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
1984 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1986 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1987 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1988 input_channels, output_channels)
1994 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1995 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1996 input_channels, output_channels)
2003 route_group->add (bus);
2005 bus->set_remote_control_id (control_id);
2008 bus->add_internal_return ();
2010 ret.push_back (bus);
2014 catch (failed_constructor &err) {
2015 error << _("Session: could not create new audio route.") << endmsg;
2019 catch (AudioEngine::PortRegistrationFailure& pfe) {
2020 error << pfe.what() << endmsg;
2030 add_routes (ret, false, true, true); // autoconnect outputs only
2038 Session::new_route_from_template (uint32_t how_many, const std::string& template_path)
2041 uint32_t control_id;
2043 uint32_t number = 0;
2045 if (!tree.read (template_path.c_str())) {
2049 XMLNode* node = tree.root();
2051 IO::disable_connecting ();
2053 control_id = next_control_id ();
2057 XMLNode node_copy (*node);
2059 /* Remove IDs of everything so that new ones are used */
2060 node_copy.remove_property_recursively (X_("id"));
2063 string const route_name = node_copy.property(X_("name"))->value ();
2065 /* generate a new name by adding a number to the end of the template name */
2067 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2068 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2072 /* set this name in the XML description that we are about to use */
2073 Route::set_name_in_state (node_copy, name);
2075 /* trim bitslots from listen sends so that new ones are used */
2076 XMLNodeList children = node_copy.children ();
2077 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2078 if ((*i)->name() == X_("Processor")) {
2079 XMLProperty* role = (*i)->property (X_("role"));
2080 if (role && role->value() == X_("Listen")) {
2081 (*i)->remove_property (X_("bitslot"));
2086 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2089 error << _("Session: cannot create track/bus from template description") << endmsg;
2093 if (boost::dynamic_pointer_cast<Track>(route)) {
2094 /* force input/output change signals so that the new diskstream
2095 picks up the configuration of the route. During session
2096 loading this normally happens in a different way.
2099 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2101 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2102 change.after = route->input()->n_ports();
2103 route->input()->changed (change, this);
2104 change.after = route->output()->n_ports();
2105 route->output()->changed (change, this);
2108 route->set_remote_control_id (control_id);
2111 ret.push_back (route);
2114 catch (failed_constructor &err) {
2115 error << _("Session: could not create new route from template") << endmsg;
2119 catch (AudioEngine::PortRegistrationFailure& pfe) {
2120 error << pfe.what() << endmsg;
2129 add_routes (ret, true, true, true);
2130 IO::enable_connecting ();
2137 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
2139 ChanCount existing_inputs;
2140 ChanCount existing_outputs;
2142 count_existing_track_channels (existing_inputs, existing_outputs);
2145 RCUWriter<RouteList> writer (routes);
2146 boost::shared_ptr<RouteList> r = writer.get_copy ();
2147 r->insert (r->end(), new_routes.begin(), new_routes.end());
2149 /* if there is no control out and we're not in the middle of loading,
2150 resort the graph here. if there is a control out, we will resort
2151 toward the end of this method. if we are in the middle of loading,
2152 we will resort when done.
2155 if (!_monitor_out && IO::connecting_legal) {
2156 resort_routes_using (r);
2160 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2162 boost::weak_ptr<Route> wpr (*x);
2163 boost::shared_ptr<Route> r (*x);
2165 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2166 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2167 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2168 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2169 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2170 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2171 r->order_key_changed.connect_same_thread (*this, boost::bind (&Session::route_order_key_changed, this));
2173 if (r->is_master()) {
2177 if (r->is_monitor()) {
2181 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2183 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2184 track_playlist_changed (boost::weak_ptr<Track> (tr));
2185 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2187 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2189 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2190 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2194 if (input_auto_connect || output_auto_connect) {
2195 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
2199 if (_monitor_out && IO::connecting_legal) {
2202 Glib::Mutex::Lock lm (_engine.process_lock());
2204 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2205 if ((*x)->is_monitor()) {
2207 } else if ((*x)->is_master()) {
2210 (*x)->enable_monitor_send ();
2221 save_state (_current_snapshot_name);
2224 RouteAdded (new_routes); /* EMIT SIGNAL */
2225 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
2229 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2231 boost::shared_ptr<RouteList> r = routes.reader ();
2232 boost::shared_ptr<Send> s;
2234 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2235 if ((s = (*i)->internal_send_for (dest)) != 0) {
2236 s->amp()->gain_control()->set_value (0.0);
2242 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2244 boost::shared_ptr<RouteList> r = routes.reader ();
2245 boost::shared_ptr<Send> s;
2247 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2248 if ((s = (*i)->internal_send_for (dest)) != 0) {
2249 s->amp()->gain_control()->set_value (1.0);
2255 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2257 boost::shared_ptr<RouteList> r = routes.reader ();
2258 boost::shared_ptr<Send> s;
2260 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2261 if ((s = (*i)->internal_send_for (dest)) != 0) {
2262 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2267 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2269 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2271 boost::shared_ptr<RouteList> r = routes.reader ();
2272 boost::shared_ptr<RouteList> t (new RouteList);
2274 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2275 /* no MIDI sends because there are no MIDI busses yet */
2276 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2281 add_internal_sends (dest, p, t);
2285 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2287 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2288 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
2293 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
2295 add_internal_send (dest, sender->before_processor_for_index (index), sender);
2299 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
2301 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
2305 if (!dest->internal_return()) {
2306 dest->add_internal_return ();
2309 sender->add_aux_send (dest, before);
2315 Session::remove_route (boost::shared_ptr<Route> route)
2317 if (route == _master_out) {
2321 route->set_solo (false, this);
2324 RCUWriter<RouteList> writer (routes);
2325 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2329 /* deleting the master out seems like a dumb
2330 idea, but its more of a UI policy issue
2334 if (route == _master_out) {
2335 _master_out = boost::shared_ptr<Route> ();
2338 if (route == _monitor_out) {
2339 _monitor_out.reset ();
2342 /* writer goes out of scope, forces route list update */
2345 update_route_solo_state ();
2347 // We need to disconnect the route's inputs and outputs
2349 route->input()->disconnect (0);
2350 route->output()->disconnect (0);
2352 /* if the route had internal sends sending to it, remove them */
2353 if (route->internal_return()) {
2355 boost::shared_ptr<RouteList> r = routes.reader ();
2356 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2357 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2359 (*i)->remove_processor (s);
2364 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2365 if (mt && mt->step_editing()) {
2366 if (_step_editors > 0) {
2371 update_latency_compensation ();
2374 /* Re-sort routes to remove the graph's current references to the one that is
2375 * going away, then flush old references out of the graph.
2379 if (_process_graph) {
2380 _process_graph->clear_other_chain ();
2383 /* get rid of it from the dead wood collection in the route list manager */
2385 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2389 /* try to cause everyone to drop their references */
2391 route->drop_references ();
2393 sync_order_keys (N_("session"));
2395 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2397 /* save the new state of the world */
2399 if (save_state (_current_snapshot_name)) {
2400 save_history (_current_snapshot_name);
2405 Session::route_mute_changed (void* /*src*/)
2411 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2413 boost::shared_ptr<Route> route = wpr.lock();
2415 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2419 if (route->listening_via_monitor ()) {
2421 if (Config->get_exclusive_solo()) {
2422 /* new listen: disable all other listen */
2423 boost::shared_ptr<RouteList> r = routes.reader ();
2424 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2425 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2428 (*i)->set_listen (false, this);
2434 } else if (_listen_cnt > 0) {
2439 update_route_solo_state ();
2442 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2444 boost::shared_ptr<Route> route = wpr.lock ();
2447 /* should not happen */
2448 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2452 bool send_changed = false;
2454 if (route->solo_isolated()) {
2455 if (_solo_isolated_cnt == 0) {
2456 send_changed = true;
2458 _solo_isolated_cnt++;
2459 } else if (_solo_isolated_cnt > 0) {
2460 _solo_isolated_cnt--;
2461 if (_solo_isolated_cnt == 0) {
2462 send_changed = true;
2467 IsolatedChanged (); /* EMIT SIGNAL */
2472 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2474 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
2476 if (!self_solo_change) {
2477 // session doesn't care about changes to soloed-by-others
2481 if (solo_update_disabled) {
2483 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
2487 boost::shared_ptr<Route> route = wpr.lock ();
2490 boost::shared_ptr<RouteList> r = routes.reader ();
2493 if (route->self_soloed()) {
2499 RouteGroup* rg = route->route_group ();
2500 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
2502 if (delta == 1 && Config->get_exclusive_solo()) {
2504 /* new solo: disable all other solos, but not the group if its solo-enabled */
2506 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2507 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2508 (leave_group_alone && ((*i)->route_group() == rg))) {
2511 (*i)->set_solo (false, this);
2515 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
2517 solo_update_disabled = true;
2519 RouteList uninvolved;
2521 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
2523 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2524 bool via_sends_only;
2525 bool in_signal_flow;
2527 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2528 (leave_group_alone && ((*i)->route_group() == rg))) {
2532 in_signal_flow = false;
2534 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
2536 if ((*i)->feeds (route, &via_sends_only)) {
2537 if (!via_sends_only) {
2538 if (!route->soloed_by_others_upstream()) {
2539 (*i)->mod_solo_by_others_downstream (delta);
2542 in_signal_flow = true;
2544 DEBUG_TRACE (DEBUG::Solo, "\tno feed from\n");
2547 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
2549 if (route->feeds (*i, &via_sends_only)) {
2550 /* propagate solo upstream only if routing other than
2551 sends is involved, but do consider the other route
2552 (*i) to be part of the signal flow even if only
2555 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
2559 route->soloed_by_others_downstream(),
2560 route->soloed_by_others_upstream()));
2561 if (!via_sends_only) {
2562 if (!route->soloed_by_others_downstream()) {
2563 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
2564 (*i)->mod_solo_by_others_upstream (delta);
2567 in_signal_flow = true;
2569 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
2572 if (!in_signal_flow) {
2573 uninvolved.push_back (*i);
2577 solo_update_disabled = false;
2578 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
2580 update_route_solo_state (r);
2582 /* now notify that the mute state of the routes not involved in the signal
2583 pathway of the just-solo-changed route may have altered.
2586 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2587 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1\n", (*i)->name()));
2588 (*i)->mute_changed (this);
2591 SoloChanged (); /* EMIT SIGNAL */
2596 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2598 /* now figure out if anything that matters is soloed (or is "listening")*/
2600 bool something_soloed = false;
2601 uint32_t listeners = 0;
2602 uint32_t isolated = 0;
2605 r = routes.reader();
2608 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2609 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2610 something_soloed = true;
2613 if (!(*i)->is_hidden() && (*i)->listening_via_monitor()) {
2614 if (Config->get_solo_control_is_listen_control()) {
2617 (*i)->set_listen (false, this);
2621 if ((*i)->solo_isolated()) {
2626 if (something_soloed != _non_soloed_outs_muted) {
2627 _non_soloed_outs_muted = something_soloed;
2628 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2631 _listen_cnt = listeners;
2633 if (isolated != _solo_isolated_cnt) {
2634 _solo_isolated_cnt = isolated;
2635 IsolatedChanged (); /* EMIT SIGNAL */
2639 boost::shared_ptr<RouteList>
2640 Session::get_routes_with_internal_returns() const
2642 boost::shared_ptr<RouteList> r = routes.reader ();
2643 boost::shared_ptr<RouteList> rl (new RouteList);
2645 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2646 if ((*i)->internal_return ()) {
2654 Session::io_name_is_legal (const std::string& name)
2656 boost::shared_ptr<RouteList> r = routes.reader ();
2658 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2659 if ((*i)->name() == name) {
2663 if ((*i)->has_io_processor_named (name)) {
2672 Session::set_exclusive_input_active (boost::shared_ptr<Route> rt, bool /*others_on*/)
2675 vector<string> connections;
2677 PortSet& ps (rt->input()->ports());
2679 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
2680 p->get_connections (connections);
2683 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
2684 routes_using_input_from (*s, rl);
2687 /* scan all relevant routes to see if others are on or off */
2689 bool others_are_already_on = false;
2691 for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
2693 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2695 if (mt->input_active()) {
2696 others_are_already_on = true;
2703 /* globally reverse other routes */
2705 for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
2707 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2709 mt->set_input_active (!others_are_already_on);
2716 Session::routes_using_input_from (const string& str, RouteList& rl)
2718 boost::shared_ptr<RouteList> r = routes.reader ();
2720 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2721 if ((*i)->input()->connected_to (str)) {
2727 boost::shared_ptr<Route>
2728 Session::route_by_name (string name)
2730 boost::shared_ptr<RouteList> r = routes.reader ();
2732 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2733 if ((*i)->name() == name) {
2738 return boost::shared_ptr<Route> ((Route*) 0);
2741 boost::shared_ptr<Route>
2742 Session::route_by_id (PBD::ID id)
2744 boost::shared_ptr<RouteList> r = routes.reader ();
2746 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2747 if ((*i)->id() == id) {
2752 return boost::shared_ptr<Route> ((Route*) 0);
2755 boost::shared_ptr<Track>
2756 Session::track_by_diskstream_id (PBD::ID id)
2758 boost::shared_ptr<RouteList> r = routes.reader ();
2760 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2761 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
2762 if (t && t->using_diskstream_id (id)) {
2767 return boost::shared_ptr<Track> ();
2770 boost::shared_ptr<Route>
2771 Session::route_by_remote_id (uint32_t id)
2773 boost::shared_ptr<RouteList> r = routes.reader ();
2775 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2776 if ((*i)->remote_control_id() == id) {
2781 return boost::shared_ptr<Route> ((Route*) 0);
2785 Session::playlist_region_added (boost::weak_ptr<Region> w)
2787 boost::shared_ptr<Region> r = w.lock ();
2792 /* These are the operations that are currently in progress... */
2793 list<GQuark> curr = _current_trans_quarks;
2796 /* ...and these are the operations during which we want to update
2797 the session range location markers.
2800 ops.push_back (Operations::capture);
2801 ops.push_back (Operations::paste);
2802 ops.push_back (Operations::duplicate_region);
2803 ops.push_back (Operations::insert_file);
2804 ops.push_back (Operations::insert_region);
2805 ops.push_back (Operations::drag_region_brush);
2806 ops.push_back (Operations::region_drag);
2807 ops.push_back (Operations::selection_grab);
2808 ops.push_back (Operations::region_fill);
2809 ops.push_back (Operations::fill_selection);
2810 ops.push_back (Operations::create_region);
2811 ops.push_back (Operations::region_copy);
2812 ops.push_back (Operations::fixed_time_region_copy);
2815 /* See if any of the current operations match the ones that we want */
2817 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
2819 /* If so, update the session range markers */
2821 maybe_update_session_range (r->position (), r->last_frame ());
2825 /** Update the session range markers if a is before the current start or
2826 * b is after the current end.
2829 Session::maybe_update_session_range (framepos_t a, framepos_t b)
2831 if (_state_of_the_state & Loading) {
2835 if (_session_range_location == 0) {
2837 add_session_range_location (a, b);
2841 if (a < _session_range_location->start()) {
2842 _session_range_location->set_start (a);
2845 if (b > _session_range_location->end()) {
2846 _session_range_location->set_end (b);
2852 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
2854 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2855 maybe_update_session_range (i->to, i->to + i->length);
2860 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
2862 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2863 maybe_update_session_range (i->from, i->to);
2867 /* Region management */
2869 boost::shared_ptr<Region>
2870 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2872 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2873 RegionFactory::RegionMap::const_iterator i;
2874 boost::shared_ptr<Region> region;
2876 Glib::Mutex::Lock lm (region_lock);
2878 for (i = regions.begin(); i != regions.end(); ++i) {
2882 if (region->whole_file()) {
2884 if (child->source_equivalent (region)) {
2890 return boost::shared_ptr<Region> ();
2894 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2896 set<boost::shared_ptr<Region> > relevant_regions;
2898 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2899 RegionFactory::get_regions_using_source (*s, relevant_regions);
2902 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2903 set<boost::shared_ptr<Region> >::iterator tmp;
2908 playlists->destroy_region (*r);
2909 RegionFactory::map_remove (*r);
2911 (*r)->drop_sources ();
2912 (*r)->drop_references ();
2914 relevant_regions.erase (r);
2919 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
2922 Glib::Mutex::Lock ls (source_lock);
2923 /* remove from the main source list */
2924 sources.erase ((*s)->id());
2927 (*s)->mark_for_remove ();
2928 (*s)->drop_references ();
2937 Session::remove_last_capture ()
2939 list<boost::shared_ptr<Source> > srcs;
2941 boost::shared_ptr<RouteList> rl = routes.reader ();
2942 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2943 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2948 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
2951 srcs.insert (srcs.end(), l.begin(), l.end());
2956 destroy_sources (srcs);
2958 save_state (_current_snapshot_name);
2963 /* Source Management */
2966 Session::add_source (boost::shared_ptr<Source> source)
2968 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
2969 pair<SourceMap::iterator,bool> result;
2971 entry.first = source->id();
2972 entry.second = source;
2975 Glib::Mutex::Lock lm (source_lock);
2976 result = sources.insert (entry);
2979 if (result.second) {
2981 /* yay, new source */
2983 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
2986 if (!fs->within_session()) {
2987 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
2993 boost::shared_ptr<AudioFileSource> afs;
2995 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
2996 if (Config->get_auto_analyse_audio()) {
2997 Analyser::queue_source_for_analysis (source, false);
3001 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
3006 Session::remove_source (boost::weak_ptr<Source> src)
3008 if (_state_of_the_state & Deletion) {
3012 SourceMap::iterator i;
3013 boost::shared_ptr<Source> source = src.lock();
3020 Glib::Mutex::Lock lm (source_lock);
3022 if ((i = sources.find (source->id())) != sources.end()) {
3027 if (!(_state_of_the_state & InCleanup)) {
3029 /* save state so we don't end up with a session file
3030 referring to non-existent sources.
3033 save_state (_current_snapshot_name);
3037 boost::shared_ptr<Source>
3038 Session::source_by_id (const PBD::ID& id)
3040 Glib::Mutex::Lock lm (source_lock);
3041 SourceMap::iterator i;
3042 boost::shared_ptr<Source> source;
3044 if ((i = sources.find (id)) != sources.end()) {
3051 boost::shared_ptr<Source>
3052 Session::source_by_path_and_channel (const string& path, uint16_t chn)
3054 Glib::Mutex::Lock lm (source_lock);
3056 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3057 boost::shared_ptr<AudioFileSource> afs
3058 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
3060 if (afs && afs->path() == path && chn == afs->channel()) {
3064 return boost::shared_ptr<Source>();
3068 Session::count_sources_by_origin (const string& path)
3071 Glib::Mutex::Lock lm (source_lock);
3073 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3074 boost::shared_ptr<FileSource> fs
3075 = boost::dynamic_pointer_cast<FileSource>(i->second);
3077 if (fs && fs->origin() == path) {
3087 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
3090 string old_basename = PBD::basename_nosuffix (oldname);
3091 string new_legalized = legalize_for_path (newname);
3093 /* note: we know (or assume) the old path is already valid */
3097 /* destructive file sources have a name of the form:
3099 /path/to/Tnnnn-NAME(%[LR])?.wav
3101 the task here is to replace NAME with the new name.
3106 string::size_type dash;
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 prefix = path.substr (0, dash);
3121 path += new_legalized;
3122 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3123 path = Glib::build_filename (dir, path);
3127 /* non-destructive file sources have a name of the form:
3129 /path/to/NAME-nnnnn(%[LR])?.ext
3131 the task here is to replace NAME with the new name.
3136 string::size_type dash;
3137 string::size_type postfix;
3139 dir = Glib::path_get_dirname (path);
3140 path = Glib::path_get_basename (path);
3142 /* '-' is not a legal character for the NAME part of the path */
3144 if ((dash = path.find_last_of ('-')) == string::npos) {
3148 suffix = path.substr (dash+1);
3150 // Suffix is now everything after the dash. Now we need to eliminate
3151 // the nnnnn part, which is done by either finding a '%' or a '.'
3153 postfix = suffix.find_last_of ("%");
3154 if (postfix == string::npos) {
3155 postfix = suffix.find_last_of ('.');
3158 if (postfix != string::npos) {
3159 suffix = suffix.substr (postfix);
3161 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
3165 const uint32_t limit = 10000;
3166 char buf[PATH_MAX+1];
3168 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
3170 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
3172 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
3173 path = Glib::build_filename (dir, buf);
3181 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
3190 /** Return the full path (in some session directory) for a new within-session source.
3191 * \a name must be a session-unique name that does not contain slashes
3192 * (e.g. as returned by new_*_source_name)
3195 Session::new_source_path_from_name (DataType type, const string& name)
3197 assert(name.find("/") == string::npos);
3199 SessionDirectory sdir(get_best_session_directory_for_new_source());
3202 if (type == DataType::AUDIO) {
3203 p = sdir.sound_path();
3204 } else if (type == DataType::MIDI) {
3205 p = sdir.midi_path();
3207 error << "Unknown source type, unable to create file path" << endmsg;
3211 return Glib::build_filename (p, name);
3215 Session::peak_path (string base) const
3217 return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
3220 /** Return a unique name based on \a base for a new internal audio source */
3222 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
3225 char buf[PATH_MAX+1];
3226 const uint32_t limit = 10000;
3228 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3231 legalized = legalize_for_path (base);
3233 // Find a "version" of the base name that doesn't exist in any of the possible directories.
3234 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3236 vector<space_and_path>::iterator i;
3237 uint32_t existing = 0;
3239 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3244 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3245 cnt, legalized.c_str(), ext.c_str());
3246 } else if (nchan == 2) {
3248 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
3249 cnt, legalized.c_str(), ext.c_str());
3251 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
3252 cnt, legalized.c_str(), ext.c_str());
3254 } else if (nchan < 26) {
3255 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
3256 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
3258 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3259 cnt, legalized.c_str(), ext.c_str());
3265 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3266 } else if (nchan == 2) {
3268 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
3270 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
3272 } else if (nchan < 26) {
3273 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
3275 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3279 SessionDirectory sdir((*i).path);
3281 string spath = sdir.sound_path();
3283 /* note that we search *without* the extension so that
3284 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3285 in the event that this new name is required for
3286 a file format change.
3289 if (matching_unsuffixed_filename_exists_in (spath, buf)) {
3295 if (existing == 0) {
3300 error << string_compose(
3301 _("There are already %1 recordings for %2, which I consider too many."),
3302 limit, base) << endmsg;
3304 throw failed_constructor();
3308 return Glib::path_get_basename (buf);
3311 /** Create a new within-session audio source */
3312 boost::shared_ptr<AudioFileSource>
3313 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
3315 const string name = new_audio_source_name (n, n_chans, chan, destructive);
3316 const string path = new_source_path_from_name(DataType::AUDIO, name);
3318 return boost::dynamic_pointer_cast<AudioFileSource> (
3319 SourceFactory::createWritable (DataType::AUDIO, *this, path, string(), destructive, frame_rate()));
3322 /** Return a unique name based on \a base for a new internal MIDI source */
3324 Session::new_midi_source_name (const string& base)
3327 char buf[PATH_MAX+1];
3328 const uint32_t limit = 10000;
3332 legalized = legalize_for_path (base);
3334 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3335 for (cnt = 1; cnt <= limit; ++cnt) {
3337 vector<space_and_path>::iterator i;
3338 uint32_t existing = 0;
3340 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3342 SessionDirectory sdir((*i).path);
3344 std::string p = Glib::build_filename (sdir.midi_path(), legalized);
3346 snprintf (buf, sizeof(buf), "%s-%u.mid", p.c_str(), cnt);
3348 if (Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
3353 if (existing == 0) {
3358 error << string_compose(
3359 _("There are already %1 recordings for %2, which I consider too many."),
3360 limit, base) << endmsg;
3362 throw failed_constructor();
3366 return Glib::path_get_basename(buf);
3370 /** Create a new within-session MIDI source */
3371 boost::shared_ptr<MidiSource>
3372 Session::create_midi_source_for_session (Track* track, string const & n)
3374 /* try to use the existing write source for the track, to keep numbering sane
3378 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3382 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3385 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3386 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3390 const string name = new_midi_source_name (n);
3391 const string path = new_source_path_from_name (DataType::MIDI, name);
3393 return boost::dynamic_pointer_cast<SMFSource> (
3394 SourceFactory::createWritable (
3395 DataType::MIDI, *this, path, string(), false, frame_rate()));
3400 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3402 if (playlist->hidden()) {
3406 playlists->add (playlist);
3409 playlist->release();
3416 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3418 if (_state_of_the_state & Deletion) {
3422 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3428 playlists->remove (playlist);
3434 Session::set_audition (boost::shared_ptr<Region> r)
3436 pending_audition_region = r;
3437 add_post_transport_work (PostTransportAudition);
3438 _butler->schedule_transport_work ();
3442 Session::audition_playlist ()
3444 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3445 ev->region.reset ();
3450 Session::non_realtime_set_audition ()
3452 assert (pending_audition_region);
3453 auditioner->audition_region (pending_audition_region);
3454 pending_audition_region.reset ();
3455 AuditionActive (true); /* EMIT SIGNAL */
3459 Session::audition_region (boost::shared_ptr<Region> r)
3461 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3467 Session::cancel_audition ()
3469 if (auditioner->auditioning()) {
3470 auditioner->cancel_audition ();
3471 AuditionActive (false); /* EMIT SIGNAL */
3476 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3478 if (a->is_monitor()) {
3481 if (b->is_monitor()) {
3484 return a->order_key(N_("signal")) < b->order_key(N_("signal"));
3488 Session::is_auditioning () const
3490 /* can be called before we have an auditioner object */
3492 return auditioner->auditioning();
3499 Session::graph_reordered ()
3501 /* don't do this stuff if we are setting up connections
3502 from a set_state() call or creating new tracks. Ditto for deletion.
3505 if (_state_of_the_state & (InitialConnecting|Deletion)) {
3509 /* every track/bus asked for this to be handled but it was deferred because
3510 we were connecting. do it now.
3513 request_input_change_handling ();
3517 /* force all diskstreams to update their capture offset values to
3518 reflect any changes in latencies within the graph.
3521 boost::shared_ptr<RouteList> rl = routes.reader ();
3522 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3523 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3525 tr->set_capture_offset ();
3530 /** @return Number of frames that there is disk space available to write,
3533 boost::optional<framecnt_t>
3534 Session::available_capture_duration ()
3536 if (_total_free_4k_blocks_uncertain) {
3537 return boost::optional<framecnt_t> ();
3540 float sample_bytes_on_disk = 4.0; // keep gcc happy
3542 switch (config.get_native_file_data_format()) {
3544 sample_bytes_on_disk = 4.0;
3548 sample_bytes_on_disk = 3.0;
3552 sample_bytes_on_disk = 2.0;
3556 /* impossible, but keep some gcc versions happy */
3557 fatal << string_compose (_("programming error: %1"),
3558 X_("illegal native file data format"))
3563 double scale = 4096.0 / sample_bytes_on_disk;
3565 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3566 return max_framecnt;
3569 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3573 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3576 RCUWriter<BundleList> writer (_bundles);
3577 boost::shared_ptr<BundleList> b = writer.get_copy ();
3578 b->push_back (bundle);
3581 BundleAdded (bundle); /* EMIT SIGNAL */
3587 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3589 bool removed = false;
3592 RCUWriter<BundleList> writer (_bundles);
3593 boost::shared_ptr<BundleList> b = writer.get_copy ();
3594 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3596 if (i != b->end()) {
3603 BundleRemoved (bundle); /* EMIT SIGNAL */
3609 boost::shared_ptr<Bundle>
3610 Session::bundle_by_name (string name) const
3612 boost::shared_ptr<BundleList> b = _bundles.reader ();
3614 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3615 if ((*i)->name() == name) {
3620 return boost::shared_ptr<Bundle> ();
3624 Session::tempo_map_changed (const PropertyChange&)
3628 playlists->update_after_tempo_map_change ();
3630 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3636 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3638 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3639 (*i)->recompute_frames_from_bbt ();
3643 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3644 * the given count with the current block size.
3647 Session::ensure_buffers (ChanCount howmany)
3649 BufferManager::ensure_buffers (howmany);
3653 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3655 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3656 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3661 Session::next_insert_id ()
3663 /* this doesn't really loop forever. just think about it */
3666 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3667 if (!insert_bitset[n]) {
3668 insert_bitset[n] = true;
3674 /* none available, so resize and try again */
3676 insert_bitset.resize (insert_bitset.size() + 16, false);
3681 Session::next_send_id ()
3683 /* this doesn't really loop forever. just think about it */
3686 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3687 if (!send_bitset[n]) {
3688 send_bitset[n] = true;
3694 /* none available, so resize and try again */
3696 send_bitset.resize (send_bitset.size() + 16, false);
3701 Session::next_aux_send_id ()
3703 /* this doesn't really loop forever. just think about it */
3706 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
3707 if (!aux_send_bitset[n]) {
3708 aux_send_bitset[n] = true;
3714 /* none available, so resize and try again */
3716 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
3721 Session::next_return_id ()
3723 /* this doesn't really loop forever. just think about it */
3726 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3727 if (!return_bitset[n]) {
3728 return_bitset[n] = true;
3734 /* none available, so resize and try again */
3736 return_bitset.resize (return_bitset.size() + 16, false);
3741 Session::mark_send_id (uint32_t id)
3743 if (id >= send_bitset.size()) {
3744 send_bitset.resize (id+16, false);
3746 if (send_bitset[id]) {
3747 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3749 send_bitset[id] = true;
3753 Session::mark_aux_send_id (uint32_t id)
3755 if (id >= aux_send_bitset.size()) {
3756 aux_send_bitset.resize (id+16, false);
3758 if (aux_send_bitset[id]) {
3759 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
3761 aux_send_bitset[id] = true;
3765 Session::mark_return_id (uint32_t id)
3767 if (id >= return_bitset.size()) {
3768 return_bitset.resize (id+16, false);
3770 if (return_bitset[id]) {
3771 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3773 return_bitset[id] = true;
3777 Session::mark_insert_id (uint32_t id)
3779 if (id >= insert_bitset.size()) {
3780 insert_bitset.resize (id+16, false);
3782 if (insert_bitset[id]) {
3783 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3785 insert_bitset[id] = true;
3789 Session::unmark_send_id (uint32_t id)
3791 if (id < send_bitset.size()) {
3792 send_bitset[id] = false;
3797 Session::unmark_aux_send_id (uint32_t id)
3799 if (id < aux_send_bitset.size()) {
3800 aux_send_bitset[id] = false;
3805 Session::unmark_return_id (uint32_t id)
3807 if (id < return_bitset.size()) {
3808 return_bitset[id] = false;
3813 Session::unmark_insert_id (uint32_t id)
3815 if (id < insert_bitset.size()) {
3816 insert_bitset[id] = false;
3821 /* Named Selection management */
3823 boost::shared_ptr<NamedSelection>
3824 Session::named_selection_by_name (string name)
3826 Glib::Mutex::Lock lm (named_selection_lock);
3827 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
3828 if ((*i)->name == name) {
3832 return boost::shared_ptr<NamedSelection>();
3836 Session::add_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3839 Glib::Mutex::Lock lm (named_selection_lock);
3840 named_selections.insert (named_selections.begin(), named_selection);
3845 NamedSelectionAdded (); /* EMIT SIGNAL */
3849 Session::remove_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3851 bool removed = false;
3854 Glib::Mutex::Lock lm (named_selection_lock);
3856 NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
3858 if (i != named_selections.end()) {
3859 named_selections.erase (i);
3866 NamedSelectionRemoved (); /* EMIT SIGNAL */
3871 Session::reset_native_file_format ()
3873 boost::shared_ptr<RouteList> rl = routes.reader ();
3874 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3875 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3877 /* don't save state as we do this, there's no point
3880 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3881 tr->reset_write_sources (false);
3882 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3888 Session::route_name_unique (string n) const
3890 boost::shared_ptr<RouteList> r = routes.reader ();
3892 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3893 if ((*i)->name() == n) {
3902 Session::route_name_internal (string n) const
3904 if (auditioner && auditioner->name() == n) {
3908 if (_click_io && _click_io->name() == n) {
3916 Session::freeze_all (InterThreadInfo& itt)
3918 boost::shared_ptr<RouteList> r = routes.reader ();
3920 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3922 boost::shared_ptr<Track> t;
3924 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3925 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3935 boost::shared_ptr<Region>
3936 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
3937 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3938 InterThreadInfo& itt,
3939 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
3942 boost::shared_ptr<Region> result;
3943 boost::shared_ptr<Playlist> playlist;
3944 boost::shared_ptr<AudioFileSource> fsource;
3946 char buf[PATH_MAX+1];
3947 ChanCount diskstream_channels (track.n_channels());
3948 framepos_t position;
3949 framecnt_t this_chunk;
3952 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3953 const string sound_dir = sdir.sound_path();
3954 framepos_t len = end - start;
3955 bool need_block_size_reset = false;
3957 ChanCount const max_proc = track.max_processor_streams ();
3960 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3961 end, start) << endmsg;
3965 const framecnt_t chunk_size = (256 * 1024)/4;
3967 // block all process callback handling
3969 block_processing ();
3971 /* call tree *MUST* hold route_lock */
3973 if ((playlist = track.playlist()) == 0) {
3977 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3979 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
3981 for (x = 0; x < 99999; ++x) {
3982 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());
3983 if (!Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
3989 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3994 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
3995 SourceFactory::createWritable (DataType::AUDIO, *this, buf, string(), false, frame_rate()));
3998 catch (failed_constructor& err) {
3999 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
4003 srcs.push_back (fsource);
4006 /* tell redirects that care that we are about to use a much larger
4007 * blocksize. this will flush all plugins too, so that they are ready
4008 * to be used for this process.
4011 need_block_size_reset = true;
4012 track.set_block_size (chunk_size);
4017 /* create a set of reasonably-sized buffers */
4018 buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
4019 buffers.set_count (max_proc);
4021 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4022 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4024 afs->prepare_for_peakfile_writes ();
4027 while (to_do && !itt.cancel) {
4029 this_chunk = min (to_do, chunk_size);
4031 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export)) {
4036 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4037 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4040 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
4046 start += this_chunk;
4047 to_do -= this_chunk;
4049 itt.progress = (float) (1.0 - ((double) to_do / len));
4058 xnow = localtime (&now);
4060 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
4061 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4064 afs->update_header (position, *xnow, now);
4065 afs->flush_header ();
4069 /* construct a region to represent the bounced material */
4073 plist.add (Properties::start, 0);
4074 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4075 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4077 result = RegionFactory::create (srcs, plist);
4083 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4084 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4087 afs->mark_for_remove ();
4090 (*src)->drop_references ();
4094 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4095 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4098 afs->done_with_peakfile_writes ();
4103 if (need_block_size_reset) {
4104 track.set_block_size (get_block_size());
4107 unblock_processing ();
4113 Session::gain_automation_buffer() const
4115 return ProcessThread::gain_automation_buffer ();
4119 Session::send_gain_automation_buffer() const
4121 return ProcessThread::send_gain_automation_buffer ();
4125 Session::pan_automation_buffer() const
4127 return ProcessThread::pan_automation_buffer ();
4131 Session::get_silent_buffers (ChanCount count)
4133 return ProcessThread::get_silent_buffers (count);
4137 Session::get_scratch_buffers (ChanCount count)
4139 return ProcessThread::get_scratch_buffers (count);
4143 Session::get_mix_buffers (ChanCount count)
4145 return ProcessThread::get_mix_buffers (count);
4149 Session::ntracks () const
4152 boost::shared_ptr<RouteList> r = routes.reader ();
4154 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4155 if (boost::dynamic_pointer_cast<Track> (*i)) {
4164 Session::nbusses () const
4167 boost::shared_ptr<RouteList> r = routes.reader ();
4169 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4170 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
4179 Session::add_automation_list(AutomationList *al)
4181 automation_lists[al->id()] = al;
4185 Session::sync_order_keys (std::string const & base)
4187 if (deletion_in_progress()) {
4191 if (!Config->get_sync_all_route_ordering()) {
4192 /* leave order keys as they are */
4196 boost::shared_ptr<RouteList> r = routes.reader ();
4198 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4199 (*i)->sync_order_keys (base);
4202 Route::SyncOrderKeys (base); // EMIT SIGNAL
4204 /* this might not do anything */
4206 set_remote_control_ids ();
4209 /** @return true if there is at least one record-enabled track, otherwise false */
4211 Session::have_rec_enabled_track () const
4213 return g_atomic_int_get (&_have_rec_enabled_track) == 1;
4216 /** Update the state of our rec-enabled tracks flag */
4218 Session::update_have_rec_enabled_track ()
4220 boost::shared_ptr<RouteList> rl = routes.reader ();
4221 RouteList::iterator i = rl->begin();
4222 while (i != rl->end ()) {
4224 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4225 if (tr && tr->record_enabled ()) {
4232 int const old = g_atomic_int_get (&_have_rec_enabled_track);
4234 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4236 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4237 RecordStateChanged (); /* EMIT SIGNAL */
4242 Session::listen_position_changed ()
4244 boost::shared_ptr<RouteList> r = routes.reader ();
4246 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4247 (*i)->listen_position_changed ();
4252 Session::solo_control_mode_changed ()
4254 /* cancel all solo or all listen when solo control mode changes */
4257 set_solo (get_routes(), false);
4258 } else if (listening()) {
4259 set_listen (get_routes(), false);
4263 /** Called when a property of one of our route groups changes */
4265 Session::route_group_property_changed (RouteGroup* rg)
4267 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4270 /** Called when a route is added to one of our route groups */
4272 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4274 RouteAddedToRouteGroup (rg, r);
4277 /** Called when a route is removed from one of our route groups */
4279 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4281 RouteRemovedFromRouteGroup (rg, r);
4285 Session::get_available_sync_options () const
4287 vector<SyncSource> ret;
4289 ret.push_back (JACK);
4290 ret.push_back (MTC);
4291 ret.push_back (MIDIClock);
4296 boost::shared_ptr<RouteList>
4297 Session::get_routes_with_regions_at (framepos_t const p) const
4299 boost::shared_ptr<RouteList> r = routes.reader ();
4300 boost::shared_ptr<RouteList> rl (new RouteList);
4302 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4303 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4308 boost::shared_ptr<Playlist> pl = tr->playlist ();
4313 if (pl->has_region_at (p)) {
4322 Session::goto_end ()
4324 if (_session_range_location) {
4325 request_locate (_session_range_location->end(), false);
4327 request_locate (0, false);
4332 Session::goto_start ()
4334 if (_session_range_location) {
4335 request_locate (_session_range_location->start(), false);
4337 request_locate (0, false);
4342 Session::current_start_frame () const
4344 return _session_range_location ? _session_range_location->start() : 0;
4348 Session::current_end_frame () const
4350 return _session_range_location ? _session_range_location->end() : 0;
4354 Session::add_session_range_location (framepos_t start, framepos_t end)
4356 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4357 _locations->add (_session_range_location);
4360 /** Called when one of our routes' order keys has changed */
4362 Session::route_order_key_changed ()
4364 RouteOrderKeyChanged (); /* EMIT SIGNAL */
4368 Session::step_edit_status_change (bool yn)
4374 send = (_step_editors == 0);
4379 send = (_step_editors == 1);
4382 if (_step_editors > 0) {
4388 StepEditStatusChange (val);
4394 Session::start_time_changed (framepos_t old)
4396 /* Update the auto loop range to match the session range
4397 (unless the auto loop range has been changed by the user)
4400 Location* s = _locations->session_range_location ();
4405 Location* l = _locations->auto_loop_location ();
4407 if (l && l->start() == old) {
4408 l->set_start (s->start(), true);
4413 Session::end_time_changed (framepos_t old)
4415 /* Update the auto loop range to match the session range
4416 (unless the auto loop range has been changed by the user)
4419 Location* s = _locations->session_range_location ();
4424 Location* l = _locations->auto_loop_location ();
4426 if (l && l->end() == old) {
4427 l->set_end (s->end(), true);
4432 Session::source_search_path (DataType type) const
4436 if (session_dirs.size() == 1) {
4438 case DataType::AUDIO:
4439 s.push_back ( _session_dir->sound_path());
4441 case DataType::MIDI:
4442 s.push_back (_session_dir->midi_path());
4446 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4447 SessionDirectory sdir (i->path);
4449 case DataType::AUDIO:
4450 s.push_back (sdir.sound_path());
4452 case DataType::MIDI:
4453 s.push_back (sdir.midi_path());
4459 /* now check the explicit (possibly user-specified) search path
4462 vector<string> dirs;
4465 case DataType::AUDIO:
4466 split (config.get_audio_search_path (), dirs, ':');
4468 case DataType::MIDI:
4469 split (config.get_midi_search_path (), dirs, ':');
4473 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4475 vector<string>::iterator si;
4477 for (si = s.begin(); si != s.end(); ++si) {
4483 if (si == s.end()) {
4490 for (vector<string>::iterator si = s.begin(); si != s.end(); ++si) {
4491 if (!search_path.empty()) {
4501 Session::ensure_search_path_includes (const string& path, DataType type)
4504 vector<string> dirs;
4511 case DataType::AUDIO:
4512 search_path = config.get_audio_search_path ();
4514 case DataType::MIDI:
4515 search_path = config.get_midi_search_path ();
4519 split (search_path, dirs, ':');
4521 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4522 /* No need to add this new directory if it has the same inode as
4523 an existing one; checking inode rather than name prevents duplicated
4524 directories when we are using symlinks.
4526 On Windows, I think we could just do if (*i == path) here.
4528 if (PBD::equivalent_paths (*i, path)) {
4533 if (!search_path.empty()) {
4537 search_path += path;
4540 case DataType::AUDIO:
4541 config.set_audio_search_path (search_path);
4543 case DataType::MIDI:
4544 config.set_midi_search_path (search_path);
4549 boost::shared_ptr<Speakers>
4550 Session::get_speakers()
4556 Session::unknown_processors () const
4560 boost::shared_ptr<RouteList> r = routes.reader ();
4561 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4562 list<string> t = (*i)->unknown_processors ();
4563 copy (t.begin(), t.end(), back_inserter (p));
4573 Session::update_latency (bool playback)
4575 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
4577 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4581 boost::shared_ptr<RouteList> r = routes.reader ();
4582 framecnt_t max_latency = 0;
4585 /* reverse the list so that we work backwards from the last route to run to the first */
4586 RouteList* rl = routes.reader().get();
4587 r.reset (new RouteList (*rl));
4588 reverse (r->begin(), r->end());
4591 /* compute actual latency values for the given direction and store them all in per-port
4592 structures. this will also publish the same values (to JACK) so that computation of latency
4593 for routes can consistently use public latency values.
4596 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4597 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
4600 /* because we latency compensate playback, our published playback latencies should
4601 be the same for all output ports - all material played back by ardour has
4602 the same latency, whether its caused by plugins or by latency compensation. since
4603 these may differ from the values computed above, reset all playback port latencies
4607 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
4609 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4610 (*i)->set_public_port_latencies (max_latency, playback);
4615 post_playback_latency ();
4619 post_capture_latency ();
4622 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
4626 Session::post_playback_latency ()
4628 set_worst_playback_latency ();
4630 boost::shared_ptr<RouteList> r = routes.reader ();
4632 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4633 if (!(*i)->is_hidden() && ((*i)->active())) {
4634 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
4638 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4639 (*i)->set_latency_compensation (_worst_track_latency);
4644 Session::post_capture_latency ()
4646 set_worst_capture_latency ();
4648 /* reflect any changes in capture latencies into capture offsets
4651 boost::shared_ptr<RouteList> rl = routes.reader();
4652 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4653 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4655 tr->set_capture_offset ();
4661 Session::initialize_latencies ()
4664 Glib::Mutex::Lock lm (_engine.process_lock());
4665 update_latency (false);
4666 update_latency (true);
4669 set_worst_io_latencies ();
4673 Session::set_worst_io_latencies ()
4675 set_worst_playback_latency ();
4676 set_worst_capture_latency ();
4680 Session::set_worst_playback_latency ()
4682 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4686 _worst_output_latency = 0;
4688 if (!_engine.connected()) {
4692 boost::shared_ptr<RouteList> r = routes.reader ();
4694 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4695 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
4698 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
4702 Session::set_worst_capture_latency ()
4704 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4708 _worst_input_latency = 0;
4710 if (!_engine.connected()) {
4714 boost::shared_ptr<RouteList> r = routes.reader ();
4716 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4717 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
4720 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
4724 Session::update_latency_compensation (bool force_whole_graph)
4726 bool some_track_latency_changed = false;
4728 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4732 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
4734 _worst_track_latency = 0;
4736 boost::shared_ptr<RouteList> r = routes.reader ();
4738 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4739 if (!(*i)->is_hidden() && ((*i)->active())) {
4741 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
4742 some_track_latency_changed = true;
4744 _worst_track_latency = max (tl, _worst_track_latency);
4748 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
4749 (some_track_latency_changed ? "yes" : "no")));
4751 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
4753 if (some_track_latency_changed || force_whole_graph) {
4754 _engine.update_latencies ();
4758 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4759 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4763 tr->set_capture_offset ();
4768 Session::session_name_is_legal (const string& path)
4770 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
4772 for (int i = 0; illegal_chars[i]; ++i) {
4773 if (path.find (illegal_chars[i]) != string::npos) {
4774 return illegal_chars[i];
4782 Session::next_control_id () const
4784 return ntracks() + nbusses() + 1;
4788 Session::operation_in_progress (GQuark op) const
4790 return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());