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"
49 #include "ardour/amp.h"
50 #include "ardour/analyser.h"
51 #include "ardour/audio_buffer.h"
52 #include "ardour/audio_diskstream.h"
53 #include "ardour/audio_port.h"
54 #include "ardour/audio_track.h"
55 #include "ardour/audioengine.h"
56 #include "ardour/audiofilesource.h"
57 #include "ardour/audioplaylist.h"
58 #include "ardour/audioregion.h"
59 #include "ardour/auditioner.h"
60 #include "ardour/buffer_manager.h"
61 #include "ardour/buffer_set.h"
62 #include "ardour/bundle.h"
63 #include "ardour/butler.h"
64 #include "ardour/click.h"
65 #include "ardour/configuration.h"
66 #include "ardour/control_protocol_manager.h"
67 #include "ardour/crossfade.h"
68 #include "ardour/cycle_timer.h"
69 #include "ardour/data_type.h"
70 #include "ardour/debug.h"
71 #include "ardour/filename_extensions.h"
72 #include "ardour/internal_send.h"
73 #include "ardour/io_processor.h"
74 #include "ardour/midi_diskstream.h"
75 #include "ardour/midi_playlist.h"
76 #include "ardour/midi_region.h"
77 #include "ardour/midi_track.h"
78 #include "ardour/midi_ui.h"
79 #include "ardour/named_selection.h"
80 #include "ardour/process_thread.h"
81 #include "ardour/playlist.h"
82 #include "ardour/plugin_insert.h"
83 #include "ardour/port_insert.h"
84 #include "ardour/processor.h"
85 #include "ardour/rc_configuration.h"
86 #include "ardour/recent_sessions.h"
87 #include "ardour/region_factory.h"
88 #include "ardour/return.h"
89 #include "ardour/route_group.h"
90 #include "ardour/send.h"
91 #include "ardour/session.h"
92 #include "ardour/session_directory.h"
93 #include "ardour/session_directory.h"
94 #include "ardour/session_metadata.h"
95 #include "ardour/session_playlists.h"
96 #include "ardour/slave.h"
97 #include "ardour/smf_source.h"
98 #include "ardour/source_factory.h"
99 #include "ardour/tape_file_matcher.h"
100 #include "ardour/tempo.h"
101 #include "ardour/utils.h"
102 #include "ardour/graph.h"
103 #include "ardour/speakers.h"
104 #include "ardour/operations.h"
106 #include "midi++/port.h"
107 #include "midi++/mmc.h"
108 #include "midi++/manager.h"
113 using namespace ARDOUR;
116 bool Session::_disable_all_loaded_plugins = false;
118 PBD::Signal1<void,std::string> Session::Dialog;
119 PBD::Signal0<int> Session::AskAboutPendingState;
120 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
121 PBD::Signal0<void> Session::SendFeedback;
122 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
124 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
125 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
126 PBD::Signal0<void> Session::AutoBindingOn;
127 PBD::Signal0<void> Session::AutoBindingOff;
128 PBD::Signal2<void,std::string, std::string> Session::Exported;
129 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
130 PBD::Signal0<void> Session::Quit;
132 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
133 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
135 /** @param snapshot_name Snapshot name, without .ardour prefix */
136 Session::Session (AudioEngine &eng,
137 const string& fullpath,
138 const string& snapshot_name,
139 BusProfile* bus_profile,
142 , _target_transport_speed (0.0)
143 , _requested_return_frame (-1)
144 , _session_dir (new SessionDirectory(fullpath))
146 , _state_of_the_state (Clean)
147 , _butler (new Butler (*this))
148 , _post_transport_work (0)
149 , _send_timecode_update (false)
150 , _all_route_group (new RouteGroup (*this, "all"))
151 , route_graph (new Graph(*this))
152 , routes (new RouteList)
153 , _total_free_4k_blocks (0)
154 , _bundles (new BundleList)
155 , _bundle_xml_node (0)
157 , _click_io ((IO*) 0)
159 , click_emphasis_data (0)
161 , _metadata (new SessionMetadata())
162 , _have_rec_enabled_track (false)
163 , _suspend_timecode_transmission (0)
165 _locations = new Locations (*this);
167 playlists.reset (new SessionPlaylists);
169 _all_route_group->set_active (true, this);
171 interpolation.add_channel_to (0, 0);
173 if (!eng.connected()) {
174 throw failed_constructor();
177 n_physical_outputs = _engine.n_physical_outputs ();
178 n_physical_inputs = _engine.n_physical_inputs ();
180 first_stage_init (fullpath, snapshot_name);
182 _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
185 if (create (mix_template, bus_profile)) {
187 throw failed_constructor ();
191 if (second_stage_init ()) {
193 throw failed_constructor ();
196 store_recent_sessions(_name, _path);
198 bool was_dirty = dirty();
200 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
202 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
203 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
206 DirtyChanged (); /* EMIT SIGNAL */
209 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
210 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
223 vector<void*> debug_pointers;
225 /* if we got to here, leaving pending capture state around
229 remove_pending_capture_state ();
231 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
233 _engine.remove_session ();
235 /* clear history so that no references to objects are held any more */
239 /* clear state tree so that no references to objects are held any more */
243 /* reset dynamic state version back to default */
245 Stateful::loading_state_version = 0;
247 _butler->drop_references ();
249 delete midi_control_ui;
250 delete _all_route_group;
252 if (click_data != default_click) {
253 delete [] click_data;
256 if (click_emphasis_data != default_click_emphasis) {
257 delete [] click_emphasis_data;
262 /* clear out any pending dead wood from RCU managed objects */
267 AudioDiskstream::free_working_buffers();
269 /* tell everyone who is still standing that we're about to die */
272 /* tell everyone to drop references and delete objects as we go */
274 DEBUG_TRACE (DEBUG::Destruction, "delete named selections\n");
275 named_selections.clear ();
277 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
278 RegionFactory::delete_all_regions ();
280 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
282 /* reset these three references to special routes before we do the usual route delete thing */
285 _master_out.reset ();
286 _monitor_out.reset ();
289 RCUWriter<RouteList> writer (routes);
290 boost::shared_ptr<RouteList> r = writer.get_copy ();
292 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
293 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
294 (*i)->drop_references ();
298 /* writer goes out of scope and updates master */
302 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
303 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
304 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
305 i->second->drop_references ();
310 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
311 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
316 Crossfade::set_buffer_size (0);
318 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
323 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
325 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
326 boost_debug_list_ptrs ();
331 Session::when_engine_running ()
333 string first_physical_output;
335 BootMessage (_("Set block size and sample rate"));
337 set_block_size (_engine.frames_per_cycle());
338 set_frame_rate (_engine.frame_rate());
340 BootMessage (_("Using configuration"));
342 boost::function<void (std::string)> ff (boost::bind (&Session::config_changed, this, _1, false));
343 boost::function<void (std::string)> ft (boost::bind (&Session::config_changed, this, _1, true));
345 Config->map_parameters (ff);
346 config.map_parameters (ft);
348 /* every time we reconnect, recompute worst case output latencies */
350 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
352 if (synced_to_jack()) {
353 _engine.transport_stop ();
356 if (config.get_jack_time_master()) {
357 _engine.transport_locate (_transport_frame);
365 _click_io.reset (new ClickIO (*this, "click"));
367 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
369 /* existing state for Click */
372 if (Stateful::loading_state_version < 3000) {
373 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
375 c = _click_io->set_state (*child->children().front(), Stateful::loading_state_version);
380 _clicking = Config->get_clicking ();
384 error << _("could not setup Click I/O") << endmsg;
391 /* default state for Click: dual-mono to first 2 physical outputs */
394 _engine.get_physical_outputs (DataType::AUDIO, outs);
396 for (uint32_t physport = 0; physport < 2; ++physport) {
397 if (outs.size() > physport) {
398 if (_click_io->add_port (outs[physport], this)) {
399 // relax, even though its an error
404 if (_click_io->n_ports () > ChanCount::ZERO) {
405 _clicking = Config->get_clicking ();
410 catch (failed_constructor& err) {
411 error << _("cannot setup Click I/O") << endmsg;
414 BootMessage (_("Compute I/O Latencies"));
417 // XXX HOW TO ALERT UI TO THIS ? DO WE NEED TO?
420 BootMessage (_("Set up standard connections"));
422 vector<string> inputs[DataType::num_types];
423 vector<string> outputs[DataType::num_types];
424 for (uint32_t i = 0; i < DataType::num_types; ++i) {
425 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
426 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
429 /* Create a set of Bundle objects that map
430 to the physical I/O currently available. We create both
431 mono and stereo bundles, so that the common cases of mono
432 and stereo tracks get bundles to put in their mixer strip
433 in / out menus. There may be a nicer way of achieving that;
434 it doesn't really scale that well to higher channel counts
437 /* mono output bundles */
439 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
441 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
443 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
444 c->add_channel (_("mono"), DataType::AUDIO);
445 c->set_port (0, outputs[DataType::AUDIO][np]);
450 /* stereo output bundles */
452 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
453 if (np + 1 < outputs[DataType::AUDIO].size()) {
455 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
456 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
457 c->add_channel (_("L"), DataType::AUDIO);
458 c->set_port (0, outputs[DataType::AUDIO][np]);
459 c->add_channel (_("R"), DataType::AUDIO);
460 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
466 /* mono input bundles */
468 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
470 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
472 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
473 c->add_channel (_("mono"), DataType::AUDIO);
474 c->set_port (0, inputs[DataType::AUDIO][np]);
479 /* stereo input bundles */
481 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
482 if (np + 1 < inputs[DataType::AUDIO].size()) {
484 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
486 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
487 c->add_channel (_("L"), DataType::AUDIO);
488 c->set_port (0, inputs[DataType::AUDIO][np]);
489 c->add_channel (_("R"), DataType::AUDIO);
490 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
496 /* MIDI input bundles */
498 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
499 string n = inputs[DataType::MIDI][np];
500 boost::erase_first (n, X_("alsa_pcm:"));
502 boost::shared_ptr<Bundle> c (new Bundle (n, false));
503 c->add_channel ("", DataType::MIDI);
504 c->set_port (0, inputs[DataType::MIDI][np]);
508 /* MIDI output bundles */
510 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
511 string n = outputs[DataType::MIDI][np];
512 boost::erase_first (n, X_("alsa_pcm:"));
514 boost::shared_ptr<Bundle> c (new Bundle (n, true));
515 c->add_channel ("", DataType::MIDI);
516 c->set_port (0, outputs[DataType::MIDI][np]);
520 BootMessage (_("Setup signal flow and plugins"));
522 ControlProtocolManager::instance().set_session (this);
524 /* This must be done after the ControlProtocolManager set_session above,
525 as it will set states for ports which the ControlProtocolManager creates.
527 MIDI::Manager::instance()->set_port_states (Config->midi_port_states ());
529 /* And this must be done after the MIDI::Manager::set_port_states as
530 * it will try to make connections whose details are loaded by set_port_states.
535 if (_is_new && !no_auto_connect()) {
537 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock());
539 /* don't connect the master bus outputs if there is a monitor bus */
541 if (_master_out && Config->get_auto_connect_standard_busses() && !_monitor_out) {
543 /* if requested auto-connect the outputs to the first N physical ports.
546 uint32_t limit = _master_out->n_outputs().n_total();
548 for (uint32_t n = 0; n < limit; ++n) {
549 Port* p = _master_out->output()->nth (n);
551 if (outputs[p->type()].size() > n) {
552 connect_to = outputs[p->type()][n];
555 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
556 if (_master_out->output()->connect (p, connect_to, this)) {
557 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
567 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
568 are undefined, at best.
571 /* control out listens to master bus (but ignores it
572 under some conditions)
575 uint32_t limit = _monitor_out->n_inputs().n_audio();
578 for (uint32_t n = 0; n < limit; ++n) {
579 AudioPort* p = _monitor_out->input()->ports().nth_audio_port (n);
580 AudioPort* o = _master_out->output()->ports().nth_audio_port (n);
583 string connect_to = o->name();
584 if (_monitor_out->input()->connect (p, connect_to, this)) {
585 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
593 /* if control out is not connected, connect control out to physical outs
596 if (!_monitor_out->output()->connected ()) {
598 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
600 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
603 _monitor_out->output()->connect_ports_to_bundle (b, this);
605 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
606 Config->get_monitor_bus_preferred_bundle())
612 /* Monitor bus is audio only */
613 uint32_t mod = n_physical_outputs.get (DataType::AUDIO);
614 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
618 for (uint32_t n = 0; n < limit; ++n) {
620 Port* p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
622 if (outputs[DataType::AUDIO].size() > (n % mod)) {
623 connect_to = outputs[DataType::AUDIO][n % mod];
626 if (!connect_to.empty()) {
627 if (_monitor_out->output()->connect (p, connect_to, this)) {
628 error << string_compose (
629 _("cannot connect control output %1 to %2"),
642 _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
644 /* update latencies */
646 initialize_latencies ();
648 /* hook us up to the engine */
650 BootMessage (_("Connect to engine"));
651 _engine.set_session (this);
655 Session::hookup_io ()
657 /* stop graph reordering notifications from
658 causing resorts, etc.
661 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
665 /* we delay creating the auditioner till now because
666 it makes its own connections to ports.
670 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
672 throw failed_constructor ();
674 a->use_new_diskstream ();
678 catch (failed_constructor& err) {
679 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
683 /* load bundles, which we may have postponed earlier on */
684 if (_bundle_xml_node) {
685 load_bundles (*_bundle_xml_node);
686 delete _bundle_xml_node;
689 /* Tell all IO objects to connect themselves together */
691 IO::enable_connecting ();
692 MIDI::Port::MakeConnections ();
694 /* Now reset all panners */
696 Delivery::reset_panners ();
698 /* Connect tracks to monitor/listen bus if there is one. Note that in an
699 existing session, the internal sends will already exist, but we want the
700 routes to notice that they connect to the control out specifically.
704 boost::shared_ptr<RouteList> r = routes.reader ();
705 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
707 if ((*x)->is_monitor()) {
711 } else if ((*x)->is_master()) {
717 (*x)->listen_via_monitor ();
722 /* Anyone who cares about input state, wake up and do something */
724 IOConnectionsComplete (); /* EMIT SIGNAL */
726 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
728 /* now handle the whole enchilada as if it was one
734 /* update the full solo state, which can't be
735 correctly determined on a per-route basis, but
736 needs the global overview that only the session
740 update_route_solo_state ();
744 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
746 boost::shared_ptr<Track> track = wp.lock ();
751 boost::shared_ptr<Playlist> playlist;
753 if ((playlist = track->playlist()) != 0) {
754 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
755 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
756 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
761 Session::record_enabling_legal () const
763 /* this used to be in here, but survey says.... we don't need to restrict it */
764 // if (record_status() == Recording) {
768 if (Config->get_all_safe()) {
775 Session::set_track_monitor_input_status (bool yn)
777 boost::shared_ptr<RouteList> rl = routes.reader ();
778 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
779 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
780 if (tr && tr->record_enabled ()) {
781 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
782 tr->monitor_input (yn);
788 Session::reset_input_monitor_state ()
790 if (transport_rolling()) {
791 set_track_monitor_input_status (Config->get_monitoring_model() == HardwareMonitoring && !config.get_auto_input());
793 set_track_monitor_input_status (Config->get_monitoring_model() == HardwareMonitoring);
798 Session::auto_punch_start_changed (Location* location)
800 replace_event (SessionEvent::PunchIn, location->start());
802 if (get_record_enabled() && config.get_punch_in()) {
803 /* capture start has been changed, so save new pending state */
804 save_state ("", true);
809 Session::auto_punch_end_changed (Location* location)
811 framepos_t when_to_stop = location->end();
812 // when_to_stop += _worst_output_latency + _worst_input_latency;
813 replace_event (SessionEvent::PunchOut, when_to_stop);
817 Session::auto_punch_changed (Location* location)
819 framepos_t when_to_stop = location->end();
821 replace_event (SessionEvent::PunchIn, location->start());
822 //when_to_stop += _worst_output_latency + _worst_input_latency;
823 replace_event (SessionEvent::PunchOut, when_to_stop);
827 Session::auto_loop_changed (Location* location)
829 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
831 if (transport_rolling() && play_loop) {
834 // if (_transport_frame > location->end()) {
836 if (_transport_frame < location->start() || _transport_frame > location->end()) {
837 // relocate to beginning of loop
838 clear_events (SessionEvent::LocateRoll);
840 request_locate (location->start(), true);
843 else if (Config->get_seamless_loop() && !loop_changing) {
845 // schedule a locate-roll to refill the diskstreams at the
847 loop_changing = true;
849 if (location->end() > last_loopend) {
850 clear_events (SessionEvent::LocateRoll);
851 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
858 last_loopend = location->end();
862 Session::set_auto_punch_location (Location* location)
866 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
867 punch_connections.drop_connections();
868 existing->set_auto_punch (false, this);
869 remove_event (existing->start(), SessionEvent::PunchIn);
870 clear_events (SessionEvent::PunchOut);
871 auto_punch_location_changed (0);
880 if (location->end() <= location->start()) {
881 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
885 punch_connections.drop_connections ();
887 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
888 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
889 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
891 location->set_auto_punch (true, this);
893 auto_punch_changed (location);
895 auto_punch_location_changed (location);
899 Session::set_auto_loop_location (Location* location)
903 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
904 loop_connections.drop_connections ();
905 existing->set_auto_loop (false, this);
906 remove_event (existing->end(), SessionEvent::AutoLoop);
907 auto_loop_location_changed (0);
916 if (location->end() <= location->start()) {
917 error << _("Session: you can't use a mark for auto loop") << endmsg;
921 last_loopend = location->end();
923 loop_connections.drop_connections ();
925 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
926 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
927 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
929 location->set_auto_loop (true, this);
931 /* take care of our stuff first */
933 auto_loop_changed (location);
935 /* now tell everyone else */
937 auto_loop_location_changed (location);
941 Session::locations_added (Location *)
947 Session::locations_changed ()
949 _locations->apply (*this, &Session::handle_locations_changed);
953 Session::handle_locations_changed (Locations::LocationList& locations)
955 Locations::LocationList::iterator i;
957 bool set_loop = false;
958 bool set_punch = false;
960 for (i = locations.begin(); i != locations.end(); ++i) {
964 if (location->is_auto_punch()) {
965 set_auto_punch_location (location);
968 if (location->is_auto_loop()) {
969 set_auto_loop_location (location);
973 if (location->is_session_range()) {
974 _session_range_location = location;
979 set_auto_loop_location (0);
982 set_auto_punch_location (0);
989 Session::enable_record ()
991 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
992 /* no recording at anything except normal speed */
997 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
999 if (rs == Recording) {
1003 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1005 _last_record_location = _transport_frame;
1006 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1008 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1009 set_track_monitor_input_status (true);
1012 RecordStateChanged ();
1019 Session::disable_record (bool rt_context, bool force)
1023 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1025 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1026 g_atomic_int_set (&_record_status, Disabled);
1027 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1029 if (rs == Recording) {
1030 g_atomic_int_set (&_record_status, Enabled);
1034 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1035 set_track_monitor_input_status (false);
1038 RecordStateChanged (); /* emit signal */
1041 remove_pending_capture_state ();
1047 Session::step_back_from_record ()
1049 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1051 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1052 set_track_monitor_input_status (false);
1058 Session::maybe_enable_record ()
1060 if (_step_editors > 0) {
1064 g_atomic_int_set (&_record_status, Enabled);
1066 /* This function is currently called from somewhere other than an RT thread.
1067 This save_state() call therefore doesn't impact anything. Doing it here
1068 means that we save pending state of which sources the next record will use,
1069 which gives us some chance of recovering from a crash during the record.
1072 save_state ("", true);
1074 if (_transport_speed) {
1075 if (!config.get_punch_in()) {
1079 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1080 RecordStateChanged (); /* EMIT SIGNAL */
1087 Session::audible_frame () const
1093 /* the first of these two possible settings for "offset"
1094 mean that the audible frame is stationary until
1095 audio emerges from the latency compensation
1098 the second means that the audible frame is stationary
1099 until audio would emerge from a physical port
1100 in the absence of any plugin latency compensation
1103 offset = worst_playback_latency ();
1105 if (offset > current_block_size) {
1106 offset -= current_block_size;
1108 /* XXX is this correct? if we have no external
1109 physical connections and everything is internal
1110 then surely this is zero? still, how
1111 likely is that anyway?
1113 offset = current_block_size;
1116 if (synced_to_jack()) {
1117 tf = _engine.transport_frame();
1119 tf = _transport_frame;
1124 if (!non_realtime_work_pending()) {
1128 /* Check to see if we have passed the first guaranteed
1129 audible frame past our last start position. if not,
1130 return that last start point because in terms
1131 of audible frames, we have not moved yet.
1133 `Start position' in this context means the time we last
1134 either started or changed transport direction.
1137 if (_transport_speed > 0.0f) {
1139 if (!play_loop || !have_looped) {
1140 if (tf < _last_roll_or_reversal_location + offset) {
1141 return _last_roll_or_reversal_location;
1149 } else if (_transport_speed < 0.0f) {
1151 /* XXX wot? no backward looping? */
1153 if (tf > _last_roll_or_reversal_location - offset) {
1154 return _last_roll_or_reversal_location;
1166 Session::set_frame_rate (framecnt_t frames_per_second)
1168 /** \fn void Session::set_frame_size(framecnt_t)
1169 the AudioEngine object that calls this guarantees
1170 that it will not be called while we are also in
1171 ::process(). Its fine to do things that block
1175 _base_frame_rate = frames_per_second;
1179 Automatable::set_automation_interval (ceil ((double) frames_per_second * (0.001 * Config->get_automation_interval())));
1183 // XXX we need some equivalent to this, somehow
1184 // SndFileSource::setup_standard_crossfades (frames_per_second);
1188 /* XXX need to reset/reinstantiate all LADSPA plugins */
1192 Session::set_block_size (pframes_t nframes)
1194 /* the AudioEngine guarantees
1195 that it will not be called while we are also in
1196 ::process(). It is therefore fine to do things that block
1201 current_block_size = nframes;
1205 boost::shared_ptr<RouteList> r = routes.reader ();
1207 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1208 (*i)->set_block_size (nframes);
1211 boost::shared_ptr<RouteList> rl = routes.reader ();
1212 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1213 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1215 tr->set_block_size (nframes);
1219 set_worst_io_latencies ();
1223 struct RouteSorter {
1224 /** @return true to run r1 before r2, otherwise false */
1225 bool sort_by_rec_enabled (const boost::shared_ptr<Route>& r1, const boost::shared_ptr<Route>& r2) {
1226 if (r1->record_enabled()) {
1227 if (r2->record_enabled()) {
1228 /* both rec-enabled, just use signal order */
1229 return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1231 /* r1 rec-enabled, r2 not rec-enabled, run r2 early */
1235 if (r2->record_enabled()) {
1236 /* r2 rec-enabled, r1 not rec-enabled, run r1 early */
1239 /* neither rec-enabled, use signal order */
1240 return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1245 bool operator() (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> r2) {
1246 if (r2->feeds (r1)) {
1247 /* r1 fed by r2; run r2 early */
1249 } else if (r1->feeds (r2)) {
1250 /* r2 fed by r1; run r1 early */
1253 if (r1->not_fed ()) {
1254 if (r2->not_fed ()) {
1255 /* no ardour-based connections inbound to either route. */
1256 return sort_by_rec_enabled (r1, r2);
1258 /* r2 has connections, r1 does not; run r1 early */
1262 if (r2->not_fed()) {
1263 /* r1 has connections, r2 does not; run r2 early */
1266 /* both r1 and r2 have connections, but not to each other. just use signal order */
1267 return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1275 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1277 boost::shared_ptr<Route> r2;
1279 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1280 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1284 /* make a copy of the existing list of routes that feed r1 */
1286 Route::FedBy existing (r1->fed_by());
1288 /* for each route that feeds r1, recurse, marking it as feeding
1292 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1293 if (!(r2 = i->r.lock ())) {
1294 /* (*i) went away, ignore it */
1298 /* r2 is a route that feeds r1 which somehow feeds base. mark
1299 base as being fed by r2
1302 rbase->add_fed_by (r2, i->sends_only);
1306 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1310 if (r1->feeds (r2) && r2->feeds (r1)) {
1314 /* now recurse, so that we can mark base as being fed by
1315 all routes that feed r2
1318 trace_terminal (r2, rbase);
1325 Session::resort_routes ()
1327 /* don't do anything here with signals emitted
1328 by Routes while we are being destroyed.
1331 if (_state_of_the_state & Deletion) {
1336 RCUWriter<RouteList> writer (routes);
1337 boost::shared_ptr<RouteList> r = writer.get_copy ();
1338 resort_routes_using (r);
1339 /* writer goes out of scope and forces update */
1342 //route_graph->dump(1);
1345 boost::shared_ptr<RouteList> rl = routes.reader ();
1346 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1347 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1349 const Route::FedBy& fb ((*i)->fed_by());
1351 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1352 boost::shared_ptr<Route> sf = f->r.lock();
1354 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1362 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1364 RouteList::iterator i, j;
1366 for (i = r->begin(); i != r->end(); ++i) {
1368 (*i)->clear_fed_by ();
1370 for (j = r->begin(); j != r->end(); ++j) {
1372 /* although routes can feed themselves, it will
1373 cause an endless recursive descent if we
1374 detect it. so don't bother checking for
1382 bool via_sends_only;
1384 if ((*j)->direct_feeds (*i, &via_sends_only)) {
1385 (*i)->add_fed_by (*j, via_sends_only);
1390 for (i = r->begin(); i != r->end(); ++i) {
1391 trace_terminal (*i, *i);
1397 route_graph->rechain (r);
1400 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1401 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1402 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1403 (*i)->name(), (*i)->order_key ("signal")));
1409 /** Find a route name starting with \a base, maybe followed by the
1410 * lowest \a id. \a id will always be added if \a definitely_add_number
1411 * is true on entry; otherwise it will only be added if required
1412 * to make the name unique.
1414 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1415 * The available route name with the lowest ID will be used, and \a id
1416 * will be set to the ID.
1418 * \return false if a route name could not be found, and \a track_name
1419 * and \a id do not reflect a free route name.
1422 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1424 if (!definitely_add_number && route_by_name (base) == 0) {
1425 /* juse use the base */
1426 snprintf (name, name_len, "%s", base.c_str());
1431 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1433 if (route_by_name (name) == 0) {
1439 } while (id < (UINT_MAX-1));
1444 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
1446 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
1448 in = ChanCount::ZERO;
1449 out = ChanCount::ZERO;
1451 boost::shared_ptr<RouteList> r = routes.reader ();
1453 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1454 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1455 if (tr && !tr->is_hidden()) {
1456 in += tr->n_inputs();
1457 out += tr->n_outputs();
1462 /** Caller must not hold process lock
1463 * @param name_template string to use for the start of the name, or "" to use "Midi".
1465 list<boost::shared_ptr<MidiTrack> >
1466 Session::new_midi_track (TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1468 char track_name[32];
1469 uint32_t track_id = 0;
1471 RouteList new_routes;
1472 list<boost::shared_ptr<MidiTrack> > ret;
1473 uint32_t control_id;
1475 control_id = ntracks() + nbusses();
1477 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Midi");
1480 if (!find_route_name (name_template.empty() ? _("Midi") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1481 error << "cannot find name for new midi track" << endmsg;
1485 boost::shared_ptr<MidiTrack> track;
1488 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1490 if (track->init ()) {
1494 track->use_new_diskstream();
1496 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1497 boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1500 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1501 if (track->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1502 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1506 if (track->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1507 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1512 track->non_realtime_input_change();
1515 route_group->add (track);
1518 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1519 track->set_remote_control_id (control_id);
1521 new_routes.push_back (track);
1522 ret.push_back (track);
1525 catch (failed_constructor &err) {
1526 error << _("Session: could not create new midi track.") << endmsg;
1530 catch (AudioEngine::PortRegistrationFailure& pfe) {
1532 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;
1540 if (!new_routes.empty()) {
1541 add_routes (new_routes, true, true);
1548 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
1550 boost::shared_ptr<Route> midi_track (wmt.lock());
1556 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
1558 if (change.after.n_audio() <= change.before.n_audio()) {
1562 /* new audio ports: make sure the audio goes somewhere useful,
1563 unless the user has no-auto-connect selected.
1565 The existing ChanCounts don't matter for this call as they are only
1566 to do with matching input and output indices, and we are only changing
1572 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
1576 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1577 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1578 * @param output_start As \a input_start, but for outputs.
1581 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
1582 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
1584 if (!IO::connecting_legal) {
1588 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::NOT_LOCK);
1594 /* If both inputs and outputs are auto-connected to physical ports,
1595 use the max of input and output offsets to ensure auto-connected
1596 port numbers always match up (e.g. the first audio input and the
1597 first audio output of the route will have the same physical
1598 port number). Otherwise just use the lowest input or output
1602 DEBUG_TRACE (DEBUG::Graph,
1603 string_compose("Auto-connect: existing in = %1 out = %2\n",
1604 existing_inputs, existing_outputs));
1606 const bool in_out_physical =
1607 (Config->get_input_auto_connect() & AutoConnectPhysical)
1608 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1611 const ChanCount in_offset = in_out_physical
1612 ? ChanCount::max(existing_inputs, existing_outputs)
1615 const ChanCount out_offset = in_out_physical
1616 ? ChanCount::max(existing_inputs, existing_outputs)
1619 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1620 vector<string> physinputs;
1621 vector<string> physoutputs;
1623 _engine.get_physical_outputs (*t, physoutputs);
1624 _engine.get_physical_inputs (*t, physinputs);
1626 if (!physinputs.empty() && connect_inputs) {
1627 uint32_t nphysical_in = physinputs.size();
1629 DEBUG_TRACE (DEBUG::Graph,
1630 string_compose("There are %1 physical inputs of type %2\n",
1633 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1636 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1637 DEBUG_TRACE (DEBUG::Graph,
1638 string_compose("Get index %1 + %2 % %3 = %4\n",
1639 in_offset.get(*t), i, nphysical_in,
1640 (in_offset.get(*t) + i) % nphysical_in));
1641 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1644 DEBUG_TRACE (DEBUG::Graph,
1645 string_compose("Connect route %1 IN to %2\n",
1646 route->name(), port));
1648 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
1652 ChanCount one_added (*t, 1);
1653 existing_inputs += one_added;
1657 if (!physoutputs.empty()) {
1658 uint32_t nphysical_out = physoutputs.size();
1659 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
1662 if ((*t) == DataType::MIDI || Config->get_output_auto_connect() & AutoConnectPhysical) {
1663 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1664 } else if ((*t) == DataType::AUDIO && Config->get_output_auto_connect() & AutoConnectMaster) {
1665 /* master bus is audio only */
1666 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1667 port = _master_out->input()->ports().port(*t,
1668 i % _master_out->input()->n_ports().get(*t))->name();
1672 DEBUG_TRACE (DEBUG::Graph,
1673 string_compose("Connect route %1 OUT to %2\n",
1674 route->name(), port));
1676 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
1680 ChanCount one_added (*t, 1);
1681 existing_outputs += one_added;
1687 /** Caller must not hold process lock
1688 * @param name_template string to use for the start of the name, or "" to use "Audio".
1690 list< boost::shared_ptr<AudioTrack> >
1691 Session::new_audio_track (
1692 int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template
1695 char track_name[32];
1696 uint32_t track_id = 0;
1698 RouteList new_routes;
1699 list<boost::shared_ptr<AudioTrack> > ret;
1700 uint32_t control_id;
1702 control_id = ntracks() + nbusses() + 1;
1704 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
1707 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1708 error << "cannot find name for new audio track" << endmsg;
1712 boost::shared_ptr<AudioTrack> track;
1715 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
1717 if (track->init ()) {
1721 track->use_new_diskstream();
1723 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1724 boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1727 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1729 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1730 error << string_compose (
1731 _("cannot configure %1 in/%2 out configuration for new audio track"),
1732 input_channels, output_channels)
1737 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1738 error << string_compose (
1739 _("cannot configure %1 in/%2 out configuration for new audio track"),
1740 input_channels, output_channels)
1747 route_group->add (track);
1750 track->non_realtime_input_change();
1752 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1753 track->set_remote_control_id (control_id);
1756 new_routes.push_back (track);
1757 ret.push_back (track);
1760 catch (failed_constructor &err) {
1761 error << _("Session: could not create new audio track.") << endmsg;
1765 catch (AudioEngine::PortRegistrationFailure& pfe) {
1767 error << pfe.what() << endmsg;
1775 if (!new_routes.empty()) {
1776 add_routes (new_routes, true, true);
1783 Session::set_remote_control_ids ()
1785 RemoteModel m = Config->get_remote_model();
1786 bool emit_signal = false;
1788 boost::shared_ptr<RouteList> r = routes.reader ();
1790 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1791 if (MixerOrdered == m) {
1792 int32_t order = (*i)->order_key(N_("signal"));
1793 (*i)->set_remote_control_id (order+1, false);
1795 } else if (EditorOrdered == m) {
1796 int32_t order = (*i)->order_key(N_("editor"));
1797 (*i)->set_remote_control_id (order+1, false);
1799 } else if (UserOrdered == m) {
1800 //do nothing ... only changes to remote id's are initiated by user
1805 Route::RemoteControlIDChange();
1809 /** Caller must not hold process lock.
1810 * @param name_template string to use for the start of the name, or "" to use "Bus".
1813 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
1816 uint32_t bus_id = 0;
1819 uint32_t control_id;
1821 control_id = ntracks() + nbusses() + 1;
1823 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
1826 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
1827 error << "cannot find name for new audio bus" << endmsg;
1832 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
1838 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1839 boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
1842 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1844 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1845 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1846 input_channels, output_channels)
1852 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1853 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1854 input_channels, output_channels)
1861 route_group->add (bus);
1863 bus->set_remote_control_id (control_id);
1866 bus->add_internal_return ();
1868 ret.push_back (bus);
1872 catch (failed_constructor &err) {
1873 error << _("Session: could not create new audio route.") << endmsg;
1877 catch (AudioEngine::PortRegistrationFailure& pfe) {
1878 error << pfe.what() << endmsg;
1888 add_routes (ret, false, true);
1896 Session::new_route_from_template (uint32_t how_many, const std::string& template_path)
1900 uint32_t control_id;
1902 uint32_t number = 0;
1904 if (!tree.read (template_path.c_str())) {
1908 XMLNode* node = tree.root();
1910 control_id = ntracks() + nbusses() + 1;
1914 XMLNode node_copy (*node); // make a copy so we can change the name if we need to
1916 std::string node_name = IO::name_from_state (*node_copy.children().front());
1918 /* generate a new name by adding a number to the end of the template name */
1919 if (!find_route_name (node_name.c_str(), ++number, name, sizeof(name), true)) {
1920 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
1924 /* set IO children to use the new name */
1925 XMLNodeList const & children = node_copy.children ();
1926 for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
1927 if ((*i)->name() == IO::state_node_name) {
1928 IO::set_name_in_state (**i, name);
1932 Track::zero_diskstream_id_in_xml (node_copy);
1935 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
1938 error << _("Session: cannot create track/bus from template description") << endmsg;
1942 if (boost::dynamic_pointer_cast<Track>(route)) {
1943 /* force input/output change signals so that the new diskstream
1944 picks up the configuration of the route. During session
1945 loading this normally happens in a different way.
1948 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1950 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
1951 change.after = route->input()->n_ports();
1952 route->input()->changed (change, this);
1953 change.after = route->output()->n_ports();
1954 route->output()->changed (change, this);
1957 route->set_remote_control_id (control_id);
1960 ret.push_back (route);
1963 catch (failed_constructor &err) {
1964 error << _("Session: could not create new route from template") << endmsg;
1968 catch (AudioEngine::PortRegistrationFailure& pfe) {
1969 error << pfe.what() << endmsg;
1978 add_routes (ret, true, true);
1985 Session::add_routes (RouteList& new_routes, bool auto_connect, bool save)
1987 ChanCount existing_inputs;
1988 ChanCount existing_outputs;
1990 count_existing_track_channels (existing_inputs, existing_outputs);
1993 RCUWriter<RouteList> writer (routes);
1994 boost::shared_ptr<RouteList> r = writer.get_copy ();
1995 r->insert (r->end(), new_routes.begin(), new_routes.end());
1997 /* if there is no control out and we're not in the middle of loading,
1998 resort the graph here. if there is a control out, we will resort
1999 toward the end of this method. if we are in the middle of loading,
2000 we will resort when done.
2003 if (!_monitor_out && IO::connecting_legal) {
2004 resort_routes_using (r);
2008 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2010 boost::weak_ptr<Route> wpr (*x);
2011 boost::shared_ptr<Route> r (*x);
2013 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2014 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2015 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2016 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2017 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2018 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2019 r->order_key_changed.connect_same_thread (*this, boost::bind (&Session::route_order_key_changed, this));
2021 if (r->is_master()) {
2025 if (r->is_monitor()) {
2029 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2031 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2032 track_playlist_changed (boost::weak_ptr<Track> (tr));
2033 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2035 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2037 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2038 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2043 auto_connect_route (r, existing_inputs, existing_outputs, true);
2047 if (_monitor_out && IO::connecting_legal) {
2049 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2050 if ((*x)->is_monitor()) {
2052 } else if ((*x)->is_master()) {
2055 (*x)->listen_via_monitor ();
2065 save_state (_current_snapshot_name);
2068 RouteAdded (new_routes); /* EMIT SIGNAL */
2069 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
2073 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2075 boost::shared_ptr<RouteList> r = routes.reader ();
2076 boost::shared_ptr<Send> s;
2078 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2079 if ((s = (*i)->internal_send_for (dest)) != 0) {
2080 s->amp()->gain_control()->set_value (0.0);
2086 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2088 boost::shared_ptr<RouteList> r = routes.reader ();
2089 boost::shared_ptr<Send> s;
2091 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2092 if ((s = (*i)->internal_send_for (dest)) != 0) {
2093 s->amp()->gain_control()->set_value (1.0);
2099 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2101 boost::shared_ptr<RouteList> r = routes.reader ();
2102 boost::shared_ptr<Send> s;
2104 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2105 if ((s = (*i)->internal_send_for (dest)) != 0) {
2106 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2111 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2113 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2115 boost::shared_ptr<RouteList> r = routes.reader ();
2116 boost::shared_ptr<RouteList> t (new RouteList);
2118 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2119 /* no MIDI sends because there are no MIDI busses yet */
2120 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2125 add_internal_sends (dest, p, t);
2129 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2131 if (dest->is_monitor() || dest->is_master()) {
2135 if (!dest->internal_return()) {
2136 dest->add_internal_return();
2139 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2141 if ((*i)->is_monitor() || (*i)->is_master() || (*i) == dest) {
2145 (*i)->listen_via (dest, p);
2152 Session::remove_route (boost::shared_ptr<Route> route)
2154 if (((route == _master_out) || (route == _monitor_out)) && !Config->get_allow_special_bus_removal()) {
2158 route->set_solo (false, this);
2161 RCUWriter<RouteList> writer (routes);
2162 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2166 /* deleting the master out seems like a dumb
2167 idea, but its more of a UI policy issue
2171 if (route == _master_out) {
2172 _master_out = boost::shared_ptr<Route> ();
2175 if (route == _monitor_out) {
2177 /* cancel control outs for all routes */
2179 for (RouteList::iterator r = rs->begin(); r != rs->end(); ++r) {
2180 (*r)->drop_listen (_monitor_out);
2183 _monitor_out.reset ();
2186 /* writer goes out of scope, forces route list update */
2189 update_route_solo_state ();
2191 // We need to disconnect the route's inputs and outputs
2193 route->input()->disconnect (0);
2194 route->output()->disconnect (0);
2196 /* if the route had internal sends sending to it, remove them */
2197 if (route->internal_return()) {
2199 boost::shared_ptr<RouteList> r = routes.reader ();
2200 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2201 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2203 (*i)->remove_processor (s);
2208 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2209 if (mt && mt->step_editing()) {
2210 if (_step_editors > 0) {
2215 update_latency_compensation ();
2218 /* Re-sort routes to remove the graph's current references to the one that is
2219 * going away, then flush old references out of the graph.
2223 route_graph->clear_other_chain ();
2225 /* get rid of it from the dead wood collection in the route list manager */
2227 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2231 /* try to cause everyone to drop their references */
2233 route->drop_references ();
2235 sync_order_keys (N_("session"));
2237 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2239 /* save the new state of the world */
2241 if (save_state (_current_snapshot_name)) {
2242 save_history (_current_snapshot_name);
2247 Session::route_mute_changed (void* /*src*/)
2253 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2255 boost::shared_ptr<Route> route = wpr.lock();
2257 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2261 if (route->listening_via_monitor ()) {
2263 if (Config->get_exclusive_solo()) {
2264 /* new listen: disable all other listen */
2265 boost::shared_ptr<RouteList> r = routes.reader ();
2266 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2267 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2270 (*i)->set_listen (false, this);
2276 } else if (_listen_cnt > 0) {
2281 update_route_solo_state ();
2284 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2286 boost::shared_ptr<Route> route = wpr.lock ();
2289 /* should not happen */
2290 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2294 bool send_changed = false;
2296 if (route->solo_isolated()) {
2297 if (_solo_isolated_cnt == 0) {
2298 send_changed = true;
2300 _solo_isolated_cnt++;
2301 } else if (_solo_isolated_cnt > 0) {
2302 _solo_isolated_cnt--;
2303 if (_solo_isolated_cnt == 0) {
2304 send_changed = true;
2309 IsolatedChanged (); /* EMIT SIGNAL */
2314 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2316 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
2318 if (!self_solo_change) {
2319 // session doesn't care about changes to soloed-by-others
2323 if (solo_update_disabled) {
2325 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
2329 boost::shared_ptr<Route> route = wpr.lock ();
2332 boost::shared_ptr<RouteList> r = routes.reader ();
2335 if (route->self_soloed()) {
2341 RouteGroup* rg = route->route_group ();
2342 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
2344 if (delta == 1 && Config->get_exclusive_solo()) {
2346 /* new solo: disable all other solos, but not the group if its solo-enabled */
2348 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2349 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2350 (leave_group_alone && ((*i)->route_group() == rg))) {
2353 (*i)->set_solo (false, this);
2357 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
2359 solo_update_disabled = true;
2361 RouteList uninvolved;
2363 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
2365 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2366 bool via_sends_only;
2367 bool in_signal_flow;
2369 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2370 (leave_group_alone && ((*i)->route_group() == rg))) {
2374 in_signal_flow = false;
2376 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
2378 if ((*i)->feeds (route, &via_sends_only)) {
2379 if (!via_sends_only) {
2380 if (!route->soloed_by_others_upstream()) {
2381 (*i)->mod_solo_by_others_downstream (delta);
2384 in_signal_flow = true;
2386 DEBUG_TRACE (DEBUG::Solo, "\tno feed from\n");
2389 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
2391 if (route->feeds (*i, &via_sends_only)) {
2392 /* propagate solo upstream only if routing other than
2393 sends is involved, but do consider the other route
2394 (*i) to be part of the signal flow even if only
2397 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
2401 route->soloed_by_others_downstream(),
2402 route->soloed_by_others_upstream()));
2403 if (!via_sends_only) {
2404 if (!route->soloed_by_others_downstream()) {
2405 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
2406 (*i)->mod_solo_by_others_upstream (delta);
2409 in_signal_flow = true;
2411 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
2414 if (!in_signal_flow) {
2415 uninvolved.push_back (*i);
2419 solo_update_disabled = false;
2420 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
2422 update_route_solo_state (r);
2424 /* now notify that the mute state of the routes not involved in the signal
2425 pathway of the just-solo-changed route may have altered.
2428 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2429 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1\n", (*i)->name()));
2430 (*i)->mute_changed (this);
2433 SoloChanged (); /* EMIT SIGNAL */
2438 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2440 /* now figure out if anything that matters is soloed (or is "listening")*/
2442 bool something_soloed = false;
2443 uint32_t listeners = 0;
2444 uint32_t isolated = 0;
2447 r = routes.reader();
2450 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2451 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2452 something_soloed = true;
2455 if (!(*i)->is_hidden() && (*i)->listening_via_monitor()) {
2456 if (Config->get_solo_control_is_listen_control()) {
2459 (*i)->set_listen (false, this);
2463 if ((*i)->solo_isolated()) {
2468 if (something_soloed != _non_soloed_outs_muted) {
2469 _non_soloed_outs_muted = something_soloed;
2470 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2473 _listen_cnt = listeners;
2475 if (isolated != _solo_isolated_cnt) {
2476 _solo_isolated_cnt = isolated;
2477 IsolatedChanged (); /* EMIT SIGNAL */
2481 boost::shared_ptr<RouteList>
2482 Session::get_routes_with_internal_returns() const
2484 boost::shared_ptr<RouteList> r = routes.reader ();
2485 boost::shared_ptr<RouteList> rl (new RouteList);
2487 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2488 if ((*i)->internal_return ()) {
2496 Session::io_name_is_legal (const std::string& name)
2498 boost::shared_ptr<RouteList> r = routes.reader ();
2500 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2501 if ((*i)->name() == name) {
2505 if ((*i)->has_io_processor_named (name)) {
2514 Session::set_exclusive_input_active (boost::shared_ptr<Route> rt, bool others_on)
2517 vector<string> connections;
2519 PortSet& ps (rt->input()->ports());
2521 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
2522 p->get_connections (connections);
2525 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
2526 routes_using_input_from (*s, rl);
2529 /* scan all relevant routes to see if others are on or off */
2531 bool others_are_already_on = false;
2533 for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
2535 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2537 if (mt->input_active()) {
2538 others_are_already_on = true;
2545 /* globally reverse other routes */
2547 for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
2549 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2551 mt->set_input_active (!others_are_already_on);
2558 Session::routes_using_input_from (const string& str, RouteList& rl)
2560 boost::shared_ptr<RouteList> r = routes.reader ();
2562 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2563 if ((*i)->input()->connected_to (str)) {
2569 boost::shared_ptr<Route>
2570 Session::route_by_name (string name)
2572 boost::shared_ptr<RouteList> r = routes.reader ();
2574 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2575 if ((*i)->name() == name) {
2580 return boost::shared_ptr<Route> ((Route*) 0);
2583 boost::shared_ptr<Route>
2584 Session::route_by_id (PBD::ID id)
2586 boost::shared_ptr<RouteList> r = routes.reader ();
2588 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2589 if ((*i)->id() == id) {
2594 return boost::shared_ptr<Route> ((Route*) 0);
2597 boost::shared_ptr<Route>
2598 Session::route_by_remote_id (uint32_t id)
2600 boost::shared_ptr<RouteList> r = routes.reader ();
2602 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2603 if ((*i)->remote_control_id() == id) {
2608 return boost::shared_ptr<Route> ((Route*) 0);
2612 Session::playlist_region_added (boost::weak_ptr<Region> w)
2614 boost::shared_ptr<Region> r = w.lock ();
2619 /* These are the operations that are currently in progress... */
2620 list<GQuark> curr = _current_trans_quarks;
2623 /* ...and these are the operations during which we want to update
2624 the session range location markers.
2627 ops.push_back (Operations::capture);
2628 ops.push_back (Operations::paste);
2629 ops.push_back (Operations::duplicate_region);
2630 ops.push_back (Operations::insert_file);
2631 ops.push_back (Operations::insert_region);
2632 ops.push_back (Operations::drag_region_brush);
2633 ops.push_back (Operations::region_drag);
2634 ops.push_back (Operations::selection_grab);
2635 ops.push_back (Operations::region_fill);
2636 ops.push_back (Operations::fill_selection);
2637 ops.push_back (Operations::create_region);
2638 ops.push_back (Operations::region_copy);
2639 ops.push_back (Operations::fixed_time_region_copy);
2642 /* See if any of the current operations match the ones that we want */
2644 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
2646 /* If so, update the session range markers */
2648 maybe_update_session_range (r->position (), r->last_frame ());
2652 /** Update the session range markers if a is before the current start or
2653 * b is after the current end.
2656 Session::maybe_update_session_range (framepos_t a, framepos_t b)
2658 if (_state_of_the_state & Loading) {
2662 if (_session_range_location == 0) {
2664 add_session_range_location (a, b);
2668 if (a < _session_range_location->start()) {
2669 _session_range_location->set_start (a);
2672 if (b > _session_range_location->end()) {
2673 _session_range_location->set_end (b);
2679 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
2681 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2682 maybe_update_session_range (i->to, i->to + i->length);
2687 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
2689 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2690 maybe_update_session_range (i->from, i->to);
2694 /* Region management */
2696 boost::shared_ptr<Region>
2697 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2699 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2700 RegionFactory::RegionMap::const_iterator i;
2701 boost::shared_ptr<Region> region;
2703 Glib::Mutex::Lock lm (region_lock);
2705 for (i = regions.begin(); i != regions.end(); ++i) {
2709 if (region->whole_file()) {
2711 if (child->source_equivalent (region)) {
2717 return boost::shared_ptr<Region> ();
2721 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2723 set<boost::shared_ptr<Region> > relevant_regions;
2725 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2726 RegionFactory::get_regions_using_source (*s, relevant_regions);
2729 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2730 set<boost::shared_ptr<Region> >::iterator tmp;
2735 playlists->destroy_region (*r);
2736 RegionFactory::map_remove (*r);
2738 (*r)->drop_sources ();
2739 (*r)->drop_references ();
2741 relevant_regions.erase (r);
2746 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
2749 Glib::Mutex::Lock ls (source_lock);
2750 /* remove from the main source list */
2751 sources.erase ((*s)->id());
2754 (*s)->mark_for_remove ();
2755 (*s)->drop_references ();
2764 Session::remove_last_capture ()
2766 list<boost::shared_ptr<Source> > srcs;
2768 boost::shared_ptr<RouteList> rl = routes.reader ();
2769 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2770 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2775 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
2778 srcs.insert (srcs.end(), l.begin(), l.end());
2783 destroy_sources (srcs);
2785 save_state (_current_snapshot_name);
2790 /* Source Management */
2793 Session::add_source (boost::shared_ptr<Source> source)
2795 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
2796 pair<SourceMap::iterator,bool> result;
2798 entry.first = source->id();
2799 entry.second = source;
2802 Glib::Mutex::Lock lm (source_lock);
2803 result = sources.insert (entry);
2806 if (result.second) {
2808 /* yay, new source */
2812 boost::shared_ptr<AudioFileSource> afs;
2814 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
2815 if (Config->get_auto_analyse_audio()) {
2816 Analyser::queue_source_for_analysis (source, false);
2820 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
2825 Session::remove_source (boost::weak_ptr<Source> src)
2827 if (_state_of_the_state & Deletion) {
2831 SourceMap::iterator i;
2832 boost::shared_ptr<Source> source = src.lock();
2839 Glib::Mutex::Lock lm (source_lock);
2841 if ((i = sources.find (source->id())) != sources.end()) {
2846 if (!_state_of_the_state & InCleanup) {
2848 /* save state so we don't end up with a session file
2849 referring to non-existent sources.
2852 save_state (_current_snapshot_name);
2856 boost::shared_ptr<Source>
2857 Session::source_by_id (const PBD::ID& id)
2859 Glib::Mutex::Lock lm (source_lock);
2860 SourceMap::iterator i;
2861 boost::shared_ptr<Source> source;
2863 if ((i = sources.find (id)) != sources.end()) {
2870 boost::shared_ptr<Source>
2871 Session::source_by_path_and_channel (const string& path, uint16_t chn)
2873 Glib::Mutex::Lock lm (source_lock);
2875 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2876 boost::shared_ptr<AudioFileSource> afs
2877 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
2879 if (afs && afs->path() == path && chn == afs->channel()) {
2883 return boost::shared_ptr<Source>();
2887 Session::count_sources_by_origin (const string& path)
2890 Glib::Mutex::Lock lm (source_lock);
2892 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2893 boost::shared_ptr<FileSource> fs
2894 = boost::dynamic_pointer_cast<FileSource>(i->second);
2896 if (fs && fs->origin() == path) {
2906 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
2909 string old_basename = PBD::basename_nosuffix (oldname);
2910 string new_legalized = legalize_for_path (newname);
2912 /* note: we know (or assume) the old path is already valid */
2916 /* destructive file sources have a name of the form:
2918 /path/to/Tnnnn-NAME(%[LR])?.wav
2920 the task here is to replace NAME with the new name.
2925 string::size_type dash;
2927 dir = Glib::path_get_dirname (path);
2928 path = Glib::path_get_basename (path);
2930 /* '-' is not a legal character for the NAME part of the path */
2932 if ((dash = path.find_last_of ('-')) == string::npos) {
2936 prefix = path.substr (0, dash);
2940 path += new_legalized;
2941 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
2942 path = Glib::build_filename (dir, path);
2946 /* non-destructive file sources have a name of the form:
2948 /path/to/NAME-nnnnn(%[LR])?.ext
2950 the task here is to replace NAME with the new name.
2955 string::size_type dash;
2956 string::size_type postfix;
2958 dir = Glib::path_get_dirname (path);
2959 path = Glib::path_get_basename (path);
2961 /* '-' is not a legal character for the NAME part of the path */
2963 if ((dash = path.find_last_of ('-')) == string::npos) {
2967 suffix = path.substr (dash+1);
2969 // Suffix is now everything after the dash. Now we need to eliminate
2970 // the nnnnn part, which is done by either finding a '%' or a '.'
2972 postfix = suffix.find_last_of ("%");
2973 if (postfix == string::npos) {
2974 postfix = suffix.find_last_of ('.');
2977 if (postfix != string::npos) {
2978 suffix = suffix.substr (postfix);
2980 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
2984 const uint32_t limit = 10000;
2985 char buf[PATH_MAX+1];
2987 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
2989 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
2991 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
2992 path = Glib::build_filename (dir, buf);
3000 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
3009 /** Return the full path (in some session directory) for a new within-session source.
3010 * \a name must be a session-unique name that does not contain slashes
3011 * (e.g. as returned by new_*_source_name)
3014 Session::new_source_path_from_name (DataType type, const string& name)
3016 assert(name.find("/") == string::npos);
3018 SessionDirectory sdir(get_best_session_directory_for_new_source());
3021 if (type == DataType::AUDIO) {
3022 p = sdir.sound_path();
3023 } else if (type == DataType::MIDI) {
3024 p = sdir.midi_path();
3026 error << "Unknown source type, unable to create file path" << endmsg;
3031 return p.to_string();
3035 Session::peak_path (string base) const
3037 sys::path peakfile_path(_session_dir->peak_path());
3038 peakfile_path /= base + peakfile_suffix;
3039 return peakfile_path.to_string();
3042 /** Return a unique name based on \a base for a new internal audio source */
3044 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
3047 char buf[PATH_MAX+1];
3048 const uint32_t limit = 10000;
3050 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3053 legalized = legalize_for_path (base);
3055 // Find a "version" of the base name that doesn't exist in any of the possible directories.
3056 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3058 vector<space_and_path>::iterator i;
3059 uint32_t existing = 0;
3061 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3066 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3067 cnt, legalized.c_str(), ext.c_str());
3068 } else if (nchan == 2) {
3070 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
3071 cnt, legalized.c_str(), ext.c_str());
3073 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
3074 cnt, legalized.c_str(), ext.c_str());
3076 } else if (nchan < 26) {
3077 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
3078 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
3080 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3081 cnt, legalized.c_str(), ext.c_str());
3087 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3088 } else if (nchan == 2) {
3090 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
3092 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
3094 } else if (nchan < 26) {
3095 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
3097 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3101 SessionDirectory sdir((*i).path);
3103 string spath = sdir.sound_path().to_string();
3105 /* note that we search *without* the extension so that
3106 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3107 in the event that this new name is required for
3108 a file format change.
3111 if (matching_unsuffixed_filename_exists_in (spath, buf)) {
3117 if (existing == 0) {
3122 error << string_compose(
3123 _("There are already %1 recordings for %2, which I consider too many."),
3124 limit, base) << endmsg;
3126 throw failed_constructor();
3130 return Glib::path_get_basename (buf);
3133 /** Create a new within-session audio source */
3134 boost::shared_ptr<AudioFileSource>
3135 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
3137 const string name = new_audio_source_name (n, n_chans, chan, destructive);
3138 const string path = new_source_path_from_name(DataType::AUDIO, name);
3140 return boost::dynamic_pointer_cast<AudioFileSource> (
3141 SourceFactory::createWritable (DataType::AUDIO, *this, path, string(), destructive, frame_rate()));
3144 /** Return a unique name based on \a base for a new internal MIDI source */
3146 Session::new_midi_source_name (const string& base)
3149 char buf[PATH_MAX+1];
3150 const uint32_t limit = 10000;
3154 legalized = legalize_for_path (base);
3156 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3157 for (cnt = 1; cnt <= limit; ++cnt) {
3159 vector<space_and_path>::iterator i;
3160 uint32_t existing = 0;
3162 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3164 SessionDirectory sdir((*i).path);
3166 sys::path p = sdir.midi_path();
3169 snprintf (buf, sizeof(buf), "%s-%u.mid", p.to_string().c_str(), cnt);
3171 if (sys::exists (buf)) {
3176 if (existing == 0) {
3181 error << string_compose(
3182 _("There are already %1 recordings for %2, which I consider too many."),
3183 limit, base) << endmsg;
3185 throw failed_constructor();
3189 return Glib::path_get_basename(buf);
3193 /** Create a new within-session MIDI source */
3194 boost::shared_ptr<MidiSource>
3195 Session::create_midi_source_for_session (Track* track, string const & n)
3197 /* try to use the existing write source for the track, to keep numbering sane
3201 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3205 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3208 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3209 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3213 const string name = new_midi_source_name (n);
3214 const string path = new_source_path_from_name (DataType::MIDI, name);
3216 return boost::dynamic_pointer_cast<SMFSource> (
3217 SourceFactory::createWritable (
3218 DataType::MIDI, *this, path, string(), false, frame_rate()));
3223 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3225 if (playlist->hidden()) {
3229 playlists->add (playlist);
3232 playlist->release();
3239 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3241 if (_state_of_the_state & Deletion) {
3245 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3251 playlists->remove (playlist);
3257 Session::set_audition (boost::shared_ptr<Region> r)
3259 pending_audition_region = r;
3260 add_post_transport_work (PostTransportAudition);
3261 _butler->schedule_transport_work ();
3265 Session::audition_playlist ()
3267 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3268 ev->region.reset ();
3273 Session::non_realtime_set_audition ()
3275 if (!pending_audition_region) {
3276 auditioner->audition_current_playlist ();
3278 auditioner->audition_region (pending_audition_region);
3279 pending_audition_region.reset ();
3281 AuditionActive (true); /* EMIT SIGNAL */
3285 Session::audition_region (boost::shared_ptr<Region> r)
3287 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3293 Session::cancel_audition ()
3295 if (auditioner->auditioning()) {
3296 auditioner->cancel_audition ();
3297 AuditionActive (false); /* EMIT SIGNAL */
3302 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3304 if (a->is_monitor()) {
3307 if (b->is_monitor()) {
3310 return a->order_key(N_("signal")) < b->order_key(N_("signal"));
3314 Session::is_auditioning () const
3316 /* can be called before we have an auditioner object */
3318 return auditioner->auditioning();
3325 Session::graph_reordered ()
3327 /* don't do this stuff if we are setting up connections
3328 from a set_state() call or creating new tracks. Ditto for deletion.
3331 if (_state_of_the_state & (InitialConnecting|Deletion)) {
3335 /* every track/bus asked for this to be handled but it was deferred because
3336 we were connecting. do it now.
3339 request_input_change_handling ();
3343 /* force all diskstreams to update their capture offset values to
3344 reflect any changes in latencies within the graph.
3347 boost::shared_ptr<RouteList> rl = routes.reader ();
3348 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3349 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3351 tr->set_capture_offset ();
3357 Session::available_capture_duration ()
3359 float sample_bytes_on_disk = 4.0; // keep gcc happy
3361 switch (config.get_native_file_data_format()) {
3363 sample_bytes_on_disk = 4.0;
3367 sample_bytes_on_disk = 3.0;
3371 sample_bytes_on_disk = 2.0;
3375 /* impossible, but keep some gcc versions happy */
3376 fatal << string_compose (_("programming error: %1"),
3377 X_("illegal native file data format"))
3382 double scale = 4096.0 / sample_bytes_on_disk;
3384 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3385 return max_framecnt;
3388 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3392 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3395 RCUWriter<BundleList> writer (_bundles);
3396 boost::shared_ptr<BundleList> b = writer.get_copy ();
3397 b->push_back (bundle);
3400 BundleAdded (bundle); /* EMIT SIGNAL */
3406 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3408 bool removed = false;
3411 RCUWriter<BundleList> writer (_bundles);
3412 boost::shared_ptr<BundleList> b = writer.get_copy ();
3413 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3415 if (i != b->end()) {
3422 BundleRemoved (bundle); /* EMIT SIGNAL */
3428 boost::shared_ptr<Bundle>
3429 Session::bundle_by_name (string name) const
3431 boost::shared_ptr<BundleList> b = _bundles.reader ();
3433 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3434 if ((*i)->name() == name) {
3439 return boost::shared_ptr<Bundle> ();
3443 Session::tempo_map_changed (const PropertyChange&)
3447 playlists->update_after_tempo_map_change ();
3449 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3455 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3457 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3458 (*i)->recompute_frames_from_bbt ();
3462 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3463 * the given count with the current block size.
3466 Session::ensure_buffers (ChanCount howmany)
3468 BufferManager::ensure_buffers (howmany);
3472 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3474 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3475 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3480 Session::next_insert_id ()
3482 /* this doesn't really loop forever. just think about it */
3485 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3486 if (!insert_bitset[n]) {
3487 insert_bitset[n] = true;
3493 /* none available, so resize and try again */
3495 insert_bitset.resize (insert_bitset.size() + 16, false);
3500 Session::next_send_id ()
3502 /* this doesn't really loop forever. just think about it */
3505 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3506 if (!send_bitset[n]) {
3507 send_bitset[n] = true;
3513 /* none available, so resize and try again */
3515 send_bitset.resize (send_bitset.size() + 16, false);
3520 Session::next_return_id ()
3522 /* this doesn't really loop forever. just think about it */
3525 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3526 if (!return_bitset[n]) {
3527 return_bitset[n] = true;
3533 /* none available, so resize and try again */
3535 return_bitset.resize (return_bitset.size() + 16, false);
3540 Session::mark_send_id (uint32_t id)
3542 if (id >= send_bitset.size()) {
3543 send_bitset.resize (id+16, false);
3545 if (send_bitset[id]) {
3546 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3548 send_bitset[id] = true;
3552 Session::mark_return_id (uint32_t id)
3554 if (id >= return_bitset.size()) {
3555 return_bitset.resize (id+16, false);
3557 if (return_bitset[id]) {
3558 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3560 return_bitset[id] = true;
3564 Session::mark_insert_id (uint32_t id)
3566 if (id >= insert_bitset.size()) {
3567 insert_bitset.resize (id+16, false);
3569 if (insert_bitset[id]) {
3570 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3572 insert_bitset[id] = true;
3576 Session::unmark_send_id (uint32_t id)
3578 if (id < send_bitset.size()) {
3579 send_bitset[id] = false;
3584 Session::unmark_return_id (uint32_t id)
3586 if (id < return_bitset.size()) {
3587 return_bitset[id] = false;
3592 Session::unmark_insert_id (uint32_t id)
3594 if (id < insert_bitset.size()) {
3595 insert_bitset[id] = false;
3600 /* Named Selection management */
3602 boost::shared_ptr<NamedSelection>
3603 Session::named_selection_by_name (string name)
3605 Glib::Mutex::Lock lm (named_selection_lock);
3606 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
3607 if ((*i)->name == name) {
3611 return boost::shared_ptr<NamedSelection>();
3615 Session::add_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3618 Glib::Mutex::Lock lm (named_selection_lock);
3619 named_selections.insert (named_selections.begin(), named_selection);
3624 NamedSelectionAdded (); /* EMIT SIGNAL */
3628 Session::remove_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3630 bool removed = false;
3633 Glib::Mutex::Lock lm (named_selection_lock);
3635 NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
3637 if (i != named_selections.end()) {
3638 named_selections.erase (i);
3645 NamedSelectionRemoved (); /* EMIT SIGNAL */
3650 Session::reset_native_file_format ()
3652 boost::shared_ptr<RouteList> rl = routes.reader ();
3653 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3654 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3656 /* don't save state as we do this, there's no point
3659 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3660 tr->reset_write_sources (false);
3661 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3667 Session::route_name_unique (string n) const
3669 boost::shared_ptr<RouteList> r = routes.reader ();
3671 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3672 if ((*i)->name() == n) {
3681 Session::route_name_internal (string n) const
3683 if (auditioner && auditioner->name() == n) {
3687 if (_click_io && _click_io->name() == n) {
3695 Session::freeze_all (InterThreadInfo& itt)
3697 boost::shared_ptr<RouteList> r = routes.reader ();
3699 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3701 boost::shared_ptr<Track> t;
3703 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3704 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3714 boost::shared_ptr<Region>
3715 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
3716 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3717 InterThreadInfo& itt, bool enable_processing)
3719 boost::shared_ptr<Region> result;
3720 boost::shared_ptr<Playlist> playlist;
3721 boost::shared_ptr<AudioFileSource> fsource;
3723 char buf[PATH_MAX+1];
3724 ChanCount diskstream_channels (track.n_channels());
3725 framepos_t position;
3726 framecnt_t this_chunk;
3729 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3730 const string sound_dir = sdir.sound_path().to_string();
3731 framepos_t len = end - start;
3732 bool need_block_size_reset = false;
3734 ChanCount const max_proc = track.max_processor_streams ();
3737 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3738 end, start) << endmsg;
3742 const framecnt_t chunk_size = (256 * 1024)/4;
3744 // block all process callback handling
3746 block_processing ();
3748 /* call tree *MUST* hold route_lock */
3750 if ((playlist = track.playlist()) == 0) {
3754 /* external redirects will be a problem */
3756 if (track.has_external_redirects()) {
3760 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3762 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
3764 for (x = 0; x < 99999; ++x) {
3765 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());
3766 if (!Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
3772 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3777 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
3778 SourceFactory::createWritable (DataType::AUDIO, *this, buf, string(), false, frame_rate()));
3781 catch (failed_constructor& err) {
3782 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
3786 srcs.push_back (fsource);
3789 /* tell redirects that care that we are about to use a much larger blocksize */
3791 need_block_size_reset = true;
3792 track.set_block_size (chunk_size);
3794 /* XXX need to flush all redirects */
3799 /* create a set of reasonably-sized buffers */
3800 buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
3801 buffers.set_count (max_proc);
3803 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3804 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3806 afs->prepare_for_peakfile_writes ();
3809 while (to_do && !itt.cancel) {
3811 this_chunk = min (to_do, chunk_size);
3813 if (track.export_stuff (buffers, start, this_chunk, enable_processing)) {
3818 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
3819 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3822 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
3828 start += this_chunk;
3829 to_do -= this_chunk;
3831 itt.progress = (float) (1.0 - ((double) to_do / len));
3840 xnow = localtime (&now);
3842 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3843 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3846 afs->update_header (position, *xnow, now);
3847 afs->flush_header ();
3851 /* construct a region to represent the bounced material */
3855 plist.add (Properties::start, 0);
3856 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
3857 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
3859 result = RegionFactory::create (srcs, plist);
3865 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3866 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3869 afs->mark_for_remove ();
3872 (*src)->drop_references ();
3876 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3877 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3880 afs->done_with_peakfile_writes ();
3885 if (need_block_size_reset) {
3886 track.set_block_size (get_block_size());
3889 unblock_processing ();
3895 Session::gain_automation_buffer() const
3897 return ProcessThread::gain_automation_buffer ();
3901 Session::pan_automation_buffer() const
3903 return ProcessThread::pan_automation_buffer ();
3907 Session::get_silent_buffers (ChanCount count)
3909 return ProcessThread::get_silent_buffers (count);
3913 Session::get_scratch_buffers (ChanCount count)
3915 return ProcessThread::get_scratch_buffers (count);
3919 Session::get_mix_buffers (ChanCount count)
3921 return ProcessThread::get_mix_buffers (count);
3925 Session::ntracks () const
3928 boost::shared_ptr<RouteList> r = routes.reader ();
3930 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3931 if (boost::dynamic_pointer_cast<Track> (*i)) {
3940 Session::nbusses () const
3943 boost::shared_ptr<RouteList> r = routes.reader ();
3945 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3946 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
3955 Session::add_automation_list(AutomationList *al)
3957 automation_lists[al->id()] = al;
3961 Session::sync_order_keys (std::string const & base)
3963 if (deletion_in_progress()) {
3967 if (!Config->get_sync_all_route_ordering()) {
3968 /* leave order keys as they are */
3972 boost::shared_ptr<RouteList> r = routes.reader ();
3974 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3975 (*i)->sync_order_keys (base);
3978 Route::SyncOrderKeys (base); // EMIT SIGNAL
3980 /* this might not do anything */
3982 set_remote_control_ids ();
3985 /** @return true if there is at least one record-enabled track, otherwise false */
3987 Session::have_rec_enabled_track () const
3989 return g_atomic_int_get (&_have_rec_enabled_track) == 1;
3992 /** Update the state of our rec-enabled tracks flag */
3994 Session::update_have_rec_enabled_track ()
3996 boost::shared_ptr<RouteList> rl = routes.reader ();
3997 RouteList::iterator i = rl->begin();
3998 while (i != rl->end ()) {
4000 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4001 if (tr && tr->record_enabled ()) {
4008 int const old = g_atomic_int_get (&_have_rec_enabled_track);
4010 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4012 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4013 RecordStateChanged (); /* EMIT SIGNAL */
4018 Session::listen_position_changed ()
4020 boost::shared_ptr<RouteList> r = routes.reader ();
4022 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4023 (*i)->listen_position_changed ();
4028 Session::solo_control_mode_changed ()
4030 /* cancel all solo or all listen when solo control mode changes */
4033 set_solo (get_routes(), false);
4034 } else if (listening()) {
4035 set_listen (get_routes(), false);
4039 /** Called when a property of one of our route groups changes */
4041 Session::route_group_property_changed (RouteGroup* rg)
4043 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4046 /** Called when a route is added to one of our route groups */
4048 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4050 RouteAddedToRouteGroup (rg, r);
4053 /** Called when a route is removed from one of our route groups */
4055 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4057 RouteRemovedFromRouteGroup (rg, r);
4061 Session::get_available_sync_options () const
4063 vector<SyncSource> ret;
4065 ret.push_back (JACK);
4066 ret.push_back (MTC);
4067 ret.push_back (MIDIClock);
4072 boost::shared_ptr<RouteList>
4073 Session::get_routes_with_regions_at (framepos_t const p) const
4075 boost::shared_ptr<RouteList> r = routes.reader ();
4076 boost::shared_ptr<RouteList> rl (new RouteList);
4078 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4079 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4084 boost::shared_ptr<Playlist> pl = tr->playlist ();
4089 if (pl->has_region_at (p)) {
4098 Session::goto_end ()
4100 if (_session_range_location) {
4101 request_locate (_session_range_location->end(), false);
4103 request_locate (0, false);
4108 Session::goto_start ()
4110 if (_session_range_location) {
4111 request_locate (_session_range_location->start(), false);
4113 request_locate (0, false);
4118 Session::current_start_frame () const
4120 return _session_range_location ? _session_range_location->start() : 0;
4124 Session::current_end_frame () const
4126 return _session_range_location ? _session_range_location->end() : 0;
4130 Session::add_session_range_location (framepos_t start, framepos_t end)
4132 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4133 _locations->add (_session_range_location);
4136 /** Called when one of our routes' order keys has changed */
4138 Session::route_order_key_changed ()
4140 RouteOrderKeyChanged (); /* EMIT SIGNAL */
4144 Session::step_edit_status_change (bool yn)
4150 send = (_step_editors == 0);
4155 send = (_step_editors == 1);
4158 if (_step_editors > 0) {
4164 StepEditStatusChange (val);
4170 Session::start_time_changed (framepos_t old)
4172 /* Update the auto loop range to match the session range
4173 (unless the auto loop range has been changed by the user)
4176 Location* s = _locations->session_range_location ();
4181 Location* l = _locations->auto_loop_location ();
4183 if (l->start() == old) {
4184 l->set_start (s->start(), true);
4189 Session::end_time_changed (framepos_t old)
4191 /* Update the auto loop range to match the session range
4192 (unless the auto loop range has been changed by the user)
4195 Location* s = _locations->session_range_location ();
4200 Location* l = _locations->auto_loop_location ();
4202 if (l->end() == old) {
4203 l->set_end (s->end(), true);
4208 Session::source_search_path (DataType type) const
4212 if (session_dirs.size() == 1) {
4214 case DataType::AUDIO:
4215 search_path = _session_dir->sound_path().to_string();
4217 case DataType::MIDI:
4218 search_path = _session_dir->midi_path().to_string();
4222 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4223 SessionDirectory sdir (i->path);
4224 if (!search_path.empty()) {
4228 case DataType::AUDIO:
4229 search_path += sdir.sound_path().to_string();
4231 case DataType::MIDI:
4232 search_path += sdir.midi_path().to_string();
4238 /* now add user-specified locations
4241 vector<string> dirs;
4244 case DataType::AUDIO:
4245 split (config.get_audio_search_path (), dirs, ':');
4247 case DataType::MIDI:
4248 split (config.get_midi_search_path (), dirs, ':');
4252 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4262 Session::ensure_search_path_includes (const string& path, DataType type)
4265 vector<string> dirs;
4272 case DataType::AUDIO:
4273 search_path = config.get_audio_search_path ();
4275 case DataType::MIDI:
4276 search_path = config.get_midi_search_path ();
4280 split (search_path, dirs, ':');
4282 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4288 if (!search_path.empty()) {
4292 search_path += path;
4295 case DataType::AUDIO:
4296 config.set_audio_search_path (search_path);
4298 case DataType::MIDI:
4299 config.set_midi_search_path (search_path);
4304 boost::shared_ptr<Speakers>
4305 Session::get_speakers()
4311 Session::unknown_processors () const
4315 boost::shared_ptr<RouteList> r = routes.reader ();
4316 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4317 list<string> t = (*i)->unknown_processors ();
4318 copy (t.begin(), t.end(), back_inserter (p));
4328 Session::update_latency (bool playback)
4330 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
4332 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4336 boost::shared_ptr<RouteList> r = routes.reader ();
4337 framecnt_t max_latency = 0;
4340 /* reverse the list so that we work backwards from the last route to run to the first */
4341 RouteList* rl = routes.reader().get();
4342 r.reset (new RouteList (*rl));
4343 reverse (r->begin(), r->end());
4346 /* compute actual latency values for the given direction and store them all in per-port
4347 structures. this will also publish the same values (to JACK) so that computation of latency
4348 for routes can consistently use public latency values.
4351 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4352 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
4355 /* because we latency compensate playback, our published playback latencies should
4356 be the same for all output ports - all material played back by ardour has
4357 the same latency, whether its caused by plugins or by latency compensation. since
4358 these may differ from the values computed above, reset all playback port latencies
4362 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
4364 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4365 (*i)->set_public_port_latencies (max_latency, playback);
4370 post_playback_latency ();
4374 post_capture_latency ();
4377 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
4381 Session::post_playback_latency ()
4383 set_worst_playback_latency ();
4385 boost::shared_ptr<RouteList> r = routes.reader ();
4387 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4388 if (!(*i)->is_hidden() && ((*i)->active())) {
4389 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
4393 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4394 (*i)->set_latency_compensation (_worst_track_latency);
4399 Session::post_capture_latency ()
4401 set_worst_capture_latency ();
4403 /* reflect any changes in capture latencies into capture offsets
4406 boost::shared_ptr<RouteList> rl = routes.reader();
4407 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4408 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4410 tr->set_capture_offset ();
4416 Session::initialize_latencies ()
4419 Glib::Mutex::Lock lm (_engine.process_lock());
4420 update_latency (false);
4421 update_latency (true);
4424 set_worst_io_latencies ();
4428 Session::set_worst_io_latencies ()
4430 set_worst_playback_latency ();
4431 set_worst_capture_latency ();
4435 Session::set_worst_playback_latency ()
4437 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4441 _worst_output_latency = 0;
4443 if (!_engine.connected()) {
4447 boost::shared_ptr<RouteList> r = routes.reader ();
4449 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4450 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
4453 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
4457 Session::set_worst_capture_latency ()
4459 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4463 _worst_input_latency = 0;
4465 if (!_engine.connected()) {
4469 boost::shared_ptr<RouteList> r = routes.reader ();
4471 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4472 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
4475 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
4479 Session::update_latency_compensation (bool force_whole_graph)
4481 bool some_track_latency_changed = false;
4483 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4487 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
4489 _worst_track_latency = 0;
4491 boost::shared_ptr<RouteList> r = routes.reader ();
4493 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4494 if (!(*i)->is_hidden() && ((*i)->active())) {
4496 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
4497 some_track_latency_changed = true;
4499 _worst_track_latency = max (tl, _worst_track_latency);
4503 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
4504 (some_track_latency_changed ? "yes" : "no")));
4506 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
4508 if (some_track_latency_changed || force_whole_graph) {
4509 _engine.update_latencies ();
4513 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4514 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4518 tr->set_capture_offset ();