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/crossfade.h"
67 #include "ardour/cycle_timer.h"
68 #include "ardour/data_type.h"
69 #include "ardour/debug.h"
70 #include "ardour/filename_extensions.h"
71 #include "ardour/internal_send.h"
72 #include "ardour/io_processor.h"
73 #include "ardour/midi_diskstream.h"
74 #include "ardour/midi_playlist.h"
75 #include "ardour/midi_region.h"
76 #include "ardour/midi_track.h"
77 #include "ardour/midi_ui.h"
78 #include "ardour/named_selection.h"
79 #include "ardour/process_thread.h"
80 #include "ardour/playlist.h"
81 #include "ardour/plugin_insert.h"
82 #include "ardour/port_insert.h"
83 #include "ardour/processor.h"
84 #include "ardour/rc_configuration.h"
85 #include "ardour/recent_sessions.h"
86 #include "ardour/region_factory.h"
87 #include "ardour/return.h"
88 #include "ardour/route_group.h"
89 #include "ardour/send.h"
90 #include "ardour/session.h"
91 #include "ardour/session_directory.h"
92 #include "ardour/session_directory.h"
93 #include "ardour/session_metadata.h"
94 #include "ardour/session_playlists.h"
95 #include "ardour/slave.h"
96 #include "ardour/smf_source.h"
97 #include "ardour/source_factory.h"
98 #include "ardour/tape_file_matcher.h"
99 #include "ardour/tempo.h"
100 #include "ardour/utils.h"
101 #include "ardour/graph.h"
102 #include "ardour/speakers.h"
103 #include "ardour/operations.h"
105 #include "midi++/port.h"
106 #include "midi++/mmc.h"
107 #include "midi++/manager.h"
112 using namespace ARDOUR;
115 bool Session::_disable_all_loaded_plugins = false;
117 PBD::Signal1<void,std::string> Session::Dialog;
118 PBD::Signal0<int> Session::AskAboutPendingState;
119 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
120 PBD::Signal0<void> Session::SendFeedback;
121 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
123 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
124 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
125 PBD::Signal0<void> Session::AutoBindingOn;
126 PBD::Signal0<void> Session::AutoBindingOff;
127 PBD::Signal2<void,std::string, std::string> Session::Exported;
128 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
129 PBD::Signal0<void> Session::Quit;
131 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
132 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
134 Session::Session (AudioEngine &eng,
135 const string& fullpath,
136 const string& snapshot_name,
137 BusProfile* bus_profile,
140 , _target_transport_speed (0.0)
141 , _requested_return_frame (-1)
142 , _session_dir (new SessionDirectory(fullpath))
144 , _state_of_the_state (Clean)
145 , _butler (new Butler (*this))
146 , _post_transport_work (0)
147 , _send_timecode_update (false)
148 , _all_route_group (new RouteGroup (*this, "all"))
149 , route_graph (new Graph(*this))
150 , routes (new RouteList)
151 , _total_free_4k_blocks (0)
152 , _bundles (new BundleList)
153 , _bundle_xml_node (0)
155 , _click_io ((IO*) 0)
157 , click_emphasis_data (0)
159 , _metadata (new SessionMetadata())
160 , _have_rec_enabled_track (false)
161 , _suspend_timecode_transmission (0)
163 _locations = new Locations (*this);
165 playlists.reset (new SessionPlaylists);
167 _all_route_group->set_active (true, this);
169 interpolation.add_channel_to (0, 0);
171 if (!eng.connected()) {
172 throw failed_constructor();
175 n_physical_outputs = _engine.n_physical_outputs ();
176 n_physical_inputs = _engine.n_physical_inputs ();
178 first_stage_init (fullpath, snapshot_name);
180 _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
183 if (create (mix_template, bus_profile)) {
185 throw failed_constructor ();
189 if (second_stage_init ()) {
191 throw failed_constructor ();
194 store_recent_sessions(_name, _path);
196 bool was_dirty = dirty();
198 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
200 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
201 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
204 DirtyChanged (); /* EMIT SIGNAL */
207 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
208 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
221 vector<void*> debug_pointers;
223 /* if we got to here, leaving pending capture state around
227 remove_pending_capture_state ();
229 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
231 _engine.remove_session ();
233 /* clear history so that no references to objects are held any more */
237 /* clear state tree so that no references to objects are held any more */
241 /* reset dynamic state version back to default */
243 Stateful::loading_state_version = 0;
245 _butler->drop_references ();
247 delete midi_control_ui;
248 delete _all_route_group;
250 if (click_data != default_click) {
251 delete [] click_data;
254 if (click_emphasis_data != default_click_emphasis) {
255 delete [] click_emphasis_data;
260 /* clear out any pending dead wood from RCU managed objects */
265 AudioDiskstream::free_working_buffers();
267 /* tell everyone who is still standing that we're about to die */
270 /* tell everyone to drop references and delete objects as we go */
272 DEBUG_TRACE (DEBUG::Destruction, "delete named selections\n");
273 named_selections.clear ();
275 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
276 RegionFactory::delete_all_regions ();
278 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
280 /* reset these three references to special routes before we do the usual route delete thing */
283 _master_out.reset ();
284 _monitor_out.reset ();
287 RCUWriter<RouteList> writer (routes);
288 boost::shared_ptr<RouteList> r = writer.get_copy ();
290 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
291 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
292 (*i)->drop_references ();
296 /* writer goes out of scope and updates master */
300 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
301 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
302 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->path(), i->second.use_count()));
303 i->second->drop_references ();
308 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
309 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
314 Crossfade::set_buffer_size (0);
316 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
321 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
323 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
324 boost_debug_list_ptrs ();
329 Session::when_engine_running ()
331 string first_physical_output;
333 BootMessage (_("Set block size and sample rate"));
335 set_block_size (_engine.frames_per_cycle());
336 set_frame_rate (_engine.frame_rate());
338 BootMessage (_("Using configuration"));
340 boost::function<void (std::string)> ff (boost::bind (&Session::config_changed, this, _1, false));
341 boost::function<void (std::string)> ft (boost::bind (&Session::config_changed, this, _1, true));
343 Config->map_parameters (ff);
344 config.map_parameters (ft);
346 /* every time we reconnect, recompute worst case output latencies */
348 _engine.Running.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies, this));
350 if (synced_to_jack()) {
351 _engine.transport_stop ();
354 if (config.get_jack_time_master()) {
355 _engine.transport_locate (_transport_frame);
363 _click_io.reset (new ClickIO (*this, "click"));
365 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
367 /* existing state for Click */
370 if (Stateful::loading_state_version < 3000) {
371 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
373 c = _click_io->set_state (*child->children().front(), Stateful::loading_state_version);
378 _clicking = Config->get_clicking ();
382 error << _("could not setup Click I/O") << endmsg;
389 /* default state for Click: dual-mono to first 2 physical outputs */
392 _engine.get_physical_outputs (DataType::AUDIO, outs);
394 for (uint32_t physport = 0; physport < 2; ++physport) {
395 if (outs.size() > physport) {
396 if (_click_io->add_port (outs[physport], this)) {
397 // relax, even though its an error
402 if (_click_io->n_ports () > ChanCount::ZERO) {
403 _clicking = Config->get_clicking ();
408 catch (failed_constructor& err) {
409 error << _("cannot setup Click I/O") << endmsg;
412 BootMessage (_("Compute I/O Latencies"));
415 // XXX HOW TO ALERT UI TO THIS ? DO WE NEED TO?
418 BootMessage (_("Set up standard connections"));
420 vector<string> inputs[DataType::num_types];
421 vector<string> outputs[DataType::num_types];
422 for (uint32_t i = 0; i < DataType::num_types; ++i) {
423 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
424 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
427 /* Create a set of Bundle objects that map
428 to the physical I/O currently available. We create both
429 mono and stereo bundles, so that the common cases of mono
430 and stereo tracks get bundles to put in their mixer strip
431 in / out menus. There may be a nicer way of achieving that;
432 it doesn't really scale that well to higher channel counts
435 /* mono output bundles */
437 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
439 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
441 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
442 c->add_channel (_("mono"), DataType::AUDIO);
443 c->set_port (0, outputs[DataType::AUDIO][np]);
448 /* stereo output bundles */
450 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
451 if (np + 1 < outputs[DataType::AUDIO].size()) {
453 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
454 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
455 c->add_channel (_("L"), DataType::AUDIO);
456 c->set_port (0, outputs[DataType::AUDIO][np]);
457 c->add_channel (_("R"), DataType::AUDIO);
458 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
464 /* mono input bundles */
466 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
468 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
470 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
471 c->add_channel (_("mono"), DataType::AUDIO);
472 c->set_port (0, inputs[DataType::AUDIO][np]);
477 /* stereo input bundles */
479 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
480 if (np + 1 < inputs[DataType::AUDIO].size()) {
482 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
484 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
485 c->add_channel (_("L"), DataType::AUDIO);
486 c->set_port (0, inputs[DataType::AUDIO][np]);
487 c->add_channel (_("R"), DataType::AUDIO);
488 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
494 /* MIDI input bundles */
496 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
497 string n = inputs[DataType::MIDI][np];
498 boost::erase_first (n, X_("alsa_pcm:"));
500 boost::shared_ptr<Bundle> c (new Bundle (n, false));
501 c->add_channel ("", DataType::MIDI);
502 c->set_port (0, inputs[DataType::MIDI][np]);
506 /* MIDI output bundles */
508 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
509 string n = outputs[DataType::MIDI][np];
510 boost::erase_first (n, X_("alsa_pcm:"));
512 boost::shared_ptr<Bundle> c (new Bundle (n, true));
513 c->add_channel ("", DataType::MIDI);
514 c->set_port (0, outputs[DataType::MIDI][np]);
518 BootMessage (_("Setup signal flow and plugins"));
522 if (_is_new && !no_auto_connect()) {
524 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock());
526 /* don't connect the master bus outputs if there is a monitor bus */
528 if (_master_out && Config->get_auto_connect_standard_busses() && !_monitor_out) {
530 /* if requested auto-connect the outputs to the first N physical ports.
533 uint32_t limit = _master_out->n_outputs().n_total();
535 for (uint32_t n = 0; n < limit; ++n) {
536 Port* p = _master_out->output()->nth (n);
538 if (outputs[p->type()].size() > n) {
539 connect_to = outputs[p->type()][n];
542 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
543 if (_master_out->output()->connect (p, connect_to, this)) {
544 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
554 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
555 are undefined, at best.
558 /* control out listens to master bus (but ignores it
559 under some conditions)
562 uint32_t limit = _monitor_out->n_inputs().n_audio();
565 for (uint32_t n = 0; n < limit; ++n) {
566 AudioPort* p = _monitor_out->input()->ports().nth_audio_port (n);
567 AudioPort* o = _master_out->output()->ports().nth_audio_port (n);
570 string connect_to = o->name();
571 if (_monitor_out->input()->connect (p, connect_to, this)) {
572 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
580 /* if control out is not connected, connect control out to physical outs
583 if (!_monitor_out->output()->connected ()) {
585 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
587 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
590 _monitor_out->output()->connect_ports_to_bundle (b, this);
592 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
593 Config->get_monitor_bus_preferred_bundle())
599 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
600 uint32_t mod = n_physical_outputs.get (*t);
601 uint32_t limit = _monitor_out->n_outputs().get(*t);
603 for (uint32_t n = 0; n < limit; ++n) {
605 Port* p = _monitor_out->output()->ports().port(*t, n);
607 if (outputs[*t].size() > (n % mod)) {
608 connect_to = outputs[*t][n % mod];
611 if (!connect_to.empty()) {
612 if (_monitor_out->output()->connect (p, connect_to, this)) {
613 error << string_compose (
614 _("cannot connect control output %1 to %2"),
627 _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
629 /* hook us up to the engine */
631 BootMessage (_("Connect to engine"));
632 _engine.set_session (this);
634 update_latency_compensation (true);
638 Session::hookup_io ()
640 /* stop graph reordering notifications from
641 causing resorts, etc.
644 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
648 /* we delay creating the auditioner till now because
649 it makes its own connections to ports.
653 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
655 throw failed_constructor ();
657 a->use_new_diskstream ();
661 catch (failed_constructor& err) {
662 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
666 /* load bundles, which we may have postponed earlier on */
667 if (_bundle_xml_node) {
668 load_bundles (*_bundle_xml_node);
669 delete _bundle_xml_node;
672 /* Tell all IO objects to connect themselves together */
674 IO::enable_connecting ();
675 MIDI::Port::MakeConnections ();
677 /* Now reset all panners */
679 Delivery::reset_panners ();
681 /* Connect tracks to monitor/listen bus if there is one. Note that in an
682 existing session, the internal sends will already exist, but we want the
683 routes to notice that they connect to the control out specifically.
687 boost::shared_ptr<RouteList> r = routes.reader ();
688 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
690 if ((*x)->is_monitor()) {
694 } else if ((*x)->is_master()) {
700 (*x)->listen_via_monitor ();
705 /* Anyone who cares about input state, wake up and do something */
707 IOConnectionsComplete (); /* EMIT SIGNAL */
709 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
711 /* now handle the whole enchilada as if it was one
717 /* update the full solo state, which can't be
718 correctly determined on a per-route basis, but
719 needs the global overview that only the session
723 update_route_solo_state ();
727 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
729 boost::shared_ptr<Track> track = wp.lock ();
734 boost::shared_ptr<Playlist> playlist;
736 if ((playlist = track->playlist()) != 0) {
737 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
738 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
739 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
744 Session::record_enabling_legal () const
746 /* this used to be in here, but survey says.... we don't need to restrict it */
747 // if (record_status() == Recording) {
751 if (Config->get_all_safe()) {
758 Session::set_track_monitor_input_status (bool yn)
760 boost::shared_ptr<RouteList> rl = routes.reader ();
761 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
762 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
763 if (tr && tr->record_enabled ()) {
764 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
765 tr->monitor_input (yn);
771 Session::reset_input_monitor_state ()
773 if (transport_rolling()) {
774 set_track_monitor_input_status (Config->get_monitoring_model() == HardwareMonitoring && !config.get_auto_input());
776 set_track_monitor_input_status (Config->get_monitoring_model() == HardwareMonitoring);
781 Session::auto_punch_start_changed (Location* location)
783 replace_event (SessionEvent::PunchIn, location->start());
785 if (get_record_enabled() && config.get_punch_in()) {
786 /* capture start has been changed, so save new pending state */
787 save_state ("", true);
792 Session::auto_punch_end_changed (Location* location)
794 framepos_t when_to_stop = location->end();
795 // when_to_stop += _worst_output_latency + _worst_input_latency;
796 replace_event (SessionEvent::PunchOut, when_to_stop);
800 Session::auto_punch_changed (Location* location)
802 framepos_t when_to_stop = location->end();
804 replace_event (SessionEvent::PunchIn, location->start());
805 //when_to_stop += _worst_output_latency + _worst_input_latency;
806 replace_event (SessionEvent::PunchOut, when_to_stop);
810 Session::auto_loop_changed (Location* location)
812 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
814 if (transport_rolling() && play_loop) {
817 // if (_transport_frame > location->end()) {
819 if (_transport_frame < location->start() || _transport_frame > location->end()) {
820 // relocate to beginning of loop
821 clear_events (SessionEvent::LocateRoll);
823 request_locate (location->start(), true);
826 else if (Config->get_seamless_loop() && !loop_changing) {
828 // schedule a locate-roll to refill the diskstreams at the
830 loop_changing = true;
832 if (location->end() > last_loopend) {
833 clear_events (SessionEvent::LocateRoll);
834 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
841 last_loopend = location->end();
845 Session::set_auto_punch_location (Location* location)
849 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
850 punch_connections.drop_connections();
851 existing->set_auto_punch (false, this);
852 remove_event (existing->start(), SessionEvent::PunchIn);
853 clear_events (SessionEvent::PunchOut);
854 auto_punch_location_changed (0);
863 if (location->end() <= location->start()) {
864 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
868 punch_connections.drop_connections ();
870 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
871 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
872 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
874 location->set_auto_punch (true, this);
876 auto_punch_changed (location);
878 auto_punch_location_changed (location);
882 Session::set_auto_loop_location (Location* location)
886 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
887 loop_connections.drop_connections ();
888 existing->set_auto_loop (false, this);
889 remove_event (existing->end(), SessionEvent::AutoLoop);
890 auto_loop_location_changed (0);
899 if (location->end() <= location->start()) {
900 error << _("Session: you can't use a mark for auto loop") << endmsg;
904 last_loopend = location->end();
906 loop_connections.drop_connections ();
908 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
909 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
910 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
912 location->set_auto_loop (true, this);
914 /* take care of our stuff first */
916 auto_loop_changed (location);
918 /* now tell everyone else */
920 auto_loop_location_changed (location);
924 Session::locations_added (Location *)
930 Session::locations_changed ()
932 _locations->apply (*this, &Session::handle_locations_changed);
936 Session::handle_locations_changed (Locations::LocationList& locations)
938 Locations::LocationList::iterator i;
940 bool set_loop = false;
941 bool set_punch = false;
943 for (i = locations.begin(); i != locations.end(); ++i) {
947 if (location->is_auto_punch()) {
948 set_auto_punch_location (location);
951 if (location->is_auto_loop()) {
952 set_auto_loop_location (location);
956 if (location->is_session_range()) {
957 _session_range_location = location;
962 set_auto_loop_location (0);
965 set_auto_punch_location (0);
972 Session::enable_record ()
975 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
977 if (rs == Recording) {
981 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
983 _last_record_location = _transport_frame;
984 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
986 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
987 set_track_monitor_input_status (true);
990 RecordStateChanged ();
997 Session::disable_record (bool rt_context, bool force)
1001 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1003 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1004 g_atomic_int_set (&_record_status, Disabled);
1005 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1007 if (rs == Recording) {
1008 g_atomic_int_set (&_record_status, Enabled);
1012 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1013 set_track_monitor_input_status (false);
1016 RecordStateChanged (); /* emit signal */
1019 remove_pending_capture_state ();
1025 Session::step_back_from_record ()
1027 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1029 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1030 set_track_monitor_input_status (false);
1036 Session::maybe_enable_record ()
1038 if (_step_editors > 0) {
1042 g_atomic_int_set (&_record_status, Enabled);
1044 /* This function is currently called from somewhere other than an RT thread.
1045 This save_state() call therefore doesn't impact anything. Doing it here
1046 means that we save pending state of which sources the next record will use,
1047 which gives us some chance of recovering from a crash during the record.
1050 save_state ("", true);
1052 if (_transport_speed) {
1053 if (!config.get_punch_in()) {
1057 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1058 RecordStateChanged (); /* EMIT SIGNAL */
1065 Session::audible_frame () const
1071 /* the first of these two possible settings for "offset"
1072 mean that the audible frame is stationary until
1073 audio emerges from the latency compensation
1076 the second means that the audible frame is stationary
1077 until audio would emerge from a physical port
1078 in the absence of any plugin latency compensation
1081 offset = worst_playback_latency ();
1083 if (offset > current_block_size) {
1084 offset -= current_block_size;
1086 /* XXX is this correct? if we have no external
1087 physical connections and everything is internal
1088 then surely this is zero? still, how
1089 likely is that anyway?
1091 offset = current_block_size;
1094 if (synced_to_jack()) {
1095 tf = _engine.transport_frame();
1097 tf = _transport_frame;
1102 if (!non_realtime_work_pending()) {
1106 /* Check to see if we have passed the first guaranteed
1107 audible frame past our last start position. if not,
1108 return that last start point because in terms
1109 of audible frames, we have not moved yet.
1111 `Start position' in this context means the time we last
1112 either started or changed transport direction.
1115 if (_transport_speed > 0.0f) {
1117 if (!play_loop || !have_looped) {
1118 if (tf < _last_roll_or_reversal_location + offset) {
1119 return _last_roll_or_reversal_location;
1127 } else if (_transport_speed < 0.0f) {
1129 /* XXX wot? no backward looping? */
1131 if (tf > _last_roll_or_reversal_location - offset) {
1132 return _last_roll_or_reversal_location;
1144 Session::set_frame_rate (framecnt_t frames_per_second)
1146 /** \fn void Session::set_frame_size(framecnt_t)
1147 the AudioEngine object that calls this guarantees
1148 that it will not be called while we are also in
1149 ::process(). Its fine to do things that block
1153 _base_frame_rate = frames_per_second;
1157 Automatable::set_automation_interval (ceil ((double) frames_per_second * (0.001 * Config->get_automation_interval())));
1161 // XXX we need some equivalent to this, somehow
1162 // SndFileSource::setup_standard_crossfades (frames_per_second);
1166 /* XXX need to reset/reinstantiate all LADSPA plugins */
1170 Session::set_block_size (pframes_t nframes)
1172 /* the AudioEngine guarantees
1173 that it will not be called while we are also in
1174 ::process(). It is therefore fine to do things that block
1179 current_block_size = nframes;
1183 boost::shared_ptr<RouteList> r = routes.reader ();
1185 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1186 (*i)->set_block_size (nframes);
1189 boost::shared_ptr<RouteList> rl = routes.reader ();
1190 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1191 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1193 tr->set_block_size (nframes);
1197 set_worst_io_latencies ();
1201 struct RouteSorter {
1202 /** @return true to run r1 before r2, otherwise false */
1203 bool operator() (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> r2) {
1204 if (r2->feeds (r1)) {
1205 /* r1 fed by r2; run r2 early */
1207 } else if (r1->feeds (r2)) {
1208 /* r2 fed by r1; run r1 early */
1211 if (r1->not_fed ()) {
1212 if (r2->not_fed ()) {
1213 /* no ardour-based connections inbound to either route. just use signal order */
1214 return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1216 /* r2 has connections, r1 does not; run r1 early */
1220 if (r2->not_fed()) {
1221 /* r1 has connections, r2 does not; run r2 early */
1224 /* both r1 and r2 have connections, but not to each other. just use signal order */
1225 return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1233 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1235 boost::shared_ptr<Route> r2;
1237 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1238 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1242 /* make a copy of the existing list of routes that feed r1 */
1244 Route::FedBy existing (r1->fed_by());
1246 /* for each route that feeds r1, recurse, marking it as feeding
1250 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1251 if (!(r2 = i->r.lock ())) {
1252 /* (*i) went away, ignore it */
1256 /* r2 is a route that feeds r1 which somehow feeds base. mark
1257 base as being fed by r2
1260 rbase->add_fed_by (r2, i->sends_only);
1264 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1268 if (r1->feeds (r2) && r2->feeds (r1)) {
1272 /* now recurse, so that we can mark base as being fed by
1273 all routes that feed r2
1276 trace_terminal (r2, rbase);
1283 Session::resort_routes ()
1285 /* don't do anything here with signals emitted
1286 by Routes while we are being destroyed.
1289 if (_state_of_the_state & Deletion) {
1294 RCUWriter<RouteList> writer (routes);
1295 boost::shared_ptr<RouteList> r = writer.get_copy ();
1296 resort_routes_using (r);
1297 /* writer goes out of scope and forces update */
1300 //route_graph->dump(1);
1303 boost::shared_ptr<RouteList> rl = routes.reader ();
1304 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1305 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1307 const Route::FedBy& fb ((*i)->fed_by());
1309 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1310 boost::shared_ptr<Route> sf = f->r.lock();
1312 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1320 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1322 RouteList::iterator i, j;
1324 for (i = r->begin(); i != r->end(); ++i) {
1326 (*i)->clear_fed_by ();
1328 for (j = r->begin(); j != r->end(); ++j) {
1330 /* although routes can feed themselves, it will
1331 cause an endless recursive descent if we
1332 detect it. so don't bother checking for
1340 bool via_sends_only;
1342 if ((*j)->direct_feeds (*i, &via_sends_only)) {
1343 (*i)->add_fed_by (*j, via_sends_only);
1348 for (i = r->begin(); i != r->end(); ++i) {
1349 trace_terminal (*i, *i);
1355 route_graph->rechain (r);
1358 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1359 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1360 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1361 (*i)->name(), (*i)->order_key ("signal")));
1367 /** Find a route name starting with \a base, maybe followed by the
1368 * lowest \a id. \a id will always be added if \a definitely_add_number
1369 * is true on entry; otherwise it will only be added if required
1370 * to make the name unique.
1372 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1373 * The available route name with the lowest ID will be used, and \a id
1374 * will be set to the ID.
1376 * \return false if a route name could not be found, and \a track_name
1377 * and \a id do not reflect a free route name.
1380 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1382 if (!definitely_add_number && route_by_name (base) == 0) {
1383 /* juse use the base */
1384 snprintf (name, name_len, "%s", base.c_str());
1389 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1391 if (route_by_name (name) == 0) {
1397 } while (id < (UINT_MAX-1));
1402 /** Count the total ins and outs of all non-hidden routes in the session and return them in in and out */
1404 Session::count_existing_route_channels (ChanCount& in, ChanCount& out)
1406 in = ChanCount::ZERO;
1407 out = ChanCount::ZERO;
1409 boost::shared_ptr<RouteList> r = routes.reader ();
1411 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1412 if (!(*i)->is_hidden()) {
1413 in += (*i)->n_inputs();
1414 out += (*i)->n_outputs();
1419 /** Caller must not hold process lock
1420 * @param name_template string to use for the start of the name, or "" to use "Midi".
1422 list<boost::shared_ptr<MidiTrack> >
1423 Session::new_midi_track (TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1425 char track_name[32];
1426 uint32_t track_id = 0;
1428 RouteList new_routes;
1429 list<boost::shared_ptr<MidiTrack> > ret;
1430 uint32_t control_id;
1432 control_id = ntracks() + nbusses();
1434 bool const use_number = (how_many != 1);
1437 if (!find_route_name (name_template.empty() ? _("Midi") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1438 error << "cannot find name for new midi track" << endmsg;
1442 boost::shared_ptr<MidiTrack> track;
1445 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1447 if (track->init ()) {
1451 track->use_new_diskstream();
1453 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1454 boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1457 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1458 if (track->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1459 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1463 if (track->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1464 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1469 track->non_realtime_input_change();
1472 route_group->add (track);
1475 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1476 track->set_remote_control_id (control_id);
1478 new_routes.push_back (track);
1479 ret.push_back (track);
1482 catch (failed_constructor &err) {
1483 error << _("Session: could not create new midi track.") << endmsg;
1487 catch (AudioEngine::PortRegistrationFailure& pfe) {
1489 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;
1497 if (!new_routes.empty()) {
1498 add_routes (new_routes, true, false);
1499 save_state (_current_snapshot_name);
1505 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1506 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1507 * @param output_start As \a input_start, but for outputs.
1510 Session::auto_connect_route (Route* route, ChanCount& existing_inputs, ChanCount& existing_outputs,
1511 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
1513 if (!IO::connecting_legal) {
1517 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::NOT_LOCK);
1523 /* If both inputs and outputs are auto-connected to physical ports,
1524 use the max of input and output offsets to ensure auto-connected
1525 port numbers always match up (e.g. the first audio input and the
1526 first audio output of the route will have the same physical
1527 port number). Otherwise just use the lowest input or output
1531 cerr << "ACR: existing in = " << existing_inputs << " out = " << existing_outputs << endl;
1533 const bool in_out_physical =
1534 (Config->get_input_auto_connect() & AutoConnectPhysical)
1535 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1538 const ChanCount in_offset = existing_inputs;
1540 const ChanCount out_offset = in_out_physical
1541 ? ChanCount::max(existing_inputs, existing_outputs)
1544 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1545 vector<string> physinputs;
1546 vector<string> physoutputs;
1548 _engine.get_physical_outputs (*t, physoutputs);
1549 _engine.get_physical_inputs (*t, physinputs);
1551 if (!physinputs.empty() && connect_inputs) {
1552 uint32_t nphysical_in = physinputs.size();
1554 cerr << "There are " << nphysical_in << " physical inputs of type " << *t << endl;
1556 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1559 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1560 cerr << "Get index " << in_offset.get(*t) << " + " << i << " % " << nphysical_in << " = "
1561 << (in_offset.get(*t) + i) % nphysical_in
1563 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1566 cerr << "Connect route " << route->name() << " IN to " << port << endl;
1568 if (!port.empty() && route->input()->connect (
1569 route->input()->ports().port(*t, i), port, this)) {
1575 if (!physoutputs.empty()) {
1576 uint32_t nphysical_out = physoutputs.size();
1577 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
1580 if (Config->get_output_auto_connect() & AutoConnectPhysical) {
1581 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1582 } else if (Config->get_output_auto_connect() & AutoConnectMaster) {
1583 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1584 port = _master_out->input()->ports().port(*t,
1585 i % _master_out->input()->n_ports().get(*t))->name();
1589 cerr << "Connect route " << route->name() << " OUT to " << port << endl;
1591 if (!port.empty() && route->output()->connect (
1592 route->output()->ports().port(*t, i), port, this)) {
1600 /** Caller must not hold process lock
1601 * @param name_template string to use for the start of the name, or "" to use "Audio".
1603 list< boost::shared_ptr<AudioTrack> >
1604 Session::new_audio_track (
1605 int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template
1608 char track_name[32];
1609 uint32_t track_id = 0;
1611 RouteList new_routes;
1612 list<boost::shared_ptr<AudioTrack> > ret;
1613 uint32_t control_id;
1615 control_id = ntracks() + nbusses() + 1;
1617 bool const use_number = (how_many != 1);
1620 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1621 error << "cannot find name for new audio track" << endmsg;
1625 boost::shared_ptr<AudioTrack> track;
1628 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
1630 if (track->init ()) {
1634 track->use_new_diskstream();
1636 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1637 boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1640 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1642 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1643 error << string_compose (
1644 _("cannot configure %1 in/%2 out configuration for new audio track"),
1645 input_channels, output_channels)
1650 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1651 error << string_compose (
1652 _("cannot configure %1 in/%2 out configuration for new audio track"),
1653 input_channels, output_channels)
1660 route_group->add (track);
1663 track->non_realtime_input_change();
1665 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1666 track->set_remote_control_id (control_id);
1669 new_routes.push_back (track);
1670 ret.push_back (track);
1673 catch (failed_constructor &err) {
1674 error << _("Session: could not create new audio track.") << endmsg;
1678 catch (AudioEngine::PortRegistrationFailure& pfe) {
1680 error << pfe.what() << endmsg;
1688 if (!new_routes.empty()) {
1689 add_routes (new_routes, true, true);
1696 Session::set_remote_control_ids ()
1698 RemoteModel m = Config->get_remote_model();
1699 bool emit_signal = false;
1701 boost::shared_ptr<RouteList> r = routes.reader ();
1703 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1704 if (MixerOrdered == m) {
1705 int32_t order = (*i)->order_key(N_("signal"));
1706 (*i)->set_remote_control_id (order+1, false);
1708 } else if (EditorOrdered == m) {
1709 int32_t order = (*i)->order_key(N_("editor"));
1710 (*i)->set_remote_control_id (order+1, false);
1712 } else if (UserOrdered == m) {
1713 //do nothing ... only changes to remote id's are initiated by user
1718 Route::RemoteControlIDChange();
1722 /** Caller must not hold process lock.
1723 * @param name_template string to use for the start of the name, or "" to use "Bus".
1726 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
1729 uint32_t bus_id = 0;
1732 uint32_t control_id;
1734 control_id = ntracks() + nbusses() + 1;
1736 bool const use_number = (how_many != 1);
1738 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
1739 error << "cannot find name for new audio bus" << endmsg;
1744 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
1750 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1751 boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
1754 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1756 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1757 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1758 input_channels, output_channels)
1764 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1765 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1766 input_channels, output_channels)
1773 route_group->add (bus);
1775 bus->set_remote_control_id (control_id);
1778 bus->add_internal_return ();
1780 ret.push_back (bus);
1784 catch (failed_constructor &err) {
1785 error << _("Session: could not create new audio route.") << endmsg;
1789 catch (AudioEngine::PortRegistrationFailure& pfe) {
1790 error << pfe.what() << endmsg;
1800 add_routes (ret, true, true);
1808 Session::new_route_from_template (uint32_t how_many, const std::string& template_path)
1812 uint32_t control_id;
1814 uint32_t number = 0;
1816 if (!tree.read (template_path.c_str())) {
1820 XMLNode* node = tree.root();
1822 control_id = ntracks() + nbusses() + 1;
1826 XMLNode node_copy (*node); // make a copy so we can change the name if we need to
1828 std::string node_name = IO::name_from_state (*node_copy.children().front());
1830 /* generate a new name by adding a number to the end of the template name */
1831 if (!find_route_name (node_name.c_str(), ++number, name, sizeof(name), true)) {
1832 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
1836 /* set IO children to use the new name */
1837 XMLNodeList const & children = node_copy.children ();
1838 for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
1839 if ((*i)->name() == IO::state_node_name) {
1840 IO::set_name_in_state (**i, name);
1844 Track::zero_diskstream_id_in_xml (node_copy);
1847 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
1850 error << _("Session: cannot create track/bus from template description") << endmsg;
1854 if (boost::dynamic_pointer_cast<Track>(route)) {
1855 /* force input/output change signals so that the new diskstream
1856 picks up the configuration of the route. During session
1857 loading this normally happens in a different way.
1860 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1862 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
1863 change.after = route->input()->n_ports();
1864 route->input()->changed (change, this);
1865 change.after = route->output()->n_ports();
1866 route->output()->changed (change, this);
1869 route->set_remote_control_id (control_id);
1872 ret.push_back (route);
1875 catch (failed_constructor &err) {
1876 error << _("Session: could not create new route from template") << endmsg;
1880 catch (AudioEngine::PortRegistrationFailure& pfe) {
1881 error << pfe.what() << endmsg;
1890 add_routes (ret, true, true);
1897 Session::add_routes (RouteList& new_routes, bool auto_connect, bool save)
1900 RCUWriter<RouteList> writer (routes);
1901 boost::shared_ptr<RouteList> r = writer.get_copy ();
1902 r->insert (r->end(), new_routes.begin(), new_routes.end());
1905 /* if there is no control out and we're not in the middle of loading,
1906 resort the graph here. if there is a control out, we will resort
1907 toward the end of this method. if we are in the middle of loading,
1908 we will resort when done.
1911 if (!_monitor_out && IO::connecting_legal) {
1912 resort_routes_using (r);
1916 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
1918 boost::weak_ptr<Route> wpr (*x);
1919 boost::shared_ptr<Route> r (*x);
1921 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
1922 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
1923 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
1924 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
1925 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
1926 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
1927 r->order_key_changed.connect_same_thread (*this, boost::bind (&Session::route_order_key_changed, this));
1929 if (r->is_master()) {
1933 if (r->is_monitor()) {
1937 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
1939 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
1940 track_playlist_changed (boost::weak_ptr<Track> (tr));
1941 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
1943 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
1945 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
1951 ChanCount existing_inputs;
1952 ChanCount existing_outputs;
1954 count_existing_route_channels (existing_inputs, existing_outputs);
1956 auto_connect_route (r, existing_inputs, existing_outputs, true);
1960 if (_monitor_out && IO::connecting_legal) {
1962 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
1963 if ((*x)->is_monitor()) {
1965 } else if ((*x)->is_master()) {
1968 (*x)->listen_via_monitor ();
1978 save_state (_current_snapshot_name);
1981 RouteAdded (new_routes); /* EMIT SIGNAL */
1982 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
1986 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
1988 boost::shared_ptr<RouteList> r = routes.reader ();
1989 boost::shared_ptr<Send> s;
1991 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1992 if ((s = (*i)->internal_send_for (dest)) != 0) {
1993 s->amp()->gain_control()->set_value (0.0);
1999 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2001 boost::shared_ptr<RouteList> r = routes.reader ();
2002 boost::shared_ptr<Send> s;
2004 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2005 if ((s = (*i)->internal_send_for (dest)) != 0) {
2006 s->amp()->gain_control()->set_value (1.0);
2012 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2014 boost::shared_ptr<RouteList> r = routes.reader ();
2015 boost::shared_ptr<Send> s;
2017 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2018 if ((s = (*i)->internal_send_for (dest)) != 0) {
2019 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2024 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2026 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2028 boost::shared_ptr<RouteList> r = routes.reader ();
2029 boost::shared_ptr<RouteList> t (new RouteList);
2031 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2032 if (include_buses || boost::dynamic_pointer_cast<Track>(*i)) {
2037 add_internal_sends (dest, p, t);
2041 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2043 if (dest->is_monitor() || dest->is_master()) {
2047 if (!dest->internal_return()) {
2048 dest->add_internal_return();
2051 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2053 if ((*i)->is_monitor() || (*i)->is_master() || (*i) == dest) {
2057 (*i)->listen_via (dest, p);
2064 Session::remove_route (boost::shared_ptr<Route> route)
2066 if (((route == _master_out) || (route == _monitor_out)) && !Config->get_allow_special_bus_removal()) {
2070 route->set_solo (false, this);
2073 RCUWriter<RouteList> writer (routes);
2074 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2078 /* deleting the master out seems like a dumb
2079 idea, but its more of a UI policy issue
2083 if (route == _master_out) {
2084 _master_out = boost::shared_ptr<Route> ();
2087 if (route == _monitor_out) {
2089 /* cancel control outs for all routes */
2091 for (RouteList::iterator r = rs->begin(); r != rs->end(); ++r) {
2092 (*r)->drop_listen (_monitor_out);
2095 _monitor_out.reset ();
2098 /* writer goes out of scope, forces route list update */
2101 update_route_solo_state ();
2103 // We need to disconnect the route's inputs and outputs
2105 route->input()->disconnect (0);
2106 route->output()->disconnect (0);
2108 /* if the route had internal sends sending to it, remove them */
2109 if (route->internal_return()) {
2111 boost::shared_ptr<RouteList> r = routes.reader ();
2112 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2113 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2115 (*i)->remove_processor (s);
2120 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2121 if (mt && mt->step_editing()) {
2122 if (_step_editors > 0) {
2127 update_latency_compensation ();
2130 /* Re-sort routes to remove the graph's current references to the one that is
2131 * going away, then flush old references out of the graph.
2135 route_graph->clear_other_chain ();
2137 /* get rid of it from the dead wood collection in the route list manager */
2139 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2143 /* try to cause everyone to drop their references */
2145 route->drop_references ();
2147 sync_order_keys (N_("session"));
2149 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2151 /* save the new state of the world */
2153 if (save_state (_current_snapshot_name)) {
2154 save_history (_current_snapshot_name);
2159 Session::route_mute_changed (void* /*src*/)
2165 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2167 boost::shared_ptr<Route> route = wpr.lock();
2169 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2173 if (route->listening_via_monitor ()) {
2175 if (Config->get_exclusive_solo()) {
2176 /* new listen: disable all other listen */
2177 boost::shared_ptr<RouteList> r = routes.reader ();
2178 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2179 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2182 (*i)->set_listen (false, this);
2188 } else if (_listen_cnt > 0) {
2193 update_route_solo_state ();
2196 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2198 boost::shared_ptr<Route> route = wpr.lock ();
2201 /* should not happen */
2202 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2206 bool send_changed = false;
2208 if (route->solo_isolated()) {
2209 if (_solo_isolated_cnt == 0) {
2210 send_changed = true;
2212 _solo_isolated_cnt++;
2213 } else if (_solo_isolated_cnt > 0) {
2214 _solo_isolated_cnt--;
2215 if (_solo_isolated_cnt == 0) {
2216 send_changed = true;
2221 IsolatedChanged (); /* EMIT SIGNAL */
2226 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2228 if (!self_solo_change) {
2229 // session doesn't care about changes to soloed-by-others
2233 if (solo_update_disabled) {
2238 boost::shared_ptr<Route> route = wpr.lock ();
2241 /* should not happen */
2242 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2246 boost::shared_ptr<RouteList> r = routes.reader ();
2249 if (route->self_soloed()) {
2255 if (delta == 1 && Config->get_exclusive_solo()) {
2256 /* new solo: disable all other solos */
2257 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2258 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2261 (*i)->set_solo (false, this);
2265 solo_update_disabled = true;
2267 RouteList uninvolved;
2269 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2270 bool via_sends_only;
2271 bool in_signal_flow;
2273 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2277 in_signal_flow = false;
2279 if ((*i)->feeds (route, &via_sends_only)) {
2280 if (!via_sends_only) {
2281 if (!route->soloed_by_others_upstream()) {
2282 (*i)->mod_solo_by_others_downstream (delta);
2284 in_signal_flow = true;
2288 if (route->feeds (*i, &via_sends_only)) {
2289 (*i)->mod_solo_by_others_upstream (delta);
2290 in_signal_flow = true;
2293 if (!in_signal_flow) {
2294 uninvolved.push_back (*i);
2298 solo_update_disabled = false;
2299 update_route_solo_state (r);
2301 /* now notify that the mute state of the routes not involved in the signal
2302 pathway of the just-solo-changed route may have altered.
2305 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2306 (*i)->mute_changed (this);
2309 SoloChanged (); /* EMIT SIGNAL */
2314 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2316 /* now figure out if anything that matters is soloed (or is "listening")*/
2318 bool something_soloed = false;
2319 uint32_t listeners = 0;
2320 uint32_t isolated = 0;
2323 r = routes.reader();
2326 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2327 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2328 something_soloed = true;
2331 if (!(*i)->is_hidden() && (*i)->listening_via_monitor()) {
2332 if (Config->get_solo_control_is_listen_control()) {
2335 (*i)->set_listen (false, this);
2339 if ((*i)->solo_isolated()) {
2344 if (something_soloed != _non_soloed_outs_muted) {
2345 _non_soloed_outs_muted = something_soloed;
2346 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2349 _listen_cnt = listeners;
2351 if (isolated != _solo_isolated_cnt) {
2352 _solo_isolated_cnt = isolated;
2353 IsolatedChanged (); /* EMIT SIGNAL */
2357 boost::shared_ptr<RouteList>
2358 Session::get_routes_with_internal_returns() const
2360 boost::shared_ptr<RouteList> r = routes.reader ();
2361 boost::shared_ptr<RouteList> rl (new RouteList);
2363 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2364 if ((*i)->internal_return ()) {
2372 Session::io_name_is_legal (const std::string& name)
2374 boost::shared_ptr<RouteList> r = routes.reader ();
2376 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2377 if ((*i)->name() == name) {
2381 if ((*i)->has_io_processor_named (name)) {
2389 boost::shared_ptr<Route>
2390 Session::route_by_name (string name)
2392 boost::shared_ptr<RouteList> r = routes.reader ();
2394 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2395 if ((*i)->name() == name) {
2400 return boost::shared_ptr<Route> ((Route*) 0);
2403 boost::shared_ptr<Route>
2404 Session::route_by_id (PBD::ID id)
2406 boost::shared_ptr<RouteList> r = routes.reader ();
2408 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2409 if ((*i)->id() == id) {
2414 return boost::shared_ptr<Route> ((Route*) 0);
2417 boost::shared_ptr<Route>
2418 Session::route_by_remote_id (uint32_t id)
2420 boost::shared_ptr<RouteList> r = routes.reader ();
2422 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2423 if ((*i)->remote_control_id() == id) {
2428 return boost::shared_ptr<Route> ((Route*) 0);
2432 Session::playlist_region_added (boost::weak_ptr<Region> w)
2434 boost::shared_ptr<Region> r = w.lock ();
2439 /* These are the operations that are currently in progress... */
2440 list<GQuark> curr = _current_trans_quarks;
2443 /* ...and these are the operations during which we want to update
2444 the session range location markers.
2447 ops.push_back (Operations::capture);
2448 ops.push_back (Operations::paste);
2449 ops.push_back (Operations::duplicate_region);
2450 ops.push_back (Operations::insert_file);
2451 ops.push_back (Operations::insert_region);
2452 ops.push_back (Operations::drag_region_brush);
2453 ops.push_back (Operations::region_drag);
2454 ops.push_back (Operations::selection_grab);
2455 ops.push_back (Operations::region_fill);
2456 ops.push_back (Operations::fill_selection);
2457 ops.push_back (Operations::create_region);
2460 /* See if any of the current operations match the ones that we want */
2462 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
2464 /* If so, update the session range markers */
2466 maybe_update_session_range (r->position (), r->last_frame ());
2470 /** Update the session range markers if a is before the current start or
2471 * b is after the current end.
2474 Session::maybe_update_session_range (framepos_t a, framepos_t b)
2476 if (_state_of_the_state & Loading) {
2480 if (_session_range_location == 0) {
2482 add_session_range_location (a, b);
2486 if (a < _session_range_location->start()) {
2487 _session_range_location->set_start (a);
2490 if (b > _session_range_location->end()) {
2491 _session_range_location->set_end (b);
2497 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
2499 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2500 maybe_update_session_range (i->to, i->to + i->length);
2505 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
2507 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2508 maybe_update_session_range (i->from, i->to);
2512 /* Region management */
2514 boost::shared_ptr<Region>
2515 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2517 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2518 RegionFactory::RegionMap::const_iterator i;
2519 boost::shared_ptr<Region> region;
2521 Glib::Mutex::Lock lm (region_lock);
2523 for (i = regions.begin(); i != regions.end(); ++i) {
2527 if (region->whole_file()) {
2529 if (child->source_equivalent (region)) {
2535 return boost::shared_ptr<Region> ();
2539 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2541 set<boost::shared_ptr<Region> > relevant_regions;
2543 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2544 RegionFactory::get_regions_using_source (*s, relevant_regions);
2547 cerr << "There are " << relevant_regions.size() << " using " << srcs.size() << " sources" << endl;
2549 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2550 set<boost::shared_ptr<Region> >::iterator tmp;
2555 cerr << "Cleanup " << (*r)->name() << " UC = " << (*r).use_count() << endl;
2557 playlists->destroy_region (*r);
2558 RegionFactory::map_remove (*r);
2560 (*r)->drop_sources ();
2561 (*r)->drop_references ();
2563 cerr << "\tdone UC = " << (*r).use_count() << endl;
2565 relevant_regions.erase (r);
2570 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
2573 Glib::Mutex::Lock ls (source_lock);
2574 /* remove from the main source list */
2575 sources.erase ((*s)->id());
2578 (*s)->mark_for_remove ();
2579 (*s)->drop_references ();
2588 Session::remove_last_capture ()
2590 list<boost::shared_ptr<Source> > srcs;
2592 boost::shared_ptr<RouteList> rl = routes.reader ();
2593 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2594 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2599 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
2602 srcs.insert (srcs.end(), l.begin(), l.end());
2607 destroy_sources (srcs);
2609 save_state (_current_snapshot_name);
2614 /* Source Management */
2617 Session::add_source (boost::shared_ptr<Source> source)
2619 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
2620 pair<SourceMap::iterator,bool> result;
2622 entry.first = source->id();
2623 entry.second = source;
2626 Glib::Mutex::Lock lm (source_lock);
2627 result = sources.insert (entry);
2630 if (result.second) {
2632 /* yay, new source */
2636 boost::shared_ptr<AudioFileSource> afs;
2638 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
2639 if (Config->get_auto_analyse_audio()) {
2640 Analyser::queue_source_for_analysis (source, false);
2644 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
2649 Session::remove_source (boost::weak_ptr<Source> src)
2651 if (_state_of_the_state & Deletion) {
2655 SourceMap::iterator i;
2656 boost::shared_ptr<Source> source = src.lock();
2663 Glib::Mutex::Lock lm (source_lock);
2665 if ((i = sources.find (source->id())) != sources.end()) {
2670 if (!_state_of_the_state & InCleanup) {
2672 /* save state so we don't end up with a session file
2673 referring to non-existent sources.
2676 save_state (_current_snapshot_name);
2680 boost::shared_ptr<Source>
2681 Session::source_by_id (const PBD::ID& id)
2683 Glib::Mutex::Lock lm (source_lock);
2684 SourceMap::iterator i;
2685 boost::shared_ptr<Source> source;
2687 if ((i = sources.find (id)) != sources.end()) {
2694 boost::shared_ptr<Source>
2695 Session::source_by_path_and_channel (const string& path, uint16_t chn)
2697 Glib::Mutex::Lock lm (source_lock);
2699 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2700 boost::shared_ptr<AudioFileSource> afs
2701 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
2703 if (afs && afs->path() == path && chn == afs->channel()) {
2707 return boost::shared_ptr<Source>();
2711 Session::count_sources_by_origin (const string& path)
2714 Glib::Mutex::Lock lm (source_lock);
2716 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2717 boost::shared_ptr<FileSource> fs
2718 = boost::dynamic_pointer_cast<FileSource>(i->second);
2720 if (fs && fs->origin() == path) {
2730 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
2733 string old_basename = PBD::basename_nosuffix (oldname);
2734 string new_legalized = legalize_for_path (newname);
2736 /* note: we know (or assume) the old path is already valid */
2740 /* destructive file sources have a name of the form:
2742 /path/to/Tnnnn-NAME(%[LR])?.wav
2744 the task here is to replace NAME with the new name.
2749 string::size_type dash;
2751 dir = Glib::path_get_dirname (path);
2752 path = Glib::path_get_basename (path);
2754 /* '-' is not a legal character for the NAME part of the path */
2756 if ((dash = path.find_last_of ('-')) == string::npos) {
2760 prefix = path.substr (0, dash);
2764 path += new_legalized;
2765 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
2766 path = Glib::build_filename (dir, path);
2770 /* non-destructive file sources have a name of the form:
2772 /path/to/NAME-nnnnn(%[LR])?.ext
2774 the task here is to replace NAME with the new name.
2779 string::size_type dash;
2780 string::size_type postfix;
2782 dir = Glib::path_get_dirname (path);
2783 path = Glib::path_get_basename (path);
2785 /* '-' is not a legal character for the NAME part of the path */
2787 if ((dash = path.find_last_of ('-')) == string::npos) {
2791 suffix = path.substr (dash+1);
2793 // Suffix is now everything after the dash. Now we need to eliminate
2794 // the nnnnn part, which is done by either finding a '%' or a '.'
2796 postfix = suffix.find_last_of ("%");
2797 if (postfix == string::npos) {
2798 postfix = suffix.find_last_of ('.');
2801 if (postfix != string::npos) {
2802 suffix = suffix.substr (postfix);
2804 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
2808 const uint32_t limit = 10000;
2809 char buf[PATH_MAX+1];
2811 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
2813 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
2815 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
2816 path = Glib::build_filename (dir, buf);
2824 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
2833 /** Return the full path (in some session directory) for a new within-session source.
2834 * \a name must be a session-unique name that does not contain slashes
2835 * (e.g. as returned by new_*_source_name)
2838 Session::new_source_path_from_name (DataType type, const string& name)
2840 assert(name.find("/") == string::npos);
2842 SessionDirectory sdir(get_best_session_directory_for_new_source());
2845 if (type == DataType::AUDIO) {
2846 p = sdir.sound_path();
2847 } else if (type == DataType::MIDI) {
2848 p = sdir.midi_path();
2850 error << "Unknown source type, unable to create file path" << endmsg;
2855 return p.to_string();
2859 Session::peak_path (string base) const
2861 sys::path peakfile_path(_session_dir->peak_path());
2862 peakfile_path /= base + peakfile_suffix;
2863 return peakfile_path.to_string();
2866 /** Return a unique name based on \a base for a new internal audio source */
2868 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
2871 char buf[PATH_MAX+1];
2872 const uint32_t limit = 10000;
2874 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
2877 legalized = legalize_for_path (base);
2879 // Find a "version" of the base name that doesn't exist in any of the possible directories.
2880 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
2882 vector<space_and_path>::iterator i;
2883 uint32_t existing = 0;
2885 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2890 snprintf (buf, sizeof(buf), "T%04d-%s%s",
2891 cnt, legalized.c_str(), ext.c_str());
2892 } else if (nchan == 2) {
2894 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
2895 cnt, legalized.c_str(), ext.c_str());
2897 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
2898 cnt, legalized.c_str(), ext.c_str());
2900 } else if (nchan < 26) {
2901 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
2902 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
2904 snprintf (buf, sizeof(buf), "T%04d-%s%s",
2905 cnt, legalized.c_str(), ext.c_str());
2911 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
2912 } else if (nchan == 2) {
2914 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
2916 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
2918 } else if (nchan < 26) {
2919 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
2921 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
2925 SessionDirectory sdir((*i).path);
2927 string spath = sdir.sound_path().to_string();
2929 /* note that we search *without* the extension so that
2930 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
2931 in the event that this new name is required for
2932 a file format change.
2935 if (matching_unsuffixed_filename_exists_in (spath, buf)) {
2941 if (existing == 0) {
2946 error << string_compose(
2947 _("There are already %1 recordings for %2, which I consider too many."),
2948 limit, base) << endmsg;
2950 throw failed_constructor();
2954 return Glib::path_get_basename (buf);
2957 /** Create a new within-session audio source */
2958 boost::shared_ptr<AudioFileSource>
2959 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
2961 const string name = new_audio_source_name (n, n_chans, chan, destructive);
2962 const string path = new_source_path_from_name(DataType::AUDIO, name);
2964 return boost::dynamic_pointer_cast<AudioFileSource> (
2965 SourceFactory::createWritable (DataType::AUDIO, *this, path, string(), destructive, frame_rate()));
2968 /** Return a unique name based on \a base for a new internal MIDI source */
2970 Session::new_midi_source_name (const string& base)
2973 char buf[PATH_MAX+1];
2974 const uint32_t limit = 10000;
2978 legalized = legalize_for_path (base);
2980 // Find a "version" of the file name that doesn't exist in any of the possible directories.
2981 for (cnt = 1; cnt <= limit; ++cnt) {
2983 vector<space_and_path>::iterator i;
2984 uint32_t existing = 0;
2986 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2988 SessionDirectory sdir((*i).path);
2990 sys::path p = sdir.midi_path();
2993 snprintf (buf, sizeof(buf), "%s-%u.mid", p.to_string().c_str(), cnt);
2995 if (sys::exists (buf)) {
3000 if (existing == 0) {
3005 error << string_compose(
3006 _("There are already %1 recordings for %2, which I consider too many."),
3007 limit, base) << endmsg;
3009 throw failed_constructor();
3013 return Glib::path_get_basename(buf);
3017 /** Create a new within-session MIDI source */
3018 boost::shared_ptr<MidiSource>
3019 Session::create_midi_source_for_session (Track* track, string const & n)
3021 /* try to use the existing write source for the track, to keep numbering sane
3025 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3029 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3032 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3033 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3037 const string name = new_midi_source_name (n);
3038 const string path = new_source_path_from_name (DataType::MIDI, name);
3040 return boost::dynamic_pointer_cast<SMFSource> (
3041 SourceFactory::createWritable (
3042 DataType::MIDI, *this, path, string(), false, frame_rate()));
3047 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3049 if (playlist->hidden()) {
3053 playlists->add (playlist);
3056 playlist->release();
3063 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3065 if (_state_of_the_state & Deletion) {
3069 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3075 playlists->remove (playlist);
3081 Session::set_audition (boost::shared_ptr<Region> r)
3083 pending_audition_region = r;
3084 add_post_transport_work (PostTransportAudition);
3085 _butler->schedule_transport_work ();
3089 Session::audition_playlist ()
3091 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3092 ev->region.reset ();
3097 Session::non_realtime_set_audition ()
3099 if (!pending_audition_region) {
3100 auditioner->audition_current_playlist ();
3102 auditioner->audition_region (pending_audition_region);
3103 pending_audition_region.reset ();
3105 AuditionActive (true); /* EMIT SIGNAL */
3109 Session::audition_region (boost::shared_ptr<Region> r)
3111 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3117 Session::cancel_audition ()
3119 if (auditioner->auditioning()) {
3120 auditioner->cancel_audition ();
3121 AuditionActive (false); /* EMIT SIGNAL */
3126 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3128 if (a->is_monitor()) {
3131 if (b->is_monitor()) {
3134 return a->order_key(N_("signal")) < b->order_key(N_("signal"));
3138 Session::is_auditioning () const
3140 /* can be called before we have an auditioner object */
3142 return auditioner->auditioning();
3149 Session::graph_reordered ()
3151 /* don't do this stuff if we are setting up connections
3152 from a set_state() call or creating new tracks. Ditto for deletion.
3155 if (_state_of_the_state & (InitialConnecting|Deletion)) {
3159 /* every track/bus asked for this to be handled but it was deferred because
3160 we were connecting. do it now.
3163 request_input_change_handling ();
3167 /* force all diskstreams to update their capture offset values to
3168 reflect any changes in latencies within the graph.
3171 boost::shared_ptr<RouteList> rl = routes.reader ();
3172 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3173 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3175 tr->set_capture_offset ();
3181 Session::available_capture_duration ()
3183 float sample_bytes_on_disk = 4.0; // keep gcc happy
3185 switch (config.get_native_file_data_format()) {
3187 sample_bytes_on_disk = 4.0;
3191 sample_bytes_on_disk = 3.0;
3195 sample_bytes_on_disk = 2.0;
3199 /* impossible, but keep some gcc versions happy */
3200 fatal << string_compose (_("programming error: %1"),
3201 X_("illegal native file data format"))
3206 double scale = 4096.0 / sample_bytes_on_disk;
3208 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3209 return max_framecnt;
3212 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3216 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3219 RCUWriter<BundleList> writer (_bundles);
3220 boost::shared_ptr<BundleList> b = writer.get_copy ();
3221 b->push_back (bundle);
3224 BundleAdded (bundle); /* EMIT SIGNAL */
3230 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3232 bool removed = false;
3235 RCUWriter<BundleList> writer (_bundles);
3236 boost::shared_ptr<BundleList> b = writer.get_copy ();
3237 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3239 if (i != b->end()) {
3246 BundleRemoved (bundle); /* EMIT SIGNAL */
3252 boost::shared_ptr<Bundle>
3253 Session::bundle_by_name (string name) const
3255 boost::shared_ptr<BundleList> b = _bundles.reader ();
3257 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3258 if ((*i)->name() == name) {
3263 return boost::shared_ptr<Bundle> ();
3267 Session::tempo_map_changed (const PropertyChange&)
3271 playlists->update_after_tempo_map_change ();
3273 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3279 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3281 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3282 (*i)->recompute_frames_from_bbt ();
3286 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3287 * the given count with the current block size.
3290 Session::ensure_buffers (ChanCount howmany)
3292 BufferManager::ensure_buffers (howmany);
3296 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3298 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3299 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3304 Session::next_insert_id ()
3306 /* this doesn't really loop forever. just think about it */
3309 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3310 if (!insert_bitset[n]) {
3311 insert_bitset[n] = true;
3317 /* none available, so resize and try again */
3319 insert_bitset.resize (insert_bitset.size() + 16, false);
3324 Session::next_send_id ()
3326 /* this doesn't really loop forever. just think about it */
3329 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3330 if (!send_bitset[n]) {
3331 send_bitset[n] = true;
3337 /* none available, so resize and try again */
3339 send_bitset.resize (send_bitset.size() + 16, false);
3344 Session::next_return_id ()
3346 /* this doesn't really loop forever. just think about it */
3349 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3350 if (!return_bitset[n]) {
3351 return_bitset[n] = true;
3357 /* none available, so resize and try again */
3359 return_bitset.resize (return_bitset.size() + 16, false);
3364 Session::mark_send_id (uint32_t id)
3366 if (id >= send_bitset.size()) {
3367 send_bitset.resize (id+16, false);
3369 if (send_bitset[id]) {
3370 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3372 send_bitset[id] = true;
3376 Session::mark_return_id (uint32_t id)
3378 if (id >= return_bitset.size()) {
3379 return_bitset.resize (id+16, false);
3381 if (return_bitset[id]) {
3382 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3384 return_bitset[id] = true;
3388 Session::mark_insert_id (uint32_t id)
3390 if (id >= insert_bitset.size()) {
3391 insert_bitset.resize (id+16, false);
3393 if (insert_bitset[id]) {
3394 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3396 insert_bitset[id] = true;
3400 Session::unmark_send_id (uint32_t id)
3402 if (id < send_bitset.size()) {
3403 send_bitset[id] = false;
3408 Session::unmark_return_id (uint32_t id)
3410 if (id < return_bitset.size()) {
3411 return_bitset[id] = false;
3416 Session::unmark_insert_id (uint32_t id)
3418 if (id < insert_bitset.size()) {
3419 insert_bitset[id] = false;
3424 /* Named Selection management */
3426 boost::shared_ptr<NamedSelection>
3427 Session::named_selection_by_name (string name)
3429 Glib::Mutex::Lock lm (named_selection_lock);
3430 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
3431 if ((*i)->name == name) {
3435 return boost::shared_ptr<NamedSelection>();
3439 Session::add_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3442 Glib::Mutex::Lock lm (named_selection_lock);
3443 named_selections.insert (named_selections.begin(), named_selection);
3448 NamedSelectionAdded (); /* EMIT SIGNAL */
3452 Session::remove_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3454 bool removed = false;
3457 Glib::Mutex::Lock lm (named_selection_lock);
3459 NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
3461 if (i != named_selections.end()) {
3462 named_selections.erase (i);
3469 NamedSelectionRemoved (); /* EMIT SIGNAL */
3474 Session::reset_native_file_format ()
3476 boost::shared_ptr<RouteList> rl = routes.reader ();
3477 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3478 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3480 /* don't save state as we do this, there's no point
3483 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3484 tr->reset_write_sources (false);
3485 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3491 Session::route_name_unique (string n) const
3493 boost::shared_ptr<RouteList> r = routes.reader ();
3495 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3496 if ((*i)->name() == n) {
3505 Session::route_name_internal (string n) const
3507 if (auditioner && auditioner->name() == n) {
3511 if (_click_io && _click_io->name() == n) {
3519 Session::freeze_all (InterThreadInfo& itt)
3521 boost::shared_ptr<RouteList> r = routes.reader ();
3523 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3525 boost::shared_ptr<Track> t;
3527 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3528 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3538 boost::shared_ptr<Region>
3539 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
3540 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3541 InterThreadInfo& itt, bool enable_processing)
3543 boost::shared_ptr<Region> result;
3544 boost::shared_ptr<Playlist> playlist;
3545 boost::shared_ptr<AudioFileSource> fsource;
3547 char buf[PATH_MAX+1];
3548 ChanCount diskstream_channels (track.n_channels());
3549 framepos_t position;
3550 framecnt_t this_chunk;
3553 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3554 const string sound_dir = sdir.sound_path().to_string();
3555 framepos_t len = end - start;
3556 bool need_block_size_reset = false;
3558 ChanCount const max_proc = track.max_processor_streams ();
3561 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3562 end, start) << endmsg;
3566 const framecnt_t chunk_size = (256 * 1024)/4;
3568 // block all process callback handling
3570 block_processing ();
3572 /* call tree *MUST* hold route_lock */
3574 if ((playlist = track.playlist()) == 0) {
3578 /* external redirects will be a problem */
3580 if (track.has_external_redirects()) {
3584 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3586 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
3588 for (x = 0; x < 99999; ++x) {
3589 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());
3590 if (access (buf, F_OK) != 0) {
3596 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3601 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
3602 SourceFactory::createWritable (DataType::AUDIO, *this, buf, string(), false, frame_rate()));
3605 catch (failed_constructor& err) {
3606 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
3610 srcs.push_back (fsource);
3613 /* tell redirects that care that we are about to use a much larger blocksize */
3615 need_block_size_reset = true;
3616 track.set_block_size (chunk_size);
3618 /* XXX need to flush all redirects */
3623 /* create a set of reasonably-sized buffers */
3624 buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
3625 buffers.set_count (max_proc);
3627 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3628 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3630 afs->prepare_for_peakfile_writes ();
3633 while (to_do && !itt.cancel) {
3635 this_chunk = min (to_do, chunk_size);
3637 if (track.export_stuff (buffers, start, this_chunk, enable_processing)) {
3642 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
3643 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3646 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
3652 start += this_chunk;
3653 to_do -= this_chunk;
3655 itt.progress = (float) (1.0 - ((double) to_do / len));
3664 xnow = localtime (&now);
3666 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3667 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3670 afs->update_header (position, *xnow, now);
3671 afs->flush_header ();
3675 /* construct a region to represent the bounced material */
3679 plist.add (Properties::start, 0);
3680 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
3681 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
3683 result = RegionFactory::create (srcs, plist);
3689 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3690 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3693 afs->mark_for_remove ();
3696 (*src)->drop_references ();
3700 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3701 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3704 afs->done_with_peakfile_writes ();
3709 if (need_block_size_reset) {
3710 track.set_block_size (get_block_size());
3713 unblock_processing ();
3719 Session::gain_automation_buffer() const
3721 return ProcessThread::gain_automation_buffer ();
3725 Session::pan_automation_buffer() const
3727 return ProcessThread::pan_automation_buffer ();
3731 Session::get_silent_buffers (ChanCount count)
3733 return ProcessThread::get_silent_buffers (count);
3737 Session::get_scratch_buffers (ChanCount count)
3739 return ProcessThread::get_scratch_buffers (count);
3743 Session::get_mix_buffers (ChanCount count)
3745 return ProcessThread::get_mix_buffers (count);
3749 Session::ntracks () const
3752 boost::shared_ptr<RouteList> r = routes.reader ();
3754 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3755 if (boost::dynamic_pointer_cast<Track> (*i)) {
3764 Session::nbusses () const
3767 boost::shared_ptr<RouteList> r = routes.reader ();
3769 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3770 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
3779 Session::add_automation_list(AutomationList *al)
3781 automation_lists[al->id()] = al;
3785 Session::sync_order_keys (std::string const & base)
3787 if (deletion_in_progress()) {
3791 if (!Config->get_sync_all_route_ordering()) {
3792 /* leave order keys as they are */
3796 boost::shared_ptr<RouteList> r = routes.reader ();
3798 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3799 (*i)->sync_order_keys (base);
3802 Route::SyncOrderKeys (base); // EMIT SIGNAL
3804 /* this might not do anything */
3806 set_remote_control_ids ();
3809 /** @return true if there is at least one record-enabled track, otherwise false */
3811 Session::have_rec_enabled_track () const
3813 return g_atomic_int_get (&_have_rec_enabled_track) == 1;
3816 /** Update the state of our rec-enabled tracks flag */
3818 Session::update_have_rec_enabled_track ()
3820 boost::shared_ptr<RouteList> rl = routes.reader ();
3821 RouteList::iterator i = rl->begin();
3822 while (i != rl->end ()) {
3824 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3825 if (tr && tr->record_enabled ()) {
3832 int const old = g_atomic_int_get (&_have_rec_enabled_track);
3834 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
3836 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
3837 RecordStateChanged (); /* EMIT SIGNAL */
3842 Session::listen_position_changed ()
3844 boost::shared_ptr<RouteList> r = routes.reader ();
3846 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3847 (*i)->listen_position_changed ();
3852 Session::solo_control_mode_changed ()
3854 /* cancel all solo or all listen when solo control mode changes */
3857 set_solo (get_routes(), false);
3858 } else if (listening()) {
3859 set_listen (get_routes(), false);
3863 /** Called when anything about any of our route groups changes (membership, state etc.) */
3865 Session::route_group_changed ()
3867 RouteGroupChanged (); /* EMIT SIGNAL */
3871 Session::get_available_sync_options () const
3873 vector<SyncSource> ret;
3875 ret.push_back (JACK);
3876 ret.push_back (MTC);
3877 ret.push_back (MIDIClock);
3882 boost::shared_ptr<RouteList>
3883 Session::get_routes_with_regions_at (framepos_t const p) const
3885 boost::shared_ptr<RouteList> r = routes.reader ();
3886 boost::shared_ptr<RouteList> rl (new RouteList);
3888 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3889 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3894 boost::shared_ptr<Playlist> pl = tr->playlist ();
3899 if (pl->has_region_at (p)) {
3908 Session::goto_end ()
3910 if (_session_range_location) {
3911 request_locate (_session_range_location->end(), false);
3913 request_locate (0, false);
3918 Session::goto_start ()
3920 if (_session_range_location) {
3921 request_locate (_session_range_location->start(), false);
3923 request_locate (0, false);
3928 Session::current_start_frame () const
3930 return _session_range_location ? _session_range_location->start() : 0;
3934 Session::current_end_frame () const
3936 return _session_range_location ? _session_range_location->end() : 0;
3940 Session::add_session_range_location (framepos_t start, framepos_t end)
3942 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
3943 _locations->add (_session_range_location);
3946 /** Called when one of our routes' order keys has changed */
3948 Session::route_order_key_changed ()
3950 RouteOrderKeyChanged (); /* EMIT SIGNAL */
3954 Session::step_edit_status_change (bool yn)
3960 send = (_step_editors == 0);
3965 send = (_step_editors == 1);
3968 if (_step_editors > 0) {
3974 StepEditStatusChange (val);
3980 Session::start_time_changed (framepos_t old)
3982 /* Update the auto loop range to match the session range
3983 (unless the auto loop range has been changed by the user)
3986 Location* s = _locations->session_range_location ();
3991 Location* l = _locations->auto_loop_location ();
3993 if (l->start() == old) {
3994 l->set_start (s->start(), true);
3999 Session::end_time_changed (framepos_t old)
4001 /* Update the auto loop range to match the session range
4002 (unless the auto loop range has been changed by the user)
4005 Location* s = _locations->session_range_location ();
4010 Location* l = _locations->auto_loop_location ();
4012 if (l->end() == old) {
4013 l->set_end (s->end(), true);
4018 Session::source_search_path (DataType type) const
4022 if (session_dirs.size() == 1) {
4024 case DataType::AUDIO:
4025 search_path = _session_dir->sound_path().to_string();
4027 case DataType::MIDI:
4028 search_path = _session_dir->midi_path().to_string();
4032 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4033 SessionDirectory sdir (i->path);
4034 if (!search_path.empty()) {
4038 case DataType::AUDIO:
4039 search_path += sdir.sound_path().to_string();
4041 case DataType::MIDI:
4042 search_path += sdir.midi_path().to_string();
4048 /* now add user-specified locations
4051 vector<string> dirs;
4054 case DataType::AUDIO:
4055 split (config.get_audio_search_path (), dirs, ':');
4057 case DataType::MIDI:
4058 split (config.get_midi_search_path (), dirs, ':');
4062 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4072 Session::ensure_search_path_includes (const string& path, DataType type)
4075 vector<string> dirs;
4082 case DataType::AUDIO:
4083 search_path = config.get_audio_search_path ();
4085 case DataType::MIDI:
4086 search_path = config.get_midi_search_path ();
4090 split (search_path, dirs, ':');
4092 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4098 if (!search_path.empty()) {
4102 search_path += path;
4105 case DataType::AUDIO:
4106 config.set_audio_search_path (search_path);
4108 case DataType::MIDI:
4109 config.set_midi_search_path (search_path);
4114 boost::shared_ptr<Speakers>
4115 Session::get_speakers()
4121 Session::unknown_processors () const
4125 boost::shared_ptr<RouteList> r = routes.reader ();
4126 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4127 list<string> t = (*i)->unknown_processors ();
4128 copy (t.begin(), t.end(), back_inserter (p));
4138 Session::update_latency (bool playback)
4140 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
4142 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4146 boost::shared_ptr<RouteList> r = routes.reader ();
4147 framecnt_t max_latency = 0;
4150 /* reverse the list so that we work backwards from the last route to run to the first */
4151 reverse (r->begin(), r->end());
4154 /* compute actual latency values for the given direction and store them all in per-port
4155 structures. this will also publish the same values (to JACK) so that computation of latency
4156 for routes can consistently use public latency values.
4159 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4160 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
4165 post_playback_latency ();
4167 /* because we latency compensate playback, our published playback latencies should
4168 be the same for all output ports - all material played back by ardour has
4169 the same latency, whether its caused by plugins or by latency compensation. since
4170 these may differ from the values computed above, reset all playback port latencies
4174 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
4176 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4177 (*i)->set_public_port_latencies (max_latency, playback);
4184 post_capture_latency ();
4187 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
4191 Session::post_playback_latency ()
4193 set_worst_playback_latency ();
4195 boost::shared_ptr<RouteList> r = routes.reader ();
4196 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4197 if (!(*i)->is_hidden() && ((*i)->active())) {
4198 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
4201 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4202 (*i)->set_latency_compensation (_worst_track_latency);
4208 Session::post_capture_latency ()
4210 set_worst_capture_latency ();
4212 /* reflect any changes in capture latencies into capture offsets
4215 boost::shared_ptr<RouteList> rl = routes.reader();
4216 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4217 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4219 tr->set_capture_offset ();
4225 Session::set_worst_io_latencies ()
4227 set_worst_playback_latency ();
4228 set_worst_capture_latency ();
4232 Session::set_worst_playback_latency ()
4234 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4238 _worst_output_latency = 0;
4240 if (!_engine.connected()) {
4244 boost::shared_ptr<RouteList> r = routes.reader ();
4246 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4247 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
4250 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
4254 Session::set_worst_capture_latency ()
4256 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4260 _worst_input_latency = 0;
4262 if (!_engine.connected()) {
4266 boost::shared_ptr<RouteList> r = routes.reader ();
4268 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4269 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
4272 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
4276 Session::update_latency_compensation (bool force_whole_graph)
4278 bool update_jack = false;
4280 if (_state_of_the_state & Deletion) {
4284 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
4286 _worst_track_latency = 0;
4288 boost::shared_ptr<RouteList> r = routes.reader ();
4290 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4291 if (!(*i)->is_hidden() && ((*i)->active())) {
4293 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
4296 _worst_track_latency = max (tl, _worst_track_latency);
4300 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
4301 (update_jack ? "yes" : "no")));
4303 if (force_whole_graph || update_jack) {
4304 /* trigger a full recompute of latency numbers for the graph.
4305 everything else that we need to do will be done in the latency
4308 _engine.update_total_latencies ();
4309 return; // everything else will be done in the latency callback
4314 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n")