2 Copyright (C) 1999-2010 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #include <cstdio> /* sprintf(3) ... grrr */
33 #include <glibmm/thread.h>
34 #include <glibmm/miscutils.h>
35 #include <glibmm/fileutils.h>
37 #include <boost/algorithm/string/erase.hpp>
39 #include "pbd/error.h"
40 #include "pbd/boost_debug.h"
41 #include "pbd/pathscanner.h"
42 #include "pbd/stl_delete.h"
43 #include "pbd/basename.h"
44 #include "pbd/stacktrace.h"
45 #include "pbd/file_utils.h"
46 #include "pbd/convert.h"
47 #include "pbd/strsplit.h"
49 #include "ardour/amp.h"
50 #include "ardour/analyser.h"
51 #include "ardour/audio_buffer.h"
52 #include "ardour/audio_diskstream.h"
53 #include "ardour/audio_port.h"
54 #include "ardour/audio_track.h"
55 #include "ardour/audioengine.h"
56 #include "ardour/audiofilesource.h"
57 #include "ardour/audioplaylist.h"
58 #include "ardour/audioregion.h"
59 #include "ardour/auditioner.h"
60 #include "ardour/buffer_manager.h"
61 #include "ardour/buffer_set.h"
62 #include "ardour/bundle.h"
63 #include "ardour/butler.h"
64 #include "ardour/click.h"
65 #include "ardour/configuration.h"
66 #include "ardour/control_protocol_manager.h"
67 #include "ardour/crossfade.h"
68 #include "ardour/cycle_timer.h"
69 #include "ardour/data_type.h"
70 #include "ardour/debug.h"
71 #include "ardour/filename_extensions.h"
72 #include "ardour/internal_send.h"
73 #include "ardour/io_processor.h"
74 #include "ardour/midi_diskstream.h"
75 #include "ardour/midi_playlist.h"
76 #include "ardour/midi_region.h"
77 #include "ardour/midi_track.h"
78 #include "ardour/midi_ui.h"
79 #include "ardour/named_selection.h"
80 #include "ardour/process_thread.h"
81 #include "ardour/playlist.h"
82 #include "ardour/plugin_insert.h"
83 #include "ardour/port_insert.h"
84 #include "ardour/processor.h"
85 #include "ardour/rc_configuration.h"
86 #include "ardour/recent_sessions.h"
87 #include "ardour/region_factory.h"
88 #include "ardour/return.h"
89 #include "ardour/route_graph.h"
90 #include "ardour/route_group.h"
91 #include "ardour/send.h"
92 #include "ardour/session.h"
93 #include "ardour/session_directory.h"
94 #include "ardour/session_directory.h"
95 #include "ardour/session_metadata.h"
96 #include "ardour/session_playlists.h"
97 #include "ardour/slave.h"
98 #include "ardour/smf_source.h"
99 #include "ardour/source_factory.h"
100 #include "ardour/tape_file_matcher.h"
101 #include "ardour/tempo.h"
102 #include "ardour/utils.h"
103 #include "ardour/graph.h"
104 #include "ardour/speakers.h"
105 #include "ardour/operations.h"
107 #include "midi++/port.h"
108 #include "midi++/mmc.h"
109 #include "midi++/manager.h"
114 using namespace ARDOUR;
117 bool Session::_disable_all_loaded_plugins = false;
119 PBD::Signal1<void,std::string> Session::Dialog;
120 PBD::Signal0<int> Session::AskAboutPendingState;
121 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
122 PBD::Signal0<void> Session::SendFeedback;
123 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
125 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
126 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
127 PBD::Signal0<void> Session::AutoBindingOn;
128 PBD::Signal0<void> Session::AutoBindingOff;
129 PBD::Signal2<void,std::string, std::string> Session::Exported;
130 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
131 PBD::Signal0<void> Session::Quit;
132 PBD::Signal0<void> Session::FeedbackDetected;
133 PBD::Signal0<void> Session::SuccessfulGraphSort;
135 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
136 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
138 /** @param snapshot_name Snapshot name, without .ardour prefix */
139 Session::Session (AudioEngine &eng,
140 const string& fullpath,
141 const string& snapshot_name,
142 BusProfile* bus_profile,
145 , _target_transport_speed (0.0)
146 , _requested_return_frame (-1)
147 , _session_dir (new SessionDirectory(fullpath))
149 , _state_of_the_state (Clean)
150 , _butler (new Butler (*this))
151 , _post_transport_work (0)
152 , _send_timecode_update (false)
153 , _all_route_group (new RouteGroup (*this, "all"))
154 , _process_graph (new Graph (*this))
155 , routes (new RouteList)
156 , _total_free_4k_blocks (0)
157 , _bundles (new BundleList)
158 , _bundle_xml_node (0)
160 , _click_io ((IO*) 0)
162 , click_emphasis_data (0)
164 , _metadata (new SessionMetadata())
165 , _have_rec_enabled_track (false)
166 , _suspend_timecode_transmission (0)
168 _locations = new Locations (*this);
170 playlists.reset (new SessionPlaylists);
172 _all_route_group->set_active (true, this);
174 interpolation.add_channel_to (0, 0);
176 if (!eng.connected()) {
177 throw failed_constructor();
180 n_physical_outputs = _engine.n_physical_outputs ();
181 n_physical_inputs = _engine.n_physical_inputs ();
183 first_stage_init (fullpath, snapshot_name);
185 _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
188 if (create (mix_template, bus_profile)) {
190 throw failed_constructor ();
194 if (second_stage_init ()) {
196 throw failed_constructor ();
199 store_recent_sessions(_name, _path);
201 bool was_dirty = dirty();
203 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
205 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
206 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
209 DirtyChanged (); /* EMIT SIGNAL */
212 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
213 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
226 vector<void*> debug_pointers;
228 /* if we got to here, leaving pending capture state around
232 remove_pending_capture_state ();
234 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
236 _engine.remove_session ();
238 /* clear history so that no references to objects are held any more */
242 /* clear state tree so that no references to objects are held any more */
246 /* reset dynamic state version back to default */
248 Stateful::loading_state_version = 0;
250 _butler->drop_references ();
252 delete midi_control_ui;
253 delete _all_route_group;
255 if (click_data != default_click) {
256 delete [] click_data;
259 if (click_emphasis_data != default_click_emphasis) {
260 delete [] click_emphasis_data;
265 /* clear out any pending dead wood from RCU managed objects */
270 AudioDiskstream::free_working_buffers();
272 /* tell everyone who is still standing that we're about to die */
275 /* tell everyone to drop references and delete objects as we go */
277 DEBUG_TRACE (DEBUG::Destruction, "delete named selections\n");
278 named_selections.clear ();
280 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
281 RegionFactory::delete_all_regions ();
283 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
285 /* reset these three references to special routes before we do the usual route delete thing */
288 _master_out.reset ();
289 _monitor_out.reset ();
292 RCUWriter<RouteList> writer (routes);
293 boost::shared_ptr<RouteList> r = writer.get_copy ();
295 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
296 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
297 (*i)->drop_references ();
301 /* writer goes out of scope and updates master */
305 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
306 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
307 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
308 i->second->drop_references ();
313 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
314 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
319 Crossfade::set_buffer_size (0);
321 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
326 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
328 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
329 boost_debug_list_ptrs ();
334 Session::when_engine_running ()
336 string first_physical_output;
338 BootMessage (_("Set block size and sample rate"));
340 set_block_size (_engine.frames_per_cycle());
341 set_frame_rate (_engine.frame_rate());
343 BootMessage (_("Using configuration"));
345 boost::function<void (std::string)> ff (boost::bind (&Session::config_changed, this, _1, false));
346 boost::function<void (std::string)> ft (boost::bind (&Session::config_changed, this, _1, true));
348 Config->map_parameters (ff);
349 config.map_parameters (ft);
351 /* every time we reconnect, recompute worst case output latencies */
353 _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
355 if (synced_to_jack()) {
356 _engine.transport_stop ();
359 if (config.get_jack_time_master()) {
360 _engine.transport_locate (_transport_frame);
368 _click_io.reset (new ClickIO (*this, "click"));
370 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
372 /* existing state for Click */
375 if (Stateful::loading_state_version < 3000) {
376 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
378 c = _click_io->set_state (*child->children().front(), Stateful::loading_state_version);
383 _clicking = Config->get_clicking ();
387 error << _("could not setup Click I/O") << endmsg;
394 /* default state for Click: dual-mono to first 2 physical outputs */
397 _engine.get_physical_outputs (DataType::AUDIO, outs);
399 for (uint32_t physport = 0; physport < 2; ++physport) {
400 if (outs.size() > physport) {
401 if (_click_io->add_port (outs[physport], this)) {
402 // relax, even though its an error
407 if (_click_io->n_ports () > ChanCount::ZERO) {
408 _clicking = Config->get_clicking ();
413 catch (failed_constructor& err) {
414 error << _("cannot setup Click I/O") << endmsg;
417 BootMessage (_("Compute I/O Latencies"));
420 // XXX HOW TO ALERT UI TO THIS ? DO WE NEED TO?
423 BootMessage (_("Set up standard connections"));
425 vector<string> inputs[DataType::num_types];
426 vector<string> outputs[DataType::num_types];
427 for (uint32_t i = 0; i < DataType::num_types; ++i) {
428 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
429 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
432 /* Create a set of Bundle objects that map
433 to the physical I/O currently available. We create both
434 mono and stereo bundles, so that the common cases of mono
435 and stereo tracks get bundles to put in their mixer strip
436 in / out menus. There may be a nicer way of achieving that;
437 it doesn't really scale that well to higher channel counts
440 /* mono output bundles */
442 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
444 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
446 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
447 c->add_channel (_("mono"), DataType::AUDIO);
448 c->set_port (0, outputs[DataType::AUDIO][np]);
453 /* stereo output bundles */
455 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
456 if (np + 1 < outputs[DataType::AUDIO].size()) {
458 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
459 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
460 c->add_channel (_("L"), DataType::AUDIO);
461 c->set_port (0, outputs[DataType::AUDIO][np]);
462 c->add_channel (_("R"), DataType::AUDIO);
463 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
469 /* mono input bundles */
471 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
473 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
475 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
476 c->add_channel (_("mono"), DataType::AUDIO);
477 c->set_port (0, inputs[DataType::AUDIO][np]);
482 /* stereo input bundles */
484 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
485 if (np + 1 < inputs[DataType::AUDIO].size()) {
487 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
489 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
490 c->add_channel (_("L"), DataType::AUDIO);
491 c->set_port (0, inputs[DataType::AUDIO][np]);
492 c->add_channel (_("R"), DataType::AUDIO);
493 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
499 /* MIDI input bundles */
501 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
502 string n = inputs[DataType::MIDI][np];
503 boost::erase_first (n, X_("alsa_pcm:"));
505 boost::shared_ptr<Bundle> c (new Bundle (n, false));
506 c->add_channel ("", DataType::MIDI);
507 c->set_port (0, inputs[DataType::MIDI][np]);
511 /* MIDI output bundles */
513 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
514 string n = outputs[DataType::MIDI][np];
515 boost::erase_first (n, X_("alsa_pcm:"));
517 boost::shared_ptr<Bundle> c (new Bundle (n, true));
518 c->add_channel ("", DataType::MIDI);
519 c->set_port (0, outputs[DataType::MIDI][np]);
523 BootMessage (_("Setup signal flow and plugins"));
525 ControlProtocolManager::instance().set_session (this);
527 /* This must be done after the ControlProtocolManager set_session above,
528 as it will set states for ports which the ControlProtocolManager creates.
530 MIDI::Manager::instance()->set_port_states (Config->midi_port_states ());
532 /* And this must be done after the MIDI::Manager::set_port_states as
533 * it will try to make connections whose details are loaded by set_port_states.
538 if (_is_new && !no_auto_connect()) {
540 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock());
542 /* don't connect the master bus outputs if there is a monitor bus */
544 if (_master_out && Config->get_auto_connect_standard_busses() && !_monitor_out) {
546 /* if requested auto-connect the outputs to the first N physical ports.
549 uint32_t limit = _master_out->n_outputs().n_total();
551 for (uint32_t n = 0; n < limit; ++n) {
552 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
554 if (outputs[p->type()].size() > n) {
555 connect_to = outputs[p->type()][n];
558 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
559 if (_master_out->output()->connect (p, connect_to, this)) {
560 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
570 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
571 are undefined, at best.
574 /* control out listens to master bus (but ignores it
575 under some conditions)
578 uint32_t limit = _monitor_out->n_inputs().n_audio();
581 for (uint32_t n = 0; n < limit; ++n) {
582 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
583 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
586 string connect_to = o->name();
587 if (_monitor_out->input()->connect (p, connect_to, this)) {
588 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
596 /* if control out is not connected, connect control out to physical outs
599 if (!_monitor_out->output()->connected ()) {
601 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
603 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
606 _monitor_out->output()->connect_ports_to_bundle (b, this);
608 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
609 Config->get_monitor_bus_preferred_bundle())
615 /* Monitor bus is audio only */
616 uint32_t mod = n_physical_outputs.get (DataType::AUDIO);
617 uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
621 for (uint32_t n = 0; n < limit; ++n) {
623 boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
625 if (outputs[DataType::AUDIO].size() > (n % mod)) {
626 connect_to = outputs[DataType::AUDIO][n % mod];
629 if (!connect_to.empty()) {
630 if (_monitor_out->output()->connect (p, connect_to, this)) {
631 error << string_compose (
632 _("cannot connect control output %1 to %2"),
645 _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
647 /* update latencies */
649 initialize_latencies ();
651 /* hook us up to the engine */
653 BootMessage (_("Connect to engine"));
654 _engine.set_session (this);
658 Session::hookup_io ()
660 /* stop graph reordering notifications from
661 causing resorts, etc.
664 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
668 /* we delay creating the auditioner till now because
669 it makes its own connections to ports.
673 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
675 throw failed_constructor ();
677 a->use_new_diskstream ();
681 catch (failed_constructor& err) {
682 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
686 /* load bundles, which we may have postponed earlier on */
687 if (_bundle_xml_node) {
688 load_bundles (*_bundle_xml_node);
689 delete _bundle_xml_node;
692 /* Tell all IO objects to connect themselves together */
694 IO::enable_connecting ();
695 MIDI::Port::MakeConnections ();
697 /* Now reset all panners */
699 Delivery::reset_panners ();
701 /* Connect tracks to monitor/listen bus if there is one. Note that in an
702 existing session, the internal sends will already exist, but we want the
703 routes to notice that they connect to the control out specifically.
707 boost::shared_ptr<RouteList> r = routes.reader ();
708 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
710 if ((*x)->is_monitor()) {
714 } else if ((*x)->is_master()) {
720 (*x)->listen_via_monitor ();
725 /* Anyone who cares about input state, wake up and do something */
727 IOConnectionsComplete (); /* EMIT SIGNAL */
729 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
731 /* now handle the whole enchilada as if it was one
737 /* update the full solo state, which can't be
738 correctly determined on a per-route basis, but
739 needs the global overview that only the session
743 update_route_solo_state ();
747 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
749 boost::shared_ptr<Track> track = wp.lock ();
754 boost::shared_ptr<Playlist> playlist;
756 if ((playlist = track->playlist()) != 0) {
757 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
758 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
759 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
764 Session::record_enabling_legal () const
766 /* this used to be in here, but survey says.... we don't need to restrict it */
767 // if (record_status() == Recording) {
771 if (Config->get_all_safe()) {
778 Session::set_track_monitor_input_status (bool yn)
780 boost::shared_ptr<RouteList> rl = routes.reader ();
781 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
782 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
783 if (tr && tr->record_enabled ()) {
784 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
785 tr->request_jack_monitors_input (yn);
791 Session::auto_punch_start_changed (Location* location)
793 replace_event (SessionEvent::PunchIn, location->start());
795 if (get_record_enabled() && config.get_punch_in()) {
796 /* capture start has been changed, so save new pending state */
797 save_state ("", true);
802 Session::auto_punch_end_changed (Location* location)
804 framepos_t when_to_stop = location->end();
805 // when_to_stop += _worst_output_latency + _worst_input_latency;
806 replace_event (SessionEvent::PunchOut, when_to_stop);
810 Session::auto_punch_changed (Location* location)
812 framepos_t when_to_stop = location->end();
814 replace_event (SessionEvent::PunchIn, location->start());
815 //when_to_stop += _worst_output_latency + _worst_input_latency;
816 replace_event (SessionEvent::PunchOut, when_to_stop);
820 Session::auto_loop_changed (Location* location)
822 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
824 if (transport_rolling() && play_loop) {
827 // if (_transport_frame > location->end()) {
829 if (_transport_frame < location->start() || _transport_frame > location->end()) {
830 // relocate to beginning of loop
831 clear_events (SessionEvent::LocateRoll);
833 request_locate (location->start(), true);
836 else if (Config->get_seamless_loop() && !loop_changing) {
838 // schedule a locate-roll to refill the diskstreams at the
840 loop_changing = true;
842 if (location->end() > last_loopend) {
843 clear_events (SessionEvent::LocateRoll);
844 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
851 last_loopend = location->end();
855 Session::set_auto_punch_location (Location* location)
859 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
860 punch_connections.drop_connections();
861 existing->set_auto_punch (false, this);
862 remove_event (existing->start(), SessionEvent::PunchIn);
863 clear_events (SessionEvent::PunchOut);
864 auto_punch_location_changed (0);
873 if (location->end() <= location->start()) {
874 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
878 punch_connections.drop_connections ();
880 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
881 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
882 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
884 location->set_auto_punch (true, this);
886 auto_punch_changed (location);
888 auto_punch_location_changed (location);
892 Session::set_auto_loop_location (Location* location)
896 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
897 loop_connections.drop_connections ();
898 existing->set_auto_loop (false, this);
899 remove_event (existing->end(), SessionEvent::AutoLoop);
900 auto_loop_location_changed (0);
909 if (location->end() <= location->start()) {
910 error << _("Session: you can't use a mark for auto loop") << endmsg;
914 last_loopend = location->end();
916 loop_connections.drop_connections ();
918 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
919 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
920 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
922 location->set_auto_loop (true, this);
924 /* take care of our stuff first */
926 auto_loop_changed (location);
928 /* now tell everyone else */
930 auto_loop_location_changed (location);
934 Session::locations_added (Location *)
940 Session::locations_changed ()
942 _locations->apply (*this, &Session::handle_locations_changed);
946 Session::handle_locations_changed (Locations::LocationList& locations)
948 Locations::LocationList::iterator i;
950 bool set_loop = false;
951 bool set_punch = false;
953 for (i = locations.begin(); i != locations.end(); ++i) {
957 if (location->is_auto_punch()) {
958 set_auto_punch_location (location);
961 if (location->is_auto_loop()) {
962 set_auto_loop_location (location);
966 if (location->is_session_range()) {
967 _session_range_location = location;
972 set_auto_loop_location (0);
975 set_auto_punch_location (0);
982 Session::enable_record ()
984 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
985 /* no recording at anything except normal speed */
990 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
992 if (rs == Recording) {
996 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
998 _last_record_location = _transport_frame;
999 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1001 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1002 set_track_monitor_input_status (true);
1005 RecordStateChanged ();
1012 Session::disable_record (bool rt_context, bool force)
1016 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1018 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1019 g_atomic_int_set (&_record_status, Disabled);
1020 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1022 if (rs == Recording) {
1023 g_atomic_int_set (&_record_status, Enabled);
1027 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1028 set_track_monitor_input_status (false);
1031 RecordStateChanged (); /* emit signal */
1034 remove_pending_capture_state ();
1040 Session::step_back_from_record ()
1042 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1044 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1045 set_track_monitor_input_status (false);
1048 RecordStateChanged (); /* emit signal */
1053 Session::maybe_enable_record ()
1055 if (_step_editors > 0) {
1059 g_atomic_int_set (&_record_status, Enabled);
1061 /* This function is currently called from somewhere other than an RT thread.
1062 This save_state() call therefore doesn't impact anything. Doing it here
1063 means that we save pending state of which sources the next record will use,
1064 which gives us some chance of recovering from a crash during the record.
1067 save_state ("", true);
1069 if (_transport_speed) {
1070 if (!config.get_punch_in()) {
1074 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1075 RecordStateChanged (); /* EMIT SIGNAL */
1082 Session::audible_frame () const
1088 /* the first of these two possible settings for "offset"
1089 mean that the audible frame is stationary until
1090 audio emerges from the latency compensation
1093 the second means that the audible frame is stationary
1094 until audio would emerge from a physical port
1095 in the absence of any plugin latency compensation
1098 offset = worst_playback_latency ();
1100 if (offset > current_block_size) {
1101 offset -= current_block_size;
1103 /* XXX is this correct? if we have no external
1104 physical connections and everything is internal
1105 then surely this is zero? still, how
1106 likely is that anyway?
1108 offset = current_block_size;
1111 if (synced_to_jack()) {
1112 tf = _engine.transport_frame();
1114 tf = _transport_frame;
1119 if (!non_realtime_work_pending()) {
1123 /* Check to see if we have passed the first guaranteed
1124 audible frame past our last start position. if not,
1125 return that last start point because in terms
1126 of audible frames, we have not moved yet.
1128 `Start position' in this context means the time we last
1129 either started or changed transport direction.
1132 if (_transport_speed > 0.0f) {
1134 if (!play_loop || !have_looped) {
1135 if (tf < _last_roll_or_reversal_location + offset) {
1136 return _last_roll_or_reversal_location;
1144 } else if (_transport_speed < 0.0f) {
1146 /* XXX wot? no backward looping? */
1148 if (tf > _last_roll_or_reversal_location - offset) {
1149 return _last_roll_or_reversal_location;
1161 Session::set_frame_rate (framecnt_t frames_per_second)
1163 /** \fn void Session::set_frame_size(framecnt_t)
1164 the AudioEngine object that calls this guarantees
1165 that it will not be called while we are also in
1166 ::process(). Its fine to do things that block
1170 _base_frame_rate = frames_per_second;
1174 Automatable::set_automation_interval (ceil ((double) frames_per_second * (0.001 * Config->get_automation_interval())));
1178 // XXX we need some equivalent to this, somehow
1179 // SndFileSource::setup_standard_crossfades (frames_per_second);
1183 /* XXX need to reset/reinstantiate all LADSPA plugins */
1187 Session::set_block_size (pframes_t nframes)
1189 /* the AudioEngine guarantees
1190 that it will not be called while we are also in
1191 ::process(). It is therefore fine to do things that block
1196 current_block_size = nframes;
1200 boost::shared_ptr<RouteList> r = routes.reader ();
1202 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1203 (*i)->set_block_size (nframes);
1206 boost::shared_ptr<RouteList> rl = routes.reader ();
1207 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1208 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1210 tr->set_block_size (nframes);
1214 set_worst_io_latencies ();
1220 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1222 boost::shared_ptr<Route> r2;
1224 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1225 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1229 /* make a copy of the existing list of routes that feed r1 */
1231 Route::FedBy existing (r1->fed_by());
1233 /* for each route that feeds r1, recurse, marking it as feeding
1237 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1238 if (!(r2 = i->r.lock ())) {
1239 /* (*i) went away, ignore it */
1243 /* r2 is a route that feeds r1 which somehow feeds base. mark
1244 base as being fed by r2
1247 rbase->add_fed_by (r2, i->sends_only);
1251 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1255 if (r1->feeds (r2) && r2->feeds (r1)) {
1259 /* now recurse, so that we can mark base as being fed by
1260 all routes that feed r2
1263 trace_terminal (r2, rbase);
1270 Session::resort_routes ()
1272 /* don't do anything here with signals emitted
1273 by Routes during initial setup or while we
1274 are being destroyed.
1277 if (_state_of_the_state & (InitialConnecting | Deletion)) {
1282 RCUWriter<RouteList> writer (routes);
1283 boost::shared_ptr<RouteList> r = writer.get_copy ();
1284 resort_routes_using (r);
1285 /* writer goes out of scope and forces update */
1288 //_process_graph->dump(1);
1291 boost::shared_ptr<RouteList> rl = routes.reader ();
1292 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1293 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1295 const Route::FedBy& fb ((*i)->fed_by());
1297 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1298 boost::shared_ptr<Route> sf = f->r.lock();
1300 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1308 /** This is called whenever we need to rebuild the graph of how we will process
1310 * @param r List of routes, in any order.
1314 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1316 /* We are going to build a directed graph of our routes;
1317 this is where the edges of that graph are put.
1322 /* Go through all routes doing two things:
1324 * 1. Collect the edges of the route graph. Each of these edges
1325 * is a pair of routes, one of which directly feeds the other
1326 * either by a JACK connection or by an internal send.
1328 * 2. Begin the process of making routes aware of which other
1329 * routes directly or indirectly feed them. This information
1330 * is used by the solo code.
1333 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1335 /* Clear out the route's list of direct or indirect feeds */
1336 (*i)->clear_fed_by ();
1338 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
1340 bool via_sends_only;
1342 /* See if this *j feeds *i according to the current state of the JACK
1343 connections and internal sends.
1345 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
1346 /* add the edge to the graph (part #1) */
1347 edges.add (*j, *i, via_sends_only);
1348 /* tell the route (for part #2) */
1349 (*i)->add_fed_by (*j, via_sends_only);
1354 /* Attempt a topological sort of the route graph */
1355 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
1357 if (sorted_routes) {
1358 /* We got a satisfactory topological sort, so there is no feedback;
1361 Note: the process graph rechain does not require a
1362 topologically-sorted list, but hey ho.
1364 _process_graph->rechain (sorted_routes, edges);
1365 _current_route_graph = edges;
1367 /* Complete the building of the routes' lists of what directly
1368 or indirectly feeds them.
1370 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1371 trace_terminal (*i, *i);
1377 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1378 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1379 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1380 (*i)->name(), (*i)->order_key ("signal")));
1384 SuccessfulGraphSort (); /* EMIT SIGNAL */
1387 /* The topological sort failed, so we have a problem. Tell everyone
1388 and stick to the old graph; this will continue to be processed, so
1389 until the feedback is fixed, what is played back will not quite
1390 reflect what is actually connected. Note also that we do not
1391 do trace_terminal here, as it would fail due to an endless recursion,
1392 so the solo code will think that everything is still connected
1396 FeedbackDetected (); /* EMIT SIGNAL */
1401 /** Find a route name starting with \a base, maybe followed by the
1402 * lowest \a id. \a id will always be added if \a definitely_add_number
1403 * is true on entry; otherwise it will only be added if required
1404 * to make the name unique.
1406 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1407 * The available route name with the lowest ID will be used, and \a id
1408 * will be set to the ID.
1410 * \return false if a route name could not be found, and \a track_name
1411 * and \a id do not reflect a free route name.
1414 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1416 if (!definitely_add_number && route_by_name (base) == 0) {
1417 /* juse use the base */
1418 snprintf (name, name_len, "%s", base.c_str());
1423 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1425 if (route_by_name (name) == 0) {
1431 } while (id < (UINT_MAX-1));
1436 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
1438 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
1440 in = ChanCount::ZERO;
1441 out = ChanCount::ZERO;
1443 boost::shared_ptr<RouteList> r = routes.reader ();
1445 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1446 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1447 if (tr && !tr->is_hidden()) {
1448 in += tr->n_inputs();
1449 out += tr->n_outputs();
1454 /** Caller must not hold process lock
1455 * @param name_template string to use for the start of the name, or "" to use "MIDI".
1457 list<boost::shared_ptr<MidiTrack> >
1458 Session::new_midi_track (TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1460 char track_name[32];
1461 uint32_t track_id = 0;
1463 RouteList new_routes;
1464 list<boost::shared_ptr<MidiTrack> > ret;
1465 uint32_t control_id;
1467 control_id = ntracks() + nbusses();
1469 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
1472 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1473 error << "cannot find name for new midi track" << endmsg;
1477 boost::shared_ptr<MidiTrack> track;
1480 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1482 if (track->init ()) {
1486 track->use_new_diskstream();
1488 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1489 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1492 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1493 if (track->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1494 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1498 if (track->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1499 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1504 track->non_realtime_input_change();
1507 route_group->add (track);
1510 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1511 track->set_remote_control_id (control_id);
1513 new_routes.push_back (track);
1514 ret.push_back (track);
1517 catch (failed_constructor &err) {
1518 error << _("Session: could not create new midi track.") << endmsg;
1522 catch (AudioEngine::PortRegistrationFailure& pfe) {
1524 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;
1532 if (!new_routes.empty()) {
1533 add_routes (new_routes, true, true);
1540 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
1542 boost::shared_ptr<Route> midi_track (wmt.lock());
1548 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
1550 if (change.after.n_audio() <= change.before.n_audio()) {
1554 /* new audio ports: make sure the audio goes somewhere useful,
1555 unless the user has no-auto-connect selected.
1557 The existing ChanCounts don't matter for this call as they are only
1558 to do with matching input and output indices, and we are only changing
1564 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
1568 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1569 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1570 * @param output_start As \a input_start, but for outputs.
1573 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
1574 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
1576 if (!IO::connecting_legal) {
1580 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::NOT_LOCK);
1586 /* If both inputs and outputs are auto-connected to physical ports,
1587 use the max of input and output offsets to ensure auto-connected
1588 port numbers always match up (e.g. the first audio input and the
1589 first audio output of the route will have the same physical
1590 port number). Otherwise just use the lowest input or output
1594 DEBUG_TRACE (DEBUG::Graph,
1595 string_compose("Auto-connect: existing in = %1 out = %2\n",
1596 existing_inputs, existing_outputs));
1598 const bool in_out_physical =
1599 (Config->get_input_auto_connect() & AutoConnectPhysical)
1600 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1603 const ChanCount in_offset = in_out_physical
1604 ? ChanCount::max(existing_inputs, existing_outputs)
1607 const ChanCount out_offset = in_out_physical
1608 ? ChanCount::max(existing_inputs, existing_outputs)
1611 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1612 vector<string> physinputs;
1613 vector<string> physoutputs;
1615 _engine.get_physical_outputs (*t, physoutputs);
1616 _engine.get_physical_inputs (*t, physinputs);
1618 if (!physinputs.empty() && connect_inputs) {
1619 uint32_t nphysical_in = physinputs.size();
1621 DEBUG_TRACE (DEBUG::Graph,
1622 string_compose("There are %1 physical inputs of type %2\n",
1625 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1628 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1629 DEBUG_TRACE (DEBUG::Graph,
1630 string_compose("Get index %1 + %2 % %3 = %4\n",
1631 in_offset.get(*t), i, nphysical_in,
1632 (in_offset.get(*t) + i) % nphysical_in));
1633 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1636 DEBUG_TRACE (DEBUG::Graph,
1637 string_compose("Connect route %1 IN to %2\n",
1638 route->name(), port));
1640 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
1644 ChanCount one_added (*t, 1);
1645 existing_inputs += one_added;
1649 if (!physoutputs.empty()) {
1650 uint32_t nphysical_out = physoutputs.size();
1651 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
1654 if ((*t) == DataType::MIDI || Config->get_output_auto_connect() & AutoConnectPhysical) {
1655 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1656 } else if ((*t) == DataType::AUDIO && Config->get_output_auto_connect() & AutoConnectMaster) {
1657 /* master bus is audio only */
1658 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1659 port = _master_out->input()->ports().port(*t,
1660 i % _master_out->input()->n_ports().get(*t))->name();
1664 DEBUG_TRACE (DEBUG::Graph,
1665 string_compose("Connect route %1 OUT to %2\n",
1666 route->name(), port));
1668 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
1672 ChanCount one_added (*t, 1);
1673 existing_outputs += one_added;
1679 /** Caller must not hold process lock
1680 * @param name_template string to use for the start of the name, or "" to use "Audio".
1682 list< boost::shared_ptr<AudioTrack> >
1683 Session::new_audio_track (
1684 int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template
1687 char track_name[32];
1688 uint32_t track_id = 0;
1690 RouteList new_routes;
1691 list<boost::shared_ptr<AudioTrack> > ret;
1692 uint32_t control_id;
1694 control_id = ntracks() + nbusses() + 1;
1696 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
1699 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1700 error << "cannot find name for new audio track" << endmsg;
1704 boost::shared_ptr<AudioTrack> track;
1707 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
1709 if (track->init ()) {
1713 track->use_new_diskstream();
1715 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1716 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1719 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1721 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1722 error << string_compose (
1723 _("cannot configure %1 in/%2 out configuration for new audio track"),
1724 input_channels, output_channels)
1729 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1730 error << string_compose (
1731 _("cannot configure %1 in/%2 out configuration for new audio track"),
1732 input_channels, output_channels)
1739 route_group->add (track);
1742 track->non_realtime_input_change();
1744 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1745 track->set_remote_control_id (control_id);
1748 new_routes.push_back (track);
1749 ret.push_back (track);
1752 catch (failed_constructor &err) {
1753 error << _("Session: could not create new audio track.") << endmsg;
1757 catch (AudioEngine::PortRegistrationFailure& pfe) {
1759 error << pfe.what() << endmsg;
1767 if (!new_routes.empty()) {
1768 add_routes (new_routes, true, true);
1775 Session::set_remote_control_ids ()
1777 RemoteModel m = Config->get_remote_model();
1778 bool emit_signal = false;
1780 boost::shared_ptr<RouteList> r = routes.reader ();
1782 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1783 if (MixerOrdered == m) {
1784 int32_t order = (*i)->order_key(N_("signal"));
1785 (*i)->set_remote_control_id (order+1, false);
1787 } else if (EditorOrdered == m) {
1788 int32_t order = (*i)->order_key(N_("editor"));
1789 (*i)->set_remote_control_id (order+1, false);
1791 } else if (UserOrdered == m) {
1792 //do nothing ... only changes to remote id's are initiated by user
1797 Route::RemoteControlIDChange();
1801 /** Caller must not hold process lock.
1802 * @param name_template string to use for the start of the name, or "" to use "Bus".
1805 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
1808 uint32_t bus_id = 0;
1811 uint32_t control_id;
1813 control_id = ntracks() + nbusses() + 1;
1815 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
1818 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
1819 error << "cannot find name for new audio bus" << endmsg;
1824 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
1830 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1831 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
1834 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1836 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1837 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1838 input_channels, output_channels)
1844 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1845 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1846 input_channels, output_channels)
1853 route_group->add (bus);
1855 bus->set_remote_control_id (control_id);
1858 bus->add_internal_return ();
1860 ret.push_back (bus);
1864 catch (failed_constructor &err) {
1865 error << _("Session: could not create new audio route.") << endmsg;
1869 catch (AudioEngine::PortRegistrationFailure& pfe) {
1870 error << pfe.what() << endmsg;
1880 add_routes (ret, false, true);
1888 Session::new_route_from_template (uint32_t how_many, const std::string& template_path)
1891 uint32_t control_id;
1893 uint32_t number = 0;
1895 if (!tree.read (template_path.c_str())) {
1899 XMLNode* node = tree.root();
1901 control_id = ntracks() + nbusses() + 1;
1905 XMLNode node_copy (*node);
1907 /* Remove IDs of everything so that new ones are used */
1908 node_copy.remove_property_recursively (X_("id"));
1911 string const route_name = node_copy.property(X_("name"))->value ();
1913 /* generate a new name by adding a number to the end of the template name */
1915 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
1916 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
1920 /* set this name in the XML description that we are about to use */
1921 Route::set_name_in_state (node_copy, name);
1923 /* trim bitslots from listen sends so that new ones are used */
1924 XMLNodeList children = node_copy.children ();
1925 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
1926 if ((*i)->name() == X_("Processor")) {
1927 XMLProperty* role = (*i)->property (X_("role"));
1928 if (role && role->value() == X_("Listen")) {
1929 (*i)->remove_property (X_("bitslot"));
1934 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
1937 error << _("Session: cannot create track/bus from template description") << endmsg;
1941 if (boost::dynamic_pointer_cast<Track>(route)) {
1942 /* force input/output change signals so that the new diskstream
1943 picks up the configuration of the route. During session
1944 loading this normally happens in a different way.
1947 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1949 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
1950 change.after = route->input()->n_ports();
1951 route->input()->changed (change, this);
1952 change.after = route->output()->n_ports();
1953 route->output()->changed (change, this);
1956 route->set_remote_control_id (control_id);
1959 ret.push_back (route);
1962 catch (failed_constructor &err) {
1963 error << _("Session: could not create new route from template") << endmsg;
1967 catch (AudioEngine::PortRegistrationFailure& pfe) {
1968 error << pfe.what() << endmsg;
1977 add_routes (ret, true, true);
1984 Session::add_routes (RouteList& new_routes, bool auto_connect, bool save)
1986 ChanCount existing_inputs;
1987 ChanCount existing_outputs;
1989 count_existing_track_channels (existing_inputs, existing_outputs);
1992 RCUWriter<RouteList> writer (routes);
1993 boost::shared_ptr<RouteList> r = writer.get_copy ();
1994 r->insert (r->end(), new_routes.begin(), new_routes.end());
1996 /* if there is no control out and we're not in the middle of loading,
1997 resort the graph here. if there is a control out, we will resort
1998 toward the end of this method. if we are in the middle of loading,
1999 we will resort when done.
2002 if (!_monitor_out && IO::connecting_legal) {
2003 resort_routes_using (r);
2007 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2009 boost::weak_ptr<Route> wpr (*x);
2010 boost::shared_ptr<Route> r (*x);
2012 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2013 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2014 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2015 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2016 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2017 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2018 r->order_key_changed.connect_same_thread (*this, boost::bind (&Session::route_order_key_changed, this));
2020 if (r->is_master()) {
2024 if (r->is_monitor()) {
2028 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2030 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2031 track_playlist_changed (boost::weak_ptr<Track> (tr));
2032 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2034 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2036 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2037 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2042 auto_connect_route (r, existing_inputs, existing_outputs, true);
2046 if (_monitor_out && IO::connecting_legal) {
2048 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2049 if ((*x)->is_monitor()) {
2051 } else if ((*x)->is_master()) {
2054 (*x)->listen_via_monitor ();
2064 save_state (_current_snapshot_name);
2067 RouteAdded (new_routes); /* EMIT SIGNAL */
2068 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
2072 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2074 boost::shared_ptr<RouteList> r = routes.reader ();
2075 boost::shared_ptr<Send> s;
2077 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2078 if ((s = (*i)->internal_send_for (dest)) != 0) {
2079 s->amp()->gain_control()->set_value (0.0);
2085 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2087 boost::shared_ptr<RouteList> r = routes.reader ();
2088 boost::shared_ptr<Send> s;
2090 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2091 if ((s = (*i)->internal_send_for (dest)) != 0) {
2092 s->amp()->gain_control()->set_value (1.0);
2098 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2100 boost::shared_ptr<RouteList> r = routes.reader ();
2101 boost::shared_ptr<Send> s;
2103 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2104 if ((s = (*i)->internal_send_for (dest)) != 0) {
2105 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2110 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2112 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2114 boost::shared_ptr<RouteList> r = routes.reader ();
2115 boost::shared_ptr<RouteList> t (new RouteList);
2117 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2118 /* no MIDI sends because there are no MIDI busses yet */
2119 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2124 add_internal_sends (dest, p, t);
2128 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2130 if (dest->is_monitor() || dest->is_master()) {
2134 if (!dest->internal_return()) {
2135 dest->add_internal_return();
2138 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2140 if ((*i)->is_monitor() || (*i)->is_master() || (*i) == dest) {
2144 (*i)->listen_via (dest, p);
2151 Session::remove_route (boost::shared_ptr<Route> route)
2153 if (((route == _master_out) || (route == _monitor_out)) && !Config->get_allow_special_bus_removal()) {
2157 route->set_solo (false, this);
2160 RCUWriter<RouteList> writer (routes);
2161 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2165 /* deleting the master out seems like a dumb
2166 idea, but its more of a UI policy issue
2170 if (route == _master_out) {
2171 _master_out = boost::shared_ptr<Route> ();
2174 if (route == _monitor_out) {
2176 /* cancel control outs for all routes */
2178 for (RouteList::iterator r = rs->begin(); r != rs->end(); ++r) {
2179 (*r)->drop_listen (_monitor_out);
2182 _monitor_out.reset ();
2185 /* writer goes out of scope, forces route list update */
2188 update_route_solo_state ();
2190 // We need to disconnect the route's inputs and outputs
2192 route->input()->disconnect (0);
2193 route->output()->disconnect (0);
2195 /* if the route had internal sends sending to it, remove them */
2196 if (route->internal_return()) {
2198 boost::shared_ptr<RouteList> r = routes.reader ();
2199 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2200 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2202 (*i)->remove_processor (s);
2207 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2208 if (mt && mt->step_editing()) {
2209 if (_step_editors > 0) {
2214 update_latency_compensation ();
2217 /* Re-sort routes to remove the graph's current references to the one that is
2218 * going away, then flush old references out of the graph.
2222 _process_graph->clear_other_chain ();
2224 /* get rid of it from the dead wood collection in the route list manager */
2226 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2230 /* try to cause everyone to drop their references */
2232 route->drop_references ();
2234 sync_order_keys (N_("session"));
2236 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2238 /* save the new state of the world */
2240 if (save_state (_current_snapshot_name)) {
2241 save_history (_current_snapshot_name);
2246 Session::route_mute_changed (void* /*src*/)
2252 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2254 boost::shared_ptr<Route> route = wpr.lock();
2256 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2260 if (route->listening_via_monitor ()) {
2262 if (Config->get_exclusive_solo()) {
2263 /* new listen: disable all other listen */
2264 boost::shared_ptr<RouteList> r = routes.reader ();
2265 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2266 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2269 (*i)->set_listen (false, this);
2275 } else if (_listen_cnt > 0) {
2280 update_route_solo_state ();
2283 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2285 boost::shared_ptr<Route> route = wpr.lock ();
2288 /* should not happen */
2289 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2293 bool send_changed = false;
2295 if (route->solo_isolated()) {
2296 if (_solo_isolated_cnt == 0) {
2297 send_changed = true;
2299 _solo_isolated_cnt++;
2300 } else if (_solo_isolated_cnt > 0) {
2301 _solo_isolated_cnt--;
2302 if (_solo_isolated_cnt == 0) {
2303 send_changed = true;
2308 IsolatedChanged (); /* EMIT SIGNAL */
2313 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2315 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
2317 if (!self_solo_change) {
2318 // session doesn't care about changes to soloed-by-others
2322 if (solo_update_disabled) {
2324 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
2328 boost::shared_ptr<Route> route = wpr.lock ();
2331 boost::shared_ptr<RouteList> r = routes.reader ();
2334 if (route->self_soloed()) {
2340 RouteGroup* rg = route->route_group ();
2341 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
2343 if (delta == 1 && Config->get_exclusive_solo()) {
2345 /* new solo: disable all other solos, but not the group if its solo-enabled */
2347 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2348 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2349 (leave_group_alone && ((*i)->route_group() == rg))) {
2352 (*i)->set_solo (false, this);
2356 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
2358 solo_update_disabled = true;
2360 RouteList uninvolved;
2362 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
2364 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2365 bool via_sends_only;
2366 bool in_signal_flow;
2368 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2369 (leave_group_alone && ((*i)->route_group() == rg))) {
2373 in_signal_flow = false;
2375 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
2377 if ((*i)->feeds (route, &via_sends_only)) {
2378 if (!via_sends_only) {
2379 if (!route->soloed_by_others_upstream()) {
2380 (*i)->mod_solo_by_others_downstream (delta);
2383 in_signal_flow = true;
2385 DEBUG_TRACE (DEBUG::Solo, "\tno feed from\n");
2388 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
2390 if (route->feeds (*i, &via_sends_only)) {
2391 /* propagate solo upstream only if routing other than
2392 sends is involved, but do consider the other route
2393 (*i) to be part of the signal flow even if only
2396 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
2400 route->soloed_by_others_downstream(),
2401 route->soloed_by_others_upstream()));
2402 if (!via_sends_only) {
2403 if (!route->soloed_by_others_downstream()) {
2404 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
2405 (*i)->mod_solo_by_others_upstream (delta);
2408 in_signal_flow = true;
2410 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
2413 if (!in_signal_flow) {
2414 uninvolved.push_back (*i);
2418 solo_update_disabled = false;
2419 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
2421 update_route_solo_state (r);
2423 /* now notify that the mute state of the routes not involved in the signal
2424 pathway of the just-solo-changed route may have altered.
2427 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2428 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1\n", (*i)->name()));
2429 (*i)->mute_changed (this);
2432 SoloChanged (); /* EMIT SIGNAL */
2437 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2439 /* now figure out if anything that matters is soloed (or is "listening")*/
2441 bool something_soloed = false;
2442 uint32_t listeners = 0;
2443 uint32_t isolated = 0;
2446 r = routes.reader();
2449 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2450 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2451 something_soloed = true;
2454 if (!(*i)->is_hidden() && (*i)->listening_via_monitor()) {
2455 if (Config->get_solo_control_is_listen_control()) {
2458 (*i)->set_listen (false, this);
2462 if ((*i)->solo_isolated()) {
2467 if (something_soloed != _non_soloed_outs_muted) {
2468 _non_soloed_outs_muted = something_soloed;
2469 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2472 _listen_cnt = listeners;
2474 if (isolated != _solo_isolated_cnt) {
2475 _solo_isolated_cnt = isolated;
2476 IsolatedChanged (); /* EMIT SIGNAL */
2480 boost::shared_ptr<RouteList>
2481 Session::get_routes_with_internal_returns() const
2483 boost::shared_ptr<RouteList> r = routes.reader ();
2484 boost::shared_ptr<RouteList> rl (new RouteList);
2486 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2487 if ((*i)->internal_return ()) {
2495 Session::io_name_is_legal (const std::string& name)
2497 boost::shared_ptr<RouteList> r = routes.reader ();
2499 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2500 if ((*i)->name() == name) {
2504 if ((*i)->has_io_processor_named (name)) {
2513 Session::set_exclusive_input_active (boost::shared_ptr<Route> rt, bool /*others_on*/)
2516 vector<string> connections;
2518 PortSet& ps (rt->input()->ports());
2520 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
2521 p->get_connections (connections);
2524 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
2525 routes_using_input_from (*s, rl);
2528 /* scan all relevant routes to see if others are on or off */
2530 bool others_are_already_on = false;
2532 for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
2534 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2536 if (mt->input_active()) {
2537 others_are_already_on = true;
2544 /* globally reverse other routes */
2546 for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
2548 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2550 mt->set_input_active (!others_are_already_on);
2557 Session::routes_using_input_from (const string& str, RouteList& rl)
2559 boost::shared_ptr<RouteList> r = routes.reader ();
2561 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2562 if ((*i)->input()->connected_to (str)) {
2568 boost::shared_ptr<Route>
2569 Session::route_by_name (string name)
2571 boost::shared_ptr<RouteList> r = routes.reader ();
2573 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2574 if ((*i)->name() == name) {
2579 return boost::shared_ptr<Route> ((Route*) 0);
2582 boost::shared_ptr<Route>
2583 Session::route_by_id (PBD::ID id)
2585 boost::shared_ptr<RouteList> r = routes.reader ();
2587 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2588 if ((*i)->id() == id) {
2593 return boost::shared_ptr<Route> ((Route*) 0);
2596 boost::shared_ptr<Track>
2597 Session::track_by_diskstream_id (PBD::ID id)
2599 boost::shared_ptr<RouteList> r = routes.reader ();
2601 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2602 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
2603 if (t && t->using_diskstream_id (id)) {
2608 return boost::shared_ptr<Track> ();
2611 boost::shared_ptr<Route>
2612 Session::route_by_remote_id (uint32_t id)
2614 boost::shared_ptr<RouteList> r = routes.reader ();
2616 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2617 if ((*i)->remote_control_id() == id) {
2622 return boost::shared_ptr<Route> ((Route*) 0);
2626 Session::playlist_region_added (boost::weak_ptr<Region> w)
2628 boost::shared_ptr<Region> r = w.lock ();
2633 /* These are the operations that are currently in progress... */
2634 list<GQuark> curr = _current_trans_quarks;
2637 /* ...and these are the operations during which we want to update
2638 the session range location markers.
2641 ops.push_back (Operations::capture);
2642 ops.push_back (Operations::paste);
2643 ops.push_back (Operations::duplicate_region);
2644 ops.push_back (Operations::insert_file);
2645 ops.push_back (Operations::insert_region);
2646 ops.push_back (Operations::drag_region_brush);
2647 ops.push_back (Operations::region_drag);
2648 ops.push_back (Operations::selection_grab);
2649 ops.push_back (Operations::region_fill);
2650 ops.push_back (Operations::fill_selection);
2651 ops.push_back (Operations::create_region);
2652 ops.push_back (Operations::region_copy);
2653 ops.push_back (Operations::fixed_time_region_copy);
2656 /* See if any of the current operations match the ones that we want */
2658 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
2660 /* If so, update the session range markers */
2662 maybe_update_session_range (r->position (), r->last_frame ());
2666 /** Update the session range markers if a is before the current start or
2667 * b is after the current end.
2670 Session::maybe_update_session_range (framepos_t a, framepos_t b)
2672 if (_state_of_the_state & Loading) {
2676 if (_session_range_location == 0) {
2678 add_session_range_location (a, b);
2682 if (a < _session_range_location->start()) {
2683 _session_range_location->set_start (a);
2686 if (b > _session_range_location->end()) {
2687 _session_range_location->set_end (b);
2693 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
2695 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2696 maybe_update_session_range (i->to, i->to + i->length);
2701 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
2703 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2704 maybe_update_session_range (i->from, i->to);
2708 /* Region management */
2710 boost::shared_ptr<Region>
2711 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2713 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2714 RegionFactory::RegionMap::const_iterator i;
2715 boost::shared_ptr<Region> region;
2717 Glib::Mutex::Lock lm (region_lock);
2719 for (i = regions.begin(); i != regions.end(); ++i) {
2723 if (region->whole_file()) {
2725 if (child->source_equivalent (region)) {
2731 return boost::shared_ptr<Region> ();
2735 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2737 set<boost::shared_ptr<Region> > relevant_regions;
2739 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2740 RegionFactory::get_regions_using_source (*s, relevant_regions);
2743 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2744 set<boost::shared_ptr<Region> >::iterator tmp;
2749 playlists->destroy_region (*r);
2750 RegionFactory::map_remove (*r);
2752 (*r)->drop_sources ();
2753 (*r)->drop_references ();
2755 relevant_regions.erase (r);
2760 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
2763 Glib::Mutex::Lock ls (source_lock);
2764 /* remove from the main source list */
2765 sources.erase ((*s)->id());
2768 (*s)->mark_for_remove ();
2769 (*s)->drop_references ();
2778 Session::remove_last_capture ()
2780 list<boost::shared_ptr<Source> > srcs;
2782 boost::shared_ptr<RouteList> rl = routes.reader ();
2783 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2784 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2789 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
2792 srcs.insert (srcs.end(), l.begin(), l.end());
2797 destroy_sources (srcs);
2799 save_state (_current_snapshot_name);
2804 /* Source Management */
2807 Session::add_source (boost::shared_ptr<Source> source)
2809 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
2810 pair<SourceMap::iterator,bool> result;
2812 entry.first = source->id();
2813 entry.second = source;
2816 Glib::Mutex::Lock lm (source_lock);
2817 result = sources.insert (entry);
2820 if (result.second) {
2822 /* yay, new source */
2826 boost::shared_ptr<AudioFileSource> afs;
2828 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
2829 if (Config->get_auto_analyse_audio()) {
2830 Analyser::queue_source_for_analysis (source, false);
2834 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
2839 Session::remove_source (boost::weak_ptr<Source> src)
2841 if (_state_of_the_state & Deletion) {
2845 SourceMap::iterator i;
2846 boost::shared_ptr<Source> source = src.lock();
2853 Glib::Mutex::Lock lm (source_lock);
2855 if ((i = sources.find (source->id())) != sources.end()) {
2860 if (!_state_of_the_state & InCleanup) {
2862 /* save state so we don't end up with a session file
2863 referring to non-existent sources.
2866 save_state (_current_snapshot_name);
2870 boost::shared_ptr<Source>
2871 Session::source_by_id (const PBD::ID& id)
2873 Glib::Mutex::Lock lm (source_lock);
2874 SourceMap::iterator i;
2875 boost::shared_ptr<Source> source;
2877 if ((i = sources.find (id)) != sources.end()) {
2884 boost::shared_ptr<Source>
2885 Session::source_by_path_and_channel (const string& path, uint16_t chn)
2887 Glib::Mutex::Lock lm (source_lock);
2889 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2890 boost::shared_ptr<AudioFileSource> afs
2891 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
2893 if (afs && afs->path() == path && chn == afs->channel()) {
2897 return boost::shared_ptr<Source>();
2901 Session::count_sources_by_origin (const string& path)
2904 Glib::Mutex::Lock lm (source_lock);
2906 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2907 boost::shared_ptr<FileSource> fs
2908 = boost::dynamic_pointer_cast<FileSource>(i->second);
2910 if (fs && fs->origin() == path) {
2920 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
2923 string old_basename = PBD::basename_nosuffix (oldname);
2924 string new_legalized = legalize_for_path (newname);
2926 /* note: we know (or assume) the old path is already valid */
2930 /* destructive file sources have a name of the form:
2932 /path/to/Tnnnn-NAME(%[LR])?.wav
2934 the task here is to replace NAME with the new name.
2939 string::size_type dash;
2941 dir = Glib::path_get_dirname (path);
2942 path = Glib::path_get_basename (path);
2944 /* '-' is not a legal character for the NAME part of the path */
2946 if ((dash = path.find_last_of ('-')) == string::npos) {
2950 prefix = path.substr (0, dash);
2954 path += new_legalized;
2955 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
2956 path = Glib::build_filename (dir, path);
2960 /* non-destructive file sources have a name of the form:
2962 /path/to/NAME-nnnnn(%[LR])?.ext
2964 the task here is to replace NAME with the new name.
2969 string::size_type dash;
2970 string::size_type postfix;
2972 dir = Glib::path_get_dirname (path);
2973 path = Glib::path_get_basename (path);
2975 /* '-' is not a legal character for the NAME part of the path */
2977 if ((dash = path.find_last_of ('-')) == string::npos) {
2981 suffix = path.substr (dash+1);
2983 // Suffix is now everything after the dash. Now we need to eliminate
2984 // the nnnnn part, which is done by either finding a '%' or a '.'
2986 postfix = suffix.find_last_of ("%");
2987 if (postfix == string::npos) {
2988 postfix = suffix.find_last_of ('.');
2991 if (postfix != string::npos) {
2992 suffix = suffix.substr (postfix);
2994 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
2998 const uint32_t limit = 10000;
2999 char buf[PATH_MAX+1];
3001 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
3003 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
3005 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
3006 path = Glib::build_filename (dir, buf);
3014 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
3023 /** Return the full path (in some session directory) for a new within-session source.
3024 * \a name must be a session-unique name that does not contain slashes
3025 * (e.g. as returned by new_*_source_name)
3028 Session::new_source_path_from_name (DataType type, const string& name)
3030 assert(name.find("/") == string::npos);
3032 SessionDirectory sdir(get_best_session_directory_for_new_source());
3035 if (type == DataType::AUDIO) {
3036 p = sdir.sound_path();
3037 } else if (type == DataType::MIDI) {
3038 p = sdir.midi_path();
3040 error << "Unknown source type, unable to create file path" << endmsg;
3045 return p.to_string();
3049 Session::peak_path (string base) const
3051 sys::path peakfile_path(_session_dir->peak_path());
3052 peakfile_path /= base + peakfile_suffix;
3053 return peakfile_path.to_string();
3056 /** Return a unique name based on \a base for a new internal audio source */
3058 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
3061 char buf[PATH_MAX+1];
3062 const uint32_t limit = 10000;
3064 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3067 legalized = legalize_for_path (base);
3069 // Find a "version" of the base name that doesn't exist in any of the possible directories.
3070 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3072 vector<space_and_path>::iterator i;
3073 uint32_t existing = 0;
3075 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3080 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3081 cnt, legalized.c_str(), ext.c_str());
3082 } else if (nchan == 2) {
3084 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
3085 cnt, legalized.c_str(), ext.c_str());
3087 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
3088 cnt, legalized.c_str(), ext.c_str());
3090 } else if (nchan < 26) {
3091 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
3092 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
3094 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3095 cnt, legalized.c_str(), ext.c_str());
3101 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3102 } else if (nchan == 2) {
3104 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
3106 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
3108 } else if (nchan < 26) {
3109 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
3111 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3115 SessionDirectory sdir((*i).path);
3117 string spath = sdir.sound_path().to_string();
3119 /* note that we search *without* the extension so that
3120 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3121 in the event that this new name is required for
3122 a file format change.
3125 if (matching_unsuffixed_filename_exists_in (spath, buf)) {
3131 if (existing == 0) {
3136 error << string_compose(
3137 _("There are already %1 recordings for %2, which I consider too many."),
3138 limit, base) << endmsg;
3140 throw failed_constructor();
3144 return Glib::path_get_basename (buf);
3147 /** Create a new within-session audio source */
3148 boost::shared_ptr<AudioFileSource>
3149 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
3151 const string name = new_audio_source_name (n, n_chans, chan, destructive);
3152 const string path = new_source_path_from_name(DataType::AUDIO, name);
3154 return boost::dynamic_pointer_cast<AudioFileSource> (
3155 SourceFactory::createWritable (DataType::AUDIO, *this, path, string(), destructive, frame_rate()));
3158 /** Return a unique name based on \a base for a new internal MIDI source */
3160 Session::new_midi_source_name (const string& base)
3163 char buf[PATH_MAX+1];
3164 const uint32_t limit = 10000;
3168 legalized = legalize_for_path (base);
3170 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3171 for (cnt = 1; cnt <= limit; ++cnt) {
3173 vector<space_and_path>::iterator i;
3174 uint32_t existing = 0;
3176 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3178 SessionDirectory sdir((*i).path);
3180 sys::path p = sdir.midi_path();
3183 snprintf (buf, sizeof(buf), "%s-%u.mid", p.to_string().c_str(), cnt);
3185 if (sys::exists (buf)) {
3190 if (existing == 0) {
3195 error << string_compose(
3196 _("There are already %1 recordings for %2, which I consider too many."),
3197 limit, base) << endmsg;
3199 throw failed_constructor();
3203 return Glib::path_get_basename(buf);
3207 /** Create a new within-session MIDI source */
3208 boost::shared_ptr<MidiSource>
3209 Session::create_midi_source_for_session (Track* track, string const & n)
3211 /* try to use the existing write source for the track, to keep numbering sane
3215 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3219 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3222 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3223 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3227 const string name = new_midi_source_name (n);
3228 const string path = new_source_path_from_name (DataType::MIDI, name);
3230 return boost::dynamic_pointer_cast<SMFSource> (
3231 SourceFactory::createWritable (
3232 DataType::MIDI, *this, path, string(), false, frame_rate()));
3237 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3239 if (playlist->hidden()) {
3243 playlists->add (playlist);
3246 playlist->release();
3253 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3255 if (_state_of_the_state & Deletion) {
3259 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3265 playlists->remove (playlist);
3271 Session::set_audition (boost::shared_ptr<Region> r)
3273 pending_audition_region = r;
3274 add_post_transport_work (PostTransportAudition);
3275 _butler->schedule_transport_work ();
3279 Session::audition_playlist ()
3281 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3282 ev->region.reset ();
3287 Session::non_realtime_set_audition ()
3289 if (!pending_audition_region) {
3290 auditioner->audition_current_playlist ();
3292 auditioner->audition_region (pending_audition_region);
3293 pending_audition_region.reset ();
3295 AuditionActive (true); /* EMIT SIGNAL */
3299 Session::audition_region (boost::shared_ptr<Region> r)
3301 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3307 Session::cancel_audition ()
3309 if (auditioner->auditioning()) {
3310 auditioner->cancel_audition ();
3311 AuditionActive (false); /* EMIT SIGNAL */
3316 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3318 if (a->is_monitor()) {
3321 if (b->is_monitor()) {
3324 return a->order_key(N_("signal")) < b->order_key(N_("signal"));
3328 Session::is_auditioning () const
3330 /* can be called before we have an auditioner object */
3332 return auditioner->auditioning();
3339 Session::graph_reordered ()
3341 /* don't do this stuff if we are setting up connections
3342 from a set_state() call or creating new tracks. Ditto for deletion.
3345 if (_state_of_the_state & (InitialConnecting|Deletion)) {
3349 /* every track/bus asked for this to be handled but it was deferred because
3350 we were connecting. do it now.
3353 request_input_change_handling ();
3357 /* force all diskstreams to update their capture offset values to
3358 reflect any changes in latencies within the graph.
3361 boost::shared_ptr<RouteList> rl = routes.reader ();
3362 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3363 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3365 tr->set_capture_offset ();
3371 Session::available_capture_duration ()
3373 float sample_bytes_on_disk = 4.0; // keep gcc happy
3375 switch (config.get_native_file_data_format()) {
3377 sample_bytes_on_disk = 4.0;
3381 sample_bytes_on_disk = 3.0;
3385 sample_bytes_on_disk = 2.0;
3389 /* impossible, but keep some gcc versions happy */
3390 fatal << string_compose (_("programming error: %1"),
3391 X_("illegal native file data format"))
3396 double scale = 4096.0 / sample_bytes_on_disk;
3398 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3399 return max_framecnt;
3402 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3406 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3409 RCUWriter<BundleList> writer (_bundles);
3410 boost::shared_ptr<BundleList> b = writer.get_copy ();
3411 b->push_back (bundle);
3414 BundleAdded (bundle); /* EMIT SIGNAL */
3420 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3422 bool removed = false;
3425 RCUWriter<BundleList> writer (_bundles);
3426 boost::shared_ptr<BundleList> b = writer.get_copy ();
3427 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3429 if (i != b->end()) {
3436 BundleRemoved (bundle); /* EMIT SIGNAL */
3442 boost::shared_ptr<Bundle>
3443 Session::bundle_by_name (string name) const
3445 boost::shared_ptr<BundleList> b = _bundles.reader ();
3447 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3448 if ((*i)->name() == name) {
3453 return boost::shared_ptr<Bundle> ();
3457 Session::tempo_map_changed (const PropertyChange&)
3461 playlists->update_after_tempo_map_change ();
3463 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3469 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3471 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3472 (*i)->recompute_frames_from_bbt ();
3476 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3477 * the given count with the current block size.
3480 Session::ensure_buffers (ChanCount howmany)
3482 BufferManager::ensure_buffers (howmany);
3486 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3488 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3489 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3494 Session::next_insert_id ()
3496 /* this doesn't really loop forever. just think about it */
3499 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3500 if (!insert_bitset[n]) {
3501 insert_bitset[n] = true;
3507 /* none available, so resize and try again */
3509 insert_bitset.resize (insert_bitset.size() + 16, false);
3514 Session::next_send_id ()
3516 /* this doesn't really loop forever. just think about it */
3519 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3520 if (!send_bitset[n]) {
3521 send_bitset[n] = true;
3527 /* none available, so resize and try again */
3529 send_bitset.resize (send_bitset.size() + 16, false);
3534 Session::next_return_id ()
3536 /* this doesn't really loop forever. just think about it */
3539 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3540 if (!return_bitset[n]) {
3541 return_bitset[n] = true;
3547 /* none available, so resize and try again */
3549 return_bitset.resize (return_bitset.size() + 16, false);
3554 Session::mark_send_id (uint32_t id)
3556 if (id >= send_bitset.size()) {
3557 send_bitset.resize (id+16, false);
3559 if (send_bitset[id]) {
3560 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3562 send_bitset[id] = true;
3566 Session::mark_return_id (uint32_t id)
3568 if (id >= return_bitset.size()) {
3569 return_bitset.resize (id+16, false);
3571 if (return_bitset[id]) {
3572 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3574 return_bitset[id] = true;
3578 Session::mark_insert_id (uint32_t id)
3580 if (id >= insert_bitset.size()) {
3581 insert_bitset.resize (id+16, false);
3583 if (insert_bitset[id]) {
3584 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3586 insert_bitset[id] = true;
3590 Session::unmark_send_id (uint32_t id)
3592 if (id < send_bitset.size()) {
3593 send_bitset[id] = false;
3598 Session::unmark_return_id (uint32_t id)
3600 if (id < return_bitset.size()) {
3601 return_bitset[id] = false;
3606 Session::unmark_insert_id (uint32_t id)
3608 if (id < insert_bitset.size()) {
3609 insert_bitset[id] = false;
3614 /* Named Selection management */
3616 boost::shared_ptr<NamedSelection>
3617 Session::named_selection_by_name (string name)
3619 Glib::Mutex::Lock lm (named_selection_lock);
3620 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
3621 if ((*i)->name == name) {
3625 return boost::shared_ptr<NamedSelection>();
3629 Session::add_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3632 Glib::Mutex::Lock lm (named_selection_lock);
3633 named_selections.insert (named_selections.begin(), named_selection);
3638 NamedSelectionAdded (); /* EMIT SIGNAL */
3642 Session::remove_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3644 bool removed = false;
3647 Glib::Mutex::Lock lm (named_selection_lock);
3649 NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
3651 if (i != named_selections.end()) {
3652 named_selections.erase (i);
3659 NamedSelectionRemoved (); /* EMIT SIGNAL */
3664 Session::reset_native_file_format ()
3666 boost::shared_ptr<RouteList> rl = routes.reader ();
3667 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3668 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3670 /* don't save state as we do this, there's no point
3673 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3674 tr->reset_write_sources (false);
3675 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3681 Session::route_name_unique (string n) const
3683 boost::shared_ptr<RouteList> r = routes.reader ();
3685 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3686 if ((*i)->name() == n) {
3695 Session::route_name_internal (string n) const
3697 if (auditioner && auditioner->name() == n) {
3701 if (_click_io && _click_io->name() == n) {
3709 Session::freeze_all (InterThreadInfo& itt)
3711 boost::shared_ptr<RouteList> r = routes.reader ();
3713 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3715 boost::shared_ptr<Track> t;
3717 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3718 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3728 boost::shared_ptr<Region>
3729 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
3730 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3731 InterThreadInfo& itt, bool enable_processing)
3733 boost::shared_ptr<Region> result;
3734 boost::shared_ptr<Playlist> playlist;
3735 boost::shared_ptr<AudioFileSource> fsource;
3737 char buf[PATH_MAX+1];
3738 ChanCount diskstream_channels (track.n_channels());
3739 framepos_t position;
3740 framecnt_t this_chunk;
3743 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3744 const string sound_dir = sdir.sound_path().to_string();
3745 framepos_t len = end - start;
3746 bool need_block_size_reset = false;
3748 ChanCount const max_proc = track.max_processor_streams ();
3751 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3752 end, start) << endmsg;
3756 const framecnt_t chunk_size = (256 * 1024)/4;
3758 // block all process callback handling
3760 block_processing ();
3762 /* call tree *MUST* hold route_lock */
3764 if ((playlist = track.playlist()) == 0) {
3768 /* external redirects will be a problem */
3770 if (track.has_external_redirects()) {
3774 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3776 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
3778 for (x = 0; x < 99999; ++x) {
3779 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());
3780 if (!Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
3786 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3791 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
3792 SourceFactory::createWritable (DataType::AUDIO, *this, buf, string(), false, frame_rate()));
3795 catch (failed_constructor& err) {
3796 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
3800 srcs.push_back (fsource);
3803 /* tell redirects that care that we are about to use a much larger blocksize */
3805 need_block_size_reset = true;
3806 track.set_block_size (chunk_size);
3808 /* XXX need to flush all redirects */
3813 /* create a set of reasonably-sized buffers */
3814 buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
3815 buffers.set_count (max_proc);
3817 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3818 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3820 afs->prepare_for_peakfile_writes ();
3823 while (to_do && !itt.cancel) {
3825 this_chunk = min (to_do, chunk_size);
3827 if (track.export_stuff (buffers, start, this_chunk, enable_processing)) {
3832 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
3833 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3836 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
3842 start += this_chunk;
3843 to_do -= this_chunk;
3845 itt.progress = (float) (1.0 - ((double) to_do / len));
3854 xnow = localtime (&now);
3856 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3857 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3860 afs->update_header (position, *xnow, now);
3861 afs->flush_header ();
3865 /* construct a region to represent the bounced material */
3869 plist.add (Properties::start, 0);
3870 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
3871 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
3873 result = RegionFactory::create (srcs, plist);
3879 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3880 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3883 afs->mark_for_remove ();
3886 (*src)->drop_references ();
3890 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3891 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3894 afs->done_with_peakfile_writes ();
3899 if (need_block_size_reset) {
3900 track.set_block_size (get_block_size());
3903 unblock_processing ();
3909 Session::gain_automation_buffer() const
3911 return ProcessThread::gain_automation_buffer ();
3915 Session::pan_automation_buffer() const
3917 return ProcessThread::pan_automation_buffer ();
3921 Session::get_silent_buffers (ChanCount count)
3923 return ProcessThread::get_silent_buffers (count);
3927 Session::get_scratch_buffers (ChanCount count)
3929 return ProcessThread::get_scratch_buffers (count);
3933 Session::get_mix_buffers (ChanCount count)
3935 return ProcessThread::get_mix_buffers (count);
3939 Session::ntracks () const
3942 boost::shared_ptr<RouteList> r = routes.reader ();
3944 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3945 if (boost::dynamic_pointer_cast<Track> (*i)) {
3954 Session::nbusses () const
3957 boost::shared_ptr<RouteList> r = routes.reader ();
3959 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3960 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
3969 Session::add_automation_list(AutomationList *al)
3971 automation_lists[al->id()] = al;
3975 Session::sync_order_keys (std::string const & base)
3977 if (deletion_in_progress()) {
3981 if (!Config->get_sync_all_route_ordering()) {
3982 /* leave order keys as they are */
3986 boost::shared_ptr<RouteList> r = routes.reader ();
3988 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3989 (*i)->sync_order_keys (base);
3992 Route::SyncOrderKeys (base); // EMIT SIGNAL
3994 /* this might not do anything */
3996 set_remote_control_ids ();
3999 /** @return true if there is at least one record-enabled track, otherwise false */
4001 Session::have_rec_enabled_track () const
4003 return g_atomic_int_get (&_have_rec_enabled_track) == 1;
4006 /** Update the state of our rec-enabled tracks flag */
4008 Session::update_have_rec_enabled_track ()
4010 boost::shared_ptr<RouteList> rl = routes.reader ();
4011 RouteList::iterator i = rl->begin();
4012 while (i != rl->end ()) {
4014 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4015 if (tr && tr->record_enabled ()) {
4022 int const old = g_atomic_int_get (&_have_rec_enabled_track);
4024 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4026 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4027 RecordStateChanged (); /* EMIT SIGNAL */
4032 Session::listen_position_changed ()
4034 boost::shared_ptr<RouteList> r = routes.reader ();
4036 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4037 (*i)->listen_position_changed ();
4042 Session::solo_control_mode_changed ()
4044 /* cancel all solo or all listen when solo control mode changes */
4047 set_solo (get_routes(), false);
4048 } else if (listening()) {
4049 set_listen (get_routes(), false);
4053 /** Called when a property of one of our route groups changes */
4055 Session::route_group_property_changed (RouteGroup* rg)
4057 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4060 /** Called when a route is added to one of our route groups */
4062 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4064 RouteAddedToRouteGroup (rg, r);
4067 /** Called when a route is removed from one of our route groups */
4069 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4071 RouteRemovedFromRouteGroup (rg, r);
4075 Session::get_available_sync_options () const
4077 vector<SyncSource> ret;
4079 ret.push_back (JACK);
4080 ret.push_back (MTC);
4081 ret.push_back (MIDIClock);
4086 boost::shared_ptr<RouteList>
4087 Session::get_routes_with_regions_at (framepos_t const p) const
4089 boost::shared_ptr<RouteList> r = routes.reader ();
4090 boost::shared_ptr<RouteList> rl (new RouteList);
4092 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4093 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4098 boost::shared_ptr<Playlist> pl = tr->playlist ();
4103 if (pl->has_region_at (p)) {
4112 Session::goto_end ()
4114 if (_session_range_location) {
4115 request_locate (_session_range_location->end(), false);
4117 request_locate (0, false);
4122 Session::goto_start ()
4124 if (_session_range_location) {
4125 request_locate (_session_range_location->start(), false);
4127 request_locate (0, false);
4132 Session::current_start_frame () const
4134 return _session_range_location ? _session_range_location->start() : 0;
4138 Session::current_end_frame () const
4140 return _session_range_location ? _session_range_location->end() : 0;
4144 Session::add_session_range_location (framepos_t start, framepos_t end)
4146 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4147 _locations->add (_session_range_location);
4150 /** Called when one of our routes' order keys has changed */
4152 Session::route_order_key_changed ()
4154 RouteOrderKeyChanged (); /* EMIT SIGNAL */
4158 Session::step_edit_status_change (bool yn)
4164 send = (_step_editors == 0);
4169 send = (_step_editors == 1);
4172 if (_step_editors > 0) {
4178 StepEditStatusChange (val);
4184 Session::start_time_changed (framepos_t old)
4186 /* Update the auto loop range to match the session range
4187 (unless the auto loop range has been changed by the user)
4190 Location* s = _locations->session_range_location ();
4195 Location* l = _locations->auto_loop_location ();
4197 if (l->start() == old) {
4198 l->set_start (s->start(), true);
4203 Session::end_time_changed (framepos_t old)
4205 /* Update the auto loop range to match the session range
4206 (unless the auto loop range has been changed by the user)
4209 Location* s = _locations->session_range_location ();
4214 Location* l = _locations->auto_loop_location ();
4216 if (l && l->end() == old) {
4217 l->set_end (s->end(), true);
4222 Session::source_search_path (DataType type) const
4226 if (session_dirs.size() == 1) {
4228 case DataType::AUDIO:
4229 s.push_back ( _session_dir->sound_path().to_string());
4231 case DataType::MIDI:
4232 s.push_back (_session_dir->midi_path().to_string());
4236 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4237 SessionDirectory sdir (i->path);
4239 case DataType::AUDIO:
4240 s.push_back (sdir.sound_path().to_string());
4242 case DataType::MIDI:
4243 s.push_back (sdir.midi_path().to_string());
4249 /* now check the explicit (possibly user-specified) search path
4252 vector<string> dirs;
4255 case DataType::AUDIO:
4256 split (config.get_audio_search_path (), dirs, ':');
4258 case DataType::MIDI:
4259 split (config.get_midi_search_path (), dirs, ':');
4263 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4265 vector<string>::iterator si;
4267 for (si = s.begin(); si != s.end(); ++si) {
4273 if (si == s.end()) {
4280 for (vector<string>::iterator si = s.begin(); si != s.end(); ++si) {
4281 if (!search_path.empty()) {
4291 Session::ensure_search_path_includes (const string& path, DataType type)
4294 vector<string> dirs;
4301 case DataType::AUDIO:
4302 search_path = config.get_audio_search_path ();
4304 case DataType::MIDI:
4305 search_path = config.get_midi_search_path ();
4309 split (search_path, dirs, ':');
4311 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4317 if (!search_path.empty()) {
4321 search_path += path;
4324 case DataType::AUDIO:
4325 config.set_audio_search_path (search_path);
4327 case DataType::MIDI:
4328 config.set_midi_search_path (search_path);
4333 boost::shared_ptr<Speakers>
4334 Session::get_speakers()
4340 Session::unknown_processors () const
4344 boost::shared_ptr<RouteList> r = routes.reader ();
4345 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4346 list<string> t = (*i)->unknown_processors ();
4347 copy (t.begin(), t.end(), back_inserter (p));
4357 Session::update_latency (bool playback)
4359 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
4361 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4365 boost::shared_ptr<RouteList> r = routes.reader ();
4366 framecnt_t max_latency = 0;
4369 /* reverse the list so that we work backwards from the last route to run to the first */
4370 RouteList* rl = routes.reader().get();
4371 r.reset (new RouteList (*rl));
4372 reverse (r->begin(), r->end());
4375 /* compute actual latency values for the given direction and store them all in per-port
4376 structures. this will also publish the same values (to JACK) so that computation of latency
4377 for routes can consistently use public latency values.
4380 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4381 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
4384 /* because we latency compensate playback, our published playback latencies should
4385 be the same for all output ports - all material played back by ardour has
4386 the same latency, whether its caused by plugins or by latency compensation. since
4387 these may differ from the values computed above, reset all playback port latencies
4391 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
4393 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4394 (*i)->set_public_port_latencies (max_latency, playback);
4399 post_playback_latency ();
4403 post_capture_latency ();
4406 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
4410 Session::post_playback_latency ()
4412 set_worst_playback_latency ();
4414 boost::shared_ptr<RouteList> r = routes.reader ();
4416 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4417 if (!(*i)->is_hidden() && ((*i)->active())) {
4418 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
4422 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4423 (*i)->set_latency_compensation (_worst_track_latency);
4428 Session::post_capture_latency ()
4430 set_worst_capture_latency ();
4432 /* reflect any changes in capture latencies into capture offsets
4435 boost::shared_ptr<RouteList> rl = routes.reader();
4436 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4437 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4439 tr->set_capture_offset ();
4445 Session::initialize_latencies ()
4448 Glib::Mutex::Lock lm (_engine.process_lock());
4449 update_latency (false);
4450 update_latency (true);
4453 set_worst_io_latencies ();
4457 Session::set_worst_io_latencies ()
4459 set_worst_playback_latency ();
4460 set_worst_capture_latency ();
4464 Session::set_worst_playback_latency ()
4466 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4470 _worst_output_latency = 0;
4472 if (!_engine.connected()) {
4476 boost::shared_ptr<RouteList> r = routes.reader ();
4478 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4479 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
4482 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
4486 Session::set_worst_capture_latency ()
4488 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4492 _worst_input_latency = 0;
4494 if (!_engine.connected()) {
4498 boost::shared_ptr<RouteList> r = routes.reader ();
4500 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4501 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
4504 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
4508 Session::update_latency_compensation (bool force_whole_graph)
4510 bool some_track_latency_changed = false;
4512 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4516 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
4518 _worst_track_latency = 0;
4520 boost::shared_ptr<RouteList> r = routes.reader ();
4522 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4523 if (!(*i)->is_hidden() && ((*i)->active())) {
4525 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
4526 some_track_latency_changed = true;
4528 _worst_track_latency = max (tl, _worst_track_latency);
4532 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
4533 (some_track_latency_changed ? "yes" : "no")));
4535 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
4537 if (some_track_latency_changed || force_whole_graph) {
4538 _engine.update_latencies ();
4542 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4543 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4547 tr->set_capture_offset ();
4552 Session::session_name_is_legal (const string& path)
4554 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
4556 for (int i = 0; illegal_chars[i]; ++i) {
4557 if (path.find (illegal_chars[i]) != string::npos) {
4558 return illegal_chars[i];