2 Copyright (C) 1999-2010 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #include <cstdio> /* sprintf(3) ... grrr */
33 #include <glibmm/thread.h>
34 #include <glibmm/miscutils.h>
35 #include <glibmm/fileutils.h>
37 #include <boost/algorithm/string/erase.hpp>
39 #include "pbd/error.h"
40 #include "pbd/boost_debug.h"
41 #include "pbd/pathscanner.h"
42 #include "pbd/stl_delete.h"
43 #include "pbd/basename.h"
44 #include "pbd/stacktrace.h"
45 #include "pbd/file_utils.h"
46 #include "pbd/convert.h"
47 #include "pbd/strsplit.h"
48 #include "pbd/strsplit.h"
49 #include "pbd/unwind.h"
51 #include "ardour/amp.h"
52 #include "ardour/analyser.h"
53 #include "ardour/audio_buffer.h"
54 #include "ardour/audio_diskstream.h"
55 #include "ardour/audio_port.h"
56 #include "ardour/audio_track.h"
57 #include "ardour/audioengine.h"
58 #include "ardour/audiofilesource.h"
59 #include "ardour/audioplaylist.h"
60 #include "ardour/audioregion.h"
61 #include "ardour/auditioner.h"
62 #include "ardour/buffer_manager.h"
63 #include "ardour/buffer_set.h"
64 #include "ardour/bundle.h"
65 #include "ardour/butler.h"
66 #include "ardour/click.h"
67 #include "ardour/configuration.h"
68 #include "ardour/control_protocol_manager.h"
69 #include "ardour/cycle_timer.h"
70 #include "ardour/data_type.h"
71 #include "ardour/debug.h"
72 #include "ardour/filename_extensions.h"
73 #include "ardour/internal_send.h"
74 #include "ardour/io_processor.h"
75 #include "ardour/midi_diskstream.h"
76 #include "ardour/midi_playlist.h"
77 #include "ardour/midi_region.h"
78 #include "ardour/midi_track.h"
79 #include "ardour/midi_ui.h"
80 #include "ardour/named_selection.h"
81 #include "ardour/process_thread.h"
82 #include "ardour/playlist.h"
83 #include "ardour/plugin.h"
84 #include "ardour/plugin_insert.h"
85 #include "ardour/port_insert.h"
86 #include "ardour/processor.h"
87 #include "ardour/rc_configuration.h"
88 #include "ardour/recent_sessions.h"
89 #include "ardour/region_factory.h"
90 #include "ardour/return.h"
91 #include "ardour/route_graph.h"
92 #include "ardour/route_group.h"
93 #include "ardour/send.h"
94 #include "ardour/session.h"
95 #include "ardour/session_directory.h"
96 #include "ardour/session_directory.h"
97 #include "ardour/session_playlists.h"
98 #include "ardour/slave.h"
99 #include "ardour/smf_source.h"
100 #include "ardour/source_factory.h"
101 #include "ardour/tape_file_matcher.h"
102 #include "ardour/tempo.h"
103 #include "ardour/utils.h"
104 #include "ardour/graph.h"
105 #include "ardour/speakers.h"
106 #include "ardour/operations.h"
108 #include "midi++/port.h"
109 #include "midi++/mmc.h"
110 #include "midi++/manager.h"
115 using namespace ARDOUR;
118 bool Session::_disable_all_loaded_plugins = false;
120 PBD::Signal1<void,std::string> Session::Dialog;
121 PBD::Signal0<int> Session::AskAboutPendingState;
122 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
123 PBD::Signal0<void> Session::SendFeedback;
124 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
126 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
127 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
128 PBD::Signal0<void> Session::AutoBindingOn;
129 PBD::Signal0<void> Session::AutoBindingOff;
130 PBD::Signal2<void,std::string, std::string> Session::Exported;
131 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
132 PBD::Signal0<void> Session::Quit;
133 PBD::Signal0<void> Session::FeedbackDetected;
134 PBD::Signal0<void> Session::SuccessfulGraphSort;
136 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
137 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
139 /** @param snapshot_name Snapshot name, without .ardour prefix */
140 Session::Session (AudioEngine &eng,
141 const string& fullpath,
142 const string& snapshot_name,
143 BusProfile* bus_profile,
146 , _target_transport_speed (0.0)
147 , _requested_return_frame (-1)
148 , _session_dir (new SessionDirectory(fullpath))
150 , _state_of_the_state (Clean)
151 , _butler (new Butler (*this))
152 , _post_transport_work (0)
153 , _send_timecode_update (false)
154 , _all_route_group (new RouteGroup (*this, "all"))
155 , routes (new RouteList)
156 , _total_free_4k_blocks (0)
157 , _bundles (new BundleList)
158 , _bundle_xml_node (0)
160 , _click_io ((IO*) 0)
162 , click_emphasis_data (0)
164 , _have_rec_enabled_track (false)
165 , _suspend_timecode_transmission (0)
167 _locations = new Locations (*this);
169 if (how_many_dsp_threads () > 1) {
170 /* For now, only create the graph if we are using >1 DSP threads, as
171 it is a bit slower than the old code with 1 thread.
173 _process_graph.reset (new Graph (*this));
176 playlists.reset (new SessionPlaylists);
178 _all_route_group->set_active (true, this);
180 interpolation.add_channel_to (0, 0);
182 if (!eng.connected()) {
183 throw failed_constructor();
186 n_physical_outputs = _engine.n_physical_outputs ();
187 n_physical_inputs = _engine.n_physical_inputs ();
189 first_stage_init (fullpath, snapshot_name);
191 _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
194 if (create (mix_template, bus_profile)) {
196 throw failed_constructor ();
200 if (second_stage_init ()) {
202 throw failed_constructor ();
205 store_recent_sessions(_name, _path);
207 bool was_dirty = dirty();
209 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
211 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
212 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
215 DirtyChanged (); /* EMIT SIGNAL */
218 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
219 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
235 vector<void*> debug_pointers;
237 /* if we got to here, leaving pending capture state around
241 remove_pending_capture_state ();
243 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
245 _engine.remove_session ();
247 /* clear history so that no references to objects are held any more */
251 /* clear state tree so that no references to objects are held any more */
255 /* reset dynamic state version back to default */
257 Stateful::loading_state_version = 0;
259 _butler->drop_references ();
261 delete midi_control_ui;
262 delete _all_route_group;
264 if (click_data != default_click) {
265 delete [] click_data;
268 if (click_emphasis_data != default_click_emphasis) {
269 delete [] click_emphasis_data;
274 /* clear out any pending dead wood from RCU managed objects */
279 AudioDiskstream::free_working_buffers();
281 /* tell everyone who is still standing that we're about to die */
284 /* tell everyone to drop references and delete objects as we go */
286 DEBUG_TRACE (DEBUG::Destruction, "delete named selections\n");
287 named_selections.clear ();
289 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
290 RegionFactory::delete_all_regions ();
292 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
294 /* reset these three references to special routes before we do the usual route delete thing */
297 _master_out.reset ();
298 _monitor_out.reset ();
301 RCUWriter<RouteList> writer (routes);
302 boost::shared_ptr<RouteList> r = writer.get_copy ();
304 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
305 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
306 (*i)->drop_references ();
310 /* writer goes out of scope and updates master */
314 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
315 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
316 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
317 i->second->drop_references ();
322 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
323 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
328 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
333 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
335 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
336 boost_debug_list_ptrs ();
341 Session::when_engine_running ()
343 string first_physical_output;
345 BootMessage (_("Set block size and sample rate"));
347 set_block_size (_engine.frames_per_cycle());
348 set_frame_rate (_engine.frame_rate());
350 BootMessage (_("Using configuration"));
352 boost::function<void (std::string)> ff (boost::bind (&Session::config_changed, this, _1, false));
353 boost::function<void (std::string)> ft (boost::bind (&Session::config_changed, this, _1, true));
355 Config->map_parameters (ff);
356 config.map_parameters (ft);
358 /* every time we reconnect, recompute worst case output latencies */
360 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
362 if (synced_to_jack()) {
363 _engine.transport_stop ();
366 if (config.get_jack_time_master()) {
367 _engine.transport_locate (_transport_frame);
375 _click_io.reset (new ClickIO (*this, "click"));
376 _click_gain.reset (new Amp (*this));
377 _click_gain->activate ();
379 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
381 /* existing state for Click */
384 if (Stateful::loading_state_version < 3000) {
385 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
387 const XMLNodeList& children (child->children());
388 XMLNodeList::const_iterator i = children.begin();
389 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
391 if (i != children.end()) {
392 c = _click_gain->set_state (**i, Stateful::loading_state_version);
398 _clicking = Config->get_clicking ();
402 error << _("could not setup Click I/O") << endmsg;
409 /* default state for Click: dual-mono to first 2 physical outputs */
412 _engine.get_physical_outputs (DataType::AUDIO, outs);
414 for (uint32_t physport = 0; physport < 2; ++physport) {
415 if (outs.size() > physport) {
416 if (_click_io->add_port (outs[physport], this)) {
417 // relax, even though its an error
422 if (_click_io->n_ports () > ChanCount::ZERO) {
423 _clicking = Config->get_clicking ();
428 catch (failed_constructor& err) {
429 error << _("cannot setup Click I/O") << endmsg;
432 BootMessage (_("Compute I/O Latencies"));
435 // XXX HOW TO ALERT UI TO THIS ? DO WE NEED TO?
438 BootMessage (_("Set up standard connections"));
440 vector<string> inputs[DataType::num_types];
441 vector<string> outputs[DataType::num_types];
442 for (uint32_t i = 0; i < DataType::num_types; ++i) {
443 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
444 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
447 /* Create a set of Bundle objects that map
448 to the physical I/O currently available. We create both
449 mono and stereo bundles, so that the common cases of mono
450 and stereo tracks get bundles to put in their mixer strip
451 in / out menus. There may be a nicer way of achieving that;
452 it doesn't really scale that well to higher channel counts
455 /* mono output bundles */
457 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
459 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
461 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
462 c->add_channel (_("mono"), DataType::AUDIO);
463 c->set_port (0, outputs[DataType::AUDIO][np]);
468 /* stereo output bundles */
470 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
471 if (np + 1 < outputs[DataType::AUDIO].size()) {
473 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
474 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
475 c->add_channel (_("L"), DataType::AUDIO);
476 c->set_port (0, outputs[DataType::AUDIO][np]);
477 c->add_channel (_("R"), DataType::AUDIO);
478 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
484 /* mono input bundles */
486 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
488 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
490 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
491 c->add_channel (_("mono"), DataType::AUDIO);
492 c->set_port (0, inputs[DataType::AUDIO][np]);
497 /* stereo input bundles */
499 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
500 if (np + 1 < inputs[DataType::AUDIO].size()) {
502 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
504 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
505 c->add_channel (_("L"), DataType::AUDIO);
506 c->set_port (0, inputs[DataType::AUDIO][np]);
507 c->add_channel (_("R"), DataType::AUDIO);
508 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
514 /* MIDI input bundles */
516 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
517 string n = inputs[DataType::MIDI][np];
518 boost::erase_first (n, X_("alsa_pcm:"));
520 boost::shared_ptr<Bundle> c (new Bundle (n, false));
521 c->add_channel ("", DataType::MIDI);
522 c->set_port (0, inputs[DataType::MIDI][np]);
526 /* MIDI output bundles */
528 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
529 string n = outputs[DataType::MIDI][np];
530 boost::erase_first (n, X_("alsa_pcm:"));
532 boost::shared_ptr<Bundle> c (new Bundle (n, true));
533 c->add_channel ("", DataType::MIDI);
534 c->set_port (0, outputs[DataType::MIDI][np]);
538 BootMessage (_("Setup signal flow and plugins"));
540 ControlProtocolManager::instance().set_session (this);
542 /* This must be done after the ControlProtocolManager set_session above,
543 as it will set states for ports which the ControlProtocolManager creates.
545 MIDI::Manager::instance()->set_port_states (Config->midi_port_states ());
547 /* And this must be done after the MIDI::Manager::set_port_states as
548 * it will try to make connections whose details are loaded by set_port_states.
553 if (_is_new && !no_auto_connect()) {
554 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock());
555 auto_connect_master_bus ();
558 _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
560 /* update latencies */
562 initialize_latencies ();
564 /* hook us up to the engine */
566 BootMessage (_("Connect to engine"));
567 _engine.set_session (this);
571 Session::auto_connect_master_bus ()
573 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
577 /* if requested auto-connect the outputs to the first N physical ports.
580 uint32_t limit = _master_out->n_outputs().n_total();
581 vector<string> outputs[DataType::num_types];
583 for (uint32_t i = 0; i < DataType::num_types; ++i) {
584 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
587 for (uint32_t n = 0; n < limit; ++n) {
588 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
590 if (outputs[p->type()].size() > n) {
591 connect_to = outputs[p->type()][n];
594 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
595 if (_master_out->output()->connect (p, connect_to, this)) {
596 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
605 Session::remove_monitor_section ()
611 /* force reversion to Solo-In-Place */
612 Config->set_solo_control_is_listen_control (false);
615 /* Hold process lock while doing this so that we don't hear bits and
616 * pieces of audio as we work on each route.
619 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
621 /* Connect tracks to monitor section. Note that in an
622 existing session, the internal sends will already exist, but we want the
623 routes to notice that they connect to the control out specifically.
627 boost::shared_ptr<RouteList> r = routes.reader ();
628 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
630 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
632 if ((*x)->is_monitor()) {
634 } else if ((*x)->is_master()) {
637 (*x)->remove_aux_or_listen (_monitor_out);
642 remove_route (_monitor_out);
643 auto_connect_master_bus ();
647 Session::add_monitor_section ()
651 if (_monitor_out || !_master_out) {
655 boost::shared_ptr<Route> r (new Route (*this, _("monitor"), Route::MonitorOut, DataType::AUDIO));
661 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
662 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
665 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
666 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
667 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
671 add_routes (rl, false, false, false);
673 assert (_monitor_out);
675 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
676 are undefined, at best.
679 uint32_t limit = _monitor_out->n_inputs().n_audio();
683 /* connect the inputs to the master bus outputs. this
684 * represents a separate data feed from the internal sends from
685 * each route. as of jan 2011, it allows the monitor section to
686 * conditionally ignore either the internal sends or the normal
687 * input feed, but we should really find a better way to do
691 _master_out->output()->disconnect (this);
693 for (uint32_t n = 0; n < limit; ++n) {
694 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
695 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
698 string connect_to = o->name();
699 if (_monitor_out->input()->connect (p, connect_to, this)) {
700 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
708 /* if monitor section is not connected, connect it to physical outs
711 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
713 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
715 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
718 _monitor_out->output()->connect_ports_to_bundle (b, this);
720 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
721 Config->get_monitor_bus_preferred_bundle())
727 /* Monitor bus is audio only */
729 uint32_t mod = n_physical_outputs.get (DataType::AUDIO);
730 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
731 vector<string> outputs[DataType::num_types];
733 for (uint32_t i = 0; i < DataType::num_types; ++i) {
734 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
740 for (uint32_t n = 0; n < limit; ++n) {
742 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
744 if (outputs[DataType::AUDIO].size() > (n % mod)) {
745 connect_to = outputs[DataType::AUDIO][n % mod];
748 if (!connect_to.empty()) {
749 if (_monitor_out->output()->connect (p, connect_to, this)) {
750 error << string_compose (
751 _("cannot connect control output %1 to %2"),
762 /* Hold process lock while doing this so that we don't hear bits and
763 * pieces of audio as we work on each route.
766 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
768 /* Connect tracks to monitor section. Note that in an
769 existing session, the internal sends will already exist, but we want the
770 routes to notice that they connect to the control out specifically.
774 boost::shared_ptr<RouteList> rls = routes.reader ();
776 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
778 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
780 if ((*x)->is_monitor()) {
782 } else if ((*x)->is_master()) {
785 (*x)->enable_monitor_send ();
791 Session::hookup_io ()
793 /* stop graph reordering notifications from
794 causing resorts, etc.
797 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
801 /* we delay creating the auditioner till now because
802 it makes its own connections to ports.
806 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
808 throw failed_constructor ();
810 a->use_new_diskstream ();
814 catch (failed_constructor& err) {
815 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
819 /* load bundles, which we may have postponed earlier on */
820 if (_bundle_xml_node) {
821 load_bundles (*_bundle_xml_node);
822 delete _bundle_xml_node;
825 /* Tell all IO objects to connect themselves together */
827 IO::enable_connecting ();
828 MIDI::Port::MakeConnections ();
830 /* Now reset all panners */
832 Delivery::reset_panners ();
834 /* Anyone who cares about input state, wake up and do something */
836 IOConnectionsComplete (); /* EMIT SIGNAL */
838 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
840 /* now handle the whole enchilada as if it was one
846 /* update the full solo state, which can't be
847 correctly determined on a per-route basis, but
848 needs the global overview that only the session
852 update_route_solo_state ();
856 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
858 boost::shared_ptr<Track> track = wp.lock ();
863 boost::shared_ptr<Playlist> playlist;
865 if ((playlist = track->playlist()) != 0) {
866 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
867 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
868 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
873 Session::record_enabling_legal () const
875 /* this used to be in here, but survey says.... we don't need to restrict it */
876 // if (record_status() == Recording) {
880 if (Config->get_all_safe()) {
887 Session::set_track_monitor_input_status (bool yn)
889 boost::shared_ptr<RouteList> rl = routes.reader ();
890 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
891 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
892 if (tr && tr->record_enabled ()) {
893 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
894 tr->request_jack_monitors_input (yn);
900 Session::auto_punch_start_changed (Location* location)
902 replace_event (SessionEvent::PunchIn, location->start());
904 if (get_record_enabled() && config.get_punch_in()) {
905 /* capture start has been changed, so save new pending state */
906 save_state ("", true);
911 Session::auto_punch_end_changed (Location* location)
913 framepos_t when_to_stop = location->end();
914 // when_to_stop += _worst_output_latency + _worst_input_latency;
915 replace_event (SessionEvent::PunchOut, when_to_stop);
919 Session::auto_punch_changed (Location* location)
921 framepos_t when_to_stop = location->end();
923 replace_event (SessionEvent::PunchIn, location->start());
924 //when_to_stop += _worst_output_latency + _worst_input_latency;
925 replace_event (SessionEvent::PunchOut, when_to_stop);
929 Session::auto_loop_changed (Location* location)
931 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
933 if (transport_rolling() && play_loop) {
936 // if (_transport_frame > location->end()) {
938 if (_transport_frame < location->start() || _transport_frame > location->end()) {
939 // relocate to beginning of loop
940 clear_events (SessionEvent::LocateRoll);
942 request_locate (location->start(), true);
945 else if (Config->get_seamless_loop() && !loop_changing) {
947 // schedule a locate-roll to refill the diskstreams at the
949 loop_changing = true;
951 if (location->end() > last_loopend) {
952 clear_events (SessionEvent::LocateRoll);
953 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
960 last_loopend = location->end();
964 Session::set_auto_punch_location (Location* location)
968 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
969 punch_connections.drop_connections();
970 existing->set_auto_punch (false, this);
971 remove_event (existing->start(), SessionEvent::PunchIn);
972 clear_events (SessionEvent::PunchOut);
973 auto_punch_location_changed (0);
982 if (location->end() <= location->start()) {
983 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
987 punch_connections.drop_connections ();
989 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
990 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
991 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
993 location->set_auto_punch (true, this);
995 auto_punch_changed (location);
997 auto_punch_location_changed (location);
1001 Session::set_auto_loop_location (Location* location)
1005 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1006 loop_connections.drop_connections ();
1007 existing->set_auto_loop (false, this);
1008 remove_event (existing->end(), SessionEvent::AutoLoop);
1009 auto_loop_location_changed (0);
1014 if (location == 0) {
1018 if (location->end() <= location->start()) {
1019 error << _("Session: you can't use a mark for auto loop") << endmsg;
1023 last_loopend = location->end();
1025 loop_connections.drop_connections ();
1027 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1028 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1029 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1031 location->set_auto_loop (true, this);
1033 /* take care of our stuff first */
1035 auto_loop_changed (location);
1037 /* now tell everyone else */
1039 auto_loop_location_changed (location);
1043 Session::locations_added (Location *)
1049 Session::locations_changed ()
1051 _locations->apply (*this, &Session::handle_locations_changed);
1055 Session::handle_locations_changed (Locations::LocationList& locations)
1057 Locations::LocationList::iterator i;
1059 bool set_loop = false;
1060 bool set_punch = false;
1062 for (i = locations.begin(); i != locations.end(); ++i) {
1066 if (location->is_auto_punch()) {
1067 set_auto_punch_location (location);
1070 if (location->is_auto_loop()) {
1071 set_auto_loop_location (location);
1075 if (location->is_session_range()) {
1076 _session_range_location = location;
1081 set_auto_loop_location (0);
1084 set_auto_punch_location (0);
1091 Session::enable_record ()
1093 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1094 /* no recording at anything except normal speed */
1099 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1101 if (rs == Recording) {
1105 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1107 _last_record_location = _transport_frame;
1108 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1110 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1111 set_track_monitor_input_status (true);
1114 RecordStateChanged ();
1121 Session::disable_record (bool rt_context, bool force)
1125 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1127 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1128 g_atomic_int_set (&_record_status, Disabled);
1129 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1131 if (rs == Recording) {
1132 g_atomic_int_set (&_record_status, Enabled);
1136 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1137 set_track_monitor_input_status (false);
1140 RecordStateChanged (); /* emit signal */
1143 remove_pending_capture_state ();
1149 Session::step_back_from_record ()
1151 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1153 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1154 set_track_monitor_input_status (false);
1157 RecordStateChanged (); /* emit signal */
1162 Session::maybe_enable_record ()
1164 if (_step_editors > 0) {
1168 g_atomic_int_set (&_record_status, Enabled);
1170 /* This function is currently called from somewhere other than an RT thread.
1171 This save_state() call therefore doesn't impact anything. Doing it here
1172 means that we save pending state of which sources the next record will use,
1173 which gives us some chance of recovering from a crash during the record.
1176 save_state ("", true);
1178 if (_transport_speed) {
1179 if (!config.get_punch_in()) {
1183 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1184 RecordStateChanged (); /* EMIT SIGNAL */
1191 Session::audible_frame () const
1197 /* the first of these two possible settings for "offset"
1198 mean that the audible frame is stationary until
1199 audio emerges from the latency compensation
1202 the second means that the audible frame is stationary
1203 until audio would emerge from a physical port
1204 in the absence of any plugin latency compensation
1207 offset = worst_playback_latency ();
1209 if (offset > current_block_size) {
1210 offset -= current_block_size;
1212 /* XXX is this correct? if we have no external
1213 physical connections and everything is internal
1214 then surely this is zero? still, how
1215 likely is that anyway?
1217 offset = current_block_size;
1220 if (synced_to_jack()) {
1221 tf = _engine.transport_frame();
1223 tf = _transport_frame;
1228 if (!non_realtime_work_pending()) {
1232 /* Check to see if we have passed the first guaranteed
1233 audible frame past our last start position. if not,
1234 return that last start point because in terms
1235 of audible frames, we have not moved yet.
1237 `Start position' in this context means the time we last
1238 either started or changed transport direction.
1241 if (_transport_speed > 0.0f) {
1243 if (!play_loop || !have_looped) {
1244 if (tf < _last_roll_or_reversal_location + offset) {
1245 return _last_roll_or_reversal_location;
1253 } else if (_transport_speed < 0.0f) {
1255 /* XXX wot? no backward looping? */
1257 if (tf > _last_roll_or_reversal_location - offset) {
1258 return _last_roll_or_reversal_location;
1270 Session::set_frame_rate (framecnt_t frames_per_second)
1272 /** \fn void Session::set_frame_size(framecnt_t)
1273 the AudioEngine object that calls this guarantees
1274 that it will not be called while we are also in
1275 ::process(). Its fine to do things that block
1279 _base_frame_rate = frames_per_second;
1283 Automatable::set_automation_interval (ceil ((double) frames_per_second * (0.001 * Config->get_automation_interval())));
1287 // XXX we need some equivalent to this, somehow
1288 // SndFileSource::setup_standard_crossfades (frames_per_second);
1292 /* XXX need to reset/reinstantiate all LADSPA plugins */
1296 Session::set_block_size (pframes_t nframes)
1298 /* the AudioEngine guarantees
1299 that it will not be called while we are also in
1300 ::process(). It is therefore fine to do things that block
1305 current_block_size = nframes;
1309 boost::shared_ptr<RouteList> r = routes.reader ();
1311 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1312 (*i)->set_block_size (nframes);
1315 boost::shared_ptr<RouteList> rl = routes.reader ();
1316 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1317 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1319 tr->set_block_size (nframes);
1323 set_worst_io_latencies ();
1329 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1331 boost::shared_ptr<Route> r2;
1333 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1334 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1338 /* make a copy of the existing list of routes that feed r1 */
1340 Route::FedBy existing (r1->fed_by());
1342 /* for each route that feeds r1, recurse, marking it as feeding
1346 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1347 if (!(r2 = i->r.lock ())) {
1348 /* (*i) went away, ignore it */
1352 /* r2 is a route that feeds r1 which somehow feeds base. mark
1353 base as being fed by r2
1356 rbase->add_fed_by (r2, i->sends_only);
1360 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1364 if (r1->feeds (r2) && r2->feeds (r1)) {
1368 /* now recurse, so that we can mark base as being fed by
1369 all routes that feed r2
1372 trace_terminal (r2, rbase);
1379 Session::resort_routes ()
1381 /* don't do anything here with signals emitted
1382 by Routes during initial setup or while we
1383 are being destroyed.
1386 if (_state_of_the_state & (InitialConnecting | Deletion)) {
1391 RCUWriter<RouteList> writer (routes);
1392 boost::shared_ptr<RouteList> r = writer.get_copy ();
1393 resort_routes_using (r);
1394 /* writer goes out of scope and forces update */
1398 boost::shared_ptr<RouteList> rl = routes.reader ();
1399 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1400 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1402 const Route::FedBy& fb ((*i)->fed_by());
1404 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1405 boost::shared_ptr<Route> sf = f->r.lock();
1407 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1415 /** This is called whenever we need to rebuild the graph of how we will process
1417 * @param r List of routes, in any order.
1421 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1423 /* We are going to build a directed graph of our routes;
1424 this is where the edges of that graph are put.
1429 /* Go through all routes doing two things:
1431 * 1. Collect the edges of the route graph. Each of these edges
1432 * is a pair of routes, one of which directly feeds the other
1433 * either by a JACK connection or by an internal send.
1435 * 2. Begin the process of making routes aware of which other
1436 * routes directly or indirectly feed them. This information
1437 * is used by the solo code.
1440 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1442 /* Clear out the route's list of direct or indirect feeds */
1443 (*i)->clear_fed_by ();
1445 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
1447 bool via_sends_only;
1449 /* See if this *j feeds *i according to the current state of the JACK
1450 connections and internal sends.
1452 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
1453 /* add the edge to the graph (part #1) */
1454 edges.add (*j, *i, via_sends_only);
1455 /* tell the route (for part #2) */
1456 (*i)->add_fed_by (*j, via_sends_only);
1461 /* Attempt a topological sort of the route graph */
1462 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
1464 if (sorted_routes) {
1465 /* We got a satisfactory topological sort, so there is no feedback;
1468 Note: the process graph rechain does not require a
1469 topologically-sorted list, but hey ho.
1471 if (_process_graph) {
1472 _process_graph->rechain (sorted_routes, edges);
1475 _current_route_graph = edges;
1477 /* Complete the building of the routes' lists of what directly
1478 or indirectly feeds them.
1480 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1481 trace_terminal (*i, *i);
1487 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1488 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1489 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1490 (*i)->name(), (*i)->order_key ("signal")));
1494 SuccessfulGraphSort (); /* EMIT SIGNAL */
1497 /* The topological sort failed, so we have a problem. Tell everyone
1498 and stick to the old graph; this will continue to be processed, so
1499 until the feedback is fixed, what is played back will not quite
1500 reflect what is actually connected. Note also that we do not
1501 do trace_terminal here, as it would fail due to an endless recursion,
1502 so the solo code will think that everything is still connected
1506 FeedbackDetected (); /* EMIT SIGNAL */
1511 /** Find a route name starting with \a base, maybe followed by the
1512 * lowest \a id. \a id will always be added if \a definitely_add_number
1513 * is true on entry; otherwise it will only be added if required
1514 * to make the name unique.
1516 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1517 * The available route name with the lowest ID will be used, and \a id
1518 * will be set to the ID.
1520 * \return false if a route name could not be found, and \a track_name
1521 * and \a id do not reflect a free route name.
1524 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1526 if (!definitely_add_number && route_by_name (base) == 0) {
1527 /* juse use the base */
1528 snprintf (name, name_len, "%s", base.c_str());
1533 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1535 if (route_by_name (name) == 0) {
1541 } while (id < (UINT_MAX-1));
1546 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
1548 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
1550 in = ChanCount::ZERO;
1551 out = ChanCount::ZERO;
1553 boost::shared_ptr<RouteList> r = routes.reader ();
1555 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1556 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1557 if (tr && !tr->is_hidden()) {
1558 in += tr->n_inputs();
1559 out += tr->n_outputs();
1564 /** Caller must not hold process lock
1565 * @param name_template string to use for the start of the name, or "" to use "MIDI".
1566 * @param instrument plugin info for the instrument to insert pre-fader, if any
1568 list<boost::shared_ptr<MidiTrack> >
1569 Session::new_midi_track (boost::shared_ptr<PluginInfo> instrument, TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1571 char track_name[32];
1572 uint32_t track_id = 0;
1574 RouteList new_routes;
1575 list<boost::shared_ptr<MidiTrack> > ret;
1576 uint32_t control_id;
1578 control_id = next_control_id ();
1580 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
1583 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1584 error << "cannot find name for new midi track" << endmsg;
1588 boost::shared_ptr<MidiTrack> track;
1591 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1593 if (track->init ()) {
1597 track->use_new_diskstream();
1599 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1600 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1603 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1604 if (track->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1605 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1609 if (track->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1610 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1615 track->non_realtime_input_change();
1618 route_group->add (track);
1621 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1622 track->set_remote_control_id (control_id);
1624 new_routes.push_back (track);
1625 ret.push_back (track);
1628 catch (failed_constructor &err) {
1629 error << _("Session: could not create new midi track.") << endmsg;
1633 catch (AudioEngine::PortRegistrationFailure& pfe) {
1635 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;
1643 if (!new_routes.empty()) {
1644 add_routes (new_routes, true, true, true);
1647 for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
1648 PluginPtr plugin = instrument->load (*this);
1649 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
1650 (*r)->add_processor (p, PreFader);
1660 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
1662 boost::shared_ptr<Route> midi_track (wmt.lock());
1668 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
1670 if (change.after.n_audio() <= change.before.n_audio()) {
1674 /* new audio ports: make sure the audio goes somewhere useful,
1675 unless the user has no-auto-connect selected.
1677 The existing ChanCounts don't matter for this call as they are only
1678 to do with matching input and output indices, and we are only changing
1684 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
1688 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1689 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1690 * @param output_start As \a input_start, but for outputs.
1693 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
1694 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
1696 if (!IO::connecting_legal) {
1700 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::NOT_LOCK);
1706 /* If both inputs and outputs are auto-connected to physical ports,
1707 use the max of input and output offsets to ensure auto-connected
1708 port numbers always match up (e.g. the first audio input and the
1709 first audio output of the route will have the same physical
1710 port number). Otherwise just use the lowest input or output
1714 DEBUG_TRACE (DEBUG::Graph,
1715 string_compose("Auto-connect: existing in = %1 out = %2\n",
1716 existing_inputs, existing_outputs));
1718 const bool in_out_physical =
1719 (Config->get_input_auto_connect() & AutoConnectPhysical)
1720 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1723 const ChanCount in_offset = in_out_physical
1724 ? ChanCount::max(existing_inputs, existing_outputs)
1727 const ChanCount out_offset = in_out_physical
1728 ? ChanCount::max(existing_inputs, existing_outputs)
1731 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1732 vector<string> physinputs;
1733 vector<string> physoutputs;
1735 _engine.get_physical_outputs (*t, physoutputs);
1736 _engine.get_physical_inputs (*t, physinputs);
1738 if (!physinputs.empty() && connect_inputs) {
1739 uint32_t nphysical_in = physinputs.size();
1741 DEBUG_TRACE (DEBUG::Graph,
1742 string_compose("There are %1 physical inputs of type %2\n",
1745 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1748 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1749 DEBUG_TRACE (DEBUG::Graph,
1750 string_compose("Get index %1 + %2 % %3 = %4\n",
1751 in_offset.get(*t), i, nphysical_in,
1752 (in_offset.get(*t) + i) % nphysical_in));
1753 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1756 DEBUG_TRACE (DEBUG::Graph,
1757 string_compose("Connect route %1 IN to %2\n",
1758 route->name(), port));
1760 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
1764 ChanCount one_added (*t, 1);
1765 existing_inputs += one_added;
1769 if (!physoutputs.empty()) {
1770 uint32_t nphysical_out = physoutputs.size();
1771 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
1774 if ((*t) == DataType::MIDI || Config->get_output_auto_connect() & AutoConnectPhysical) {
1775 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1776 } else if ((*t) == DataType::AUDIO && Config->get_output_auto_connect() & AutoConnectMaster) {
1777 /* master bus is audio only */
1778 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1779 port = _master_out->input()->ports().port(*t,
1780 i % _master_out->input()->n_ports().get(*t))->name();
1784 DEBUG_TRACE (DEBUG::Graph,
1785 string_compose("Connect route %1 OUT to %2\n",
1786 route->name(), port));
1788 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
1792 ChanCount one_added (*t, 1);
1793 existing_outputs += one_added;
1799 /** Caller must not hold process lock
1800 * @param name_template string to use for the start of the name, or "" to use "Audio".
1802 list< boost::shared_ptr<AudioTrack> >
1803 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
1804 uint32_t how_many, string name_template)
1806 char track_name[32];
1807 uint32_t track_id = 0;
1809 RouteList new_routes;
1810 list<boost::shared_ptr<AudioTrack> > ret;
1811 uint32_t control_id;
1813 control_id = next_control_id ();
1815 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
1818 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1819 error << "cannot find name for new audio track" << endmsg;
1823 boost::shared_ptr<AudioTrack> track;
1826 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
1828 if (track->init ()) {
1832 track->use_new_diskstream();
1834 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1835 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1838 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1840 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1841 error << string_compose (
1842 _("cannot configure %1 in/%2 out configuration for new audio track"),
1843 input_channels, output_channels)
1848 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1849 error << string_compose (
1850 _("cannot configure %1 in/%2 out configuration for new audio track"),
1851 input_channels, output_channels)
1858 route_group->add (track);
1861 track->non_realtime_input_change();
1863 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1864 track->set_remote_control_id (control_id);
1867 new_routes.push_back (track);
1868 ret.push_back (track);
1871 catch (failed_constructor &err) {
1872 error << _("Session: could not create new audio track.") << endmsg;
1876 catch (AudioEngine::PortRegistrationFailure& pfe) {
1878 error << pfe.what() << endmsg;
1886 if (!new_routes.empty()) {
1887 add_routes (new_routes, true, true, true);
1894 Session::set_remote_control_ids ()
1896 RemoteModel m = Config->get_remote_model();
1897 bool emit_signal = false;
1899 boost::shared_ptr<RouteList> r = routes.reader ();
1901 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1902 if (MixerOrdered == m) {
1903 int32_t order = (*i)->order_key(N_("signal"));
1904 (*i)->set_remote_control_id (order+1, false);
1906 } else if (EditorOrdered == m) {
1907 int32_t order = (*i)->order_key(N_("editor"));
1908 (*i)->set_remote_control_id (order+1, false);
1910 } else if (UserOrdered == m) {
1911 //do nothing ... only changes to remote id's are initiated by user
1916 Route::RemoteControlIDChange();
1920 /** Caller must not hold process lock.
1921 * @param name_template string to use for the start of the name, or "" to use "Bus".
1924 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
1927 uint32_t bus_id = 0;
1930 uint32_t control_id;
1932 control_id = next_control_id ();
1934 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
1937 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
1938 error << "cannot find name for new audio bus" << endmsg;
1943 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
1949 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1950 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
1953 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1955 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1956 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1957 input_channels, output_channels)
1963 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1964 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1965 input_channels, output_channels)
1972 route_group->add (bus);
1974 bus->set_remote_control_id (control_id);
1977 bus->add_internal_return ();
1979 ret.push_back (bus);
1983 catch (failed_constructor &err) {
1984 error << _("Session: could not create new audio route.") << endmsg;
1988 catch (AudioEngine::PortRegistrationFailure& pfe) {
1989 error << pfe.what() << endmsg;
1999 add_routes (ret, false, true, true); // autoconnect outputs only
2007 Session::new_route_from_template (uint32_t how_many, const std::string& template_path)
2010 uint32_t control_id;
2012 uint32_t number = 0;
2014 if (!tree.read (template_path.c_str())) {
2018 XMLNode* node = tree.root();
2020 IO::disable_connecting ();
2022 control_id = next_control_id ();
2026 XMLNode node_copy (*node);
2028 /* Remove IDs of everything so that new ones are used */
2029 node_copy.remove_property_recursively (X_("id"));
2032 string const route_name = node_copy.property(X_("name"))->value ();
2034 /* generate a new name by adding a number to the end of the template name */
2036 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2037 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2041 /* set this name in the XML description that we are about to use */
2042 Route::set_name_in_state (node_copy, name);
2044 /* trim bitslots from listen sends so that new ones are used */
2045 XMLNodeList children = node_copy.children ();
2046 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2047 if ((*i)->name() == X_("Processor")) {
2048 XMLProperty* role = (*i)->property (X_("role"));
2049 if (role && role->value() == X_("Listen")) {
2050 (*i)->remove_property (X_("bitslot"));
2055 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2058 error << _("Session: cannot create track/bus from template description") << endmsg;
2062 if (boost::dynamic_pointer_cast<Track>(route)) {
2063 /* force input/output change signals so that the new diskstream
2064 picks up the configuration of the route. During session
2065 loading this normally happens in a different way.
2068 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2070 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2071 change.after = route->input()->n_ports();
2072 route->input()->changed (change, this);
2073 change.after = route->output()->n_ports();
2074 route->output()->changed (change, this);
2077 route->set_remote_control_id (control_id);
2080 ret.push_back (route);
2083 catch (failed_constructor &err) {
2084 error << _("Session: could not create new route from template") << endmsg;
2088 catch (AudioEngine::PortRegistrationFailure& pfe) {
2089 error << pfe.what() << endmsg;
2098 add_routes (ret, true, true, true);
2099 IO::enable_connecting ();
2106 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
2108 ChanCount existing_inputs;
2109 ChanCount existing_outputs;
2111 count_existing_track_channels (existing_inputs, existing_outputs);
2114 RCUWriter<RouteList> writer (routes);
2115 boost::shared_ptr<RouteList> r = writer.get_copy ();
2116 r->insert (r->end(), new_routes.begin(), new_routes.end());
2118 /* if there is no control out and we're not in the middle of loading,
2119 resort the graph here. if there is a control out, we will resort
2120 toward the end of this method. if we are in the middle of loading,
2121 we will resort when done.
2124 if (!_monitor_out && IO::connecting_legal) {
2125 resort_routes_using (r);
2129 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2131 boost::weak_ptr<Route> wpr (*x);
2132 boost::shared_ptr<Route> r (*x);
2134 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2135 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2136 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2137 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2138 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2139 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2140 r->order_key_changed.connect_same_thread (*this, boost::bind (&Session::route_order_key_changed, this));
2142 if (r->is_master()) {
2146 if (r->is_monitor()) {
2150 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2152 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2153 track_playlist_changed (boost::weak_ptr<Track> (tr));
2154 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2156 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2158 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2159 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2163 if (input_auto_connect || output_auto_connect) {
2164 auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
2168 if (_monitor_out && IO::connecting_legal) {
2171 Glib::Mutex::Lock lm (_engine.process_lock());
2173 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2174 if ((*x)->is_monitor()) {
2176 } else if ((*x)->is_master()) {
2179 (*x)->enable_monitor_send ();
2190 save_state (_current_snapshot_name);
2193 RouteAdded (new_routes); /* EMIT SIGNAL */
2194 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
2198 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2200 boost::shared_ptr<RouteList> r = routes.reader ();
2201 boost::shared_ptr<Send> s;
2203 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2204 if ((s = (*i)->internal_send_for (dest)) != 0) {
2205 s->amp()->gain_control()->set_value (0.0);
2211 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2213 boost::shared_ptr<RouteList> r = routes.reader ();
2214 boost::shared_ptr<Send> s;
2216 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2217 if ((s = (*i)->internal_send_for (dest)) != 0) {
2218 s->amp()->gain_control()->set_value (1.0);
2224 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2226 boost::shared_ptr<RouteList> r = routes.reader ();
2227 boost::shared_ptr<Send> s;
2229 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2230 if ((s = (*i)->internal_send_for (dest)) != 0) {
2231 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2236 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2238 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2240 boost::shared_ptr<RouteList> r = routes.reader ();
2241 boost::shared_ptr<RouteList> t (new RouteList);
2243 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2244 /* no MIDI sends because there are no MIDI busses yet */
2245 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2250 add_internal_sends (dest, p, t);
2254 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2256 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2257 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
2262 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
2264 add_internal_send (dest, sender->before_processor_for_index (index), sender);
2268 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
2270 if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
2274 if (!dest->internal_return()) {
2275 dest->add_internal_return ();
2278 sender->add_aux_send (dest, before);
2284 Session::remove_route (boost::shared_ptr<Route> route)
2286 if (route == _master_out) {
2290 route->set_solo (false, this);
2293 RCUWriter<RouteList> writer (routes);
2294 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2298 /* deleting the master out seems like a dumb
2299 idea, but its more of a UI policy issue
2303 if (route == _master_out) {
2304 _master_out = boost::shared_ptr<Route> ();
2307 if (route == _monitor_out) {
2308 _monitor_out.reset ();
2311 /* writer goes out of scope, forces route list update */
2314 update_route_solo_state ();
2316 // We need to disconnect the route's inputs and outputs
2318 route->input()->disconnect (0);
2319 route->output()->disconnect (0);
2321 /* if the route had internal sends sending to it, remove them */
2322 if (route->internal_return()) {
2324 boost::shared_ptr<RouteList> r = routes.reader ();
2325 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2326 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2328 (*i)->remove_processor (s);
2333 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2334 if (mt && mt->step_editing()) {
2335 if (_step_editors > 0) {
2340 update_latency_compensation ();
2343 /* Re-sort routes to remove the graph's current references to the one that is
2344 * going away, then flush old references out of the graph.
2348 if (_process_graph) {
2349 _process_graph->clear_other_chain ();
2352 /* get rid of it from the dead wood collection in the route list manager */
2354 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2358 /* try to cause everyone to drop their references */
2360 route->drop_references ();
2362 sync_order_keys (N_("session"));
2364 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2366 /* save the new state of the world */
2368 if (save_state (_current_snapshot_name)) {
2369 save_history (_current_snapshot_name);
2374 Session::route_mute_changed (void* /*src*/)
2380 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2382 boost::shared_ptr<Route> route = wpr.lock();
2384 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2388 if (route->listening_via_monitor ()) {
2390 if (Config->get_exclusive_solo()) {
2391 /* new listen: disable all other listen */
2392 boost::shared_ptr<RouteList> r = routes.reader ();
2393 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2394 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2397 (*i)->set_listen (false, this);
2403 } else if (_listen_cnt > 0) {
2408 update_route_solo_state ();
2411 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2413 boost::shared_ptr<Route> route = wpr.lock ();
2416 /* should not happen */
2417 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2421 bool send_changed = false;
2423 if (route->solo_isolated()) {
2424 if (_solo_isolated_cnt == 0) {
2425 send_changed = true;
2427 _solo_isolated_cnt++;
2428 } else if (_solo_isolated_cnt > 0) {
2429 _solo_isolated_cnt--;
2430 if (_solo_isolated_cnt == 0) {
2431 send_changed = true;
2436 IsolatedChanged (); /* EMIT SIGNAL */
2441 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2443 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
2445 if (!self_solo_change) {
2446 // session doesn't care about changes to soloed-by-others
2450 if (solo_update_disabled) {
2452 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
2456 boost::shared_ptr<Route> route = wpr.lock ();
2459 boost::shared_ptr<RouteList> r = routes.reader ();
2462 if (route->self_soloed()) {
2468 RouteGroup* rg = route->route_group ();
2469 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
2471 if (delta == 1 && Config->get_exclusive_solo()) {
2473 /* new solo: disable all other solos, but not the group if its solo-enabled */
2475 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2476 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2477 (leave_group_alone && ((*i)->route_group() == rg))) {
2480 (*i)->set_solo (false, this);
2484 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
2486 solo_update_disabled = true;
2488 RouteList uninvolved;
2490 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
2492 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2493 bool via_sends_only;
2494 bool in_signal_flow;
2496 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2497 (leave_group_alone && ((*i)->route_group() == rg))) {
2501 in_signal_flow = false;
2503 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
2505 if ((*i)->feeds (route, &via_sends_only)) {
2506 if (!via_sends_only) {
2507 if (!route->soloed_by_others_upstream()) {
2508 (*i)->mod_solo_by_others_downstream (delta);
2511 in_signal_flow = true;
2513 DEBUG_TRACE (DEBUG::Solo, "\tno feed from\n");
2516 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
2518 if (route->feeds (*i, &via_sends_only)) {
2519 /* propagate solo upstream only if routing other than
2520 sends is involved, but do consider the other route
2521 (*i) to be part of the signal flow even if only
2524 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
2528 route->soloed_by_others_downstream(),
2529 route->soloed_by_others_upstream()));
2530 if (!via_sends_only) {
2531 if (!route->soloed_by_others_downstream()) {
2532 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
2533 (*i)->mod_solo_by_others_upstream (delta);
2536 in_signal_flow = true;
2538 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
2541 if (!in_signal_flow) {
2542 uninvolved.push_back (*i);
2546 solo_update_disabled = false;
2547 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
2549 update_route_solo_state (r);
2551 /* now notify that the mute state of the routes not involved in the signal
2552 pathway of the just-solo-changed route may have altered.
2555 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2556 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1\n", (*i)->name()));
2557 (*i)->mute_changed (this);
2560 SoloChanged (); /* EMIT SIGNAL */
2565 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2567 /* now figure out if anything that matters is soloed (or is "listening")*/
2569 bool something_soloed = false;
2570 uint32_t listeners = 0;
2571 uint32_t isolated = 0;
2574 r = routes.reader();
2577 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2578 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2579 something_soloed = true;
2582 if (!(*i)->is_hidden() && (*i)->listening_via_monitor()) {
2583 if (Config->get_solo_control_is_listen_control()) {
2586 (*i)->set_listen (false, this);
2590 if ((*i)->solo_isolated()) {
2595 if (something_soloed != _non_soloed_outs_muted) {
2596 _non_soloed_outs_muted = something_soloed;
2597 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2600 _listen_cnt = listeners;
2602 if (isolated != _solo_isolated_cnt) {
2603 _solo_isolated_cnt = isolated;
2604 IsolatedChanged (); /* EMIT SIGNAL */
2608 boost::shared_ptr<RouteList>
2609 Session::get_routes_with_internal_returns() const
2611 boost::shared_ptr<RouteList> r = routes.reader ();
2612 boost::shared_ptr<RouteList> rl (new RouteList);
2614 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2615 if ((*i)->internal_return ()) {
2623 Session::io_name_is_legal (const std::string& name)
2625 boost::shared_ptr<RouteList> r = routes.reader ();
2627 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2628 if ((*i)->name() == name) {
2632 if ((*i)->has_io_processor_named (name)) {
2641 Session::set_exclusive_input_active (boost::shared_ptr<Route> rt, bool /*others_on*/)
2644 vector<string> connections;
2646 PortSet& ps (rt->input()->ports());
2648 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
2649 p->get_connections (connections);
2652 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
2653 routes_using_input_from (*s, rl);
2656 /* scan all relevant routes to see if others are on or off */
2658 bool others_are_already_on = false;
2660 for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
2662 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2664 if (mt->input_active()) {
2665 others_are_already_on = true;
2672 /* globally reverse other routes */
2674 for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
2676 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2678 mt->set_input_active (!others_are_already_on);
2685 Session::routes_using_input_from (const string& str, RouteList& rl)
2687 boost::shared_ptr<RouteList> r = routes.reader ();
2689 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2690 if ((*i)->input()->connected_to (str)) {
2696 boost::shared_ptr<Route>
2697 Session::route_by_name (string name)
2699 boost::shared_ptr<RouteList> r = routes.reader ();
2701 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2702 if ((*i)->name() == name) {
2707 return boost::shared_ptr<Route> ((Route*) 0);
2710 boost::shared_ptr<Route>
2711 Session::route_by_id (PBD::ID id)
2713 boost::shared_ptr<RouteList> r = routes.reader ();
2715 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2716 if ((*i)->id() == id) {
2721 return boost::shared_ptr<Route> ((Route*) 0);
2724 boost::shared_ptr<Track>
2725 Session::track_by_diskstream_id (PBD::ID id)
2727 boost::shared_ptr<RouteList> r = routes.reader ();
2729 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2730 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
2731 if (t && t->using_diskstream_id (id)) {
2736 return boost::shared_ptr<Track> ();
2739 boost::shared_ptr<Route>
2740 Session::route_by_remote_id (uint32_t id)
2742 boost::shared_ptr<RouteList> r = routes.reader ();
2744 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2745 if ((*i)->remote_control_id() == id) {
2750 return boost::shared_ptr<Route> ((Route*) 0);
2754 Session::playlist_region_added (boost::weak_ptr<Region> w)
2756 boost::shared_ptr<Region> r = w.lock ();
2761 /* These are the operations that are currently in progress... */
2762 list<GQuark> curr = _current_trans_quarks;
2765 /* ...and these are the operations during which we want to update
2766 the session range location markers.
2769 ops.push_back (Operations::capture);
2770 ops.push_back (Operations::paste);
2771 ops.push_back (Operations::duplicate_region);
2772 ops.push_back (Operations::insert_file);
2773 ops.push_back (Operations::insert_region);
2774 ops.push_back (Operations::drag_region_brush);
2775 ops.push_back (Operations::region_drag);
2776 ops.push_back (Operations::selection_grab);
2777 ops.push_back (Operations::region_fill);
2778 ops.push_back (Operations::fill_selection);
2779 ops.push_back (Operations::create_region);
2780 ops.push_back (Operations::region_copy);
2781 ops.push_back (Operations::fixed_time_region_copy);
2784 /* See if any of the current operations match the ones that we want */
2786 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
2788 /* If so, update the session range markers */
2790 maybe_update_session_range (r->position (), r->last_frame ());
2794 /** Update the session range markers if a is before the current start or
2795 * b is after the current end.
2798 Session::maybe_update_session_range (framepos_t a, framepos_t b)
2800 if (_state_of_the_state & Loading) {
2804 if (_session_range_location == 0) {
2806 add_session_range_location (a, b);
2810 if (a < _session_range_location->start()) {
2811 _session_range_location->set_start (a);
2814 if (b > _session_range_location->end()) {
2815 _session_range_location->set_end (b);
2821 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
2823 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2824 maybe_update_session_range (i->to, i->to + i->length);
2829 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
2831 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2832 maybe_update_session_range (i->from, i->to);
2836 /* Region management */
2838 boost::shared_ptr<Region>
2839 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2841 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2842 RegionFactory::RegionMap::const_iterator i;
2843 boost::shared_ptr<Region> region;
2845 Glib::Mutex::Lock lm (region_lock);
2847 for (i = regions.begin(); i != regions.end(); ++i) {
2851 if (region->whole_file()) {
2853 if (child->source_equivalent (region)) {
2859 return boost::shared_ptr<Region> ();
2863 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2865 set<boost::shared_ptr<Region> > relevant_regions;
2867 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2868 RegionFactory::get_regions_using_source (*s, relevant_regions);
2871 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2872 set<boost::shared_ptr<Region> >::iterator tmp;
2877 playlists->destroy_region (*r);
2878 RegionFactory::map_remove (*r);
2880 (*r)->drop_sources ();
2881 (*r)->drop_references ();
2883 relevant_regions.erase (r);
2888 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
2891 Glib::Mutex::Lock ls (source_lock);
2892 /* remove from the main source list */
2893 sources.erase ((*s)->id());
2896 (*s)->mark_for_remove ();
2897 (*s)->drop_references ();
2906 Session::remove_last_capture ()
2908 list<boost::shared_ptr<Source> > srcs;
2910 boost::shared_ptr<RouteList> rl = routes.reader ();
2911 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2912 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2917 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
2920 srcs.insert (srcs.end(), l.begin(), l.end());
2925 destroy_sources (srcs);
2927 save_state (_current_snapshot_name);
2932 /* Source Management */
2935 Session::add_source (boost::shared_ptr<Source> source)
2937 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
2938 pair<SourceMap::iterator,bool> result;
2940 entry.first = source->id();
2941 entry.second = source;
2944 Glib::Mutex::Lock lm (source_lock);
2945 result = sources.insert (entry);
2948 if (result.second) {
2950 /* yay, new source */
2954 boost::shared_ptr<AudioFileSource> afs;
2956 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
2957 if (Config->get_auto_analyse_audio()) {
2958 Analyser::queue_source_for_analysis (source, false);
2962 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
2967 Session::remove_source (boost::weak_ptr<Source> src)
2969 if (_state_of_the_state & Deletion) {
2973 SourceMap::iterator i;
2974 boost::shared_ptr<Source> source = src.lock();
2981 Glib::Mutex::Lock lm (source_lock);
2983 if ((i = sources.find (source->id())) != sources.end()) {
2988 if (!(_state_of_the_state & InCleanup)) {
2990 /* save state so we don't end up with a session file
2991 referring to non-existent sources.
2994 save_state (_current_snapshot_name);
2998 boost::shared_ptr<Source>
2999 Session::source_by_id (const PBD::ID& id)
3001 Glib::Mutex::Lock lm (source_lock);
3002 SourceMap::iterator i;
3003 boost::shared_ptr<Source> source;
3005 if ((i = sources.find (id)) != sources.end()) {
3012 boost::shared_ptr<Source>
3013 Session::source_by_path_and_channel (const string& path, uint16_t chn)
3015 Glib::Mutex::Lock lm (source_lock);
3017 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3018 boost::shared_ptr<AudioFileSource> afs
3019 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
3021 if (afs && afs->path() == path && chn == afs->channel()) {
3025 return boost::shared_ptr<Source>();
3029 Session::count_sources_by_origin (const string& path)
3032 Glib::Mutex::Lock lm (source_lock);
3034 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3035 boost::shared_ptr<FileSource> fs
3036 = boost::dynamic_pointer_cast<FileSource>(i->second);
3038 if (fs && fs->origin() == path) {
3048 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
3051 string old_basename = PBD::basename_nosuffix (oldname);
3052 string new_legalized = legalize_for_path (newname);
3054 /* note: we know (or assume) the old path is already valid */
3058 /* destructive file sources have a name of the form:
3060 /path/to/Tnnnn-NAME(%[LR])?.wav
3062 the task here is to replace NAME with the new name.
3067 string::size_type dash;
3069 dir = Glib::path_get_dirname (path);
3070 path = Glib::path_get_basename (path);
3072 /* '-' is not a legal character for the NAME part of the path */
3074 if ((dash = path.find_last_of ('-')) == string::npos) {
3078 prefix = path.substr (0, dash);
3082 path += new_legalized;
3083 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3084 path = Glib::build_filename (dir, path);
3088 /* non-destructive file sources have a name of the form:
3090 /path/to/NAME-nnnnn(%[LR])?.ext
3092 the task here is to replace NAME with the new name.
3097 string::size_type dash;
3098 string::size_type postfix;
3100 dir = Glib::path_get_dirname (path);
3101 path = Glib::path_get_basename (path);
3103 /* '-' is not a legal character for the NAME part of the path */
3105 if ((dash = path.find_last_of ('-')) == string::npos) {
3109 suffix = path.substr (dash+1);
3111 // Suffix is now everything after the dash. Now we need to eliminate
3112 // the nnnnn part, which is done by either finding a '%' or a '.'
3114 postfix = suffix.find_last_of ("%");
3115 if (postfix == string::npos) {
3116 postfix = suffix.find_last_of ('.');
3119 if (postfix != string::npos) {
3120 suffix = suffix.substr (postfix);
3122 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
3126 const uint32_t limit = 10000;
3127 char buf[PATH_MAX+1];
3129 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
3131 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
3133 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
3134 path = Glib::build_filename (dir, buf);
3142 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
3151 /** Return the full path (in some session directory) for a new within-session source.
3152 * \a name must be a session-unique name that does not contain slashes
3153 * (e.g. as returned by new_*_source_name)
3156 Session::new_source_path_from_name (DataType type, const string& name)
3158 assert(name.find("/") == string::npos);
3160 SessionDirectory sdir(get_best_session_directory_for_new_source());
3163 if (type == DataType::AUDIO) {
3164 p = sdir.sound_path();
3165 } else if (type == DataType::MIDI) {
3166 p = sdir.midi_path();
3168 error << "Unknown source type, unable to create file path" << endmsg;
3173 return p.to_string();
3177 Session::peak_path (string base) const
3179 sys::path peakfile_path(_session_dir->peak_path());
3180 peakfile_path /= base + peakfile_suffix;
3181 return peakfile_path.to_string();
3184 /** Return a unique name based on \a base for a new internal audio source */
3186 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
3189 char buf[PATH_MAX+1];
3190 const uint32_t limit = 10000;
3192 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3195 legalized = legalize_for_path (base);
3197 // Find a "version" of the base name that doesn't exist in any of the possible directories.
3198 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3200 vector<space_and_path>::iterator i;
3201 uint32_t existing = 0;
3203 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3208 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3209 cnt, legalized.c_str(), ext.c_str());
3210 } else if (nchan == 2) {
3212 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
3213 cnt, legalized.c_str(), ext.c_str());
3215 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
3216 cnt, legalized.c_str(), ext.c_str());
3218 } else if (nchan < 26) {
3219 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
3220 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
3222 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3223 cnt, legalized.c_str(), ext.c_str());
3229 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3230 } else if (nchan == 2) {
3232 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
3234 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
3236 } else if (nchan < 26) {
3237 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
3239 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3243 SessionDirectory sdir((*i).path);
3245 string spath = sdir.sound_path().to_string();
3247 /* note that we search *without* the extension so that
3248 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3249 in the event that this new name is required for
3250 a file format change.
3253 if (matching_unsuffixed_filename_exists_in (spath, buf)) {
3259 if (existing == 0) {
3264 error << string_compose(
3265 _("There are already %1 recordings for %2, which I consider too many."),
3266 limit, base) << endmsg;
3268 throw failed_constructor();
3272 return Glib::path_get_basename (buf);
3275 /** Create a new within-session audio source */
3276 boost::shared_ptr<AudioFileSource>
3277 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
3279 const string name = new_audio_source_name (n, n_chans, chan, destructive);
3280 const string path = new_source_path_from_name(DataType::AUDIO, name);
3282 return boost::dynamic_pointer_cast<AudioFileSource> (
3283 SourceFactory::createWritable (DataType::AUDIO, *this, path, string(), destructive, frame_rate()));
3286 /** Return a unique name based on \a base for a new internal MIDI source */
3288 Session::new_midi_source_name (const string& base)
3291 char buf[PATH_MAX+1];
3292 const uint32_t limit = 10000;
3296 legalized = legalize_for_path (base);
3298 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3299 for (cnt = 1; cnt <= limit; ++cnt) {
3301 vector<space_and_path>::iterator i;
3302 uint32_t existing = 0;
3304 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3306 SessionDirectory sdir((*i).path);
3308 sys::path p = sdir.midi_path();
3311 snprintf (buf, sizeof(buf), "%s-%u.mid", p.to_string().c_str(), cnt);
3313 if (sys::exists (buf)) {
3318 if (existing == 0) {
3323 error << string_compose(
3324 _("There are already %1 recordings for %2, which I consider too many."),
3325 limit, base) << endmsg;
3327 throw failed_constructor();
3331 return Glib::path_get_basename(buf);
3335 /** Create a new within-session MIDI source */
3336 boost::shared_ptr<MidiSource>
3337 Session::create_midi_source_for_session (Track* track, string const & n)
3339 /* try to use the existing write source for the track, to keep numbering sane
3343 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3347 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3350 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3351 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3355 const string name = new_midi_source_name (n);
3356 const string path = new_source_path_from_name (DataType::MIDI, name);
3358 return boost::dynamic_pointer_cast<SMFSource> (
3359 SourceFactory::createWritable (
3360 DataType::MIDI, *this, path, string(), false, frame_rate()));
3365 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3367 if (playlist->hidden()) {
3371 playlists->add (playlist);
3374 playlist->release();
3381 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3383 if (_state_of_the_state & Deletion) {
3387 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3393 playlists->remove (playlist);
3399 Session::set_audition (boost::shared_ptr<Region> r)
3401 pending_audition_region = r;
3402 add_post_transport_work (PostTransportAudition);
3403 _butler->schedule_transport_work ();
3407 Session::audition_playlist ()
3409 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3410 ev->region.reset ();
3415 Session::non_realtime_set_audition ()
3417 assert (pending_audition_region);
3418 auditioner->audition_region (pending_audition_region);
3419 pending_audition_region.reset ();
3420 AuditionActive (true); /* EMIT SIGNAL */
3424 Session::audition_region (boost::shared_ptr<Region> r)
3426 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3432 Session::cancel_audition ()
3434 if (auditioner->auditioning()) {
3435 auditioner->cancel_audition ();
3436 AuditionActive (false); /* EMIT SIGNAL */
3441 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3443 if (a->is_monitor()) {
3446 if (b->is_monitor()) {
3449 return a->order_key(N_("signal")) < b->order_key(N_("signal"));
3453 Session::is_auditioning () const
3455 /* can be called before we have an auditioner object */
3457 return auditioner->auditioning();
3464 Session::graph_reordered ()
3466 /* don't do this stuff if we are setting up connections
3467 from a set_state() call or creating new tracks. Ditto for deletion.
3470 if (_state_of_the_state & (InitialConnecting|Deletion)) {
3474 /* every track/bus asked for this to be handled but it was deferred because
3475 we were connecting. do it now.
3478 request_input_change_handling ();
3482 /* force all diskstreams to update their capture offset values to
3483 reflect any changes in latencies within the graph.
3486 boost::shared_ptr<RouteList> rl = routes.reader ();
3487 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3488 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3490 tr->set_capture_offset ();
3496 Session::available_capture_duration ()
3498 float sample_bytes_on_disk = 4.0; // keep gcc happy
3500 switch (config.get_native_file_data_format()) {
3502 sample_bytes_on_disk = 4.0;
3506 sample_bytes_on_disk = 3.0;
3510 sample_bytes_on_disk = 2.0;
3514 /* impossible, but keep some gcc versions happy */
3515 fatal << string_compose (_("programming error: %1"),
3516 X_("illegal native file data format"))
3521 double scale = 4096.0 / sample_bytes_on_disk;
3523 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3524 return max_framecnt;
3527 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3531 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3534 RCUWriter<BundleList> writer (_bundles);
3535 boost::shared_ptr<BundleList> b = writer.get_copy ();
3536 b->push_back (bundle);
3539 BundleAdded (bundle); /* EMIT SIGNAL */
3545 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3547 bool removed = false;
3550 RCUWriter<BundleList> writer (_bundles);
3551 boost::shared_ptr<BundleList> b = writer.get_copy ();
3552 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3554 if (i != b->end()) {
3561 BundleRemoved (bundle); /* EMIT SIGNAL */
3567 boost::shared_ptr<Bundle>
3568 Session::bundle_by_name (string name) const
3570 boost::shared_ptr<BundleList> b = _bundles.reader ();
3572 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3573 if ((*i)->name() == name) {
3578 return boost::shared_ptr<Bundle> ();
3582 Session::tempo_map_changed (const PropertyChange&)
3586 playlists->update_after_tempo_map_change ();
3588 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3594 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3596 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3597 (*i)->recompute_frames_from_bbt ();
3601 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3602 * the given count with the current block size.
3605 Session::ensure_buffers (ChanCount howmany)
3607 BufferManager::ensure_buffers (howmany);
3611 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3613 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3614 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3619 Session::next_insert_id ()
3621 /* this doesn't really loop forever. just think about it */
3624 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3625 if (!insert_bitset[n]) {
3626 insert_bitset[n] = true;
3632 /* none available, so resize and try again */
3634 insert_bitset.resize (insert_bitset.size() + 16, false);
3639 Session::next_send_id ()
3641 /* this doesn't really loop forever. just think about it */
3644 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3645 if (!send_bitset[n]) {
3646 send_bitset[n] = true;
3652 /* none available, so resize and try again */
3654 send_bitset.resize (send_bitset.size() + 16, false);
3659 Session::next_aux_send_id ()
3661 /* this doesn't really loop forever. just think about it */
3664 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
3665 if (!aux_send_bitset[n]) {
3666 aux_send_bitset[n] = true;
3672 /* none available, so resize and try again */
3674 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
3679 Session::next_return_id ()
3681 /* this doesn't really loop forever. just think about it */
3684 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3685 if (!return_bitset[n]) {
3686 return_bitset[n] = true;
3692 /* none available, so resize and try again */
3694 return_bitset.resize (return_bitset.size() + 16, false);
3699 Session::mark_send_id (uint32_t id)
3701 if (id >= send_bitset.size()) {
3702 send_bitset.resize (id+16, false);
3704 if (send_bitset[id]) {
3705 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3707 send_bitset[id] = true;
3711 Session::mark_aux_send_id (uint32_t id)
3713 if (id >= aux_send_bitset.size()) {
3714 aux_send_bitset.resize (id+16, false);
3716 if (aux_send_bitset[id]) {
3717 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
3719 aux_send_bitset[id] = true;
3723 Session::mark_return_id (uint32_t id)
3725 if (id >= return_bitset.size()) {
3726 return_bitset.resize (id+16, false);
3728 if (return_bitset[id]) {
3729 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3731 return_bitset[id] = true;
3735 Session::mark_insert_id (uint32_t id)
3737 if (id >= insert_bitset.size()) {
3738 insert_bitset.resize (id+16, false);
3740 if (insert_bitset[id]) {
3741 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3743 insert_bitset[id] = true;
3747 Session::unmark_send_id (uint32_t id)
3749 if (id < send_bitset.size()) {
3750 send_bitset[id] = false;
3755 Session::unmark_aux_send_id (uint32_t id)
3757 if (id < aux_send_bitset.size()) {
3758 aux_send_bitset[id] = false;
3763 Session::unmark_return_id (uint32_t id)
3765 if (id < return_bitset.size()) {
3766 return_bitset[id] = false;
3771 Session::unmark_insert_id (uint32_t id)
3773 if (id < insert_bitset.size()) {
3774 insert_bitset[id] = false;
3779 /* Named Selection management */
3781 boost::shared_ptr<NamedSelection>
3782 Session::named_selection_by_name (string name)
3784 Glib::Mutex::Lock lm (named_selection_lock);
3785 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
3786 if ((*i)->name == name) {
3790 return boost::shared_ptr<NamedSelection>();
3794 Session::add_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3797 Glib::Mutex::Lock lm (named_selection_lock);
3798 named_selections.insert (named_selections.begin(), named_selection);
3803 NamedSelectionAdded (); /* EMIT SIGNAL */
3807 Session::remove_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3809 bool removed = false;
3812 Glib::Mutex::Lock lm (named_selection_lock);
3814 NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
3816 if (i != named_selections.end()) {
3817 named_selections.erase (i);
3824 NamedSelectionRemoved (); /* EMIT SIGNAL */
3829 Session::reset_native_file_format ()
3831 boost::shared_ptr<RouteList> rl = routes.reader ();
3832 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3833 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3835 /* don't save state as we do this, there's no point
3838 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3839 tr->reset_write_sources (false);
3840 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3846 Session::route_name_unique (string n) const
3848 boost::shared_ptr<RouteList> r = routes.reader ();
3850 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3851 if ((*i)->name() == n) {
3860 Session::route_name_internal (string n) const
3862 if (auditioner && auditioner->name() == n) {
3866 if (_click_io && _click_io->name() == n) {
3874 Session::freeze_all (InterThreadInfo& itt)
3876 boost::shared_ptr<RouteList> r = routes.reader ();
3878 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3880 boost::shared_ptr<Track> t;
3882 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3883 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3893 boost::shared_ptr<Region>
3894 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
3895 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3896 InterThreadInfo& itt,
3897 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
3900 boost::shared_ptr<Region> result;
3901 boost::shared_ptr<Playlist> playlist;
3902 boost::shared_ptr<AudioFileSource> fsource;
3904 char buf[PATH_MAX+1];
3905 ChanCount diskstream_channels (track.n_channels());
3906 framepos_t position;
3907 framecnt_t this_chunk;
3910 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3911 const string sound_dir = sdir.sound_path().to_string();
3912 framepos_t len = end - start;
3913 bool need_block_size_reset = false;
3915 ChanCount const max_proc = track.max_processor_streams ();
3918 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3919 end, start) << endmsg;
3923 const framecnt_t chunk_size = (256 * 1024)/4;
3925 // block all process callback handling
3927 block_processing ();
3929 /* call tree *MUST* hold route_lock */
3931 if ((playlist = track.playlist()) == 0) {
3935 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3937 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
3939 for (x = 0; x < 99999; ++x) {
3940 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());
3941 if (!Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
3947 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3952 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
3953 SourceFactory::createWritable (DataType::AUDIO, *this, buf, string(), false, frame_rate()));
3956 catch (failed_constructor& err) {
3957 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
3961 srcs.push_back (fsource);
3964 /* tell redirects that care that we are about to use a much larger
3965 * blocksize. this will flush all plugins too, so that they are ready
3966 * to be used for this process.
3969 need_block_size_reset = true;
3970 track.set_block_size (chunk_size);
3975 /* create a set of reasonably-sized buffers */
3976 buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
3977 buffers.set_count (max_proc);
3979 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3980 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3982 afs->prepare_for_peakfile_writes ();
3985 while (to_do && !itt.cancel) {
3987 this_chunk = min (to_do, chunk_size);
3989 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export)) {
3994 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
3995 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3998 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
4004 start += this_chunk;
4005 to_do -= this_chunk;
4007 itt.progress = (float) (1.0 - ((double) to_do / len));
4016 xnow = localtime (&now);
4018 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
4019 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4022 afs->update_header (position, *xnow, now);
4023 afs->flush_header ();
4027 /* construct a region to represent the bounced material */
4031 plist.add (Properties::start, 0);
4032 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4033 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4035 result = RegionFactory::create (srcs, plist);
4041 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4042 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4045 afs->mark_for_remove ();
4048 (*src)->drop_references ();
4052 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4053 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4056 afs->done_with_peakfile_writes ();
4061 if (need_block_size_reset) {
4062 track.set_block_size (get_block_size());
4065 unblock_processing ();
4071 Session::gain_automation_buffer() const
4073 return ProcessThread::gain_automation_buffer ();
4077 Session::pan_automation_buffer() const
4079 return ProcessThread::pan_automation_buffer ();
4083 Session::get_silent_buffers (ChanCount count)
4085 return ProcessThread::get_silent_buffers (count);
4089 Session::get_scratch_buffers (ChanCount count)
4091 return ProcessThread::get_scratch_buffers (count);
4095 Session::get_mix_buffers (ChanCount count)
4097 return ProcessThread::get_mix_buffers (count);
4101 Session::ntracks () const
4104 boost::shared_ptr<RouteList> r = routes.reader ();
4106 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4107 if (boost::dynamic_pointer_cast<Track> (*i)) {
4116 Session::nbusses () const
4119 boost::shared_ptr<RouteList> r = routes.reader ();
4121 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4122 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
4131 Session::add_automation_list(AutomationList *al)
4133 automation_lists[al->id()] = al;
4137 Session::sync_order_keys (std::string const & base)
4139 if (deletion_in_progress()) {
4143 if (!Config->get_sync_all_route_ordering()) {
4144 /* leave order keys as they are */
4148 boost::shared_ptr<RouteList> r = routes.reader ();
4150 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4151 (*i)->sync_order_keys (base);
4154 Route::SyncOrderKeys (base); // EMIT SIGNAL
4156 /* this might not do anything */
4158 set_remote_control_ids ();
4161 /** @return true if there is at least one record-enabled track, otherwise false */
4163 Session::have_rec_enabled_track () const
4165 return g_atomic_int_get (&_have_rec_enabled_track) == 1;
4168 /** Update the state of our rec-enabled tracks flag */
4170 Session::update_have_rec_enabled_track ()
4172 boost::shared_ptr<RouteList> rl = routes.reader ();
4173 RouteList::iterator i = rl->begin();
4174 while (i != rl->end ()) {
4176 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4177 if (tr && tr->record_enabled ()) {
4184 int const old = g_atomic_int_get (&_have_rec_enabled_track);
4186 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4188 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4189 RecordStateChanged (); /* EMIT SIGNAL */
4194 Session::listen_position_changed ()
4196 boost::shared_ptr<RouteList> r = routes.reader ();
4198 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4199 (*i)->listen_position_changed ();
4204 Session::solo_control_mode_changed ()
4206 /* cancel all solo or all listen when solo control mode changes */
4209 set_solo (get_routes(), false);
4210 } else if (listening()) {
4211 set_listen (get_routes(), false);
4215 /** Called when a property of one of our route groups changes */
4217 Session::route_group_property_changed (RouteGroup* rg)
4219 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4222 /** Called when a route is added to one of our route groups */
4224 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4226 RouteAddedToRouteGroup (rg, r);
4229 /** Called when a route is removed from one of our route groups */
4231 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4233 RouteRemovedFromRouteGroup (rg, r);
4237 Session::get_available_sync_options () const
4239 vector<SyncSource> ret;
4241 ret.push_back (JACK);
4242 ret.push_back (MTC);
4243 ret.push_back (MIDIClock);
4248 boost::shared_ptr<RouteList>
4249 Session::get_routes_with_regions_at (framepos_t const p) const
4251 boost::shared_ptr<RouteList> r = routes.reader ();
4252 boost::shared_ptr<RouteList> rl (new RouteList);
4254 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4255 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4260 boost::shared_ptr<Playlist> pl = tr->playlist ();
4265 if (pl->has_region_at (p)) {
4274 Session::goto_end ()
4276 if (_session_range_location) {
4277 request_locate (_session_range_location->end(), false);
4279 request_locate (0, false);
4284 Session::goto_start ()
4286 if (_session_range_location) {
4287 request_locate (_session_range_location->start(), false);
4289 request_locate (0, false);
4294 Session::current_start_frame () const
4296 return _session_range_location ? _session_range_location->start() : 0;
4300 Session::current_end_frame () const
4302 return _session_range_location ? _session_range_location->end() : 0;
4306 Session::add_session_range_location (framepos_t start, framepos_t end)
4308 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4309 _locations->add (_session_range_location);
4312 /** Called when one of our routes' order keys has changed */
4314 Session::route_order_key_changed ()
4316 RouteOrderKeyChanged (); /* EMIT SIGNAL */
4320 Session::step_edit_status_change (bool yn)
4326 send = (_step_editors == 0);
4331 send = (_step_editors == 1);
4334 if (_step_editors > 0) {
4340 StepEditStatusChange (val);
4346 Session::start_time_changed (framepos_t old)
4348 /* Update the auto loop range to match the session range
4349 (unless the auto loop range has been changed by the user)
4352 Location* s = _locations->session_range_location ();
4357 Location* l = _locations->auto_loop_location ();
4359 if (l && l->start() == old) {
4360 l->set_start (s->start(), true);
4365 Session::end_time_changed (framepos_t old)
4367 /* Update the auto loop range to match the session range
4368 (unless the auto loop range has been changed by the user)
4371 Location* s = _locations->session_range_location ();
4376 Location* l = _locations->auto_loop_location ();
4378 if (l && l->end() == old) {
4379 l->set_end (s->end(), true);
4384 Session::source_search_path (DataType type) const
4388 if (session_dirs.size() == 1) {
4390 case DataType::AUDIO:
4391 s.push_back ( _session_dir->sound_path().to_string());
4393 case DataType::MIDI:
4394 s.push_back (_session_dir->midi_path().to_string());
4398 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4399 SessionDirectory sdir (i->path);
4401 case DataType::AUDIO:
4402 s.push_back (sdir.sound_path().to_string());
4404 case DataType::MIDI:
4405 s.push_back (sdir.midi_path().to_string());
4411 /* now check the explicit (possibly user-specified) search path
4414 vector<string> dirs;
4417 case DataType::AUDIO:
4418 split (config.get_audio_search_path (), dirs, ':');
4420 case DataType::MIDI:
4421 split (config.get_midi_search_path (), dirs, ':');
4425 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4427 vector<string>::iterator si;
4429 for (si = s.begin(); si != s.end(); ++si) {
4435 if (si == s.end()) {
4442 for (vector<string>::iterator si = s.begin(); si != s.end(); ++si) {
4443 if (!search_path.empty()) {
4453 Session::ensure_search_path_includes (const string& path, DataType type)
4456 vector<string> dirs;
4463 case DataType::AUDIO:
4464 search_path = config.get_audio_search_path ();
4466 case DataType::MIDI:
4467 search_path = config.get_midi_search_path ();
4471 split (search_path, dirs, ':');
4473 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4474 /* No need to add this new directory if it has the same inode as
4475 an existing one; checking inode rather than name prevents duplicated
4476 directories when we are using symlinks.
4478 On Windows, I think we could just do if (*i == path) here.
4480 if (inodes_same (*i, path)) {
4485 if (!search_path.empty()) {
4489 search_path += path;
4492 case DataType::AUDIO:
4493 config.set_audio_search_path (search_path);
4495 case DataType::MIDI:
4496 config.set_midi_search_path (search_path);
4501 boost::shared_ptr<Speakers>
4502 Session::get_speakers()
4508 Session::unknown_processors () const
4512 boost::shared_ptr<RouteList> r = routes.reader ();
4513 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4514 list<string> t = (*i)->unknown_processors ();
4515 copy (t.begin(), t.end(), back_inserter (p));
4525 Session::update_latency (bool playback)
4527 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
4529 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4533 boost::shared_ptr<RouteList> r = routes.reader ();
4534 framecnt_t max_latency = 0;
4537 /* reverse the list so that we work backwards from the last route to run to the first */
4538 RouteList* rl = routes.reader().get();
4539 r.reset (new RouteList (*rl));
4540 reverse (r->begin(), r->end());
4543 /* compute actual latency values for the given direction and store them all in per-port
4544 structures. this will also publish the same values (to JACK) so that computation of latency
4545 for routes can consistently use public latency values.
4548 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4549 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
4552 /* because we latency compensate playback, our published playback latencies should
4553 be the same for all output ports - all material played back by ardour has
4554 the same latency, whether its caused by plugins or by latency compensation. since
4555 these may differ from the values computed above, reset all playback port latencies
4559 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
4561 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4562 (*i)->set_public_port_latencies (max_latency, playback);
4567 post_playback_latency ();
4571 post_capture_latency ();
4574 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
4578 Session::post_playback_latency ()
4580 set_worst_playback_latency ();
4582 boost::shared_ptr<RouteList> r = routes.reader ();
4584 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4585 if (!(*i)->is_hidden() && ((*i)->active())) {
4586 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
4590 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4591 (*i)->set_latency_compensation (_worst_track_latency);
4596 Session::post_capture_latency ()
4598 set_worst_capture_latency ();
4600 /* reflect any changes in capture latencies into capture offsets
4603 boost::shared_ptr<RouteList> rl = routes.reader();
4604 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4605 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4607 tr->set_capture_offset ();
4613 Session::initialize_latencies ()
4616 Glib::Mutex::Lock lm (_engine.process_lock());
4617 update_latency (false);
4618 update_latency (true);
4621 set_worst_io_latencies ();
4625 Session::set_worst_io_latencies ()
4627 set_worst_playback_latency ();
4628 set_worst_capture_latency ();
4632 Session::set_worst_playback_latency ()
4634 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4638 _worst_output_latency = 0;
4640 if (!_engine.connected()) {
4644 boost::shared_ptr<RouteList> r = routes.reader ();
4646 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4647 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
4650 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
4654 Session::set_worst_capture_latency ()
4656 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4660 _worst_input_latency = 0;
4662 if (!_engine.connected()) {
4666 boost::shared_ptr<RouteList> r = routes.reader ();
4668 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4669 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
4672 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
4676 Session::update_latency_compensation (bool force_whole_graph)
4678 bool some_track_latency_changed = false;
4680 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4684 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
4686 _worst_track_latency = 0;
4688 boost::shared_ptr<RouteList> r = routes.reader ();
4690 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4691 if (!(*i)->is_hidden() && ((*i)->active())) {
4693 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
4694 some_track_latency_changed = true;
4696 _worst_track_latency = max (tl, _worst_track_latency);
4700 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
4701 (some_track_latency_changed ? "yes" : "no")));
4703 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
4705 if (some_track_latency_changed || force_whole_graph) {
4706 _engine.update_latencies ();
4710 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4711 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4715 tr->set_capture_offset ();
4720 Session::session_name_is_legal (const string& path)
4722 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
4724 for (int i = 0; illegal_chars[i]; ++i) {
4725 if (path.find (illegal_chars[i]) != string::npos) {
4726 return illegal_chars[i];
4734 Session::next_control_id () const
4736 return ntracks() + nbusses() + 1;