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/crossfade.h"
70 #include "ardour/cycle_timer.h"
71 #include "ardour/data_type.h"
72 #include "ardour/debug.h"
73 #include "ardour/filename_extensions.h"
74 #include "ardour/internal_send.h"
75 #include "ardour/io_processor.h"
76 #include "ardour/midi_diskstream.h"
77 #include "ardour/midi_playlist.h"
78 #include "ardour/midi_region.h"
79 #include "ardour/midi_track.h"
80 #include "ardour/midi_ui.h"
81 #include "ardour/named_selection.h"
82 #include "ardour/process_thread.h"
83 #include "ardour/playlist.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_metadata.h"
98 #include "ardour/session_playlists.h"
99 #include "ardour/slave.h"
100 #include "ardour/smf_source.h"
101 #include "ardour/source_factory.h"
102 #include "ardour/tape_file_matcher.h"
103 #include "ardour/tempo.h"
104 #include "ardour/utils.h"
105 #include "ardour/graph.h"
106 #include "ardour/speakers.h"
107 #include "ardour/operations.h"
109 #include "midi++/port.h"
110 #include "midi++/mmc.h"
111 #include "midi++/manager.h"
116 using namespace ARDOUR;
119 bool Session::_disable_all_loaded_plugins = false;
121 PBD::Signal1<void,std::string> Session::Dialog;
122 PBD::Signal0<int> Session::AskAboutPendingState;
123 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
124 PBD::Signal0<void> Session::SendFeedback;
125 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
127 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
128 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
129 PBD::Signal0<void> Session::AutoBindingOn;
130 PBD::Signal0<void> Session::AutoBindingOff;
131 PBD::Signal2<void,std::string, std::string> Session::Exported;
132 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
133 PBD::Signal0<void> Session::Quit;
134 PBD::Signal0<void> Session::FeedbackDetected;
135 PBD::Signal0<void> Session::SuccessfulGraphSort;
137 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
138 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
140 /** @param snapshot_name Snapshot name, without .ardour prefix */
141 Session::Session (AudioEngine &eng,
142 const string& fullpath,
143 const string& snapshot_name,
144 BusProfile* bus_profile,
147 , _target_transport_speed (0.0)
148 , _requested_return_frame (-1)
149 , _session_dir (new SessionDirectory(fullpath))
151 , _state_of_the_state (Clean)
152 , _butler (new Butler (*this))
153 , _post_transport_work (0)
154 , _send_timecode_update (false)
155 , _all_route_group (new RouteGroup (*this, "all"))
156 , _process_graph (new Graph (*this))
157 , routes (new RouteList)
158 , _total_free_4k_blocks (0)
159 , _bundles (new BundleList)
160 , _bundle_xml_node (0)
162 , _click_io ((IO*) 0)
164 , click_emphasis_data (0)
166 , _metadata (new SessionMetadata())
167 , _have_rec_enabled_track (false)
168 , _suspend_timecode_transmission (0)
170 _locations = new Locations (*this);
172 playlists.reset (new SessionPlaylists);
174 _all_route_group->set_active (true, this);
176 interpolation.add_channel_to (0, 0);
178 if (!eng.connected()) {
179 throw failed_constructor();
182 n_physical_outputs = _engine.n_physical_outputs ();
183 n_physical_inputs = _engine.n_physical_inputs ();
185 first_stage_init (fullpath, snapshot_name);
187 _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
190 if (create (mix_template, bus_profile)) {
192 throw failed_constructor ();
196 if (second_stage_init ()) {
198 throw failed_constructor ();
201 store_recent_sessions(_name, _path);
203 bool was_dirty = dirty();
205 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
207 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
208 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
211 DirtyChanged (); /* EMIT SIGNAL */
214 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
215 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
231 vector<void*> debug_pointers;
233 /* if we got to here, leaving pending capture state around
237 remove_pending_capture_state ();
239 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
241 _engine.remove_session ();
243 /* clear history so that no references to objects are held any more */
247 /* clear state tree so that no references to objects are held any more */
251 /* reset dynamic state version back to default */
253 Stateful::loading_state_version = 0;
255 _butler->drop_references ();
257 delete midi_control_ui;
258 delete _all_route_group;
260 if (click_data != default_click) {
261 delete [] click_data;
264 if (click_emphasis_data != default_click_emphasis) {
265 delete [] click_emphasis_data;
270 /* clear out any pending dead wood from RCU managed objects */
275 AudioDiskstream::free_working_buffers();
277 /* tell everyone who is still standing that we're about to die */
280 /* tell everyone to drop references and delete objects as we go */
282 DEBUG_TRACE (DEBUG::Destruction, "delete named selections\n");
283 named_selections.clear ();
285 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
286 RegionFactory::delete_all_regions ();
288 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
290 /* reset these three references to special routes before we do the usual route delete thing */
293 _master_out.reset ();
294 _monitor_out.reset ();
297 RCUWriter<RouteList> writer (routes);
298 boost::shared_ptr<RouteList> r = writer.get_copy ();
300 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
301 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
302 (*i)->drop_references ();
306 /* writer goes out of scope and updates master */
310 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
311 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
312 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
313 i->second->drop_references ();
318 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
319 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
324 Crossfade::set_buffer_size (0);
326 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
331 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
333 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
334 boost_debug_list_ptrs ();
339 Session::when_engine_running ()
341 string first_physical_output;
343 BootMessage (_("Set block size and sample rate"));
345 set_block_size (_engine.frames_per_cycle());
346 set_frame_rate (_engine.frame_rate());
348 BootMessage (_("Using configuration"));
350 boost::function<void (std::string)> ff (boost::bind (&Session::config_changed, this, _1, false));
351 boost::function<void (std::string)> ft (boost::bind (&Session::config_changed, this, _1, true));
353 Config->map_parameters (ff);
354 config.map_parameters (ft);
356 /* every time we reconnect, recompute worst case output latencies */
358 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
360 if (synced_to_jack()) {
361 _engine.transport_stop ();
364 if (config.get_jack_time_master()) {
365 _engine.transport_locate (_transport_frame);
373 _click_io.reset (new ClickIO (*this, "click"));
375 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
377 /* existing state for Click */
380 if (Stateful::loading_state_version < 3000) {
381 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
383 c = _click_io->set_state (*child->children().front(), Stateful::loading_state_version);
388 _clicking = Config->get_clicking ();
392 error << _("could not setup Click I/O") << endmsg;
399 /* default state for Click: dual-mono to first 2 physical outputs */
402 _engine.get_physical_outputs (DataType::AUDIO, outs);
404 for (uint32_t physport = 0; physport < 2; ++physport) {
405 if (outs.size() > physport) {
406 if (_click_io->add_port (outs[physport], this)) {
407 // relax, even though its an error
412 if (_click_io->n_ports () > ChanCount::ZERO) {
413 _clicking = Config->get_clicking ();
418 catch (failed_constructor& err) {
419 error << _("cannot setup Click I/O") << endmsg;
422 BootMessage (_("Compute I/O Latencies"));
425 // XXX HOW TO ALERT UI TO THIS ? DO WE NEED TO?
428 BootMessage (_("Set up standard connections"));
430 vector<string> inputs[DataType::num_types];
431 vector<string> outputs[DataType::num_types];
432 for (uint32_t i = 0; i < DataType::num_types; ++i) {
433 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
434 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
437 /* Create a set of Bundle objects that map
438 to the physical I/O currently available. We create both
439 mono and stereo bundles, so that the common cases of mono
440 and stereo tracks get bundles to put in their mixer strip
441 in / out menus. There may be a nicer way of achieving that;
442 it doesn't really scale that well to higher channel counts
445 /* mono output bundles */
447 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
449 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
451 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
452 c->add_channel (_("mono"), DataType::AUDIO);
453 c->set_port (0, outputs[DataType::AUDIO][np]);
458 /* stereo output bundles */
460 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
461 if (np + 1 < outputs[DataType::AUDIO].size()) {
463 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
464 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
465 c->add_channel (_("L"), DataType::AUDIO);
466 c->set_port (0, outputs[DataType::AUDIO][np]);
467 c->add_channel (_("R"), DataType::AUDIO);
468 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
474 /* mono input bundles */
476 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
478 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
480 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
481 c->add_channel (_("mono"), DataType::AUDIO);
482 c->set_port (0, inputs[DataType::AUDIO][np]);
487 /* stereo input bundles */
489 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
490 if (np + 1 < inputs[DataType::AUDIO].size()) {
492 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
494 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
495 c->add_channel (_("L"), DataType::AUDIO);
496 c->set_port (0, inputs[DataType::AUDIO][np]);
497 c->add_channel (_("R"), DataType::AUDIO);
498 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
504 /* MIDI input bundles */
506 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
507 string n = inputs[DataType::MIDI][np];
508 boost::erase_first (n, X_("alsa_pcm:"));
510 boost::shared_ptr<Bundle> c (new Bundle (n, false));
511 c->add_channel ("", DataType::MIDI);
512 c->set_port (0, inputs[DataType::MIDI][np]);
516 /* MIDI output bundles */
518 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
519 string n = outputs[DataType::MIDI][np];
520 boost::erase_first (n, X_("alsa_pcm:"));
522 boost::shared_ptr<Bundle> c (new Bundle (n, true));
523 c->add_channel ("", DataType::MIDI);
524 c->set_port (0, outputs[DataType::MIDI][np]);
528 BootMessage (_("Setup signal flow and plugins"));
530 ControlProtocolManager::instance().set_session (this);
532 /* This must be done after the ControlProtocolManager set_session above,
533 as it will set states for ports which the ControlProtocolManager creates.
535 MIDI::Manager::instance()->set_port_states (Config->midi_port_states ());
537 /* And this must be done after the MIDI::Manager::set_port_states as
538 * it will try to make connections whose details are loaded by set_port_states.
543 if (_is_new && !no_auto_connect()) {
544 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock());
545 auto_connect_master_bus ();
548 _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
550 /* update latencies */
552 initialize_latencies ();
554 /* hook us up to the engine */
556 BootMessage (_("Connect to engine"));
557 _engine.set_session (this);
561 Session::auto_connect_master_bus ()
563 if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
567 /* if requested auto-connect the outputs to the first N physical ports.
570 uint32_t limit = _master_out->n_outputs().n_total();
571 vector<string> outputs[DataType::num_types];
573 for (uint32_t i = 0; i < DataType::num_types; ++i) {
574 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
577 for (uint32_t n = 0; n < limit; ++n) {
578 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
580 if (outputs[p->type()].size() > n) {
581 connect_to = outputs[p->type()][n];
584 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
585 if (_master_out->output()->connect (p, connect_to, this)) {
586 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
595 Session::remove_monitor_section ()
601 /* force reversion to Solo-In-Pace */
602 Config->set_solo_control_is_listen_control (false);
605 /* Hold process lock while doing this so that we don't hear bits and
606 * pieces of audio as we work on each route.
609 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
611 /* Connect tracks to monitor section. Note that in an
612 existing session, the internal sends will already exist, but we want the
613 routes to notice that they connect to the control out specifically.
617 boost::shared_ptr<RouteList> r = routes.reader ();
618 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
620 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
622 if ((*x)->is_monitor()) {
624 } else if ((*x)->is_master()) {
627 (*x)->remove_aux_or_listen (_monitor_out);
632 remove_route (_monitor_out);
633 auto_connect_master_bus ();
637 Session::add_monitor_section ()
641 if (_monitor_out || !_master_out) {
645 boost::shared_ptr<Route> r (new Route (*this, _("monitor"), Route::MonitorOut, DataType::AUDIO));
651 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
652 // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
655 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
656 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
657 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
661 add_routes (rl, false, false);
663 assert (_monitor_out);
665 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
666 are undefined, at best.
669 uint32_t limit = _monitor_out->n_inputs().n_audio();
673 /* connect the inputs to the master bus outputs. this
674 * represents a separate data feed from the internal sends from
675 * each route. as of jan 2011, it allows the monitor section to
676 * conditionally ignore either the internal sends or the normal
677 * input feed, but we should really find a better way to do
681 _master_out->output()->disconnect (this);
683 for (uint32_t n = 0; n < limit; ++n) {
684 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
685 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
688 string connect_to = o->name();
689 if (_monitor_out->input()->connect (p, connect_to, this)) {
690 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
698 /* if monitor section is not connected, connect it to physical outs
701 if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
703 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
705 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
708 _monitor_out->output()->connect_ports_to_bundle (b, this);
710 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
711 Config->get_monitor_bus_preferred_bundle())
717 /* Monitor bus is audio only */
719 uint32_t mod = n_physical_outputs.get (DataType::AUDIO);
720 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
721 vector<string> outputs[DataType::num_types];
723 for (uint32_t i = 0; i < DataType::num_types; ++i) {
724 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
730 for (uint32_t n = 0; n < limit; ++n) {
732 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
734 if (outputs[DataType::AUDIO].size() > (n % mod)) {
735 connect_to = outputs[DataType::AUDIO][n % mod];
738 if (!connect_to.empty()) {
739 if (_monitor_out->output()->connect (p, connect_to, this)) {
740 error << string_compose (
741 _("cannot connect control output %1 to %2"),
752 /* Hold process lock while doing this so that we don't hear bits and
753 * pieces of audio as we work on each route.
756 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
758 /* Connect tracks to monitor section. Note that in an
759 existing session, the internal sends will already exist, but we want the
760 routes to notice that they connect to the control out specifically.
764 boost::shared_ptr<RouteList> rls = routes.reader ();
766 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
768 for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
770 if ((*x)->is_monitor()) {
772 } else if ((*x)->is_master()) {
775 (*x)->enable_monitor_send ();
781 Session::hookup_io ()
783 /* stop graph reordering notifications from
784 causing resorts, etc.
787 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
791 /* we delay creating the auditioner till now because
792 it makes its own connections to ports.
796 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
798 throw failed_constructor ();
800 a->use_new_diskstream ();
804 catch (failed_constructor& err) {
805 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
809 /* load bundles, which we may have postponed earlier on */
810 if (_bundle_xml_node) {
811 load_bundles (*_bundle_xml_node);
812 delete _bundle_xml_node;
815 /* Tell all IO objects to connect themselves together */
817 IO::enable_connecting ();
818 MIDI::Port::MakeConnections ();
820 /* Now reset all panners */
822 Delivery::reset_panners ();
824 /* Anyone who cares about input state, wake up and do something */
826 IOConnectionsComplete (); /* EMIT SIGNAL */
828 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
830 /* now handle the whole enchilada as if it was one
836 /* update the full solo state, which can't be
837 correctly determined on a per-route basis, but
838 needs the global overview that only the session
842 update_route_solo_state ();
846 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
848 boost::shared_ptr<Track> track = wp.lock ();
853 boost::shared_ptr<Playlist> playlist;
855 if ((playlist = track->playlist()) != 0) {
856 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
857 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
858 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
863 Session::record_enabling_legal () const
865 /* this used to be in here, but survey says.... we don't need to restrict it */
866 // if (record_status() == Recording) {
870 if (Config->get_all_safe()) {
877 Session::set_track_monitor_input_status (bool yn)
879 boost::shared_ptr<RouteList> rl = routes.reader ();
880 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
881 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
882 if (tr && tr->record_enabled ()) {
883 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
884 tr->request_jack_monitors_input (yn);
890 Session::auto_punch_start_changed (Location* location)
892 replace_event (SessionEvent::PunchIn, location->start());
894 if (get_record_enabled() && config.get_punch_in()) {
895 /* capture start has been changed, so save new pending state */
896 save_state ("", true);
901 Session::auto_punch_end_changed (Location* location)
903 framepos_t when_to_stop = location->end();
904 // when_to_stop += _worst_output_latency + _worst_input_latency;
905 replace_event (SessionEvent::PunchOut, when_to_stop);
909 Session::auto_punch_changed (Location* location)
911 framepos_t when_to_stop = location->end();
913 replace_event (SessionEvent::PunchIn, location->start());
914 //when_to_stop += _worst_output_latency + _worst_input_latency;
915 replace_event (SessionEvent::PunchOut, when_to_stop);
919 Session::auto_loop_changed (Location* location)
921 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
923 if (transport_rolling() && play_loop) {
926 // if (_transport_frame > location->end()) {
928 if (_transport_frame < location->start() || _transport_frame > location->end()) {
929 // relocate to beginning of loop
930 clear_events (SessionEvent::LocateRoll);
932 request_locate (location->start(), true);
935 else if (Config->get_seamless_loop() && !loop_changing) {
937 // schedule a locate-roll to refill the diskstreams at the
939 loop_changing = true;
941 if (location->end() > last_loopend) {
942 clear_events (SessionEvent::LocateRoll);
943 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
950 last_loopend = location->end();
954 Session::set_auto_punch_location (Location* location)
958 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
959 punch_connections.drop_connections();
960 existing->set_auto_punch (false, this);
961 remove_event (existing->start(), SessionEvent::PunchIn);
962 clear_events (SessionEvent::PunchOut);
963 auto_punch_location_changed (0);
972 if (location->end() <= location->start()) {
973 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
977 punch_connections.drop_connections ();
979 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
980 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
981 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
983 location->set_auto_punch (true, this);
985 auto_punch_changed (location);
987 auto_punch_location_changed (location);
991 Session::set_auto_loop_location (Location* location)
995 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
996 loop_connections.drop_connections ();
997 existing->set_auto_loop (false, this);
998 remove_event (existing->end(), SessionEvent::AutoLoop);
999 auto_loop_location_changed (0);
1004 if (location == 0) {
1008 if (location->end() <= location->start()) {
1009 error << _("Session: you can't use a mark for auto loop") << endmsg;
1013 last_loopend = location->end();
1015 loop_connections.drop_connections ();
1017 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1018 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1019 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1021 location->set_auto_loop (true, this);
1023 /* take care of our stuff first */
1025 auto_loop_changed (location);
1027 /* now tell everyone else */
1029 auto_loop_location_changed (location);
1033 Session::locations_added (Location *)
1039 Session::locations_changed ()
1041 _locations->apply (*this, &Session::handle_locations_changed);
1045 Session::handle_locations_changed (Locations::LocationList& locations)
1047 Locations::LocationList::iterator i;
1049 bool set_loop = false;
1050 bool set_punch = false;
1052 for (i = locations.begin(); i != locations.end(); ++i) {
1056 if (location->is_auto_punch()) {
1057 set_auto_punch_location (location);
1060 if (location->is_auto_loop()) {
1061 set_auto_loop_location (location);
1065 if (location->is_session_range()) {
1066 _session_range_location = location;
1071 set_auto_loop_location (0);
1074 set_auto_punch_location (0);
1081 Session::enable_record ()
1083 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1084 /* no recording at anything except normal speed */
1089 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1091 if (rs == Recording) {
1095 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1097 _last_record_location = _transport_frame;
1098 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1100 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1101 set_track_monitor_input_status (true);
1104 RecordStateChanged ();
1111 Session::disable_record (bool rt_context, bool force)
1115 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1117 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1118 g_atomic_int_set (&_record_status, Disabled);
1119 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1121 if (rs == Recording) {
1122 g_atomic_int_set (&_record_status, Enabled);
1126 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1127 set_track_monitor_input_status (false);
1130 RecordStateChanged (); /* emit signal */
1133 remove_pending_capture_state ();
1139 Session::step_back_from_record ()
1141 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1143 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1144 set_track_monitor_input_status (false);
1147 RecordStateChanged (); /* emit signal */
1152 Session::maybe_enable_record ()
1154 if (_step_editors > 0) {
1158 g_atomic_int_set (&_record_status, Enabled);
1160 /* This function is currently called from somewhere other than an RT thread.
1161 This save_state() call therefore doesn't impact anything. Doing it here
1162 means that we save pending state of which sources the next record will use,
1163 which gives us some chance of recovering from a crash during the record.
1166 save_state ("", true);
1168 if (_transport_speed) {
1169 if (!config.get_punch_in()) {
1173 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1174 RecordStateChanged (); /* EMIT SIGNAL */
1181 Session::audible_frame () const
1187 /* the first of these two possible settings for "offset"
1188 mean that the audible frame is stationary until
1189 audio emerges from the latency compensation
1192 the second means that the audible frame is stationary
1193 until audio would emerge from a physical port
1194 in the absence of any plugin latency compensation
1197 offset = worst_playback_latency ();
1199 if (offset > current_block_size) {
1200 offset -= current_block_size;
1202 /* XXX is this correct? if we have no external
1203 physical connections and everything is internal
1204 then surely this is zero? still, how
1205 likely is that anyway?
1207 offset = current_block_size;
1210 if (synced_to_jack()) {
1211 tf = _engine.transport_frame();
1213 tf = _transport_frame;
1218 if (!non_realtime_work_pending()) {
1222 /* Check to see if we have passed the first guaranteed
1223 audible frame past our last start position. if not,
1224 return that last start point because in terms
1225 of audible frames, we have not moved yet.
1227 `Start position' in this context means the time we last
1228 either started or changed transport direction.
1231 if (_transport_speed > 0.0f) {
1233 if (!play_loop || !have_looped) {
1234 if (tf < _last_roll_or_reversal_location + offset) {
1235 return _last_roll_or_reversal_location;
1243 } else if (_transport_speed < 0.0f) {
1245 /* XXX wot? no backward looping? */
1247 if (tf > _last_roll_or_reversal_location - offset) {
1248 return _last_roll_or_reversal_location;
1260 Session::set_frame_rate (framecnt_t frames_per_second)
1262 /** \fn void Session::set_frame_size(framecnt_t)
1263 the AudioEngine object that calls this guarantees
1264 that it will not be called while we are also in
1265 ::process(). Its fine to do things that block
1269 _base_frame_rate = frames_per_second;
1273 Automatable::set_automation_interval (ceil ((double) frames_per_second * (0.001 * Config->get_automation_interval())));
1277 // XXX we need some equivalent to this, somehow
1278 // SndFileSource::setup_standard_crossfades (frames_per_second);
1282 /* XXX need to reset/reinstantiate all LADSPA plugins */
1286 Session::set_block_size (pframes_t nframes)
1288 /* the AudioEngine guarantees
1289 that it will not be called while we are also in
1290 ::process(). It is therefore fine to do things that block
1295 current_block_size = nframes;
1299 boost::shared_ptr<RouteList> r = routes.reader ();
1301 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1302 (*i)->set_block_size (nframes);
1305 boost::shared_ptr<RouteList> rl = routes.reader ();
1306 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1307 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1309 tr->set_block_size (nframes);
1313 set_worst_io_latencies ();
1319 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1321 boost::shared_ptr<Route> r2;
1323 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1324 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1328 /* make a copy of the existing list of routes that feed r1 */
1330 Route::FedBy existing (r1->fed_by());
1332 /* for each route that feeds r1, recurse, marking it as feeding
1336 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1337 if (!(r2 = i->r.lock ())) {
1338 /* (*i) went away, ignore it */
1342 /* r2 is a route that feeds r1 which somehow feeds base. mark
1343 base as being fed by r2
1346 rbase->add_fed_by (r2, i->sends_only);
1350 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1354 if (r1->feeds (r2) && r2->feeds (r1)) {
1358 /* now recurse, so that we can mark base as being fed by
1359 all routes that feed r2
1362 trace_terminal (r2, rbase);
1369 Session::resort_routes ()
1371 /* don't do anything here with signals emitted
1372 by Routes during initial setup or while we
1373 are being destroyed.
1376 if (_state_of_the_state & (InitialConnecting | Deletion)) {
1381 RCUWriter<RouteList> writer (routes);
1382 boost::shared_ptr<RouteList> r = writer.get_copy ();
1383 resort_routes_using (r);
1384 /* writer goes out of scope and forces update */
1387 //_process_graph->dump(1);
1390 boost::shared_ptr<RouteList> rl = routes.reader ();
1391 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1392 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1394 const Route::FedBy& fb ((*i)->fed_by());
1396 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1397 boost::shared_ptr<Route> sf = f->r.lock();
1399 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1407 /** This is called whenever we need to rebuild the graph of how we will process
1409 * @param r List of routes, in any order.
1413 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1415 /* We are going to build a directed graph of our routes;
1416 this is where the edges of that graph are put.
1421 /* Go through all routes doing two things:
1423 * 1. Collect the edges of the route graph. Each of these edges
1424 * is a pair of routes, one of which directly feeds the other
1425 * either by a JACK connection or by an internal send.
1427 * 2. Begin the process of making routes aware of which other
1428 * routes directly or indirectly feed them. This information
1429 * is used by the solo code.
1432 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1434 /* Clear out the route's list of direct or indirect feeds */
1435 (*i)->clear_fed_by ();
1437 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
1439 bool via_sends_only;
1441 /* See if this *j feeds *i according to the current state of the JACK
1442 connections and internal sends.
1444 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
1445 /* add the edge to the graph (part #1) */
1446 edges.add (*j, *i, via_sends_only);
1447 /* tell the route (for part #2) */
1448 (*i)->add_fed_by (*j, via_sends_only);
1453 /* Attempt a topological sort of the route graph */
1454 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
1456 if (sorted_routes) {
1457 /* We got a satisfactory topological sort, so there is no feedback;
1460 Note: the process graph rechain does not require a
1461 topologically-sorted list, but hey ho.
1463 _process_graph->rechain (sorted_routes, edges);
1464 _current_route_graph = edges;
1466 /* Complete the building of the routes' lists of what directly
1467 or indirectly feeds them.
1469 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1470 trace_terminal (*i, *i);
1476 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1477 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1478 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1479 (*i)->name(), (*i)->order_key ("signal")));
1483 SuccessfulGraphSort (); /* EMIT SIGNAL */
1486 /* The topological sort failed, so we have a problem. Tell everyone
1487 and stick to the old graph; this will continue to be processed, so
1488 until the feedback is fixed, what is played back will not quite
1489 reflect what is actually connected. Note also that we do not
1490 do trace_terminal here, as it would fail due to an endless recursion,
1491 so the solo code will think that everything is still connected
1495 FeedbackDetected (); /* EMIT SIGNAL */
1500 /** Find a route name starting with \a base, maybe followed by the
1501 * lowest \a id. \a id will always be added if \a definitely_add_number
1502 * is true on entry; otherwise it will only be added if required
1503 * to make the name unique.
1505 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1506 * The available route name with the lowest ID will be used, and \a id
1507 * will be set to the ID.
1509 * \return false if a route name could not be found, and \a track_name
1510 * and \a id do not reflect a free route name.
1513 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1515 if (!definitely_add_number && route_by_name (base) == 0) {
1516 /* juse use the base */
1517 snprintf (name, name_len, "%s", base.c_str());
1522 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1524 if (route_by_name (name) == 0) {
1530 } while (id < (UINT_MAX-1));
1535 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
1537 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
1539 in = ChanCount::ZERO;
1540 out = ChanCount::ZERO;
1542 boost::shared_ptr<RouteList> r = routes.reader ();
1544 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1545 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1546 if (tr && !tr->is_hidden()) {
1547 in += tr->n_inputs();
1548 out += tr->n_outputs();
1553 /** Caller must not hold process lock
1554 * @param name_template string to use for the start of the name, or "" to use "MIDI".
1556 list<boost::shared_ptr<MidiTrack> >
1557 Session::new_midi_track (TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1559 char track_name[32];
1560 uint32_t track_id = 0;
1562 RouteList new_routes;
1563 list<boost::shared_ptr<MidiTrack> > ret;
1564 uint32_t control_id;
1566 control_id = next_control_id ();
1568 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
1571 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1572 error << "cannot find name for new midi track" << endmsg;
1576 boost::shared_ptr<MidiTrack> track;
1579 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1581 if (track->init ()) {
1585 track->use_new_diskstream();
1587 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1588 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1591 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1592 if (track->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1593 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1597 if (track->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1598 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1603 track->non_realtime_input_change();
1606 route_group->add (track);
1609 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1610 track->set_remote_control_id (control_id);
1612 new_routes.push_back (track);
1613 ret.push_back (track);
1616 catch (failed_constructor &err) {
1617 error << _("Session: could not create new midi track.") << endmsg;
1621 catch (AudioEngine::PortRegistrationFailure& pfe) {
1623 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;
1631 if (!new_routes.empty()) {
1632 add_routes (new_routes, true, true);
1639 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
1641 boost::shared_ptr<Route> midi_track (wmt.lock());
1647 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
1649 if (change.after.n_audio() <= change.before.n_audio()) {
1653 /* new audio ports: make sure the audio goes somewhere useful,
1654 unless the user has no-auto-connect selected.
1656 The existing ChanCounts don't matter for this call as they are only
1657 to do with matching input and output indices, and we are only changing
1663 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
1667 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1668 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1669 * @param output_start As \a input_start, but for outputs.
1672 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
1673 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
1675 if (!IO::connecting_legal) {
1679 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::NOT_LOCK);
1685 /* If both inputs and outputs are auto-connected to physical ports,
1686 use the max of input and output offsets to ensure auto-connected
1687 port numbers always match up (e.g. the first audio input and the
1688 first audio output of the route will have the same physical
1689 port number). Otherwise just use the lowest input or output
1693 DEBUG_TRACE (DEBUG::Graph,
1694 string_compose("Auto-connect: existing in = %1 out = %2\n",
1695 existing_inputs, existing_outputs));
1697 const bool in_out_physical =
1698 (Config->get_input_auto_connect() & AutoConnectPhysical)
1699 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1702 const ChanCount in_offset = in_out_physical
1703 ? ChanCount::max(existing_inputs, existing_outputs)
1706 const ChanCount out_offset = in_out_physical
1707 ? ChanCount::max(existing_inputs, existing_outputs)
1710 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1711 vector<string> physinputs;
1712 vector<string> physoutputs;
1714 _engine.get_physical_outputs (*t, physoutputs);
1715 _engine.get_physical_inputs (*t, physinputs);
1717 if (!physinputs.empty() && connect_inputs) {
1718 uint32_t nphysical_in = physinputs.size();
1720 DEBUG_TRACE (DEBUG::Graph,
1721 string_compose("There are %1 physical inputs of type %2\n",
1724 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1727 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1728 DEBUG_TRACE (DEBUG::Graph,
1729 string_compose("Get index %1 + %2 % %3 = %4\n",
1730 in_offset.get(*t), i, nphysical_in,
1731 (in_offset.get(*t) + i) % nphysical_in));
1732 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1735 DEBUG_TRACE (DEBUG::Graph,
1736 string_compose("Connect route %1 IN to %2\n",
1737 route->name(), port));
1739 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
1743 ChanCount one_added (*t, 1);
1744 existing_inputs += one_added;
1748 if (!physoutputs.empty()) {
1749 uint32_t nphysical_out = physoutputs.size();
1750 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
1753 if ((*t) == DataType::MIDI || Config->get_output_auto_connect() & AutoConnectPhysical) {
1754 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1755 } else if ((*t) == DataType::AUDIO && Config->get_output_auto_connect() & AutoConnectMaster) {
1756 /* master bus is audio only */
1757 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1758 port = _master_out->input()->ports().port(*t,
1759 i % _master_out->input()->n_ports().get(*t))->name();
1763 DEBUG_TRACE (DEBUG::Graph,
1764 string_compose("Connect route %1 OUT to %2\n",
1765 route->name(), port));
1767 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
1771 ChanCount one_added (*t, 1);
1772 existing_outputs += one_added;
1778 /** Caller must not hold process lock
1779 * @param name_template string to use for the start of the name, or "" to use "Audio".
1781 list< boost::shared_ptr<AudioTrack> >
1782 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
1783 uint32_t how_many, string name_template)
1785 char track_name[32];
1786 uint32_t track_id = 0;
1788 RouteList new_routes;
1789 list<boost::shared_ptr<AudioTrack> > ret;
1790 uint32_t control_id;
1792 control_id = next_control_id ();
1794 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
1797 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1798 error << "cannot find name for new audio track" << endmsg;
1802 boost::shared_ptr<AudioTrack> track;
1805 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
1807 if (track->init ()) {
1811 track->use_new_diskstream();
1813 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1814 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1817 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1819 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1820 error << string_compose (
1821 _("cannot configure %1 in/%2 out configuration for new audio track"),
1822 input_channels, output_channels)
1827 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1828 error << string_compose (
1829 _("cannot configure %1 in/%2 out configuration for new audio track"),
1830 input_channels, output_channels)
1837 route_group->add (track);
1840 track->non_realtime_input_change();
1842 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1843 track->set_remote_control_id (control_id);
1846 new_routes.push_back (track);
1847 ret.push_back (track);
1850 catch (failed_constructor &err) {
1851 error << _("Session: could not create new audio track.") << endmsg;
1855 catch (AudioEngine::PortRegistrationFailure& pfe) {
1857 error << pfe.what() << endmsg;
1865 if (!new_routes.empty()) {
1866 add_routes (new_routes, true, true);
1873 Session::set_remote_control_ids ()
1875 RemoteModel m = Config->get_remote_model();
1876 bool emit_signal = false;
1878 boost::shared_ptr<RouteList> r = routes.reader ();
1880 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1881 if (MixerOrdered == m) {
1882 int32_t order = (*i)->order_key(N_("signal"));
1883 (*i)->set_remote_control_id (order+1, false);
1885 } else if (EditorOrdered == m) {
1886 int32_t order = (*i)->order_key(N_("editor"));
1887 (*i)->set_remote_control_id (order+1, false);
1889 } else if (UserOrdered == m) {
1890 //do nothing ... only changes to remote id's are initiated by user
1895 Route::RemoteControlIDChange();
1899 /** Caller must not hold process lock.
1900 * @param name_template string to use for the start of the name, or "" to use "Bus".
1903 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
1906 uint32_t bus_id = 0;
1909 uint32_t control_id;
1911 control_id = next_control_id ();
1913 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
1916 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
1917 error << "cannot find name for new audio bus" << endmsg;
1922 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
1928 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1929 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
1932 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1934 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1935 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1936 input_channels, output_channels)
1942 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1943 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1944 input_channels, output_channels)
1951 route_group->add (bus);
1953 bus->set_remote_control_id (control_id);
1956 bus->add_internal_return ();
1958 ret.push_back (bus);
1962 catch (failed_constructor &err) {
1963 error << _("Session: could not create new audio route.") << endmsg;
1967 catch (AudioEngine::PortRegistrationFailure& pfe) {
1968 error << pfe.what() << endmsg;
1978 add_routes (ret, false, true);
1986 Session::new_route_from_template (uint32_t how_many, const std::string& template_path)
1989 uint32_t control_id;
1991 uint32_t number = 0;
1993 if (!tree.read (template_path.c_str())) {
1997 XMLNode* node = tree.root();
1999 control_id = next_control_id ();
2003 XMLNode node_copy (*node);
2005 /* Remove IDs of everything so that new ones are used */
2006 node_copy.remove_property_recursively (X_("id"));
2009 string const route_name = node_copy.property(X_("name"))->value ();
2011 /* generate a new name by adding a number to the end of the template name */
2013 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2014 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2018 /* set this name in the XML description that we are about to use */
2019 Route::set_name_in_state (node_copy, name);
2021 /* trim bitslots from listen sends so that new ones are used */
2022 XMLNodeList children = node_copy.children ();
2023 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2024 if ((*i)->name() == X_("Processor")) {
2025 XMLProperty* role = (*i)->property (X_("role"));
2026 if (role && role->value() == X_("Listen")) {
2027 (*i)->remove_property (X_("bitslot"));
2032 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2035 error << _("Session: cannot create track/bus from template description") << endmsg;
2039 if (boost::dynamic_pointer_cast<Track>(route)) {
2040 /* force input/output change signals so that the new diskstream
2041 picks up the configuration of the route. During session
2042 loading this normally happens in a different way.
2045 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2047 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2048 change.after = route->input()->n_ports();
2049 route->input()->changed (change, this);
2050 change.after = route->output()->n_ports();
2051 route->output()->changed (change, this);
2054 route->set_remote_control_id (control_id);
2057 ret.push_back (route);
2060 catch (failed_constructor &err) {
2061 error << _("Session: could not create new route from template") << endmsg;
2065 catch (AudioEngine::PortRegistrationFailure& pfe) {
2066 error << pfe.what() << endmsg;
2075 add_routes (ret, true, true);
2082 Session::add_routes (RouteList& new_routes, bool auto_connect, bool save)
2084 ChanCount existing_inputs;
2085 ChanCount existing_outputs;
2087 count_existing_track_channels (existing_inputs, existing_outputs);
2090 RCUWriter<RouteList> writer (routes);
2091 boost::shared_ptr<RouteList> r = writer.get_copy ();
2092 r->insert (r->end(), new_routes.begin(), new_routes.end());
2094 /* if there is no control out and we're not in the middle of loading,
2095 resort the graph here. if there is a control out, we will resort
2096 toward the end of this method. if we are in the middle of loading,
2097 we will resort when done.
2100 if (!_monitor_out && IO::connecting_legal) {
2101 resort_routes_using (r);
2105 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2107 boost::weak_ptr<Route> wpr (*x);
2108 boost::shared_ptr<Route> r (*x);
2110 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2111 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2112 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2113 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2114 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2115 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2116 r->order_key_changed.connect_same_thread (*this, boost::bind (&Session::route_order_key_changed, this));
2118 if (r->is_master()) {
2122 if (r->is_monitor()) {
2126 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2128 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2129 track_playlist_changed (boost::weak_ptr<Track> (tr));
2130 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2132 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2134 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2135 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2140 auto_connect_route (r, existing_inputs, existing_outputs, true);
2144 if (_monitor_out && IO::connecting_legal) {
2147 Glib::Mutex::Lock lm (_engine.process_lock());
2149 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2150 if ((*x)->is_monitor()) {
2152 } else if ((*x)->is_master()) {
2155 (*x)->enable_monitor_send ();
2166 save_state (_current_snapshot_name);
2169 RouteAdded (new_routes); /* EMIT SIGNAL */
2170 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
2174 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2176 boost::shared_ptr<RouteList> r = routes.reader ();
2177 boost::shared_ptr<Send> s;
2179 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2180 if ((s = (*i)->internal_send_for (dest)) != 0) {
2181 s->amp()->gain_control()->set_value (0.0);
2187 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2189 boost::shared_ptr<RouteList> r = routes.reader ();
2190 boost::shared_ptr<Send> s;
2192 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2193 if ((s = (*i)->internal_send_for (dest)) != 0) {
2194 s->amp()->gain_control()->set_value (1.0);
2200 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2202 boost::shared_ptr<RouteList> r = routes.reader ();
2203 boost::shared_ptr<Send> s;
2205 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2206 if ((s = (*i)->internal_send_for (dest)) != 0) {
2207 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2212 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2214 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2216 boost::shared_ptr<RouteList> r = routes.reader ();
2217 boost::shared_ptr<RouteList> t (new RouteList);
2219 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2220 /* no MIDI sends because there are no MIDI busses yet */
2221 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2226 add_internal_sends (dest, p, t);
2230 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2232 if (dest->is_monitor() || dest->is_master()) {
2236 if (!dest->internal_return()) {
2237 dest->add_internal_return();
2241 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2243 if ((*i)->is_monitor() || (*i)->is_master() || (*i) == dest) {
2247 (*i)->add_aux_send (dest, p);
2254 Session::remove_route (boost::shared_ptr<Route> route)
2256 if (route == _master_out) {
2260 route->set_solo (false, this);
2263 RCUWriter<RouteList> writer (routes);
2264 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2268 /* deleting the master out seems like a dumb
2269 idea, but its more of a UI policy issue
2273 if (route == _master_out) {
2274 _master_out = boost::shared_ptr<Route> ();
2277 if (route == _monitor_out) {
2278 _monitor_out.reset ();
2281 /* writer goes out of scope, forces route list update */
2284 update_route_solo_state ();
2286 // We need to disconnect the route's inputs and outputs
2288 route->input()->disconnect (0);
2289 route->output()->disconnect (0);
2291 /* if the route had internal sends sending to it, remove them */
2292 if (route->internal_return()) {
2294 boost::shared_ptr<RouteList> r = routes.reader ();
2295 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2296 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2298 (*i)->remove_processor (s);
2303 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2304 if (mt && mt->step_editing()) {
2305 if (_step_editors > 0) {
2310 update_latency_compensation ();
2313 /* Re-sort routes to remove the graph's current references to the one that is
2314 * going away, then flush old references out of the graph.
2318 _process_graph->clear_other_chain ();
2320 /* get rid of it from the dead wood collection in the route list manager */
2322 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2326 /* try to cause everyone to drop their references */
2328 route->drop_references ();
2330 sync_order_keys (N_("session"));
2332 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2334 /* save the new state of the world */
2336 if (save_state (_current_snapshot_name)) {
2337 save_history (_current_snapshot_name);
2342 Session::route_mute_changed (void* /*src*/)
2348 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2350 boost::shared_ptr<Route> route = wpr.lock();
2352 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2356 if (route->listening_via_monitor ()) {
2358 if (Config->get_exclusive_solo()) {
2359 /* new listen: disable all other listen */
2360 boost::shared_ptr<RouteList> r = routes.reader ();
2361 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2362 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2365 (*i)->set_listen (false, this);
2371 } else if (_listen_cnt > 0) {
2376 update_route_solo_state ();
2379 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2381 boost::shared_ptr<Route> route = wpr.lock ();
2384 /* should not happen */
2385 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2389 bool send_changed = false;
2391 if (route->solo_isolated()) {
2392 if (_solo_isolated_cnt == 0) {
2393 send_changed = true;
2395 _solo_isolated_cnt++;
2396 } else if (_solo_isolated_cnt > 0) {
2397 _solo_isolated_cnt--;
2398 if (_solo_isolated_cnt == 0) {
2399 send_changed = true;
2404 IsolatedChanged (); /* EMIT SIGNAL */
2409 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2411 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
2413 if (!self_solo_change) {
2414 // session doesn't care about changes to soloed-by-others
2418 if (solo_update_disabled) {
2420 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
2424 boost::shared_ptr<Route> route = wpr.lock ();
2427 boost::shared_ptr<RouteList> r = routes.reader ();
2430 if (route->self_soloed()) {
2436 RouteGroup* rg = route->route_group ();
2437 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
2439 if (delta == 1 && Config->get_exclusive_solo()) {
2441 /* new solo: disable all other solos, but not the group if its solo-enabled */
2443 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2444 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2445 (leave_group_alone && ((*i)->route_group() == rg))) {
2448 (*i)->set_solo (false, this);
2452 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
2454 solo_update_disabled = true;
2456 RouteList uninvolved;
2458 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
2460 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2461 bool via_sends_only;
2462 bool in_signal_flow;
2464 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2465 (leave_group_alone && ((*i)->route_group() == rg))) {
2469 in_signal_flow = false;
2471 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
2473 if ((*i)->feeds (route, &via_sends_only)) {
2474 if (!via_sends_only) {
2475 if (!route->soloed_by_others_upstream()) {
2476 (*i)->mod_solo_by_others_downstream (delta);
2479 in_signal_flow = true;
2481 DEBUG_TRACE (DEBUG::Solo, "\tno feed from\n");
2484 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
2486 if (route->feeds (*i, &via_sends_only)) {
2487 /* propagate solo upstream only if routing other than
2488 sends is involved, but do consider the other route
2489 (*i) to be part of the signal flow even if only
2492 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
2496 route->soloed_by_others_downstream(),
2497 route->soloed_by_others_upstream()));
2498 if (!via_sends_only) {
2499 if (!route->soloed_by_others_downstream()) {
2500 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
2501 (*i)->mod_solo_by_others_upstream (delta);
2504 in_signal_flow = true;
2506 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
2509 if (!in_signal_flow) {
2510 uninvolved.push_back (*i);
2514 solo_update_disabled = false;
2515 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
2517 update_route_solo_state (r);
2519 /* now notify that the mute state of the routes not involved in the signal
2520 pathway of the just-solo-changed route may have altered.
2523 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2524 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1\n", (*i)->name()));
2525 (*i)->mute_changed (this);
2528 SoloChanged (); /* EMIT SIGNAL */
2533 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2535 /* now figure out if anything that matters is soloed (or is "listening")*/
2537 bool something_soloed = false;
2538 uint32_t listeners = 0;
2539 uint32_t isolated = 0;
2542 r = routes.reader();
2545 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2546 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2547 something_soloed = true;
2550 if (!(*i)->is_hidden() && (*i)->listening_via_monitor()) {
2551 if (Config->get_solo_control_is_listen_control()) {
2554 (*i)->set_listen (false, this);
2558 if ((*i)->solo_isolated()) {
2563 if (something_soloed != _non_soloed_outs_muted) {
2564 _non_soloed_outs_muted = something_soloed;
2565 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2568 _listen_cnt = listeners;
2570 if (isolated != _solo_isolated_cnt) {
2571 _solo_isolated_cnt = isolated;
2572 IsolatedChanged (); /* EMIT SIGNAL */
2576 boost::shared_ptr<RouteList>
2577 Session::get_routes_with_internal_returns() const
2579 boost::shared_ptr<RouteList> r = routes.reader ();
2580 boost::shared_ptr<RouteList> rl (new RouteList);
2582 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2583 if ((*i)->internal_return ()) {
2591 Session::io_name_is_legal (const std::string& name)
2593 boost::shared_ptr<RouteList> r = routes.reader ();
2595 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2596 if ((*i)->name() == name) {
2600 if ((*i)->has_io_processor_named (name)) {
2609 Session::set_exclusive_input_active (boost::shared_ptr<Route> rt, bool /*others_on*/)
2612 vector<string> connections;
2614 PortSet& ps (rt->input()->ports());
2616 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
2617 p->get_connections (connections);
2620 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
2621 routes_using_input_from (*s, rl);
2624 /* scan all relevant routes to see if others are on or off */
2626 bool others_are_already_on = false;
2628 for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
2630 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2632 if (mt->input_active()) {
2633 others_are_already_on = true;
2640 /* globally reverse other routes */
2642 for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
2644 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2646 mt->set_input_active (!others_are_already_on);
2653 Session::routes_using_input_from (const string& str, RouteList& rl)
2655 boost::shared_ptr<RouteList> r = routes.reader ();
2657 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2658 if ((*i)->input()->connected_to (str)) {
2664 boost::shared_ptr<Route>
2665 Session::route_by_name (string name)
2667 boost::shared_ptr<RouteList> r = routes.reader ();
2669 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2670 if ((*i)->name() == name) {
2675 return boost::shared_ptr<Route> ((Route*) 0);
2678 boost::shared_ptr<Route>
2679 Session::route_by_id (PBD::ID id)
2681 boost::shared_ptr<RouteList> r = routes.reader ();
2683 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2684 if ((*i)->id() == id) {
2689 return boost::shared_ptr<Route> ((Route*) 0);
2692 boost::shared_ptr<Track>
2693 Session::track_by_diskstream_id (PBD::ID id)
2695 boost::shared_ptr<RouteList> r = routes.reader ();
2697 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2698 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
2699 if (t && t->using_diskstream_id (id)) {
2704 return boost::shared_ptr<Track> ();
2707 boost::shared_ptr<Route>
2708 Session::route_by_remote_id (uint32_t id)
2710 boost::shared_ptr<RouteList> r = routes.reader ();
2712 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2713 if ((*i)->remote_control_id() == id) {
2718 return boost::shared_ptr<Route> ((Route*) 0);
2722 Session::playlist_region_added (boost::weak_ptr<Region> w)
2724 boost::shared_ptr<Region> r = w.lock ();
2729 /* These are the operations that are currently in progress... */
2730 list<GQuark> curr = _current_trans_quarks;
2733 /* ...and these are the operations during which we want to update
2734 the session range location markers.
2737 ops.push_back (Operations::capture);
2738 ops.push_back (Operations::paste);
2739 ops.push_back (Operations::duplicate_region);
2740 ops.push_back (Operations::insert_file);
2741 ops.push_back (Operations::insert_region);
2742 ops.push_back (Operations::drag_region_brush);
2743 ops.push_back (Operations::region_drag);
2744 ops.push_back (Operations::selection_grab);
2745 ops.push_back (Operations::region_fill);
2746 ops.push_back (Operations::fill_selection);
2747 ops.push_back (Operations::create_region);
2748 ops.push_back (Operations::region_copy);
2749 ops.push_back (Operations::fixed_time_region_copy);
2752 /* See if any of the current operations match the ones that we want */
2754 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
2756 /* If so, update the session range markers */
2758 maybe_update_session_range (r->position (), r->last_frame ());
2762 /** Update the session range markers if a is before the current start or
2763 * b is after the current end.
2766 Session::maybe_update_session_range (framepos_t a, framepos_t b)
2768 if (_state_of_the_state & Loading) {
2772 if (_session_range_location == 0) {
2774 add_session_range_location (a, b);
2778 if (a < _session_range_location->start()) {
2779 _session_range_location->set_start (a);
2782 if (b > _session_range_location->end()) {
2783 _session_range_location->set_end (b);
2789 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
2791 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2792 maybe_update_session_range (i->to, i->to + i->length);
2797 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
2799 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2800 maybe_update_session_range (i->from, i->to);
2804 /* Region management */
2806 boost::shared_ptr<Region>
2807 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2809 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2810 RegionFactory::RegionMap::const_iterator i;
2811 boost::shared_ptr<Region> region;
2813 Glib::Mutex::Lock lm (region_lock);
2815 for (i = regions.begin(); i != regions.end(); ++i) {
2819 if (region->whole_file()) {
2821 if (child->source_equivalent (region)) {
2827 return boost::shared_ptr<Region> ();
2831 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2833 set<boost::shared_ptr<Region> > relevant_regions;
2835 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2836 RegionFactory::get_regions_using_source (*s, relevant_regions);
2839 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2840 set<boost::shared_ptr<Region> >::iterator tmp;
2845 playlists->destroy_region (*r);
2846 RegionFactory::map_remove (*r);
2848 (*r)->drop_sources ();
2849 (*r)->drop_references ();
2851 relevant_regions.erase (r);
2856 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
2859 Glib::Mutex::Lock ls (source_lock);
2860 /* remove from the main source list */
2861 sources.erase ((*s)->id());
2864 (*s)->mark_for_remove ();
2865 (*s)->drop_references ();
2874 Session::remove_last_capture ()
2876 list<boost::shared_ptr<Source> > srcs;
2878 boost::shared_ptr<RouteList> rl = routes.reader ();
2879 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2880 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2885 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
2888 srcs.insert (srcs.end(), l.begin(), l.end());
2893 destroy_sources (srcs);
2895 save_state (_current_snapshot_name);
2900 /* Source Management */
2903 Session::add_source (boost::shared_ptr<Source> source)
2905 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
2906 pair<SourceMap::iterator,bool> result;
2908 entry.first = source->id();
2909 entry.second = source;
2912 Glib::Mutex::Lock lm (source_lock);
2913 result = sources.insert (entry);
2916 if (result.second) {
2918 /* yay, new source */
2922 boost::shared_ptr<AudioFileSource> afs;
2924 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
2925 if (Config->get_auto_analyse_audio()) {
2926 Analyser::queue_source_for_analysis (source, false);
2930 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
2935 Session::remove_source (boost::weak_ptr<Source> src)
2937 if (_state_of_the_state & Deletion) {
2941 SourceMap::iterator i;
2942 boost::shared_ptr<Source> source = src.lock();
2949 Glib::Mutex::Lock lm (source_lock);
2951 if ((i = sources.find (source->id())) != sources.end()) {
2956 if (!_state_of_the_state & InCleanup) {
2958 /* save state so we don't end up with a session file
2959 referring to non-existent sources.
2962 save_state (_current_snapshot_name);
2966 boost::shared_ptr<Source>
2967 Session::source_by_id (const PBD::ID& id)
2969 Glib::Mutex::Lock lm (source_lock);
2970 SourceMap::iterator i;
2971 boost::shared_ptr<Source> source;
2973 if ((i = sources.find (id)) != sources.end()) {
2980 boost::shared_ptr<Source>
2981 Session::source_by_path_and_channel (const string& path, uint16_t chn)
2983 Glib::Mutex::Lock lm (source_lock);
2985 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2986 boost::shared_ptr<AudioFileSource> afs
2987 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
2989 if (afs && afs->path() == path && chn == afs->channel()) {
2993 return boost::shared_ptr<Source>();
2997 Session::count_sources_by_origin (const string& path)
3000 Glib::Mutex::Lock lm (source_lock);
3002 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3003 boost::shared_ptr<FileSource> fs
3004 = boost::dynamic_pointer_cast<FileSource>(i->second);
3006 if (fs && fs->origin() == path) {
3016 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
3019 string old_basename = PBD::basename_nosuffix (oldname);
3020 string new_legalized = legalize_for_path (newname);
3022 /* note: we know (or assume) the old path is already valid */
3026 /* destructive file sources have a name of the form:
3028 /path/to/Tnnnn-NAME(%[LR])?.wav
3030 the task here is to replace NAME with the new name.
3035 string::size_type dash;
3037 dir = Glib::path_get_dirname (path);
3038 path = Glib::path_get_basename (path);
3040 /* '-' is not a legal character for the NAME part of the path */
3042 if ((dash = path.find_last_of ('-')) == string::npos) {
3046 prefix = path.substr (0, dash);
3050 path += new_legalized;
3051 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3052 path = Glib::build_filename (dir, path);
3056 /* non-destructive file sources have a name of the form:
3058 /path/to/NAME-nnnnn(%[LR])?.ext
3060 the task here is to replace NAME with the new name.
3065 string::size_type dash;
3066 string::size_type postfix;
3068 dir = Glib::path_get_dirname (path);
3069 path = Glib::path_get_basename (path);
3071 /* '-' is not a legal character for the NAME part of the path */
3073 if ((dash = path.find_last_of ('-')) == string::npos) {
3077 suffix = path.substr (dash+1);
3079 // Suffix is now everything after the dash. Now we need to eliminate
3080 // the nnnnn part, which is done by either finding a '%' or a '.'
3082 postfix = suffix.find_last_of ("%");
3083 if (postfix == string::npos) {
3084 postfix = suffix.find_last_of ('.');
3087 if (postfix != string::npos) {
3088 suffix = suffix.substr (postfix);
3090 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
3094 const uint32_t limit = 10000;
3095 char buf[PATH_MAX+1];
3097 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
3099 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
3101 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
3102 path = Glib::build_filename (dir, buf);
3110 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
3119 /** Return the full path (in some session directory) for a new within-session source.
3120 * \a name must be a session-unique name that does not contain slashes
3121 * (e.g. as returned by new_*_source_name)
3124 Session::new_source_path_from_name (DataType type, const string& name)
3126 assert(name.find("/") == string::npos);
3128 SessionDirectory sdir(get_best_session_directory_for_new_source());
3131 if (type == DataType::AUDIO) {
3132 p = sdir.sound_path();
3133 } else if (type == DataType::MIDI) {
3134 p = sdir.midi_path();
3136 error << "Unknown source type, unable to create file path" << endmsg;
3141 return p.to_string();
3145 Session::peak_path (string base) const
3147 sys::path peakfile_path(_session_dir->peak_path());
3148 peakfile_path /= base + peakfile_suffix;
3149 return peakfile_path.to_string();
3152 /** Return a unique name based on \a base for a new internal audio source */
3154 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
3157 char buf[PATH_MAX+1];
3158 const uint32_t limit = 10000;
3160 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3163 legalized = legalize_for_path (base);
3165 // Find a "version" of the base name that doesn't exist in any of the possible directories.
3166 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3168 vector<space_and_path>::iterator i;
3169 uint32_t existing = 0;
3171 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3176 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3177 cnt, legalized.c_str(), ext.c_str());
3178 } else if (nchan == 2) {
3180 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
3181 cnt, legalized.c_str(), ext.c_str());
3183 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
3184 cnt, legalized.c_str(), ext.c_str());
3186 } else if (nchan < 26) {
3187 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
3188 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
3190 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3191 cnt, legalized.c_str(), ext.c_str());
3197 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3198 } else if (nchan == 2) {
3200 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
3202 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
3204 } else if (nchan < 26) {
3205 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
3207 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3211 SessionDirectory sdir((*i).path);
3213 string spath = sdir.sound_path().to_string();
3215 /* note that we search *without* the extension so that
3216 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3217 in the event that this new name is required for
3218 a file format change.
3221 if (matching_unsuffixed_filename_exists_in (spath, buf)) {
3227 if (existing == 0) {
3232 error << string_compose(
3233 _("There are already %1 recordings for %2, which I consider too many."),
3234 limit, base) << endmsg;
3236 throw failed_constructor();
3240 return Glib::path_get_basename (buf);
3243 /** Create a new within-session audio source */
3244 boost::shared_ptr<AudioFileSource>
3245 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
3247 const string name = new_audio_source_name (n, n_chans, chan, destructive);
3248 const string path = new_source_path_from_name(DataType::AUDIO, name);
3250 return boost::dynamic_pointer_cast<AudioFileSource> (
3251 SourceFactory::createWritable (DataType::AUDIO, *this, path, string(), destructive, frame_rate()));
3254 /** Return a unique name based on \a base for a new internal MIDI source */
3256 Session::new_midi_source_name (const string& base)
3259 char buf[PATH_MAX+1];
3260 const uint32_t limit = 10000;
3264 legalized = legalize_for_path (base);
3266 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3267 for (cnt = 1; cnt <= limit; ++cnt) {
3269 vector<space_and_path>::iterator i;
3270 uint32_t existing = 0;
3272 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3274 SessionDirectory sdir((*i).path);
3276 sys::path p = sdir.midi_path();
3279 snprintf (buf, sizeof(buf), "%s-%u.mid", p.to_string().c_str(), cnt);
3281 if (sys::exists (buf)) {
3286 if (existing == 0) {
3291 error << string_compose(
3292 _("There are already %1 recordings for %2, which I consider too many."),
3293 limit, base) << endmsg;
3295 throw failed_constructor();
3299 return Glib::path_get_basename(buf);
3303 /** Create a new within-session MIDI source */
3304 boost::shared_ptr<MidiSource>
3305 Session::create_midi_source_for_session (Track* track, string const & n)
3307 /* try to use the existing write source for the track, to keep numbering sane
3311 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3315 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3318 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3319 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3323 const string name = new_midi_source_name (n);
3324 const string path = new_source_path_from_name (DataType::MIDI, name);
3326 return boost::dynamic_pointer_cast<SMFSource> (
3327 SourceFactory::createWritable (
3328 DataType::MIDI, *this, path, string(), false, frame_rate()));
3333 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3335 if (playlist->hidden()) {
3339 playlists->add (playlist);
3342 playlist->release();
3349 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3351 if (_state_of_the_state & Deletion) {
3355 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3361 playlists->remove (playlist);
3367 Session::set_audition (boost::shared_ptr<Region> r)
3369 pending_audition_region = r;
3370 add_post_transport_work (PostTransportAudition);
3371 _butler->schedule_transport_work ();
3375 Session::audition_playlist ()
3377 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3378 ev->region.reset ();
3383 Session::non_realtime_set_audition ()
3385 if (!pending_audition_region) {
3386 auditioner->audition_current_playlist ();
3388 auditioner->audition_region (pending_audition_region);
3389 pending_audition_region.reset ();
3391 AuditionActive (true); /* EMIT SIGNAL */
3395 Session::audition_region (boost::shared_ptr<Region> r)
3397 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3403 Session::cancel_audition ()
3405 if (auditioner->auditioning()) {
3406 auditioner->cancel_audition ();
3407 AuditionActive (false); /* EMIT SIGNAL */
3412 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3414 if (a->is_monitor()) {
3417 if (b->is_monitor()) {
3420 return a->order_key(N_("signal")) < b->order_key(N_("signal"));
3424 Session::is_auditioning () const
3426 /* can be called before we have an auditioner object */
3428 return auditioner->auditioning();
3435 Session::graph_reordered ()
3437 /* don't do this stuff if we are setting up connections
3438 from a set_state() call or creating new tracks. Ditto for deletion.
3441 if (_state_of_the_state & (InitialConnecting|Deletion)) {
3445 /* every track/bus asked for this to be handled but it was deferred because
3446 we were connecting. do it now.
3449 request_input_change_handling ();
3453 /* force all diskstreams to update their capture offset values to
3454 reflect any changes in latencies within the graph.
3457 boost::shared_ptr<RouteList> rl = routes.reader ();
3458 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3459 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3461 tr->set_capture_offset ();
3467 Session::available_capture_duration ()
3469 float sample_bytes_on_disk = 4.0; // keep gcc happy
3471 switch (config.get_native_file_data_format()) {
3473 sample_bytes_on_disk = 4.0;
3477 sample_bytes_on_disk = 3.0;
3481 sample_bytes_on_disk = 2.0;
3485 /* impossible, but keep some gcc versions happy */
3486 fatal << string_compose (_("programming error: %1"),
3487 X_("illegal native file data format"))
3492 double scale = 4096.0 / sample_bytes_on_disk;
3494 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3495 return max_framecnt;
3498 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3502 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3505 RCUWriter<BundleList> writer (_bundles);
3506 boost::shared_ptr<BundleList> b = writer.get_copy ();
3507 b->push_back (bundle);
3510 BundleAdded (bundle); /* EMIT SIGNAL */
3516 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3518 bool removed = false;
3521 RCUWriter<BundleList> writer (_bundles);
3522 boost::shared_ptr<BundleList> b = writer.get_copy ();
3523 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3525 if (i != b->end()) {
3532 BundleRemoved (bundle); /* EMIT SIGNAL */
3538 boost::shared_ptr<Bundle>
3539 Session::bundle_by_name (string name) const
3541 boost::shared_ptr<BundleList> b = _bundles.reader ();
3543 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3544 if ((*i)->name() == name) {
3549 return boost::shared_ptr<Bundle> ();
3553 Session::tempo_map_changed (const PropertyChange&)
3557 playlists->update_after_tempo_map_change ();
3559 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3565 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3567 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3568 (*i)->recompute_frames_from_bbt ();
3572 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3573 * the given count with the current block size.
3576 Session::ensure_buffers (ChanCount howmany)
3578 BufferManager::ensure_buffers (howmany);
3582 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3584 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3585 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3590 Session::next_insert_id ()
3592 /* this doesn't really loop forever. just think about it */
3595 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3596 if (!insert_bitset[n]) {
3597 insert_bitset[n] = true;
3603 /* none available, so resize and try again */
3605 insert_bitset.resize (insert_bitset.size() + 16, false);
3610 Session::next_send_id ()
3612 /* this doesn't really loop forever. just think about it */
3615 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3616 if (!send_bitset[n]) {
3617 send_bitset[n] = true;
3623 /* none available, so resize and try again */
3625 send_bitset.resize (send_bitset.size() + 16, false);
3630 Session::next_aux_send_id ()
3632 /* this doesn't really loop forever. just think about it */
3635 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
3636 if (!aux_send_bitset[n]) {
3637 aux_send_bitset[n] = true;
3643 /* none available, so resize and try again */
3645 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
3650 Session::next_return_id ()
3652 /* this doesn't really loop forever. just think about it */
3655 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3656 if (!return_bitset[n]) {
3657 return_bitset[n] = true;
3663 /* none available, so resize and try again */
3665 return_bitset.resize (return_bitset.size() + 16, false);
3670 Session::mark_send_id (uint32_t id)
3672 if (id >= send_bitset.size()) {
3673 send_bitset.resize (id+16, false);
3675 if (send_bitset[id]) {
3676 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3678 send_bitset[id] = true;
3682 Session::mark_aux_send_id (uint32_t id)
3684 if (id >= aux_send_bitset.size()) {
3685 aux_send_bitset.resize (id+16, false);
3687 if (aux_send_bitset[id]) {
3688 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
3690 aux_send_bitset[id] = true;
3694 Session::mark_return_id (uint32_t id)
3696 if (id >= return_bitset.size()) {
3697 return_bitset.resize (id+16, false);
3699 if (return_bitset[id]) {
3700 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3702 return_bitset[id] = true;
3706 Session::mark_insert_id (uint32_t id)
3708 if (id >= insert_bitset.size()) {
3709 insert_bitset.resize (id+16, false);
3711 if (insert_bitset[id]) {
3712 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3714 insert_bitset[id] = true;
3718 Session::unmark_send_id (uint32_t id)
3720 if (id < send_bitset.size()) {
3721 send_bitset[id] = false;
3726 Session::unmark_aux_send_id (uint32_t id)
3728 if (id < aux_send_bitset.size()) {
3729 aux_send_bitset[id] = false;
3734 Session::unmark_return_id (uint32_t id)
3736 if (id < return_bitset.size()) {
3737 return_bitset[id] = false;
3742 Session::unmark_insert_id (uint32_t id)
3744 if (id < insert_bitset.size()) {
3745 insert_bitset[id] = false;
3750 /* Named Selection management */
3752 boost::shared_ptr<NamedSelection>
3753 Session::named_selection_by_name (string name)
3755 Glib::Mutex::Lock lm (named_selection_lock);
3756 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
3757 if ((*i)->name == name) {
3761 return boost::shared_ptr<NamedSelection>();
3765 Session::add_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3768 Glib::Mutex::Lock lm (named_selection_lock);
3769 named_selections.insert (named_selections.begin(), named_selection);
3774 NamedSelectionAdded (); /* EMIT SIGNAL */
3778 Session::remove_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3780 bool removed = false;
3783 Glib::Mutex::Lock lm (named_selection_lock);
3785 NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
3787 if (i != named_selections.end()) {
3788 named_selections.erase (i);
3795 NamedSelectionRemoved (); /* EMIT SIGNAL */
3800 Session::reset_native_file_format ()
3802 boost::shared_ptr<RouteList> rl = routes.reader ();
3803 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3804 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3806 /* don't save state as we do this, there's no point
3809 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3810 tr->reset_write_sources (false);
3811 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3817 Session::route_name_unique (string n) const
3819 boost::shared_ptr<RouteList> r = routes.reader ();
3821 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3822 if ((*i)->name() == n) {
3831 Session::route_name_internal (string n) const
3833 if (auditioner && auditioner->name() == n) {
3837 if (_click_io && _click_io->name() == n) {
3845 Session::freeze_all (InterThreadInfo& itt)
3847 boost::shared_ptr<RouteList> r = routes.reader ();
3849 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3851 boost::shared_ptr<Track> t;
3853 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3854 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3864 boost::shared_ptr<Region>
3865 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
3866 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3867 InterThreadInfo& itt, bool enable_processing)
3869 boost::shared_ptr<Region> result;
3870 boost::shared_ptr<Playlist> playlist;
3871 boost::shared_ptr<AudioFileSource> fsource;
3873 char buf[PATH_MAX+1];
3874 ChanCount diskstream_channels (track.n_channels());
3875 framepos_t position;
3876 framecnt_t this_chunk;
3879 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3880 const string sound_dir = sdir.sound_path().to_string();
3881 framepos_t len = end - start;
3882 bool need_block_size_reset = false;
3884 ChanCount const max_proc = track.max_processor_streams ();
3887 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3888 end, start) << endmsg;
3892 const framecnt_t chunk_size = (256 * 1024)/4;
3894 // block all process callback handling
3896 block_processing ();
3898 /* call tree *MUST* hold route_lock */
3900 if ((playlist = track.playlist()) == 0) {
3904 /* external redirects will be a problem */
3906 if (track.has_external_redirects()) {
3910 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3912 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
3914 for (x = 0; x < 99999; ++x) {
3915 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());
3916 if (!Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
3922 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3927 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
3928 SourceFactory::createWritable (DataType::AUDIO, *this, buf, string(), false, frame_rate()));
3931 catch (failed_constructor& err) {
3932 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
3936 srcs.push_back (fsource);
3939 /* tell redirects that care that we are about to use a much larger blocksize */
3941 need_block_size_reset = true;
3942 track.set_block_size (chunk_size);
3944 /* XXX need to flush all redirects */
3949 /* create a set of reasonably-sized buffers */
3950 buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
3951 buffers.set_count (max_proc);
3953 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3954 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3956 afs->prepare_for_peakfile_writes ();
3959 while (to_do && !itt.cancel) {
3961 this_chunk = min (to_do, chunk_size);
3963 if (track.export_stuff (buffers, start, this_chunk, enable_processing)) {
3968 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
3969 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3972 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
3978 start += this_chunk;
3979 to_do -= this_chunk;
3981 itt.progress = (float) (1.0 - ((double) to_do / len));
3990 xnow = localtime (&now);
3992 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3993 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3996 afs->update_header (position, *xnow, now);
3997 afs->flush_header ();
4001 /* construct a region to represent the bounced material */
4005 plist.add (Properties::start, 0);
4006 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4007 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4009 result = RegionFactory::create (srcs, plist);
4015 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4016 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4019 afs->mark_for_remove ();
4022 (*src)->drop_references ();
4026 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4027 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4030 afs->done_with_peakfile_writes ();
4035 if (need_block_size_reset) {
4036 track.set_block_size (get_block_size());
4039 unblock_processing ();
4045 Session::gain_automation_buffer() const
4047 return ProcessThread::gain_automation_buffer ();
4051 Session::pan_automation_buffer() const
4053 return ProcessThread::pan_automation_buffer ();
4057 Session::get_silent_buffers (ChanCount count)
4059 return ProcessThread::get_silent_buffers (count);
4063 Session::get_scratch_buffers (ChanCount count)
4065 return ProcessThread::get_scratch_buffers (count);
4069 Session::get_mix_buffers (ChanCount count)
4071 return ProcessThread::get_mix_buffers (count);
4075 Session::ntracks () const
4078 boost::shared_ptr<RouteList> r = routes.reader ();
4080 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4081 if (boost::dynamic_pointer_cast<Track> (*i)) {
4090 Session::nbusses () const
4093 boost::shared_ptr<RouteList> r = routes.reader ();
4095 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4096 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
4105 Session::add_automation_list(AutomationList *al)
4107 automation_lists[al->id()] = al;
4111 Session::sync_order_keys (std::string const & base)
4113 if (deletion_in_progress()) {
4117 if (!Config->get_sync_all_route_ordering()) {
4118 /* leave order keys as they are */
4122 boost::shared_ptr<RouteList> r = routes.reader ();
4124 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4125 (*i)->sync_order_keys (base);
4128 Route::SyncOrderKeys (base); // EMIT SIGNAL
4130 /* this might not do anything */
4132 set_remote_control_ids ();
4135 /** @return true if there is at least one record-enabled track, otherwise false */
4137 Session::have_rec_enabled_track () const
4139 return g_atomic_int_get (&_have_rec_enabled_track) == 1;
4142 /** Update the state of our rec-enabled tracks flag */
4144 Session::update_have_rec_enabled_track ()
4146 boost::shared_ptr<RouteList> rl = routes.reader ();
4147 RouteList::iterator i = rl->begin();
4148 while (i != rl->end ()) {
4150 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4151 if (tr && tr->record_enabled ()) {
4158 int const old = g_atomic_int_get (&_have_rec_enabled_track);
4160 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4162 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4163 RecordStateChanged (); /* EMIT SIGNAL */
4168 Session::listen_position_changed ()
4170 boost::shared_ptr<RouteList> r = routes.reader ();
4172 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4173 (*i)->listen_position_changed ();
4178 Session::solo_control_mode_changed ()
4180 /* cancel all solo or all listen when solo control mode changes */
4183 set_solo (get_routes(), false);
4184 } else if (listening()) {
4185 set_listen (get_routes(), false);
4189 /** Called when a property of one of our route groups changes */
4191 Session::route_group_property_changed (RouteGroup* rg)
4193 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4196 /** Called when a route is added to one of our route groups */
4198 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4200 RouteAddedToRouteGroup (rg, r);
4203 /** Called when a route is removed from one of our route groups */
4205 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4207 RouteRemovedFromRouteGroup (rg, r);
4211 Session::get_available_sync_options () const
4213 vector<SyncSource> ret;
4215 ret.push_back (JACK);
4216 ret.push_back (MTC);
4217 ret.push_back (MIDIClock);
4222 boost::shared_ptr<RouteList>
4223 Session::get_routes_with_regions_at (framepos_t const p) const
4225 boost::shared_ptr<RouteList> r = routes.reader ();
4226 boost::shared_ptr<RouteList> rl (new RouteList);
4228 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4229 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4234 boost::shared_ptr<Playlist> pl = tr->playlist ();
4239 if (pl->has_region_at (p)) {
4248 Session::goto_end ()
4250 if (_session_range_location) {
4251 request_locate (_session_range_location->end(), false);
4253 request_locate (0, false);
4258 Session::goto_start ()
4260 if (_session_range_location) {
4261 request_locate (_session_range_location->start(), false);
4263 request_locate (0, false);
4268 Session::current_start_frame () const
4270 return _session_range_location ? _session_range_location->start() : 0;
4274 Session::current_end_frame () const
4276 return _session_range_location ? _session_range_location->end() : 0;
4280 Session::add_session_range_location (framepos_t start, framepos_t end)
4282 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4283 _locations->add (_session_range_location);
4286 /** Called when one of our routes' order keys has changed */
4288 Session::route_order_key_changed ()
4290 RouteOrderKeyChanged (); /* EMIT SIGNAL */
4294 Session::step_edit_status_change (bool yn)
4300 send = (_step_editors == 0);
4305 send = (_step_editors == 1);
4308 if (_step_editors > 0) {
4314 StepEditStatusChange (val);
4320 Session::start_time_changed (framepos_t old)
4322 /* Update the auto loop range to match the session range
4323 (unless the auto loop range has been changed by the user)
4326 Location* s = _locations->session_range_location ();
4331 Location* l = _locations->auto_loop_location ();
4333 if (l->start() == old) {
4334 l->set_start (s->start(), true);
4339 Session::end_time_changed (framepos_t old)
4341 /* Update the auto loop range to match the session range
4342 (unless the auto loop range has been changed by the user)
4345 Location* s = _locations->session_range_location ();
4350 Location* l = _locations->auto_loop_location ();
4352 if (l && l->end() == old) {
4353 l->set_end (s->end(), true);
4358 Session::source_search_path (DataType type) const
4362 if (session_dirs.size() == 1) {
4364 case DataType::AUDIO:
4365 s.push_back ( _session_dir->sound_path().to_string());
4367 case DataType::MIDI:
4368 s.push_back (_session_dir->midi_path().to_string());
4372 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4373 SessionDirectory sdir (i->path);
4375 case DataType::AUDIO:
4376 s.push_back (sdir.sound_path().to_string());
4378 case DataType::MIDI:
4379 s.push_back (sdir.midi_path().to_string());
4385 /* now check the explicit (possibly user-specified) search path
4388 vector<string> dirs;
4391 case DataType::AUDIO:
4392 split (config.get_audio_search_path (), dirs, ':');
4394 case DataType::MIDI:
4395 split (config.get_midi_search_path (), dirs, ':');
4399 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4401 vector<string>::iterator si;
4403 for (si = s.begin(); si != s.end(); ++si) {
4409 if (si == s.end()) {
4416 for (vector<string>::iterator si = s.begin(); si != s.end(); ++si) {
4417 if (!search_path.empty()) {
4427 Session::ensure_search_path_includes (const string& path, DataType type)
4430 vector<string> dirs;
4437 case DataType::AUDIO:
4438 search_path = config.get_audio_search_path ();
4440 case DataType::MIDI:
4441 search_path = config.get_midi_search_path ();
4445 split (search_path, dirs, ':');
4447 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4453 if (!search_path.empty()) {
4457 search_path += path;
4460 case DataType::AUDIO:
4461 config.set_audio_search_path (search_path);
4463 case DataType::MIDI:
4464 config.set_midi_search_path (search_path);
4469 boost::shared_ptr<Speakers>
4470 Session::get_speakers()
4476 Session::unknown_processors () const
4480 boost::shared_ptr<RouteList> r = routes.reader ();
4481 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4482 list<string> t = (*i)->unknown_processors ();
4483 copy (t.begin(), t.end(), back_inserter (p));
4493 Session::update_latency (bool playback)
4495 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
4497 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4501 boost::shared_ptr<RouteList> r = routes.reader ();
4502 framecnt_t max_latency = 0;
4505 /* reverse the list so that we work backwards from the last route to run to the first */
4506 RouteList* rl = routes.reader().get();
4507 r.reset (new RouteList (*rl));
4508 reverse (r->begin(), r->end());
4511 /* compute actual latency values for the given direction and store them all in per-port
4512 structures. this will also publish the same values (to JACK) so that computation of latency
4513 for routes can consistently use public latency values.
4516 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4517 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
4520 /* because we latency compensate playback, our published playback latencies should
4521 be the same for all output ports - all material played back by ardour has
4522 the same latency, whether its caused by plugins or by latency compensation. since
4523 these may differ from the values computed above, reset all playback port latencies
4527 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
4529 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4530 (*i)->set_public_port_latencies (max_latency, playback);
4535 post_playback_latency ();
4539 post_capture_latency ();
4542 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
4546 Session::post_playback_latency ()
4548 set_worst_playback_latency ();
4550 boost::shared_ptr<RouteList> r = routes.reader ();
4552 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4553 if (!(*i)->is_hidden() && ((*i)->active())) {
4554 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
4558 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4559 (*i)->set_latency_compensation (_worst_track_latency);
4564 Session::post_capture_latency ()
4566 set_worst_capture_latency ();
4568 /* reflect any changes in capture latencies into capture offsets
4571 boost::shared_ptr<RouteList> rl = routes.reader();
4572 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4573 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4575 tr->set_capture_offset ();
4581 Session::initialize_latencies ()
4584 Glib::Mutex::Lock lm (_engine.process_lock());
4585 update_latency (false);
4586 update_latency (true);
4589 set_worst_io_latencies ();
4593 Session::set_worst_io_latencies ()
4595 set_worst_playback_latency ();
4596 set_worst_capture_latency ();
4600 Session::set_worst_playback_latency ()
4602 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4606 _worst_output_latency = 0;
4608 if (!_engine.connected()) {
4612 boost::shared_ptr<RouteList> r = routes.reader ();
4614 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4615 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
4618 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
4622 Session::set_worst_capture_latency ()
4624 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4628 _worst_input_latency = 0;
4630 if (!_engine.connected()) {
4634 boost::shared_ptr<RouteList> r = routes.reader ();
4636 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4637 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
4640 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
4644 Session::update_latency_compensation (bool force_whole_graph)
4646 bool some_track_latency_changed = false;
4648 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4652 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
4654 _worst_track_latency = 0;
4656 boost::shared_ptr<RouteList> r = routes.reader ();
4658 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4659 if (!(*i)->is_hidden() && ((*i)->active())) {
4661 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
4662 some_track_latency_changed = true;
4664 _worst_track_latency = max (tl, _worst_track_latency);
4668 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
4669 (some_track_latency_changed ? "yes" : "no")));
4671 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
4673 if (some_track_latency_changed || force_whole_graph) {
4674 _engine.update_latencies ();
4678 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4679 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4683 tr->set_capture_offset ();
4688 Session::session_name_is_legal (const string& path)
4690 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
4692 for (int i = 0; illegal_chars[i]; ++i) {
4693 if (path.find (illegal_chars[i]) != string::npos) {
4694 return illegal_chars[i];
4702 Session::next_control_id () const
4704 return ntracks() + nbusses() + 1;