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.
682 Note that in an existing session, the internal sends will
683 already exist, but we want the routes to notice that
684 they connect to the control out specifically.
688 boost::shared_ptr<RouteList> r = routes.reader ();
689 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
691 if ((*x)->is_monitor()) {
695 } else if ((*x)->is_master()) {
701 (*x)->listen_via_monitor ();
706 /* Anyone who cares about input state, wake up and do something */
708 IOConnectionsComplete (); /* EMIT SIGNAL */
710 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
712 /* now handle the whole enchilada as if it was one
718 /* update the full solo state, which can't be
719 correctly determined on a per-route basis, but
720 needs the global overview that only the session
724 update_route_solo_state ();
728 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
730 boost::shared_ptr<Track> track = wp.lock ();
735 boost::shared_ptr<Playlist> playlist;
737 if ((playlist = track->playlist()) != 0) {
738 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
739 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
740 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
745 Session::record_enabling_legal () const
747 /* this used to be in here, but survey says.... we don't need to restrict it */
748 // if (record_status() == Recording) {
752 if (Config->get_all_safe()) {
759 Session::set_track_monitor_input_status (bool yn)
761 boost::shared_ptr<RouteList> rl = routes.reader ();
762 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
763 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
764 if (tr && tr->record_enabled ()) {
765 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
766 tr->monitor_input (yn);
772 Session::reset_input_monitor_state ()
774 if (transport_rolling()) {
775 set_track_monitor_input_status (Config->get_monitoring_model() == HardwareMonitoring && !config.get_auto_input());
777 set_track_monitor_input_status (Config->get_monitoring_model() == HardwareMonitoring);
782 Session::auto_punch_start_changed (Location* location)
784 replace_event (SessionEvent::PunchIn, location->start());
786 if (get_record_enabled() && config.get_punch_in()) {
787 /* capture start has been changed, so save new pending state */
788 save_state ("", true);
793 Session::auto_punch_end_changed (Location* location)
795 framepos_t when_to_stop = location->end();
796 // when_to_stop += _worst_output_latency + _worst_input_latency;
797 replace_event (SessionEvent::PunchOut, when_to_stop);
801 Session::auto_punch_changed (Location* location)
803 framepos_t when_to_stop = location->end();
805 replace_event (SessionEvent::PunchIn, location->start());
806 //when_to_stop += _worst_output_latency + _worst_input_latency;
807 replace_event (SessionEvent::PunchOut, when_to_stop);
811 Session::auto_loop_changed (Location* location)
813 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
815 if (transport_rolling() && play_loop) {
818 // if (_transport_frame > location->end()) {
820 if (_transport_frame < location->start() || _transport_frame > location->end()) {
821 // relocate to beginning of loop
822 clear_events (SessionEvent::LocateRoll);
824 request_locate (location->start(), true);
827 else if (Config->get_seamless_loop() && !loop_changing) {
829 // schedule a locate-roll to refill the diskstreams at the
831 loop_changing = true;
833 if (location->end() > last_loopend) {
834 clear_events (SessionEvent::LocateRoll);
835 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
842 last_loopend = location->end();
846 Session::set_auto_punch_location (Location* location)
850 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
851 punch_connections.drop_connections();
852 existing->set_auto_punch (false, this);
853 remove_event (existing->start(), SessionEvent::PunchIn);
854 clear_events (SessionEvent::PunchOut);
855 auto_punch_location_changed (0);
864 if (location->end() <= location->start()) {
865 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
869 punch_connections.drop_connections ();
871 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
872 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
873 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
875 location->set_auto_punch (true, this);
877 auto_punch_changed (location);
879 auto_punch_location_changed (location);
883 Session::set_auto_loop_location (Location* location)
887 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
888 loop_connections.drop_connections ();
889 existing->set_auto_loop (false, this);
890 remove_event (existing->end(), SessionEvent::AutoLoop);
891 auto_loop_location_changed (0);
900 if (location->end() <= location->start()) {
901 error << _("Session: you can't use a mark for auto loop") << endmsg;
905 last_loopend = location->end();
907 loop_connections.drop_connections ();
909 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
910 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
911 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
913 location->set_auto_loop (true, this);
915 /* take care of our stuff first */
917 auto_loop_changed (location);
919 /* now tell everyone else */
921 auto_loop_location_changed (location);
925 Session::locations_added (Location *)
931 Session::locations_changed ()
933 _locations->apply (*this, &Session::handle_locations_changed);
937 Session::handle_locations_changed (Locations::LocationList& locations)
939 Locations::LocationList::iterator i;
941 bool set_loop = false;
942 bool set_punch = false;
944 for (i = locations.begin(); i != locations.end(); ++i) {
948 if (location->is_auto_punch()) {
949 set_auto_punch_location (location);
952 if (location->is_auto_loop()) {
953 set_auto_loop_location (location);
957 if (location->is_session_range()) {
958 _session_range_location = location;
963 set_auto_loop_location (0);
966 set_auto_punch_location (0);
973 Session::enable_record ()
976 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
978 if (rs == Recording) {
982 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
984 _last_record_location = _transport_frame;
985 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
987 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
988 set_track_monitor_input_status (true);
991 RecordStateChanged ();
998 Session::disable_record (bool rt_context, bool force)
1002 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1004 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1005 g_atomic_int_set (&_record_status, Disabled);
1006 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1008 if (rs == Recording) {
1009 g_atomic_int_set (&_record_status, Enabled);
1013 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1014 set_track_monitor_input_status (false);
1017 RecordStateChanged (); /* emit signal */
1020 remove_pending_capture_state ();
1026 Session::step_back_from_record ()
1028 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1030 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1031 set_track_monitor_input_status (false);
1037 Session::maybe_enable_record ()
1039 if (_step_editors > 0) {
1043 g_atomic_int_set (&_record_status, Enabled);
1045 /* This function is currently called from somewhere other than an RT thread.
1046 This save_state() call therefore doesn't impact anything. Doing it here
1047 means that we save pending state of which sources the next record will use,
1048 which gives us some chance of recovering from a crash during the record.
1051 save_state ("", true);
1053 if (_transport_speed) {
1054 if (!config.get_punch_in()) {
1058 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1059 RecordStateChanged (); /* EMIT SIGNAL */
1066 Session::audible_frame () const
1072 /* the first of these two possible settings for "offset"
1073 mean that the audible frame is stationary until
1074 audio emerges from the latency compensation
1077 the second means that the audible frame is stationary
1078 until audio would emerge from a physical port
1079 in the absence of any plugin latency compensation
1082 offset = worst_playback_latency ();
1084 if (offset > current_block_size) {
1085 offset -= current_block_size;
1087 /* XXX is this correct? if we have no external
1088 physical connections and everything is internal
1089 then surely this is zero? still, how
1090 likely is that anyway?
1092 offset = current_block_size;
1095 if (synced_to_jack()) {
1096 tf = _engine.transport_frame();
1098 tf = _transport_frame;
1103 if (!non_realtime_work_pending()) {
1107 /* Check to see if we have passed the first guaranteed
1108 audible frame past our last start position. if not,
1109 return that last start point because in terms
1110 of audible frames, we have not moved yet.
1112 `Start position' in this context means the time we last
1113 either started or changed transport direction.
1116 if (_transport_speed > 0.0f) {
1118 if (!play_loop || !have_looped) {
1119 if (tf < _last_roll_or_reversal_location + offset) {
1120 return _last_roll_or_reversal_location;
1128 } else if (_transport_speed < 0.0f) {
1130 /* XXX wot? no backward looping? */
1132 if (tf > _last_roll_or_reversal_location - offset) {
1133 return _last_roll_or_reversal_location;
1145 Session::set_frame_rate (framecnt_t frames_per_second)
1147 /** \fn void Session::set_frame_size(framecnt_t)
1148 the AudioEngine object that calls this guarantees
1149 that it will not be called while we are also in
1150 ::process(). Its fine to do things that block
1154 _base_frame_rate = frames_per_second;
1158 Automatable::set_automation_interval (ceil ((double) frames_per_second * (0.001 * Config->get_automation_interval())));
1162 // XXX we need some equivalent to this, somehow
1163 // SndFileSource::setup_standard_crossfades (frames_per_second);
1167 /* XXX need to reset/reinstantiate all LADSPA plugins */
1171 Session::set_block_size (pframes_t nframes)
1173 /* the AudioEngine guarantees
1174 that it will not be called while we are also in
1175 ::process(). It is therefore fine to do things that block
1180 current_block_size = nframes;
1184 boost::shared_ptr<RouteList> r = routes.reader ();
1186 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1187 (*i)->set_block_size (nframes);
1190 boost::shared_ptr<RouteList> rl = routes.reader ();
1191 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1192 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1194 tr->set_block_size (nframes);
1198 set_worst_io_latencies ();
1202 struct RouteSorter {
1203 /** @return true to run r1 before r2, otherwise false */
1204 bool operator() (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> r2) {
1205 if (r2->feeds (r1)) {
1206 /* r1 fed by r2; run r2 early */
1208 } else if (r1->feeds (r2)) {
1209 /* r2 fed by r1; run r1 early */
1212 if (r1->not_fed ()) {
1213 if (r2->not_fed ()) {
1214 /* no ardour-based connections inbound to either route. just use signal order */
1215 return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1217 /* r2 has connections, r1 does not; run r1 early */
1221 if (r2->not_fed()) {
1222 /* r1 has connections, r2 does not; run r2 early */
1225 /* both r1 and r2 have connections, but not to each other. just use signal order */
1226 return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1234 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1236 boost::shared_ptr<Route> r2;
1238 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1239 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1243 /* make a copy of the existing list of routes that feed r1 */
1245 Route::FedBy existing (r1->fed_by());
1247 /* for each route that feeds r1, recurse, marking it as feeding
1251 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1252 if (!(r2 = i->r.lock ())) {
1253 /* (*i) went away, ignore it */
1257 /* r2 is a route that feeds r1 which somehow feeds base. mark
1258 base as being fed by r2
1261 rbase->add_fed_by (r2, i->sends_only);
1265 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1269 if (r1->feeds (r2) && r2->feeds (r1)) {
1273 /* now recurse, so that we can mark base as being fed by
1274 all routes that feed r2
1277 trace_terminal (r2, rbase);
1284 Session::resort_routes ()
1286 /* don't do anything here with signals emitted
1287 by Routes while we are being destroyed.
1290 if (_state_of_the_state & Deletion) {
1295 RCUWriter<RouteList> writer (routes);
1296 boost::shared_ptr<RouteList> r = writer.get_copy ();
1297 resort_routes_using (r);
1298 /* writer goes out of scope and forces update */
1301 //route_graph->dump(1);
1304 boost::shared_ptr<RouteList> rl = routes.reader ();
1305 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1306 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1308 const Route::FedBy& fb ((*i)->fed_by());
1310 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1311 boost::shared_ptr<Route> sf = f->r.lock();
1313 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1321 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1323 RouteList::iterator i, j;
1325 for (i = r->begin(); i != r->end(); ++i) {
1327 (*i)->clear_fed_by ();
1329 for (j = r->begin(); j != r->end(); ++j) {
1331 /* although routes can feed themselves, it will
1332 cause an endless recursive descent if we
1333 detect it. so don't bother checking for
1341 bool via_sends_only;
1343 if ((*j)->direct_feeds (*i, &via_sends_only)) {
1344 (*i)->add_fed_by (*j, via_sends_only);
1349 for (i = r->begin(); i != r->end(); ++i) {
1350 trace_terminal (*i, *i);
1356 route_graph->rechain (r);
1359 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1360 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1361 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1362 (*i)->name(), (*i)->order_key ("signal")));
1368 /** Find a route name starting with \a base, maybe followed by the
1369 * lowest \a id. \a id will always be added if \a definitely_add_number
1370 * is true on entry; otherwise it will only be added if required
1371 * to make the name unique.
1373 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1374 * The available route name with the lowest ID will be used, and \a id
1375 * will be set to the ID.
1377 * \return false if a route name could not be found, and \a track_name
1378 * and \a id do not reflect a free route name.
1381 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1383 if (!definitely_add_number && route_by_name (base) == 0) {
1384 /* juse use the base */
1385 snprintf (name, name_len, "%s", base.c_str());
1390 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1392 if (route_by_name (name) == 0) {
1398 } while (id < (UINT_MAX-1));
1403 /** Count the total ins and outs of all non-hidden routes in the session and return them in in and out */
1405 Session::count_existing_route_channels (ChanCount& in, ChanCount& out)
1407 in = ChanCount::ZERO;
1408 out = ChanCount::ZERO;
1410 boost::shared_ptr<RouteList> r = routes.reader ();
1412 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1413 if (!(*i)->is_hidden()) {
1414 in += (*i)->n_inputs();
1415 out += (*i)->n_outputs();
1420 /** Caller must not hold process lock
1421 * @param name_template string to use for the start of the name, or "" to use "Midi".
1423 list<boost::shared_ptr<MidiTrack> >
1424 Session::new_midi_track (TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1426 char track_name[32];
1427 uint32_t track_id = 0;
1429 RouteList new_routes;
1430 list<boost::shared_ptr<MidiTrack> > ret;
1431 uint32_t control_id;
1433 control_id = ntracks() + nbusses();
1435 bool const use_number = (how_many != 1);
1438 if (!find_route_name (name_template.empty() ? _("Midi") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1439 error << "cannot find name for new midi track" << endmsg;
1443 boost::shared_ptr<MidiTrack> track;
1446 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1448 if (track->init ()) {
1452 track->use_new_diskstream();
1454 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1455 boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1458 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1459 if (track->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1460 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1464 if (track->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1465 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1470 track->non_realtime_input_change();
1473 route_group->add (track);
1476 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1477 track->set_remote_control_id (control_id);
1479 new_routes.push_back (track);
1480 ret.push_back (track);
1483 catch (failed_constructor &err) {
1484 error << _("Session: could not create new midi track.") << endmsg;
1488 catch (AudioEngine::PortRegistrationFailure& pfe) {
1490 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;
1498 if (!new_routes.empty()) {
1499 add_routes (new_routes, true, false);
1500 save_state (_current_snapshot_name);
1506 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1507 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1508 * @param output_start As \a input_start, but for outputs.
1511 Session::auto_connect_route (Route* route, ChanCount& existing_inputs, ChanCount& existing_outputs,
1512 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
1514 if (!IO::connecting_legal) {
1518 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::NOT_LOCK);
1524 /* If both inputs and outputs are auto-connected to physical ports,
1525 use the max of input and output offsets to ensure auto-connected
1526 port numbers always match up (e.g. the first audio input and the
1527 first audio output of the route will have the same physical
1528 port number). Otherwise just use the lowest input or output
1532 cerr << "ACR: existing in = " << existing_inputs << " out = " << existing_outputs << endl;
1534 const bool in_out_physical =
1535 (Config->get_input_auto_connect() & AutoConnectPhysical)
1536 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1539 const ChanCount in_offset = existing_inputs;
1541 const ChanCount out_offset = in_out_physical
1542 ? ChanCount::max(existing_inputs, existing_outputs)
1545 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1546 vector<string> physinputs;
1547 vector<string> physoutputs;
1549 _engine.get_physical_outputs (*t, physoutputs);
1550 _engine.get_physical_inputs (*t, physinputs);
1552 if (!physinputs.empty() && connect_inputs) {
1553 uint32_t nphysical_in = physinputs.size();
1555 cerr << "There are " << nphysical_in << " physical inputs of type " << *t << endl;
1557 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1560 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1561 cerr << "Get index " << in_offset.get(*t) << " + " << i << " % " << nphysical_in << " = "
1562 << (in_offset.get(*t) + i) % nphysical_in
1564 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1567 cerr << "Connect route " << route->name() << " IN to " << port << endl;
1569 if (!port.empty() && route->input()->connect (
1570 route->input()->ports().port(*t, i), port, this)) {
1576 if (!physoutputs.empty()) {
1577 uint32_t nphysical_out = physoutputs.size();
1578 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
1581 if (Config->get_output_auto_connect() & AutoConnectPhysical) {
1582 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1583 } else if (Config->get_output_auto_connect() & AutoConnectMaster) {
1584 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1585 port = _master_out->input()->ports().port(*t,
1586 i % _master_out->input()->n_ports().get(*t))->name();
1590 cerr << "Connect route " << route->name() << " OUT to " << port << endl;
1592 if (!port.empty() && route->output()->connect (
1593 route->output()->ports().port(*t, i), port, this)) {
1601 /** Caller must not hold process lock
1602 * @param name_template string to use for the start of the name, or "" to use "Audio".
1604 list< boost::shared_ptr<AudioTrack> >
1605 Session::new_audio_track (
1606 int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template
1609 char track_name[32];
1610 uint32_t track_id = 0;
1612 RouteList new_routes;
1613 list<boost::shared_ptr<AudioTrack> > ret;
1614 uint32_t control_id;
1616 control_id = ntracks() + nbusses() + 1;
1618 bool const use_number = (how_many != 1);
1621 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1622 error << "cannot find name for new audio track" << endmsg;
1626 boost::shared_ptr<AudioTrack> track;
1629 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
1631 if (track->init ()) {
1635 track->use_new_diskstream();
1637 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1638 boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1641 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1643 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1644 error << string_compose (
1645 _("cannot configure %1 in/%2 out configuration for new audio track"),
1646 input_channels, output_channels)
1651 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1652 error << string_compose (
1653 _("cannot configure %1 in/%2 out configuration for new audio track"),
1654 input_channels, output_channels)
1661 route_group->add (track);
1664 track->non_realtime_input_change();
1666 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1667 track->set_remote_control_id (control_id);
1670 new_routes.push_back (track);
1671 ret.push_back (track);
1674 catch (failed_constructor &err) {
1675 error << _("Session: could not create new audio track.") << endmsg;
1679 catch (AudioEngine::PortRegistrationFailure& pfe) {
1681 error << pfe.what() << endmsg;
1689 if (!new_routes.empty()) {
1690 add_routes (new_routes, true, true);
1697 Session::set_remote_control_ids ()
1699 RemoteModel m = Config->get_remote_model();
1700 bool emit_signal = false;
1702 boost::shared_ptr<RouteList> r = routes.reader ();
1704 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1705 if (MixerOrdered == m) {
1706 int32_t order = (*i)->order_key(N_("signal"));
1707 (*i)->set_remote_control_id (order+1, false);
1709 } else if (EditorOrdered == m) {
1710 int32_t order = (*i)->order_key(N_("editor"));
1711 (*i)->set_remote_control_id (order+1, false);
1713 } else if (UserOrdered == m) {
1714 //do nothing ... only changes to remote id's are initiated by user
1719 Route::RemoteControlIDChange();
1723 /** Caller must not hold process lock.
1724 * @param name_template string to use for the start of the name, or "" to use "Bus".
1727 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
1730 uint32_t bus_id = 0;
1733 uint32_t control_id;
1735 control_id = ntracks() + nbusses() + 1;
1737 bool const use_number = (how_many != 1);
1739 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
1740 error << "cannot find name for new audio bus" << endmsg;
1745 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
1751 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1752 boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
1755 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1757 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1758 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1759 input_channels, output_channels)
1765 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1766 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1767 input_channels, output_channels)
1774 route_group->add (bus);
1776 bus->set_remote_control_id (control_id);
1779 bus->add_internal_return ();
1781 ret.push_back (bus);
1785 catch (failed_constructor &err) {
1786 error << _("Session: could not create new audio route.") << endmsg;
1790 catch (AudioEngine::PortRegistrationFailure& pfe) {
1791 error << pfe.what() << endmsg;
1801 add_routes (ret, true, true);
1809 Session::new_route_from_template (uint32_t how_many, const std::string& template_path)
1813 uint32_t control_id;
1815 uint32_t number = 0;
1817 if (!tree.read (template_path.c_str())) {
1821 XMLNode* node = tree.root();
1823 control_id = ntracks() + nbusses() + 1;
1827 XMLNode node_copy (*node); // make a copy so we can change the name if we need to
1829 std::string node_name = IO::name_from_state (*node_copy.children().front());
1831 /* generate a new name by adding a number to the end of the template name */
1832 if (!find_route_name (node_name.c_str(), ++number, name, sizeof(name), true)) {
1833 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
1837 /* set IO children to use the new name */
1838 XMLNodeList const & children = node_copy.children ();
1839 for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
1840 if ((*i)->name() == IO::state_node_name) {
1841 IO::set_name_in_state (**i, name);
1845 Track::zero_diskstream_id_in_xml (node_copy);
1848 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
1851 error << _("Session: cannot create track/bus from template description") << endmsg;
1855 if (boost::dynamic_pointer_cast<Track>(route)) {
1856 /* force input/output change signals so that the new diskstream
1857 picks up the configuration of the route. During session
1858 loading this normally happens in a different way.
1861 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1863 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
1864 change.after = route->input()->n_ports();
1865 route->input()->changed (change, this);
1866 change.after = route->output()->n_ports();
1867 route->output()->changed (change, this);
1870 route->set_remote_control_id (control_id);
1873 ret.push_back (route);
1876 catch (failed_constructor &err) {
1877 error << _("Session: could not create new route from template") << endmsg;
1881 catch (AudioEngine::PortRegistrationFailure& pfe) {
1882 error << pfe.what() << endmsg;
1891 add_routes (ret, true, true);
1898 Session::add_routes (RouteList& new_routes, bool auto_connect, bool save)
1901 RCUWriter<RouteList> writer (routes);
1902 boost::shared_ptr<RouteList> r = writer.get_copy ();
1903 r->insert (r->end(), new_routes.begin(), new_routes.end());
1906 /* if there is no control out and we're not in the middle of loading,
1907 resort the graph here. if there is a control out, we will resort
1908 toward the end of this method. if we are in the middle of loading,
1909 we will resort when done.
1912 if (!_monitor_out && IO::connecting_legal) {
1913 resort_routes_using (r);
1917 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
1919 boost::weak_ptr<Route> wpr (*x);
1920 boost::shared_ptr<Route> r (*x);
1922 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
1923 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
1924 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
1925 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
1926 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
1927 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
1928 r->order_key_changed.connect_same_thread (*this, boost::bind (&Session::route_order_key_changed, this));
1930 if (r->is_master()) {
1934 if (r->is_monitor()) {
1938 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
1940 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
1941 track_playlist_changed (boost::weak_ptr<Track> (tr));
1942 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
1944 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
1946 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
1952 ChanCount existing_inputs;
1953 ChanCount existing_outputs;
1955 count_existing_route_channels (existing_inputs, existing_outputs);
1957 auto_connect_route (r, existing_inputs, existing_outputs, true);
1961 if (_monitor_out && IO::connecting_legal) {
1963 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
1964 if ((*x)->is_monitor()) {
1966 } else if ((*x)->is_master()) {
1969 (*x)->listen_via_monitor ();
1979 save_state (_current_snapshot_name);
1982 RouteAdded (new_routes); /* EMIT SIGNAL */
1983 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
1987 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
1989 boost::shared_ptr<RouteList> r = routes.reader ();
1990 boost::shared_ptr<Send> s;
1992 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1993 if ((s = (*i)->internal_send_for (dest)) != 0) {
1994 s->amp()->gain_control()->set_value (0.0);
2000 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2002 boost::shared_ptr<RouteList> r = routes.reader ();
2003 boost::shared_ptr<Send> s;
2005 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2006 if ((s = (*i)->internal_send_for (dest)) != 0) {
2007 s->amp()->gain_control()->set_value (1.0);
2013 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2015 boost::shared_ptr<RouteList> r = routes.reader ();
2016 boost::shared_ptr<Send> s;
2018 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2019 if ((s = (*i)->internal_send_for (dest)) != 0) {
2020 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2025 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2027 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2029 boost::shared_ptr<RouteList> r = routes.reader ();
2030 boost::shared_ptr<RouteList> t (new RouteList);
2032 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2033 if (include_buses || boost::dynamic_pointer_cast<Track>(*i)) {
2038 add_internal_sends (dest, p, t);
2042 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2044 if (dest->is_monitor() || dest->is_master()) {
2048 if (!dest->internal_return()) {
2049 dest->add_internal_return();
2052 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2054 if ((*i)->is_monitor() || (*i)->is_master() || (*i) == dest) {
2058 (*i)->listen_via (dest, p);
2065 Session::remove_route (boost::shared_ptr<Route> route)
2067 if (((route == _master_out) || (route == _monitor_out)) && !Config->get_allow_special_bus_removal()) {
2071 route->set_solo (false, this);
2074 RCUWriter<RouteList> writer (routes);
2075 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2079 /* deleting the master out seems like a dumb
2080 idea, but its more of a UI policy issue
2084 if (route == _master_out) {
2085 _master_out = boost::shared_ptr<Route> ();
2088 if (route == _monitor_out) {
2090 /* cancel control outs for all routes */
2092 for (RouteList::iterator r = rs->begin(); r != rs->end(); ++r) {
2093 (*r)->drop_listen (_monitor_out);
2096 _monitor_out.reset ();
2099 /* writer goes out of scope, forces route list update */
2102 update_route_solo_state ();
2104 // We need to disconnect the route's inputs and outputs
2106 route->input()->disconnect (0);
2107 route->output()->disconnect (0);
2109 /* if the route had internal sends sending to it, remove them */
2110 if (route->internal_return()) {
2112 boost::shared_ptr<RouteList> r = routes.reader ();
2113 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2114 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2116 (*i)->remove_processor (s);
2121 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2122 if (mt && mt->step_editing()) {
2123 if (_step_editors > 0) {
2128 update_latency_compensation ();
2131 /* Re-sort routes to remove the graph's current references to the one that is
2132 * going away, then flush old references out of the graph.
2136 route_graph->clear_other_chain ();
2138 /* get rid of it from the dead wood collection in the route list manager */
2140 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2144 /* try to cause everyone to drop their references */
2146 route->drop_references ();
2148 sync_order_keys (N_("session"));
2150 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2152 /* save the new state of the world */
2154 if (save_state (_current_snapshot_name)) {
2155 save_history (_current_snapshot_name);
2160 Session::route_mute_changed (void* /*src*/)
2166 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2168 boost::shared_ptr<Route> route = wpr.lock();
2170 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2174 if (route->listening_via_monitor ()) {
2176 if (Config->get_exclusive_solo()) {
2177 /* new listen: disable all other listen */
2178 boost::shared_ptr<RouteList> r = routes.reader ();
2179 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2180 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2183 (*i)->set_listen (false, this);
2189 } else if (_listen_cnt > 0) {
2194 update_route_solo_state ();
2197 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2199 boost::shared_ptr<Route> route = wpr.lock ();
2202 /* should not happen */
2203 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2207 bool send_changed = false;
2209 if (route->solo_isolated()) {
2210 if (_solo_isolated_cnt == 0) {
2211 send_changed = true;
2213 _solo_isolated_cnt++;
2214 } else if (_solo_isolated_cnt > 0) {
2215 _solo_isolated_cnt--;
2216 if (_solo_isolated_cnt == 0) {
2217 send_changed = true;
2222 IsolatedChanged (); /* EMIT SIGNAL */
2227 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2229 if (!self_solo_change) {
2230 // session doesn't care about changes to soloed-by-others
2234 if (solo_update_disabled) {
2239 boost::shared_ptr<Route> route = wpr.lock ();
2242 /* should not happen */
2243 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2247 boost::shared_ptr<RouteList> r = routes.reader ();
2250 if (route->self_soloed()) {
2256 if (delta == 1 && Config->get_exclusive_solo()) {
2257 /* new solo: disable all other solos */
2258 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2259 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2262 (*i)->set_solo (false, this);
2266 solo_update_disabled = true;
2268 RouteList uninvolved;
2270 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2271 bool via_sends_only;
2272 bool in_signal_flow;
2274 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2278 in_signal_flow = false;
2280 if ((*i)->feeds (route, &via_sends_only)) {
2281 if (!via_sends_only) {
2282 if (!route->soloed_by_others_upstream()) {
2283 (*i)->mod_solo_by_others_downstream (delta);
2285 in_signal_flow = true;
2289 if (route->feeds (*i, &via_sends_only)) {
2290 (*i)->mod_solo_by_others_upstream (delta);
2291 in_signal_flow = true;
2294 if (!in_signal_flow) {
2295 uninvolved.push_back (*i);
2299 solo_update_disabled = false;
2300 update_route_solo_state (r);
2302 /* now notify that the mute state of the routes not involved in the signal
2303 pathway of the just-solo-changed route may have altered.
2306 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2307 (*i)->mute_changed (this);
2310 SoloChanged (); /* EMIT SIGNAL */
2315 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2317 /* now figure out if anything that matters is soloed (or is "listening")*/
2319 bool something_soloed = false;
2320 uint32_t listeners = 0;
2321 uint32_t isolated = 0;
2324 r = routes.reader();
2327 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2328 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2329 something_soloed = true;
2332 if (!(*i)->is_hidden() && (*i)->listening_via_monitor()) {
2333 if (Config->get_solo_control_is_listen_control()) {
2336 (*i)->set_listen (false, this);
2340 if ((*i)->solo_isolated()) {
2345 if (something_soloed != _non_soloed_outs_muted) {
2346 _non_soloed_outs_muted = something_soloed;
2347 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2350 _listen_cnt = listeners;
2352 if (isolated != _solo_isolated_cnt) {
2353 _solo_isolated_cnt = isolated;
2354 IsolatedChanged (); /* EMIT SIGNAL */
2358 boost::shared_ptr<RouteList>
2359 Session::get_routes_with_internal_returns() const
2361 boost::shared_ptr<RouteList> r = routes.reader ();
2362 boost::shared_ptr<RouteList> rl (new RouteList);
2364 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2365 if ((*i)->internal_return ()) {
2373 Session::io_name_is_legal (const std::string& name)
2375 boost::shared_ptr<RouteList> r = routes.reader ();
2377 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2378 if ((*i)->name() == name) {
2382 if ((*i)->has_io_processor_named (name)) {
2390 boost::shared_ptr<Route>
2391 Session::route_by_name (string name)
2393 boost::shared_ptr<RouteList> r = routes.reader ();
2395 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2396 if ((*i)->name() == name) {
2401 return boost::shared_ptr<Route> ((Route*) 0);
2404 boost::shared_ptr<Route>
2405 Session::route_by_id (PBD::ID id)
2407 boost::shared_ptr<RouteList> r = routes.reader ();
2409 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2410 if ((*i)->id() == id) {
2415 return boost::shared_ptr<Route> ((Route*) 0);
2418 boost::shared_ptr<Route>
2419 Session::route_by_remote_id (uint32_t id)
2421 boost::shared_ptr<RouteList> r = routes.reader ();
2423 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2424 if ((*i)->remote_control_id() == id) {
2429 return boost::shared_ptr<Route> ((Route*) 0);
2433 Session::playlist_region_added (boost::weak_ptr<Region> w)
2435 boost::shared_ptr<Region> r = w.lock ();
2440 /* These are the operations that are currently in progress... */
2441 list<GQuark> curr = _current_trans_quarks;
2444 /* ...and these are the operations during which we want to update
2445 the session range location markers.
2448 ops.push_back (Operations::capture);
2449 ops.push_back (Operations::paste);
2450 ops.push_back (Operations::duplicate_region);
2451 ops.push_back (Operations::insert_file);
2452 ops.push_back (Operations::insert_region);
2453 ops.push_back (Operations::drag_region_brush);
2454 ops.push_back (Operations::region_drag);
2455 ops.push_back (Operations::selection_grab);
2456 ops.push_back (Operations::region_fill);
2457 ops.push_back (Operations::fill_selection);
2458 ops.push_back (Operations::create_region);
2461 /* See if any of the current operations match the ones that we want */
2463 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
2465 /* If so, update the session range markers */
2467 maybe_update_session_range (r->position (), r->last_frame ());
2471 /** Update the session range markers if a is before the current start or
2472 * b is after the current end.
2475 Session::maybe_update_session_range (framepos_t a, framepos_t b)
2477 if (_state_of_the_state & Loading) {
2481 if (_session_range_location == 0) {
2483 add_session_range_location (a, b);
2487 if (a < _session_range_location->start()) {
2488 _session_range_location->set_start (a);
2491 if (b > _session_range_location->end()) {
2492 _session_range_location->set_end (b);
2498 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
2500 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2501 maybe_update_session_range (i->to, i->to + i->length);
2506 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
2508 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2509 maybe_update_session_range (i->from, i->to);
2513 /* Region management */
2515 boost::shared_ptr<Region>
2516 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2518 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2519 RegionFactory::RegionMap::const_iterator i;
2520 boost::shared_ptr<Region> region;
2522 Glib::Mutex::Lock lm (region_lock);
2524 for (i = regions.begin(); i != regions.end(); ++i) {
2528 if (region->whole_file()) {
2530 if (child->source_equivalent (region)) {
2536 return boost::shared_ptr<Region> ();
2540 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2542 set<boost::shared_ptr<Region> > relevant_regions;
2544 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2545 RegionFactory::get_regions_using_source (*s, relevant_regions);
2548 cerr << "There are " << relevant_regions.size() << " using " << srcs.size() << " sources" << endl;
2550 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2551 set<boost::shared_ptr<Region> >::iterator tmp;
2556 cerr << "Cleanup " << (*r)->name() << " UC = " << (*r).use_count() << endl;
2558 playlists->destroy_region (*r);
2559 RegionFactory::map_remove (*r);
2561 (*r)->drop_sources ();
2562 (*r)->drop_references ();
2564 cerr << "\tdone UC = " << (*r).use_count() << endl;
2566 relevant_regions.erase (r);
2571 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
2574 Glib::Mutex::Lock ls (source_lock);
2575 /* remove from the main source list */
2576 sources.erase ((*s)->id());
2579 (*s)->mark_for_remove ();
2580 (*s)->drop_references ();
2589 Session::remove_last_capture ()
2591 list<boost::shared_ptr<Source> > srcs;
2593 boost::shared_ptr<RouteList> rl = routes.reader ();
2594 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2595 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2600 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
2603 srcs.insert (srcs.end(), l.begin(), l.end());
2608 destroy_sources (srcs);
2610 save_state (_current_snapshot_name);
2615 /* Source Management */
2618 Session::add_source (boost::shared_ptr<Source> source)
2620 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
2621 pair<SourceMap::iterator,bool> result;
2623 entry.first = source->id();
2624 entry.second = source;
2627 Glib::Mutex::Lock lm (source_lock);
2628 result = sources.insert (entry);
2631 if (result.second) {
2633 /* yay, new source */
2637 boost::shared_ptr<AudioFileSource> afs;
2639 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
2640 if (Config->get_auto_analyse_audio()) {
2641 Analyser::queue_source_for_analysis (source, false);
2645 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
2650 Session::remove_source (boost::weak_ptr<Source> src)
2652 if (_state_of_the_state & Deletion) {
2656 SourceMap::iterator i;
2657 boost::shared_ptr<Source> source = src.lock();
2664 Glib::Mutex::Lock lm (source_lock);
2666 if ((i = sources.find (source->id())) != sources.end()) {
2671 if (!_state_of_the_state & InCleanup) {
2673 /* save state so we don't end up with a session file
2674 referring to non-existent sources.
2677 save_state (_current_snapshot_name);
2681 boost::shared_ptr<Source>
2682 Session::source_by_id (const PBD::ID& id)
2684 Glib::Mutex::Lock lm (source_lock);
2685 SourceMap::iterator i;
2686 boost::shared_ptr<Source> source;
2688 if ((i = sources.find (id)) != sources.end()) {
2695 boost::shared_ptr<Source>
2696 Session::source_by_path_and_channel (const string& path, uint16_t chn)
2698 Glib::Mutex::Lock lm (source_lock);
2700 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2701 boost::shared_ptr<AudioFileSource> afs
2702 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
2704 if (afs && afs->path() == path && chn == afs->channel()) {
2708 return boost::shared_ptr<Source>();
2712 Session::count_sources_by_origin (const string& path)
2715 Glib::Mutex::Lock lm (source_lock);
2717 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2718 boost::shared_ptr<FileSource> fs
2719 = boost::dynamic_pointer_cast<FileSource>(i->second);
2721 if (fs && fs->origin() == path) {
2731 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
2734 string old_basename = PBD::basename_nosuffix (oldname);
2735 string new_legalized = legalize_for_path (newname);
2737 /* note: we know (or assume) the old path is already valid */
2741 /* destructive file sources have a name of the form:
2743 /path/to/Tnnnn-NAME(%[LR])?.wav
2745 the task here is to replace NAME with the new name.
2750 string::size_type dash;
2752 dir = Glib::path_get_dirname (path);
2753 path = Glib::path_get_basename (path);
2755 /* '-' is not a legal character for the NAME part of the path */
2757 if ((dash = path.find_last_of ('-')) == string::npos) {
2761 prefix = path.substr (0, dash);
2765 path += new_legalized;
2766 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
2767 path = Glib::build_filename (dir, path);
2771 /* non-destructive file sources have a name of the form:
2773 /path/to/NAME-nnnnn(%[LR])?.ext
2775 the task here is to replace NAME with the new name.
2780 string::size_type dash;
2781 string::size_type postfix;
2783 dir = Glib::path_get_dirname (path);
2784 path = Glib::path_get_basename (path);
2786 /* '-' is not a legal character for the NAME part of the path */
2788 if ((dash = path.find_last_of ('-')) == string::npos) {
2792 suffix = path.substr (dash+1);
2794 // Suffix is now everything after the dash. Now we need to eliminate
2795 // the nnnnn part, which is done by either finding a '%' or a '.'
2797 postfix = suffix.find_last_of ("%");
2798 if (postfix == string::npos) {
2799 postfix = suffix.find_last_of ('.');
2802 if (postfix != string::npos) {
2803 suffix = suffix.substr (postfix);
2805 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
2809 const uint32_t limit = 10000;
2810 char buf[PATH_MAX+1];
2812 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
2814 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
2816 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
2817 path = Glib::build_filename (dir, buf);
2825 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
2834 /** Return the full path (in some session directory) for a new within-session source.
2835 * \a name must be a session-unique name that does not contain slashes
2836 * (e.g. as returned by new_*_source_name)
2839 Session::new_source_path_from_name (DataType type, const string& name)
2841 assert(name.find("/") == string::npos);
2843 SessionDirectory sdir(get_best_session_directory_for_new_source());
2846 if (type == DataType::AUDIO) {
2847 p = sdir.sound_path();
2848 } else if (type == DataType::MIDI) {
2849 p = sdir.midi_path();
2851 error << "Unknown source type, unable to create file path" << endmsg;
2856 return p.to_string();
2860 Session::peak_path (string base) const
2862 sys::path peakfile_path(_session_dir->peak_path());
2863 peakfile_path /= base + peakfile_suffix;
2864 return peakfile_path.to_string();
2867 /** Return a unique name based on \a base for a new internal audio source */
2869 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
2872 char buf[PATH_MAX+1];
2873 const uint32_t limit = 10000;
2875 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
2878 legalized = legalize_for_path (base);
2880 // Find a "version" of the base name that doesn't exist in any of the possible directories.
2881 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
2883 vector<space_and_path>::iterator i;
2884 uint32_t existing = 0;
2886 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2891 snprintf (buf, sizeof(buf), "T%04d-%s%s",
2892 cnt, legalized.c_str(), ext.c_str());
2893 } else if (nchan == 2) {
2895 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
2896 cnt, legalized.c_str(), ext.c_str());
2898 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
2899 cnt, legalized.c_str(), ext.c_str());
2901 } else if (nchan < 26) {
2902 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
2903 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
2905 snprintf (buf, sizeof(buf), "T%04d-%s%s",
2906 cnt, legalized.c_str(), ext.c_str());
2912 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
2913 } else if (nchan == 2) {
2915 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
2917 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
2919 } else if (nchan < 26) {
2920 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
2922 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
2926 SessionDirectory sdir((*i).path);
2928 string spath = sdir.sound_path().to_string();
2930 /* note that we search *without* the extension so that
2931 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
2932 in the event that this new name is required for
2933 a file format change.
2936 if (matching_unsuffixed_filename_exists_in (spath, buf)) {
2942 if (existing == 0) {
2947 error << string_compose(
2948 _("There are already %1 recordings for %2, which I consider too many."),
2949 limit, base) << endmsg;
2951 throw failed_constructor();
2955 return Glib::path_get_basename (buf);
2958 /** Create a new within-session audio source */
2959 boost::shared_ptr<AudioFileSource>
2960 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
2962 const string name = new_audio_source_name (n, n_chans, chan, destructive);
2963 const string path = new_source_path_from_name(DataType::AUDIO, name);
2965 return boost::dynamic_pointer_cast<AudioFileSource> (
2966 SourceFactory::createWritable (DataType::AUDIO, *this, path, string(), destructive, frame_rate()));
2969 /** Return a unique name based on \a base for a new internal MIDI source */
2971 Session::new_midi_source_name (const string& base)
2974 char buf[PATH_MAX+1];
2975 const uint32_t limit = 10000;
2979 legalized = legalize_for_path (base);
2981 // Find a "version" of the file name that doesn't exist in any of the possible directories.
2982 for (cnt = 1; cnt <= limit; ++cnt) {
2984 vector<space_and_path>::iterator i;
2985 uint32_t existing = 0;
2987 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2989 SessionDirectory sdir((*i).path);
2991 sys::path p = sdir.midi_path();
2994 snprintf (buf, sizeof(buf), "%s-%u.mid", p.to_string().c_str(), cnt);
2996 if (sys::exists (buf)) {
3001 if (existing == 0) {
3006 error << string_compose(
3007 _("There are already %1 recordings for %2, which I consider too many."),
3008 limit, base) << endmsg;
3010 throw failed_constructor();
3014 return Glib::path_get_basename(buf);
3018 /** Create a new within-session MIDI source */
3019 boost::shared_ptr<MidiSource>
3020 Session::create_midi_source_for_session (Track* track, string const & n)
3022 /* try to use the existing write source for the track, to keep numbering sane
3026 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3030 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3033 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3034 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3038 const string name = new_midi_source_name (n);
3039 const string path = new_source_path_from_name (DataType::MIDI, name);
3041 return boost::dynamic_pointer_cast<SMFSource> (
3042 SourceFactory::createWritable (
3043 DataType::MIDI, *this, path, string(), false, frame_rate()));
3048 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3050 if (playlist->hidden()) {
3054 playlists->add (playlist);
3057 playlist->release();
3064 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3066 if (_state_of_the_state & Deletion) {
3070 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3076 playlists->remove (playlist);
3082 Session::set_audition (boost::shared_ptr<Region> r)
3084 pending_audition_region = r;
3085 add_post_transport_work (PostTransportAudition);
3086 _butler->schedule_transport_work ();
3090 Session::audition_playlist ()
3092 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3093 ev->region.reset ();
3098 Session::non_realtime_set_audition ()
3100 if (!pending_audition_region) {
3101 auditioner->audition_current_playlist ();
3103 auditioner->audition_region (pending_audition_region);
3104 pending_audition_region.reset ();
3106 AuditionActive (true); /* EMIT SIGNAL */
3110 Session::audition_region (boost::shared_ptr<Region> r)
3112 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3118 Session::cancel_audition ()
3120 if (auditioner->auditioning()) {
3121 auditioner->cancel_audition ();
3122 AuditionActive (false); /* EMIT SIGNAL */
3127 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3129 if (a->is_monitor()) {
3132 if (b->is_monitor()) {
3135 return a->order_key(N_("signal")) < b->order_key(N_("signal"));
3139 Session::is_auditioning () const
3141 /* can be called before we have an auditioner object */
3143 return auditioner->auditioning();
3150 Session::graph_reordered ()
3152 /* don't do this stuff if we are setting up connections
3153 from a set_state() call or creating new tracks. Ditto for deletion.
3156 if (_state_of_the_state & (InitialConnecting|Deletion)) {
3160 /* every track/bus asked for this to be handled but it was deferred because
3161 we were connecting. do it now.
3164 request_input_change_handling ();
3168 /* force all diskstreams to update their capture offset values to
3169 reflect any changes in latencies within the graph.
3172 boost::shared_ptr<RouteList> rl = routes.reader ();
3173 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3174 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3176 tr->set_capture_offset ();
3182 Session::available_capture_duration ()
3184 float sample_bytes_on_disk = 4.0; // keep gcc happy
3186 switch (config.get_native_file_data_format()) {
3188 sample_bytes_on_disk = 4.0;
3192 sample_bytes_on_disk = 3.0;
3196 sample_bytes_on_disk = 2.0;
3200 /* impossible, but keep some gcc versions happy */
3201 fatal << string_compose (_("programming error: %1"),
3202 X_("illegal native file data format"))
3207 double scale = 4096.0 / sample_bytes_on_disk;
3209 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3210 return max_framecnt;
3213 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3217 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3220 RCUWriter<BundleList> writer (_bundles);
3221 boost::shared_ptr<BundleList> b = writer.get_copy ();
3222 b->push_back (bundle);
3225 BundleAdded (bundle); /* EMIT SIGNAL */
3231 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3233 bool removed = false;
3236 RCUWriter<BundleList> writer (_bundles);
3237 boost::shared_ptr<BundleList> b = writer.get_copy ();
3238 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3240 if (i != b->end()) {
3247 BundleRemoved (bundle); /* EMIT SIGNAL */
3253 boost::shared_ptr<Bundle>
3254 Session::bundle_by_name (string name) const
3256 boost::shared_ptr<BundleList> b = _bundles.reader ();
3258 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3259 if ((*i)->name() == name) {
3264 return boost::shared_ptr<Bundle> ();
3268 Session::tempo_map_changed (const PropertyChange&)
3272 playlists->update_after_tempo_map_change ();
3274 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3280 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3282 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3283 (*i)->recompute_frames_from_bbt ();
3287 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3288 * the given count with the current block size.
3291 Session::ensure_buffers (ChanCount howmany)
3293 BufferManager::ensure_buffers (howmany);
3297 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3299 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3300 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3305 Session::next_insert_id ()
3307 /* this doesn't really loop forever. just think about it */
3310 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3311 if (!insert_bitset[n]) {
3312 insert_bitset[n] = true;
3318 /* none available, so resize and try again */
3320 insert_bitset.resize (insert_bitset.size() + 16, false);
3325 Session::next_send_id ()
3327 /* this doesn't really loop forever. just think about it */
3330 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3331 if (!send_bitset[n]) {
3332 send_bitset[n] = true;
3338 /* none available, so resize and try again */
3340 send_bitset.resize (send_bitset.size() + 16, false);
3345 Session::next_return_id ()
3347 /* this doesn't really loop forever. just think about it */
3350 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3351 if (!return_bitset[n]) {
3352 return_bitset[n] = true;
3358 /* none available, so resize and try again */
3360 return_bitset.resize (return_bitset.size() + 16, false);
3365 Session::mark_send_id (uint32_t id)
3367 if (id >= send_bitset.size()) {
3368 send_bitset.resize (id+16, false);
3370 if (send_bitset[id]) {
3371 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3373 send_bitset[id] = true;
3377 Session::mark_return_id (uint32_t id)
3379 if (id >= return_bitset.size()) {
3380 return_bitset.resize (id+16, false);
3382 if (return_bitset[id]) {
3383 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3385 return_bitset[id] = true;
3389 Session::mark_insert_id (uint32_t id)
3391 if (id >= insert_bitset.size()) {
3392 insert_bitset.resize (id+16, false);
3394 if (insert_bitset[id]) {
3395 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3397 insert_bitset[id] = true;
3401 Session::unmark_send_id (uint32_t id)
3403 if (id < send_bitset.size()) {
3404 send_bitset[id] = false;
3409 Session::unmark_return_id (uint32_t id)
3411 if (id < return_bitset.size()) {
3412 return_bitset[id] = false;
3417 Session::unmark_insert_id (uint32_t id)
3419 if (id < insert_bitset.size()) {
3420 insert_bitset[id] = false;
3425 /* Named Selection management */
3427 boost::shared_ptr<NamedSelection>
3428 Session::named_selection_by_name (string name)
3430 Glib::Mutex::Lock lm (named_selection_lock);
3431 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
3432 if ((*i)->name == name) {
3436 return boost::shared_ptr<NamedSelection>();
3440 Session::add_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3443 Glib::Mutex::Lock lm (named_selection_lock);
3444 named_selections.insert (named_selections.begin(), named_selection);
3449 NamedSelectionAdded (); /* EMIT SIGNAL */
3453 Session::remove_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3455 bool removed = false;
3458 Glib::Mutex::Lock lm (named_selection_lock);
3460 NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
3462 if (i != named_selections.end()) {
3463 named_selections.erase (i);
3470 NamedSelectionRemoved (); /* EMIT SIGNAL */
3475 Session::reset_native_file_format ()
3477 boost::shared_ptr<RouteList> rl = routes.reader ();
3478 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3479 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3481 /* don't save state as we do this, there's no point
3484 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3485 tr->reset_write_sources (false);
3486 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3492 Session::route_name_unique (string n) const
3494 boost::shared_ptr<RouteList> r = routes.reader ();
3496 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3497 if ((*i)->name() == n) {
3506 Session::route_name_internal (string n) const
3508 if (auditioner && auditioner->name() == n) {
3512 if (_click_io && _click_io->name() == n) {
3520 Session::freeze_all (InterThreadInfo& itt)
3522 boost::shared_ptr<RouteList> r = routes.reader ();
3524 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3526 boost::shared_ptr<Track> t;
3528 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3529 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3539 boost::shared_ptr<Region>
3540 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
3541 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3542 InterThreadInfo& itt, bool enable_processing)
3544 boost::shared_ptr<Region> result;
3545 boost::shared_ptr<Playlist> playlist;
3546 boost::shared_ptr<AudioFileSource> fsource;
3548 char buf[PATH_MAX+1];
3549 ChanCount diskstream_channels (track.n_channels());
3550 framepos_t position;
3551 framecnt_t this_chunk;
3554 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3555 const string sound_dir = sdir.sound_path().to_string();
3556 framepos_t len = end - start;
3557 bool need_block_size_reset = false;
3559 ChanCount const max_proc = track.max_processor_streams ();
3562 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3563 end, start) << endmsg;
3567 const framecnt_t chunk_size = (256 * 1024)/4;
3569 // block all process callback handling
3571 block_processing ();
3573 /* call tree *MUST* hold route_lock */
3575 if ((playlist = track.playlist()) == 0) {
3579 /* external redirects will be a problem */
3581 if (track.has_external_redirects()) {
3585 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3587 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
3589 for (x = 0; x < 99999; ++x) {
3590 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());
3591 if (access (buf, F_OK) != 0) {
3597 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3602 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
3603 SourceFactory::createWritable (DataType::AUDIO, *this, buf, string(), false, frame_rate()));
3606 catch (failed_constructor& err) {
3607 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
3611 srcs.push_back (fsource);
3614 /* tell redirects that care that we are about to use a much larger blocksize */
3616 need_block_size_reset = true;
3617 track.set_block_size (chunk_size);
3619 /* XXX need to flush all redirects */
3624 /* create a set of reasonably-sized buffers */
3625 buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
3626 buffers.set_count (max_proc);
3628 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3629 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3631 afs->prepare_for_peakfile_writes ();
3634 while (to_do && !itt.cancel) {
3636 this_chunk = min (to_do, chunk_size);
3638 if (track.export_stuff (buffers, start, this_chunk, enable_processing)) {
3643 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
3644 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3647 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
3653 start += this_chunk;
3654 to_do -= this_chunk;
3656 itt.progress = (float) (1.0 - ((double) to_do / len));
3665 xnow = localtime (&now);
3667 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3668 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3671 afs->update_header (position, *xnow, now);
3672 afs->flush_header ();
3676 /* construct a region to represent the bounced material */
3680 plist.add (Properties::start, 0);
3681 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
3682 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
3684 result = RegionFactory::create (srcs, plist);
3690 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3691 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3694 afs->mark_for_remove ();
3697 (*src)->drop_references ();
3701 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3702 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3705 afs->done_with_peakfile_writes ();
3710 if (need_block_size_reset) {
3711 track.set_block_size (get_block_size());
3714 unblock_processing ();
3720 Session::gain_automation_buffer() const
3722 return ProcessThread::gain_automation_buffer ();
3726 Session::pan_automation_buffer() const
3728 return ProcessThread::pan_automation_buffer ();
3732 Session::get_silent_buffers (ChanCount count)
3734 return ProcessThread::get_silent_buffers (count);
3738 Session::get_scratch_buffers (ChanCount count)
3740 return ProcessThread::get_scratch_buffers (count);
3744 Session::get_mix_buffers (ChanCount count)
3746 return ProcessThread::get_mix_buffers (count);
3750 Session::ntracks () const
3753 boost::shared_ptr<RouteList> r = routes.reader ();
3755 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3756 if (boost::dynamic_pointer_cast<Track> (*i)) {
3765 Session::nbusses () const
3768 boost::shared_ptr<RouteList> r = routes.reader ();
3770 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3771 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
3780 Session::add_automation_list(AutomationList *al)
3782 automation_lists[al->id()] = al;
3786 Session::sync_order_keys (std::string const & base)
3788 if (deletion_in_progress()) {
3792 if (!Config->get_sync_all_route_ordering()) {
3793 /* leave order keys as they are */
3797 boost::shared_ptr<RouteList> r = routes.reader ();
3799 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3800 (*i)->sync_order_keys (base);
3803 Route::SyncOrderKeys (base); // EMIT SIGNAL
3805 /* this might not do anything */
3807 set_remote_control_ids ();
3810 /** @return true if there is at least one record-enabled track, otherwise false */
3812 Session::have_rec_enabled_track () const
3814 return g_atomic_int_get (&_have_rec_enabled_track) == 1;
3817 /** Update the state of our rec-enabled tracks flag */
3819 Session::update_have_rec_enabled_track ()
3821 boost::shared_ptr<RouteList> rl = routes.reader ();
3822 RouteList::iterator i = rl->begin();
3823 while (i != rl->end ()) {
3825 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3826 if (tr && tr->record_enabled ()) {
3833 int const old = g_atomic_int_get (&_have_rec_enabled_track);
3835 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
3837 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
3838 RecordStateChanged (); /* EMIT SIGNAL */
3843 Session::listen_position_changed ()
3845 boost::shared_ptr<RouteList> r = routes.reader ();
3847 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3848 (*i)->listen_position_changed ();
3853 Session::solo_control_mode_changed ()
3855 /* cancel all solo or all listen when solo control mode changes */
3858 set_solo (get_routes(), false);
3859 } else if (listening()) {
3860 set_listen (get_routes(), false);
3864 /** Called when anything about any of our route groups changes (membership, state etc.) */
3866 Session::route_group_changed ()
3868 RouteGroupChanged (); /* EMIT SIGNAL */
3872 Session::get_available_sync_options () const
3874 vector<SyncSource> ret;
3876 ret.push_back (JACK);
3877 ret.push_back (MTC);
3878 ret.push_back (MIDIClock);
3883 boost::shared_ptr<RouteList>
3884 Session::get_routes_with_regions_at (framepos_t const p) const
3886 boost::shared_ptr<RouteList> r = routes.reader ();
3887 boost::shared_ptr<RouteList> rl (new RouteList);
3889 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3890 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3895 boost::shared_ptr<Playlist> pl = tr->playlist ();
3900 if (pl->has_region_at (p)) {
3909 Session::goto_end ()
3911 if (_session_range_location) {
3912 request_locate (_session_range_location->end(), false);
3914 request_locate (0, false);
3919 Session::goto_start ()
3921 if (_session_range_location) {
3922 request_locate (_session_range_location->start(), false);
3924 request_locate (0, false);
3929 Session::current_start_frame () const
3931 return _session_range_location ? _session_range_location->start() : 0;
3935 Session::current_end_frame () const
3937 return _session_range_location ? _session_range_location->end() : 0;
3941 Session::add_session_range_location (framepos_t start, framepos_t end)
3943 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
3944 _locations->add (_session_range_location);
3947 /** Called when one of our routes' order keys has changed */
3949 Session::route_order_key_changed ()
3951 RouteOrderKeyChanged (); /* EMIT SIGNAL */
3955 Session::step_edit_status_change (bool yn)
3961 send = (_step_editors == 0);
3966 send = (_step_editors == 1);
3969 if (_step_editors > 0) {
3975 StepEditStatusChange (val);
3981 Session::start_time_changed (framepos_t old)
3983 /* Update the auto loop range to match the session range
3984 (unless the auto loop range has been changed by the user)
3987 Location* s = _locations->session_range_location ();
3992 Location* l = _locations->auto_loop_location ();
3994 if (l->start() == old) {
3995 l->set_start (s->start(), true);
4000 Session::end_time_changed (framepos_t old)
4002 /* Update the auto loop range to match the session range
4003 (unless the auto loop range has been changed by the user)
4006 Location* s = _locations->session_range_location ();
4011 Location* l = _locations->auto_loop_location ();
4013 if (l->end() == old) {
4014 l->set_end (s->end(), true);
4019 Session::source_search_path (DataType type) const
4023 if (session_dirs.size() == 1) {
4025 case DataType::AUDIO:
4026 search_path = _session_dir->sound_path().to_string();
4028 case DataType::MIDI:
4029 search_path = _session_dir->midi_path().to_string();
4033 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4034 SessionDirectory sdir (i->path);
4035 if (!search_path.empty()) {
4039 case DataType::AUDIO:
4040 search_path += sdir.sound_path().to_string();
4042 case DataType::MIDI:
4043 search_path += sdir.midi_path().to_string();
4049 /* now add user-specified locations
4052 vector<string> dirs;
4055 case DataType::AUDIO:
4056 split (config.get_audio_search_path (), dirs, ':');
4058 case DataType::MIDI:
4059 split (config.get_midi_search_path (), dirs, ':');
4063 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4073 Session::ensure_search_path_includes (const string& path, DataType type)
4076 vector<string> dirs;
4083 case DataType::AUDIO:
4084 search_path = config.get_audio_search_path ();
4086 case DataType::MIDI:
4087 search_path = config.get_midi_search_path ();
4091 split (search_path, dirs, ':');
4093 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4099 if (!search_path.empty()) {
4103 search_path += path;
4106 case DataType::AUDIO:
4107 config.set_audio_search_path (search_path);
4109 case DataType::MIDI:
4110 config.set_midi_search_path (search_path);
4115 boost::shared_ptr<Speakers>
4116 Session::get_speakers()
4122 Session::unknown_processors () const
4126 boost::shared_ptr<RouteList> r = routes.reader ();
4127 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4128 list<string> t = (*i)->unknown_processors ();
4129 copy (t.begin(), t.end(), back_inserter (p));
4139 Session::update_latency (bool playback)
4141 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
4143 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4147 boost::shared_ptr<RouteList> r = routes.reader ();
4148 framecnt_t max_latency = 0;
4151 /* reverse the list so that we work backwards from the last route to run to the first */
4152 reverse (r->begin(), r->end());
4155 /* compute actual latency values for the given direction and store them all in per-port
4156 structures. this will also publish the same values (to JACK) so that computation of latency
4157 for routes can consistently use public latency values.
4160 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4161 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
4166 post_playback_latency ();
4168 /* because we latency compensate playback, our published playback latencies should
4169 be the same for all output ports - all material played back by ardour has
4170 the same latency, whether its caused by plugins or by latency compensation. since
4171 these may differ from the values computed above, reset all playback port latencies
4175 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
4177 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4178 (*i)->set_public_port_latencies (max_latency, playback);
4185 post_capture_latency ();
4188 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
4192 Session::post_playback_latency ()
4194 set_worst_playback_latency ();
4196 boost::shared_ptr<RouteList> r = routes.reader ();
4197 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4198 if (!(*i)->is_hidden() && ((*i)->active())) {
4199 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
4202 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4203 (*i)->set_latency_compensation (_worst_track_latency);
4209 Session::post_capture_latency ()
4211 set_worst_capture_latency ();
4213 /* reflect any changes in capture latencies into capture offsets
4216 boost::shared_ptr<RouteList> rl = routes.reader();
4217 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4218 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4220 tr->set_capture_offset ();
4226 Session::set_worst_io_latencies ()
4228 set_worst_playback_latency ();
4229 set_worst_capture_latency ();
4233 Session::set_worst_playback_latency ()
4235 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4239 _worst_output_latency = 0;
4241 if (!_engine.connected()) {
4245 boost::shared_ptr<RouteList> r = routes.reader ();
4247 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4248 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
4251 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
4255 Session::set_worst_capture_latency ()
4257 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4261 _worst_input_latency = 0;
4263 if (!_engine.connected()) {
4267 boost::shared_ptr<RouteList> r = routes.reader ();
4269 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4270 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
4273 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
4277 Session::update_latency_compensation (bool force_whole_graph)
4279 bool update_jack = false;
4281 if (_state_of_the_state & Deletion) {
4285 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
4287 _worst_track_latency = 0;
4289 boost::shared_ptr<RouteList> r = routes.reader ();
4291 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4292 if (!(*i)->is_hidden() && ((*i)->active())) {
4294 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
4297 _worst_track_latency = max (tl, _worst_track_latency);
4301 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
4302 (update_jack ? "yes" : "no")));
4304 if (force_whole_graph || update_jack) {
4305 /* trigger a full recompute of latency numbers for the graph.
4306 everything else that we need to do will be done in the latency
4309 _engine.update_total_latencies ();
4310 return; // everything else will be done in the latency callback
4315 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n")