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->monitor_input (yn);
791 Session::reset_input_monitor_state ()
793 if (transport_rolling()) {
794 set_track_monitor_input_status (Config->get_monitoring_model() == HardwareMonitoring && !config.get_auto_input());
796 set_track_monitor_input_status (Config->get_monitoring_model() == HardwareMonitoring);
801 Session::auto_punch_start_changed (Location* location)
803 replace_event (SessionEvent::PunchIn, location->start());
805 if (get_record_enabled() && config.get_punch_in()) {
806 /* capture start has been changed, so save new pending state */
807 save_state ("", true);
812 Session::auto_punch_end_changed (Location* location)
814 framepos_t when_to_stop = location->end();
815 // when_to_stop += _worst_output_latency + _worst_input_latency;
816 replace_event (SessionEvent::PunchOut, when_to_stop);
820 Session::auto_punch_changed (Location* location)
822 framepos_t when_to_stop = location->end();
824 replace_event (SessionEvent::PunchIn, location->start());
825 //when_to_stop += _worst_output_latency + _worst_input_latency;
826 replace_event (SessionEvent::PunchOut, when_to_stop);
830 Session::auto_loop_changed (Location* location)
832 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
834 if (transport_rolling() && play_loop) {
837 // if (_transport_frame > location->end()) {
839 if (_transport_frame < location->start() || _transport_frame > location->end()) {
840 // relocate to beginning of loop
841 clear_events (SessionEvent::LocateRoll);
843 request_locate (location->start(), true);
846 else if (Config->get_seamless_loop() && !loop_changing) {
848 // schedule a locate-roll to refill the diskstreams at the
850 loop_changing = true;
852 if (location->end() > last_loopend) {
853 clear_events (SessionEvent::LocateRoll);
854 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
861 last_loopend = location->end();
865 Session::set_auto_punch_location (Location* location)
869 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
870 punch_connections.drop_connections();
871 existing->set_auto_punch (false, this);
872 remove_event (existing->start(), SessionEvent::PunchIn);
873 clear_events (SessionEvent::PunchOut);
874 auto_punch_location_changed (0);
883 if (location->end() <= location->start()) {
884 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
888 punch_connections.drop_connections ();
890 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
891 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
892 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
894 location->set_auto_punch (true, this);
896 auto_punch_changed (location);
898 auto_punch_location_changed (location);
902 Session::set_auto_loop_location (Location* location)
906 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
907 loop_connections.drop_connections ();
908 existing->set_auto_loop (false, this);
909 remove_event (existing->end(), SessionEvent::AutoLoop);
910 auto_loop_location_changed (0);
919 if (location->end() <= location->start()) {
920 error << _("Session: you can't use a mark for auto loop") << endmsg;
924 last_loopend = location->end();
926 loop_connections.drop_connections ();
928 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
929 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
930 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
932 location->set_auto_loop (true, this);
934 /* take care of our stuff first */
936 auto_loop_changed (location);
938 /* now tell everyone else */
940 auto_loop_location_changed (location);
944 Session::locations_added (Location *)
950 Session::locations_changed ()
952 _locations->apply (*this, &Session::handle_locations_changed);
956 Session::handle_locations_changed (Locations::LocationList& locations)
958 Locations::LocationList::iterator i;
960 bool set_loop = false;
961 bool set_punch = false;
963 for (i = locations.begin(); i != locations.end(); ++i) {
967 if (location->is_auto_punch()) {
968 set_auto_punch_location (location);
971 if (location->is_auto_loop()) {
972 set_auto_loop_location (location);
976 if (location->is_session_range()) {
977 _session_range_location = location;
982 set_auto_loop_location (0);
985 set_auto_punch_location (0);
992 Session::enable_record ()
994 if (_transport_speed != 0.0 && _transport_speed != 1.0) {
995 /* no recording at anything except normal speed */
1000 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1002 if (rs == Recording) {
1006 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1008 _last_record_location = _transport_frame;
1009 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1011 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1012 set_track_monitor_input_status (true);
1015 RecordStateChanged ();
1022 Session::disable_record (bool rt_context, bool force)
1026 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1028 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1029 g_atomic_int_set (&_record_status, Disabled);
1030 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1032 if (rs == Recording) {
1033 g_atomic_int_set (&_record_status, Enabled);
1037 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1038 set_track_monitor_input_status (false);
1041 RecordStateChanged (); /* emit signal */
1044 remove_pending_capture_state ();
1050 Session::step_back_from_record ()
1052 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1054 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1055 set_track_monitor_input_status (false);
1058 RecordStateChanged (); /* emit signal */
1063 Session::maybe_enable_record ()
1065 if (_step_editors > 0) {
1069 g_atomic_int_set (&_record_status, Enabled);
1071 /* This function is currently called from somewhere other than an RT thread.
1072 This save_state() call therefore doesn't impact anything. Doing it here
1073 means that we save pending state of which sources the next record will use,
1074 which gives us some chance of recovering from a crash during the record.
1077 save_state ("", true);
1079 if (_transport_speed) {
1080 if (!config.get_punch_in()) {
1084 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1085 RecordStateChanged (); /* EMIT SIGNAL */
1092 Session::audible_frame () const
1098 /* the first of these two possible settings for "offset"
1099 mean that the audible frame is stationary until
1100 audio emerges from the latency compensation
1103 the second means that the audible frame is stationary
1104 until audio would emerge from a physical port
1105 in the absence of any plugin latency compensation
1108 offset = worst_playback_latency ();
1110 if (offset > current_block_size) {
1111 offset -= current_block_size;
1113 /* XXX is this correct? if we have no external
1114 physical connections and everything is internal
1115 then surely this is zero? still, how
1116 likely is that anyway?
1118 offset = current_block_size;
1121 if (synced_to_jack()) {
1122 tf = _engine.transport_frame();
1124 tf = _transport_frame;
1129 if (!non_realtime_work_pending()) {
1133 /* Check to see if we have passed the first guaranteed
1134 audible frame past our last start position. if not,
1135 return that last start point because in terms
1136 of audible frames, we have not moved yet.
1138 `Start position' in this context means the time we last
1139 either started or changed transport direction.
1142 if (_transport_speed > 0.0f) {
1144 if (!play_loop || !have_looped) {
1145 if (tf < _last_roll_or_reversal_location + offset) {
1146 return _last_roll_or_reversal_location;
1154 } else if (_transport_speed < 0.0f) {
1156 /* XXX wot? no backward looping? */
1158 if (tf > _last_roll_or_reversal_location - offset) {
1159 return _last_roll_or_reversal_location;
1171 Session::set_frame_rate (framecnt_t frames_per_second)
1173 /** \fn void Session::set_frame_size(framecnt_t)
1174 the AudioEngine object that calls this guarantees
1175 that it will not be called while we are also in
1176 ::process(). Its fine to do things that block
1180 _base_frame_rate = frames_per_second;
1184 Automatable::set_automation_interval (ceil ((double) frames_per_second * (0.001 * Config->get_automation_interval())));
1188 // XXX we need some equivalent to this, somehow
1189 // SndFileSource::setup_standard_crossfades (frames_per_second);
1193 /* XXX need to reset/reinstantiate all LADSPA plugins */
1197 Session::set_block_size (pframes_t nframes)
1199 /* the AudioEngine guarantees
1200 that it will not be called while we are also in
1201 ::process(). It is therefore fine to do things that block
1206 current_block_size = nframes;
1210 boost::shared_ptr<RouteList> r = routes.reader ();
1212 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1213 (*i)->set_block_size (nframes);
1216 boost::shared_ptr<RouteList> rl = routes.reader ();
1217 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1218 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1220 tr->set_block_size (nframes);
1224 set_worst_io_latencies ();
1230 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1232 boost::shared_ptr<Route> r2;
1234 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1235 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1239 /* make a copy of the existing list of routes that feed r1 */
1241 Route::FedBy existing (r1->fed_by());
1243 /* for each route that feeds r1, recurse, marking it as feeding
1247 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1248 if (!(r2 = i->r.lock ())) {
1249 /* (*i) went away, ignore it */
1253 /* r2 is a route that feeds r1 which somehow feeds base. mark
1254 base as being fed by r2
1257 rbase->add_fed_by (r2, i->sends_only);
1261 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1265 if (r1->feeds (r2) && r2->feeds (r1)) {
1269 /* now recurse, so that we can mark base as being fed by
1270 all routes that feed r2
1273 trace_terminal (r2, rbase);
1280 Session::resort_routes ()
1282 /* don't do anything here with signals emitted
1283 by Routes during initial setup or while we
1284 are being destroyed.
1287 if (_state_of_the_state & (InitialConnecting | Deletion)) {
1292 RCUWriter<RouteList> writer (routes);
1293 boost::shared_ptr<RouteList> r = writer.get_copy ();
1294 resort_routes_using (r);
1295 /* writer goes out of scope and forces update */
1298 //_process_graph->dump(1);
1301 boost::shared_ptr<RouteList> rl = routes.reader ();
1302 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1303 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1305 const Route::FedBy& fb ((*i)->fed_by());
1307 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1308 boost::shared_ptr<Route> sf = f->r.lock();
1310 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1318 /** This is called whenever we need to rebuild the graph of how we will process
1320 * @param r List of routes, in any order.
1324 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1326 /* We are going to build a directed graph of our routes;
1327 this is where the edges of that graph are put.
1332 /* Go through all routes doing two things:
1334 * 1. Collect the edges of the route graph. Each of these edges
1335 * is a pair of routes, one of which directly feeds the other
1336 * either by a JACK connection or by an internal send.
1338 * 2. Begin the process of making routes aware of which other
1339 * routes directly or indirectly feed them. This information
1340 * is used by the solo code.
1343 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1345 /* Clear out the route's list of direct or indirect feeds */
1346 (*i)->clear_fed_by ();
1348 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
1350 bool via_sends_only;
1352 /* See if this *j feeds *i according to the current state of the JACK
1353 connections and internal sends.
1355 if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
1356 /* add the edge to the graph (part #1) */
1357 edges.add (*j, *i, via_sends_only);
1358 /* tell the route (for part #2) */
1359 (*i)->add_fed_by (*j, via_sends_only);
1364 /* Attempt a topological sort of the route graph */
1365 boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
1367 if (sorted_routes) {
1368 /* We got a satisfactory topological sort, so there is no feedback;
1371 Note: the process graph rechain does not require a
1372 topologically-sorted list, but hey ho.
1374 _process_graph->rechain (sorted_routes, edges);
1375 _current_route_graph = edges;
1377 /* Complete the building of the routes' lists of what directly
1378 or indirectly feeds them.
1380 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1381 trace_terminal (*i, *i);
1387 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1388 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1389 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1390 (*i)->name(), (*i)->order_key ("signal")));
1394 SuccessfulGraphSort (); /* EMIT SIGNAL */
1397 /* The topological sort failed, so we have a problem. Tell everyone
1398 and stick to the old graph; this will continue to be processed, so
1399 until the feedback is fixed, what is played back will not quite
1400 reflect what is actually connected. Note also that we do not
1401 do trace_terminal here, as it would fail due to an endless recursion,
1402 so the solo code will think that everything is still connected
1406 FeedbackDetected (); /* EMIT SIGNAL */
1411 /** Find a route name starting with \a base, maybe followed by the
1412 * lowest \a id. \a id will always be added if \a definitely_add_number
1413 * is true on entry; otherwise it will only be added if required
1414 * to make the name unique.
1416 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1417 * The available route name with the lowest ID will be used, and \a id
1418 * will be set to the ID.
1420 * \return false if a route name could not be found, and \a track_name
1421 * and \a id do not reflect a free route name.
1424 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1426 if (!definitely_add_number && route_by_name (base) == 0) {
1427 /* juse use the base */
1428 snprintf (name, name_len, "%s", base.c_str());
1433 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1435 if (route_by_name (name) == 0) {
1441 } while (id < (UINT_MAX-1));
1446 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
1448 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
1450 in = ChanCount::ZERO;
1451 out = ChanCount::ZERO;
1453 boost::shared_ptr<RouteList> r = routes.reader ();
1455 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1456 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1457 if (tr && !tr->is_hidden()) {
1458 in += tr->n_inputs();
1459 out += tr->n_outputs();
1464 /** Caller must not hold process lock
1465 * @param name_template string to use for the start of the name, or "" to use "MIDI".
1467 list<boost::shared_ptr<MidiTrack> >
1468 Session::new_midi_track (TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1470 char track_name[32];
1471 uint32_t track_id = 0;
1473 RouteList new_routes;
1474 list<boost::shared_ptr<MidiTrack> > ret;
1475 uint32_t control_id;
1477 control_id = ntracks() + nbusses();
1479 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
1482 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1483 error << "cannot find name for new midi track" << endmsg;
1487 boost::shared_ptr<MidiTrack> track;
1490 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1492 if (track->init ()) {
1496 track->use_new_diskstream();
1498 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1499 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1502 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1503 if (track->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1504 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1508 if (track->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1509 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1514 track->non_realtime_input_change();
1517 route_group->add (track);
1520 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1521 track->set_remote_control_id (control_id);
1523 new_routes.push_back (track);
1524 ret.push_back (track);
1527 catch (failed_constructor &err) {
1528 error << _("Session: could not create new midi track.") << endmsg;
1532 catch (AudioEngine::PortRegistrationFailure& pfe) {
1534 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;
1542 if (!new_routes.empty()) {
1543 add_routes (new_routes, true, true);
1550 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
1552 boost::shared_ptr<Route> midi_track (wmt.lock());
1558 if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
1560 if (change.after.n_audio() <= change.before.n_audio()) {
1564 /* new audio ports: make sure the audio goes somewhere useful,
1565 unless the user has no-auto-connect selected.
1567 The existing ChanCounts don't matter for this call as they are only
1568 to do with matching input and output indices, and we are only changing
1574 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
1578 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1579 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1580 * @param output_start As \a input_start, but for outputs.
1583 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
1584 bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
1586 if (!IO::connecting_legal) {
1590 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::NOT_LOCK);
1596 /* If both inputs and outputs are auto-connected to physical ports,
1597 use the max of input and output offsets to ensure auto-connected
1598 port numbers always match up (e.g. the first audio input and the
1599 first audio output of the route will have the same physical
1600 port number). Otherwise just use the lowest input or output
1604 DEBUG_TRACE (DEBUG::Graph,
1605 string_compose("Auto-connect: existing in = %1 out = %2\n",
1606 existing_inputs, existing_outputs));
1608 const bool in_out_physical =
1609 (Config->get_input_auto_connect() & AutoConnectPhysical)
1610 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1613 const ChanCount in_offset = in_out_physical
1614 ? ChanCount::max(existing_inputs, existing_outputs)
1617 const ChanCount out_offset = in_out_physical
1618 ? ChanCount::max(existing_inputs, existing_outputs)
1621 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1622 vector<string> physinputs;
1623 vector<string> physoutputs;
1625 _engine.get_physical_outputs (*t, physoutputs);
1626 _engine.get_physical_inputs (*t, physinputs);
1628 if (!physinputs.empty() && connect_inputs) {
1629 uint32_t nphysical_in = physinputs.size();
1631 DEBUG_TRACE (DEBUG::Graph,
1632 string_compose("There are %1 physical inputs of type %2\n",
1635 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1638 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1639 DEBUG_TRACE (DEBUG::Graph,
1640 string_compose("Get index %1 + %2 % %3 = %4\n",
1641 in_offset.get(*t), i, nphysical_in,
1642 (in_offset.get(*t) + i) % nphysical_in));
1643 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1646 DEBUG_TRACE (DEBUG::Graph,
1647 string_compose("Connect route %1 IN to %2\n",
1648 route->name(), port));
1650 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
1654 ChanCount one_added (*t, 1);
1655 existing_inputs += one_added;
1659 if (!physoutputs.empty()) {
1660 uint32_t nphysical_out = physoutputs.size();
1661 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
1664 if ((*t) == DataType::MIDI || Config->get_output_auto_connect() & AutoConnectPhysical) {
1665 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1666 } else if ((*t) == DataType::AUDIO && Config->get_output_auto_connect() & AutoConnectMaster) {
1667 /* master bus is audio only */
1668 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1669 port = _master_out->input()->ports().port(*t,
1670 i % _master_out->input()->n_ports().get(*t))->name();
1674 DEBUG_TRACE (DEBUG::Graph,
1675 string_compose("Connect route %1 OUT to %2\n",
1676 route->name(), port));
1678 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
1682 ChanCount one_added (*t, 1);
1683 existing_outputs += one_added;
1689 /** Caller must not hold process lock
1690 * @param name_template string to use for the start of the name, or "" to use "Audio".
1692 list< boost::shared_ptr<AudioTrack> >
1693 Session::new_audio_track (
1694 int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template
1697 char track_name[32];
1698 uint32_t track_id = 0;
1700 RouteList new_routes;
1701 list<boost::shared_ptr<AudioTrack> > ret;
1702 uint32_t control_id;
1704 control_id = ntracks() + nbusses() + 1;
1706 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
1709 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1710 error << "cannot find name for new audio track" << endmsg;
1714 boost::shared_ptr<AudioTrack> track;
1717 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
1719 if (track->init ()) {
1723 track->use_new_diskstream();
1725 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1726 // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1729 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1731 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1732 error << string_compose (
1733 _("cannot configure %1 in/%2 out configuration for new audio track"),
1734 input_channels, output_channels)
1739 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1740 error << string_compose (
1741 _("cannot configure %1 in/%2 out configuration for new audio track"),
1742 input_channels, output_channels)
1749 route_group->add (track);
1752 track->non_realtime_input_change();
1754 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1755 track->set_remote_control_id (control_id);
1758 new_routes.push_back (track);
1759 ret.push_back (track);
1762 catch (failed_constructor &err) {
1763 error << _("Session: could not create new audio track.") << endmsg;
1767 catch (AudioEngine::PortRegistrationFailure& pfe) {
1769 error << pfe.what() << endmsg;
1777 if (!new_routes.empty()) {
1778 add_routes (new_routes, true, true);
1785 Session::set_remote_control_ids ()
1787 RemoteModel m = Config->get_remote_model();
1788 bool emit_signal = false;
1790 boost::shared_ptr<RouteList> r = routes.reader ();
1792 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1793 if (MixerOrdered == m) {
1794 int32_t order = (*i)->order_key(N_("signal"));
1795 (*i)->set_remote_control_id (order+1, false);
1797 } else if (EditorOrdered == m) {
1798 int32_t order = (*i)->order_key(N_("editor"));
1799 (*i)->set_remote_control_id (order+1, false);
1801 } else if (UserOrdered == m) {
1802 //do nothing ... only changes to remote id's are initiated by user
1807 Route::RemoteControlIDChange();
1811 /** Caller must not hold process lock.
1812 * @param name_template string to use for the start of the name, or "" to use "Bus".
1815 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
1818 uint32_t bus_id = 0;
1821 uint32_t control_id;
1823 control_id = ntracks() + nbusses() + 1;
1825 bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
1828 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
1829 error << "cannot find name for new audio bus" << endmsg;
1834 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
1840 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1841 // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
1844 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1846 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1847 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1848 input_channels, output_channels)
1854 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1855 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1856 input_channels, output_channels)
1863 route_group->add (bus);
1865 bus->set_remote_control_id (control_id);
1868 bus->add_internal_return ();
1870 ret.push_back (bus);
1874 catch (failed_constructor &err) {
1875 error << _("Session: could not create new audio route.") << endmsg;
1879 catch (AudioEngine::PortRegistrationFailure& pfe) {
1880 error << pfe.what() << endmsg;
1890 add_routes (ret, false, true);
1898 Session::new_route_from_template (uint32_t how_many, const std::string& template_path)
1901 uint32_t control_id;
1903 uint32_t number = 0;
1905 if (!tree.read (template_path.c_str())) {
1909 XMLNode* node = tree.root();
1911 control_id = ntracks() + nbusses() + 1;
1915 XMLNode node_copy (*node);
1917 /* Remove IDs of everything so that new ones are used */
1918 node_copy.remove_property_recursively (X_("id"));
1921 string const route_name = node_copy.property(X_("name"))->value ();
1923 /* generate a new name by adding a number to the end of the template name */
1925 if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
1926 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
1930 /* set this name in the XML description that we are about to use */
1931 Route::set_name_in_state (node_copy, name);
1933 /* trim bitslots from listen sends so that new ones are used */
1934 XMLNodeList children = node_copy.children ();
1935 for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
1936 if ((*i)->name() == X_("Processor")) {
1937 XMLProperty* role = (*i)->property (X_("role"));
1938 if (role && role->value() == X_("Listen")) {
1939 (*i)->remove_property (X_("bitslot"));
1944 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
1947 error << _("Session: cannot create track/bus from template description") << endmsg;
1951 if (boost::dynamic_pointer_cast<Track>(route)) {
1952 /* force input/output change signals so that the new diskstream
1953 picks up the configuration of the route. During session
1954 loading this normally happens in a different way.
1957 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1959 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
1960 change.after = route->input()->n_ports();
1961 route->input()->changed (change, this);
1962 change.after = route->output()->n_ports();
1963 route->output()->changed (change, this);
1966 route->set_remote_control_id (control_id);
1969 ret.push_back (route);
1972 catch (failed_constructor &err) {
1973 error << _("Session: could not create new route from template") << endmsg;
1977 catch (AudioEngine::PortRegistrationFailure& pfe) {
1978 error << pfe.what() << endmsg;
1987 add_routes (ret, true, true);
1994 Session::add_routes (RouteList& new_routes, bool auto_connect, bool save)
1996 ChanCount existing_inputs;
1997 ChanCount existing_outputs;
1999 count_existing_track_channels (existing_inputs, existing_outputs);
2002 RCUWriter<RouteList> writer (routes);
2003 boost::shared_ptr<RouteList> r = writer.get_copy ();
2004 r->insert (r->end(), new_routes.begin(), new_routes.end());
2006 /* if there is no control out and we're not in the middle of loading,
2007 resort the graph here. if there is a control out, we will resort
2008 toward the end of this method. if we are in the middle of loading,
2009 we will resort when done.
2012 if (!_monitor_out && IO::connecting_legal) {
2013 resort_routes_using (r);
2017 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2019 boost::weak_ptr<Route> wpr (*x);
2020 boost::shared_ptr<Route> r (*x);
2022 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2023 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2024 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2025 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2026 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2027 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2028 r->order_key_changed.connect_same_thread (*this, boost::bind (&Session::route_order_key_changed, this));
2030 if (r->is_master()) {
2034 if (r->is_monitor()) {
2038 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2040 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2041 track_playlist_changed (boost::weak_ptr<Track> (tr));
2042 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2044 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2046 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2047 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2052 auto_connect_route (r, existing_inputs, existing_outputs, true);
2056 if (_monitor_out && IO::connecting_legal) {
2058 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2059 if ((*x)->is_monitor()) {
2061 } else if ((*x)->is_master()) {
2064 (*x)->listen_via_monitor ();
2074 save_state (_current_snapshot_name);
2077 RouteAdded (new_routes); /* EMIT SIGNAL */
2078 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
2082 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2084 boost::shared_ptr<RouteList> r = routes.reader ();
2085 boost::shared_ptr<Send> s;
2087 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2088 if ((s = (*i)->internal_send_for (dest)) != 0) {
2089 s->amp()->gain_control()->set_value (0.0);
2095 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2097 boost::shared_ptr<RouteList> r = routes.reader ();
2098 boost::shared_ptr<Send> s;
2100 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2101 if ((s = (*i)->internal_send_for (dest)) != 0) {
2102 s->amp()->gain_control()->set_value (1.0);
2108 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2110 boost::shared_ptr<RouteList> r = routes.reader ();
2111 boost::shared_ptr<Send> s;
2113 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2114 if ((s = (*i)->internal_send_for (dest)) != 0) {
2115 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2120 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2122 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2124 boost::shared_ptr<RouteList> r = routes.reader ();
2125 boost::shared_ptr<RouteList> t (new RouteList);
2127 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2128 /* no MIDI sends because there are no MIDI busses yet */
2129 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2134 add_internal_sends (dest, p, t);
2138 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2140 if (dest->is_monitor() || dest->is_master()) {
2144 if (!dest->internal_return()) {
2145 dest->add_internal_return();
2148 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2150 if ((*i)->is_monitor() || (*i)->is_master() || (*i) == dest) {
2154 (*i)->listen_via (dest, p);
2161 Session::remove_route (boost::shared_ptr<Route> route)
2163 if (((route == _master_out) || (route == _monitor_out)) && !Config->get_allow_special_bus_removal()) {
2167 route->set_solo (false, this);
2170 RCUWriter<RouteList> writer (routes);
2171 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2175 /* deleting the master out seems like a dumb
2176 idea, but its more of a UI policy issue
2180 if (route == _master_out) {
2181 _master_out = boost::shared_ptr<Route> ();
2184 if (route == _monitor_out) {
2186 /* cancel control outs for all routes */
2188 for (RouteList::iterator r = rs->begin(); r != rs->end(); ++r) {
2189 (*r)->drop_listen (_monitor_out);
2192 _monitor_out.reset ();
2195 /* writer goes out of scope, forces route list update */
2198 update_route_solo_state ();
2200 // We need to disconnect the route's inputs and outputs
2202 route->input()->disconnect (0);
2203 route->output()->disconnect (0);
2205 /* if the route had internal sends sending to it, remove them */
2206 if (route->internal_return()) {
2208 boost::shared_ptr<RouteList> r = routes.reader ();
2209 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2210 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2212 (*i)->remove_processor (s);
2217 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2218 if (mt && mt->step_editing()) {
2219 if (_step_editors > 0) {
2224 update_latency_compensation ();
2227 /* Re-sort routes to remove the graph's current references to the one that is
2228 * going away, then flush old references out of the graph.
2232 _process_graph->clear_other_chain ();
2234 /* get rid of it from the dead wood collection in the route list manager */
2236 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2240 /* try to cause everyone to drop their references */
2242 route->drop_references ();
2244 sync_order_keys (N_("session"));
2246 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2248 /* save the new state of the world */
2250 if (save_state (_current_snapshot_name)) {
2251 save_history (_current_snapshot_name);
2256 Session::route_mute_changed (void* /*src*/)
2262 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2264 boost::shared_ptr<Route> route = wpr.lock();
2266 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2270 if (route->listening_via_monitor ()) {
2272 if (Config->get_exclusive_solo()) {
2273 /* new listen: disable all other listen */
2274 boost::shared_ptr<RouteList> r = routes.reader ();
2275 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2276 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2279 (*i)->set_listen (false, this);
2285 } else if (_listen_cnt > 0) {
2290 update_route_solo_state ();
2293 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2295 boost::shared_ptr<Route> route = wpr.lock ();
2298 /* should not happen */
2299 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2303 bool send_changed = false;
2305 if (route->solo_isolated()) {
2306 if (_solo_isolated_cnt == 0) {
2307 send_changed = true;
2309 _solo_isolated_cnt++;
2310 } else if (_solo_isolated_cnt > 0) {
2311 _solo_isolated_cnt--;
2312 if (_solo_isolated_cnt == 0) {
2313 send_changed = true;
2318 IsolatedChanged (); /* EMIT SIGNAL */
2323 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2325 DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
2327 if (!self_solo_change) {
2328 // session doesn't care about changes to soloed-by-others
2332 if (solo_update_disabled) {
2334 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
2338 boost::shared_ptr<Route> route = wpr.lock ();
2341 boost::shared_ptr<RouteList> r = routes.reader ();
2344 if (route->self_soloed()) {
2350 RouteGroup* rg = route->route_group ();
2351 bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
2353 if (delta == 1 && Config->get_exclusive_solo()) {
2355 /* new solo: disable all other solos, but not the group if its solo-enabled */
2357 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2358 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2359 (leave_group_alone && ((*i)->route_group() == rg))) {
2362 (*i)->set_solo (false, this);
2366 DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
2368 solo_update_disabled = true;
2370 RouteList uninvolved;
2372 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
2374 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2375 bool via_sends_only;
2376 bool in_signal_flow;
2378 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2379 (leave_group_alone && ((*i)->route_group() == rg))) {
2383 in_signal_flow = false;
2385 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
2387 if ((*i)->feeds (route, &via_sends_only)) {
2388 if (!via_sends_only) {
2389 if (!route->soloed_by_others_upstream()) {
2390 (*i)->mod_solo_by_others_downstream (delta);
2393 in_signal_flow = true;
2395 DEBUG_TRACE (DEBUG::Solo, "\tno feed from\n");
2398 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
2400 if (route->feeds (*i, &via_sends_only)) {
2401 /* propagate solo upstream only if routing other than
2402 sends is involved, but do consider the other route
2403 (*i) to be part of the signal flow even if only
2406 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
2410 route->soloed_by_others_downstream(),
2411 route->soloed_by_others_upstream()));
2412 if (!via_sends_only) {
2413 if (!route->soloed_by_others_downstream()) {
2414 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
2415 (*i)->mod_solo_by_others_upstream (delta);
2418 in_signal_flow = true;
2420 DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
2423 if (!in_signal_flow) {
2424 uninvolved.push_back (*i);
2428 solo_update_disabled = false;
2429 DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
2431 update_route_solo_state (r);
2433 /* now notify that the mute state of the routes not involved in the signal
2434 pathway of the just-solo-changed route may have altered.
2437 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2438 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1\n", (*i)->name()));
2439 (*i)->mute_changed (this);
2442 SoloChanged (); /* EMIT SIGNAL */
2447 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2449 /* now figure out if anything that matters is soloed (or is "listening")*/
2451 bool something_soloed = false;
2452 uint32_t listeners = 0;
2453 uint32_t isolated = 0;
2456 r = routes.reader();
2459 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2460 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2461 something_soloed = true;
2464 if (!(*i)->is_hidden() && (*i)->listening_via_monitor()) {
2465 if (Config->get_solo_control_is_listen_control()) {
2468 (*i)->set_listen (false, this);
2472 if ((*i)->solo_isolated()) {
2477 if (something_soloed != _non_soloed_outs_muted) {
2478 _non_soloed_outs_muted = something_soloed;
2479 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2482 _listen_cnt = listeners;
2484 if (isolated != _solo_isolated_cnt) {
2485 _solo_isolated_cnt = isolated;
2486 IsolatedChanged (); /* EMIT SIGNAL */
2490 boost::shared_ptr<RouteList>
2491 Session::get_routes_with_internal_returns() const
2493 boost::shared_ptr<RouteList> r = routes.reader ();
2494 boost::shared_ptr<RouteList> rl (new RouteList);
2496 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2497 if ((*i)->internal_return ()) {
2505 Session::io_name_is_legal (const std::string& name)
2507 boost::shared_ptr<RouteList> r = routes.reader ();
2509 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2510 if ((*i)->name() == name) {
2514 if ((*i)->has_io_processor_named (name)) {
2523 Session::set_exclusive_input_active (boost::shared_ptr<Route> rt, bool /*others_on*/)
2526 vector<string> connections;
2528 PortSet& ps (rt->input()->ports());
2530 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
2531 p->get_connections (connections);
2534 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
2535 routes_using_input_from (*s, rl);
2538 /* scan all relevant routes to see if others are on or off */
2540 bool others_are_already_on = false;
2542 for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
2544 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2546 if (mt->input_active()) {
2547 others_are_already_on = true;
2554 /* globally reverse other routes */
2556 for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
2558 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2560 mt->set_input_active (!others_are_already_on);
2567 Session::routes_using_input_from (const string& str, RouteList& rl)
2569 boost::shared_ptr<RouteList> r = routes.reader ();
2571 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2572 if ((*i)->input()->connected_to (str)) {
2578 boost::shared_ptr<Route>
2579 Session::route_by_name (string name)
2581 boost::shared_ptr<RouteList> r = routes.reader ();
2583 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2584 if ((*i)->name() == name) {
2589 return boost::shared_ptr<Route> ((Route*) 0);
2592 boost::shared_ptr<Route>
2593 Session::route_by_id (PBD::ID id)
2595 boost::shared_ptr<RouteList> r = routes.reader ();
2597 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2598 if ((*i)->id() == id) {
2603 return boost::shared_ptr<Route> ((Route*) 0);
2606 boost::shared_ptr<Track>
2607 Session::track_by_diskstream_id (PBD::ID id)
2609 boost::shared_ptr<RouteList> r = routes.reader ();
2611 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2612 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
2613 if (t && t->using_diskstream_id (id)) {
2618 return boost::shared_ptr<Track> ();
2621 boost::shared_ptr<Route>
2622 Session::route_by_remote_id (uint32_t id)
2624 boost::shared_ptr<RouteList> r = routes.reader ();
2626 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2627 if ((*i)->remote_control_id() == id) {
2632 return boost::shared_ptr<Route> ((Route*) 0);
2636 Session::playlist_region_added (boost::weak_ptr<Region> w)
2638 boost::shared_ptr<Region> r = w.lock ();
2643 /* These are the operations that are currently in progress... */
2644 list<GQuark> curr = _current_trans_quarks;
2647 /* ...and these are the operations during which we want to update
2648 the session range location markers.
2651 ops.push_back (Operations::capture);
2652 ops.push_back (Operations::paste);
2653 ops.push_back (Operations::duplicate_region);
2654 ops.push_back (Operations::insert_file);
2655 ops.push_back (Operations::insert_region);
2656 ops.push_back (Operations::drag_region_brush);
2657 ops.push_back (Operations::region_drag);
2658 ops.push_back (Operations::selection_grab);
2659 ops.push_back (Operations::region_fill);
2660 ops.push_back (Operations::fill_selection);
2661 ops.push_back (Operations::create_region);
2662 ops.push_back (Operations::region_copy);
2663 ops.push_back (Operations::fixed_time_region_copy);
2666 /* See if any of the current operations match the ones that we want */
2668 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
2670 /* If so, update the session range markers */
2672 maybe_update_session_range (r->position (), r->last_frame ());
2676 /** Update the session range markers if a is before the current start or
2677 * b is after the current end.
2680 Session::maybe_update_session_range (framepos_t a, framepos_t b)
2682 if (_state_of_the_state & Loading) {
2686 if (_session_range_location == 0) {
2688 add_session_range_location (a, b);
2692 if (a < _session_range_location->start()) {
2693 _session_range_location->set_start (a);
2696 if (b > _session_range_location->end()) {
2697 _session_range_location->set_end (b);
2703 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
2705 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2706 maybe_update_session_range (i->to, i->to + i->length);
2711 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
2713 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2714 maybe_update_session_range (i->from, i->to);
2718 /* Region management */
2720 boost::shared_ptr<Region>
2721 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2723 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2724 RegionFactory::RegionMap::const_iterator i;
2725 boost::shared_ptr<Region> region;
2727 Glib::Mutex::Lock lm (region_lock);
2729 for (i = regions.begin(); i != regions.end(); ++i) {
2733 if (region->whole_file()) {
2735 if (child->source_equivalent (region)) {
2741 return boost::shared_ptr<Region> ();
2745 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2747 set<boost::shared_ptr<Region> > relevant_regions;
2749 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2750 RegionFactory::get_regions_using_source (*s, relevant_regions);
2753 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2754 set<boost::shared_ptr<Region> >::iterator tmp;
2759 playlists->destroy_region (*r);
2760 RegionFactory::map_remove (*r);
2762 (*r)->drop_sources ();
2763 (*r)->drop_references ();
2765 relevant_regions.erase (r);
2770 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
2773 Glib::Mutex::Lock ls (source_lock);
2774 /* remove from the main source list */
2775 sources.erase ((*s)->id());
2778 (*s)->mark_for_remove ();
2779 (*s)->drop_references ();
2788 Session::remove_last_capture ()
2790 list<boost::shared_ptr<Source> > srcs;
2792 boost::shared_ptr<RouteList> rl = routes.reader ();
2793 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2794 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2799 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
2802 srcs.insert (srcs.end(), l.begin(), l.end());
2807 destroy_sources (srcs);
2809 save_state (_current_snapshot_name);
2814 /* Source Management */
2817 Session::add_source (boost::shared_ptr<Source> source)
2819 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
2820 pair<SourceMap::iterator,bool> result;
2822 entry.first = source->id();
2823 entry.second = source;
2826 Glib::Mutex::Lock lm (source_lock);
2827 result = sources.insert (entry);
2830 if (result.second) {
2832 /* yay, new source */
2836 boost::shared_ptr<AudioFileSource> afs;
2838 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
2839 if (Config->get_auto_analyse_audio()) {
2840 Analyser::queue_source_for_analysis (source, false);
2844 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
2849 Session::remove_source (boost::weak_ptr<Source> src)
2851 if (_state_of_the_state & Deletion) {
2855 SourceMap::iterator i;
2856 boost::shared_ptr<Source> source = src.lock();
2863 Glib::Mutex::Lock lm (source_lock);
2865 if ((i = sources.find (source->id())) != sources.end()) {
2870 if (!_state_of_the_state & InCleanup) {
2872 /* save state so we don't end up with a session file
2873 referring to non-existent sources.
2876 save_state (_current_snapshot_name);
2880 boost::shared_ptr<Source>
2881 Session::source_by_id (const PBD::ID& id)
2883 Glib::Mutex::Lock lm (source_lock);
2884 SourceMap::iterator i;
2885 boost::shared_ptr<Source> source;
2887 if ((i = sources.find (id)) != sources.end()) {
2894 boost::shared_ptr<Source>
2895 Session::source_by_path_and_channel (const string& path, uint16_t chn)
2897 Glib::Mutex::Lock lm (source_lock);
2899 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2900 boost::shared_ptr<AudioFileSource> afs
2901 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
2903 if (afs && afs->path() == path && chn == afs->channel()) {
2907 return boost::shared_ptr<Source>();
2911 Session::count_sources_by_origin (const string& path)
2914 Glib::Mutex::Lock lm (source_lock);
2916 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2917 boost::shared_ptr<FileSource> fs
2918 = boost::dynamic_pointer_cast<FileSource>(i->second);
2920 if (fs && fs->origin() == path) {
2930 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
2933 string old_basename = PBD::basename_nosuffix (oldname);
2934 string new_legalized = legalize_for_path (newname);
2936 /* note: we know (or assume) the old path is already valid */
2940 /* destructive file sources have a name of the form:
2942 /path/to/Tnnnn-NAME(%[LR])?.wav
2944 the task here is to replace NAME with the new name.
2949 string::size_type dash;
2951 dir = Glib::path_get_dirname (path);
2952 path = Glib::path_get_basename (path);
2954 /* '-' is not a legal character for the NAME part of the path */
2956 if ((dash = path.find_last_of ('-')) == string::npos) {
2960 prefix = path.substr (0, dash);
2964 path += new_legalized;
2965 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
2966 path = Glib::build_filename (dir, path);
2970 /* non-destructive file sources have a name of the form:
2972 /path/to/NAME-nnnnn(%[LR])?.ext
2974 the task here is to replace NAME with the new name.
2979 string::size_type dash;
2980 string::size_type postfix;
2982 dir = Glib::path_get_dirname (path);
2983 path = Glib::path_get_basename (path);
2985 /* '-' is not a legal character for the NAME part of the path */
2987 if ((dash = path.find_last_of ('-')) == string::npos) {
2991 suffix = path.substr (dash+1);
2993 // Suffix is now everything after the dash. Now we need to eliminate
2994 // the nnnnn part, which is done by either finding a '%' or a '.'
2996 postfix = suffix.find_last_of ("%");
2997 if (postfix == string::npos) {
2998 postfix = suffix.find_last_of ('.');
3001 if (postfix != string::npos) {
3002 suffix = suffix.substr (postfix);
3004 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
3008 const uint32_t limit = 10000;
3009 char buf[PATH_MAX+1];
3011 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
3013 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
3015 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
3016 path = Glib::build_filename (dir, buf);
3024 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
3033 /** Return the full path (in some session directory) for a new within-session source.
3034 * \a name must be a session-unique name that does not contain slashes
3035 * (e.g. as returned by new_*_source_name)
3038 Session::new_source_path_from_name (DataType type, const string& name)
3040 assert(name.find("/") == string::npos);
3042 SessionDirectory sdir(get_best_session_directory_for_new_source());
3045 if (type == DataType::AUDIO) {
3046 p = sdir.sound_path();
3047 } else if (type == DataType::MIDI) {
3048 p = sdir.midi_path();
3050 error << "Unknown source type, unable to create file path" << endmsg;
3055 return p.to_string();
3059 Session::peak_path (string base) const
3061 sys::path peakfile_path(_session_dir->peak_path());
3062 peakfile_path /= base + peakfile_suffix;
3063 return peakfile_path.to_string();
3066 /** Return a unique name based on \a base for a new internal audio source */
3068 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
3071 char buf[PATH_MAX+1];
3072 const uint32_t limit = 10000;
3074 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3077 legalized = legalize_for_path (base);
3079 // Find a "version" of the base name that doesn't exist in any of the possible directories.
3080 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3082 vector<space_and_path>::iterator i;
3083 uint32_t existing = 0;
3085 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3090 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3091 cnt, legalized.c_str(), ext.c_str());
3092 } else if (nchan == 2) {
3094 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
3095 cnt, legalized.c_str(), ext.c_str());
3097 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
3098 cnt, legalized.c_str(), ext.c_str());
3100 } else if (nchan < 26) {
3101 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
3102 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
3104 snprintf (buf, sizeof(buf), "T%04d-%s%s",
3105 cnt, legalized.c_str(), ext.c_str());
3111 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3112 } else if (nchan == 2) {
3114 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
3116 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
3118 } else if (nchan < 26) {
3119 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
3121 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3125 SessionDirectory sdir((*i).path);
3127 string spath = sdir.sound_path().to_string();
3129 /* note that we search *without* the extension so that
3130 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3131 in the event that this new name is required for
3132 a file format change.
3135 if (matching_unsuffixed_filename_exists_in (spath, buf)) {
3141 if (existing == 0) {
3146 error << string_compose(
3147 _("There are already %1 recordings for %2, which I consider too many."),
3148 limit, base) << endmsg;
3150 throw failed_constructor();
3154 return Glib::path_get_basename (buf);
3157 /** Create a new within-session audio source */
3158 boost::shared_ptr<AudioFileSource>
3159 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
3161 const string name = new_audio_source_name (n, n_chans, chan, destructive);
3162 const string path = new_source_path_from_name(DataType::AUDIO, name);
3164 return boost::dynamic_pointer_cast<AudioFileSource> (
3165 SourceFactory::createWritable (DataType::AUDIO, *this, path, string(), destructive, frame_rate()));
3168 /** Return a unique name based on \a base for a new internal MIDI source */
3170 Session::new_midi_source_name (const string& base)
3173 char buf[PATH_MAX+1];
3174 const uint32_t limit = 10000;
3178 legalized = legalize_for_path (base);
3180 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3181 for (cnt = 1; cnt <= limit; ++cnt) {
3183 vector<space_and_path>::iterator i;
3184 uint32_t existing = 0;
3186 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3188 SessionDirectory sdir((*i).path);
3190 sys::path p = sdir.midi_path();
3193 snprintf (buf, sizeof(buf), "%s-%u.mid", p.to_string().c_str(), cnt);
3195 if (sys::exists (buf)) {
3200 if (existing == 0) {
3205 error << string_compose(
3206 _("There are already %1 recordings for %2, which I consider too many."),
3207 limit, base) << endmsg;
3209 throw failed_constructor();
3213 return Glib::path_get_basename(buf);
3217 /** Create a new within-session MIDI source */
3218 boost::shared_ptr<MidiSource>
3219 Session::create_midi_source_for_session (Track* track, string const & n)
3221 /* try to use the existing write source for the track, to keep numbering sane
3225 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3229 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3232 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3233 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3237 const string name = new_midi_source_name (n);
3238 const string path = new_source_path_from_name (DataType::MIDI, name);
3240 return boost::dynamic_pointer_cast<SMFSource> (
3241 SourceFactory::createWritable (
3242 DataType::MIDI, *this, path, string(), false, frame_rate()));
3247 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3249 if (playlist->hidden()) {
3253 playlists->add (playlist);
3256 playlist->release();
3263 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3265 if (_state_of_the_state & Deletion) {
3269 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3275 playlists->remove (playlist);
3281 Session::set_audition (boost::shared_ptr<Region> r)
3283 pending_audition_region = r;
3284 add_post_transport_work (PostTransportAudition);
3285 _butler->schedule_transport_work ();
3289 Session::audition_playlist ()
3291 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3292 ev->region.reset ();
3297 Session::non_realtime_set_audition ()
3299 if (!pending_audition_region) {
3300 auditioner->audition_current_playlist ();
3302 auditioner->audition_region (pending_audition_region);
3303 pending_audition_region.reset ();
3305 AuditionActive (true); /* EMIT SIGNAL */
3309 Session::audition_region (boost::shared_ptr<Region> r)
3311 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3317 Session::cancel_audition ()
3319 if (auditioner->auditioning()) {
3320 auditioner->cancel_audition ();
3321 AuditionActive (false); /* EMIT SIGNAL */
3326 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3328 if (a->is_monitor()) {
3331 if (b->is_monitor()) {
3334 return a->order_key(N_("signal")) < b->order_key(N_("signal"));
3338 Session::is_auditioning () const
3340 /* can be called before we have an auditioner object */
3342 return auditioner->auditioning();
3349 Session::graph_reordered ()
3351 /* don't do this stuff if we are setting up connections
3352 from a set_state() call or creating new tracks. Ditto for deletion.
3355 if (_state_of_the_state & (InitialConnecting|Deletion)) {
3359 /* every track/bus asked for this to be handled but it was deferred because
3360 we were connecting. do it now.
3363 request_input_change_handling ();
3367 /* force all diskstreams to update their capture offset values to
3368 reflect any changes in latencies within the graph.
3371 boost::shared_ptr<RouteList> rl = routes.reader ();
3372 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3373 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3375 tr->set_capture_offset ();
3381 Session::available_capture_duration ()
3383 float sample_bytes_on_disk = 4.0; // keep gcc happy
3385 switch (config.get_native_file_data_format()) {
3387 sample_bytes_on_disk = 4.0;
3391 sample_bytes_on_disk = 3.0;
3395 sample_bytes_on_disk = 2.0;
3399 /* impossible, but keep some gcc versions happy */
3400 fatal << string_compose (_("programming error: %1"),
3401 X_("illegal native file data format"))
3406 double scale = 4096.0 / sample_bytes_on_disk;
3408 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3409 return max_framecnt;
3412 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3416 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3419 RCUWriter<BundleList> writer (_bundles);
3420 boost::shared_ptr<BundleList> b = writer.get_copy ();
3421 b->push_back (bundle);
3424 BundleAdded (bundle); /* EMIT SIGNAL */
3430 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3432 bool removed = false;
3435 RCUWriter<BundleList> writer (_bundles);
3436 boost::shared_ptr<BundleList> b = writer.get_copy ();
3437 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3439 if (i != b->end()) {
3446 BundleRemoved (bundle); /* EMIT SIGNAL */
3452 boost::shared_ptr<Bundle>
3453 Session::bundle_by_name (string name) const
3455 boost::shared_ptr<BundleList> b = _bundles.reader ();
3457 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3458 if ((*i)->name() == name) {
3463 return boost::shared_ptr<Bundle> ();
3467 Session::tempo_map_changed (const PropertyChange&)
3471 playlists->update_after_tempo_map_change ();
3473 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3479 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3481 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3482 (*i)->recompute_frames_from_bbt ();
3486 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3487 * the given count with the current block size.
3490 Session::ensure_buffers (ChanCount howmany)
3492 BufferManager::ensure_buffers (howmany);
3496 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3498 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3499 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3504 Session::next_insert_id ()
3506 /* this doesn't really loop forever. just think about it */
3509 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3510 if (!insert_bitset[n]) {
3511 insert_bitset[n] = true;
3517 /* none available, so resize and try again */
3519 insert_bitset.resize (insert_bitset.size() + 16, false);
3524 Session::next_send_id ()
3526 /* this doesn't really loop forever. just think about it */
3529 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3530 if (!send_bitset[n]) {
3531 send_bitset[n] = true;
3537 /* none available, so resize and try again */
3539 send_bitset.resize (send_bitset.size() + 16, false);
3544 Session::next_return_id ()
3546 /* this doesn't really loop forever. just think about it */
3549 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3550 if (!return_bitset[n]) {
3551 return_bitset[n] = true;
3557 /* none available, so resize and try again */
3559 return_bitset.resize (return_bitset.size() + 16, false);
3564 Session::mark_send_id (uint32_t id)
3566 if (id >= send_bitset.size()) {
3567 send_bitset.resize (id+16, false);
3569 if (send_bitset[id]) {
3570 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3572 send_bitset[id] = true;
3576 Session::mark_return_id (uint32_t id)
3578 if (id >= return_bitset.size()) {
3579 return_bitset.resize (id+16, false);
3581 if (return_bitset[id]) {
3582 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3584 return_bitset[id] = true;
3588 Session::mark_insert_id (uint32_t id)
3590 if (id >= insert_bitset.size()) {
3591 insert_bitset.resize (id+16, false);
3593 if (insert_bitset[id]) {
3594 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3596 insert_bitset[id] = true;
3600 Session::unmark_send_id (uint32_t id)
3602 if (id < send_bitset.size()) {
3603 send_bitset[id] = false;
3608 Session::unmark_return_id (uint32_t id)
3610 if (id < return_bitset.size()) {
3611 return_bitset[id] = false;
3616 Session::unmark_insert_id (uint32_t id)
3618 if (id < insert_bitset.size()) {
3619 insert_bitset[id] = false;
3624 /* Named Selection management */
3626 boost::shared_ptr<NamedSelection>
3627 Session::named_selection_by_name (string name)
3629 Glib::Mutex::Lock lm (named_selection_lock);
3630 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
3631 if ((*i)->name == name) {
3635 return boost::shared_ptr<NamedSelection>();
3639 Session::add_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3642 Glib::Mutex::Lock lm (named_selection_lock);
3643 named_selections.insert (named_selections.begin(), named_selection);
3648 NamedSelectionAdded (); /* EMIT SIGNAL */
3652 Session::remove_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3654 bool removed = false;
3657 Glib::Mutex::Lock lm (named_selection_lock);
3659 NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
3661 if (i != named_selections.end()) {
3662 named_selections.erase (i);
3669 NamedSelectionRemoved (); /* EMIT SIGNAL */
3674 Session::reset_native_file_format ()
3676 boost::shared_ptr<RouteList> rl = routes.reader ();
3677 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3678 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3680 /* don't save state as we do this, there's no point
3683 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3684 tr->reset_write_sources (false);
3685 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3691 Session::route_name_unique (string n) const
3693 boost::shared_ptr<RouteList> r = routes.reader ();
3695 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3696 if ((*i)->name() == n) {
3705 Session::route_name_internal (string n) const
3707 if (auditioner && auditioner->name() == n) {
3711 if (_click_io && _click_io->name() == n) {
3719 Session::freeze_all (InterThreadInfo& itt)
3721 boost::shared_ptr<RouteList> r = routes.reader ();
3723 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3725 boost::shared_ptr<Track> t;
3727 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3728 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3738 boost::shared_ptr<Region>
3739 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
3740 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3741 InterThreadInfo& itt, bool enable_processing)
3743 boost::shared_ptr<Region> result;
3744 boost::shared_ptr<Playlist> playlist;
3745 boost::shared_ptr<AudioFileSource> fsource;
3747 char buf[PATH_MAX+1];
3748 ChanCount diskstream_channels (track.n_channels());
3749 framepos_t position;
3750 framecnt_t this_chunk;
3753 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3754 const string sound_dir = sdir.sound_path().to_string();
3755 framepos_t len = end - start;
3756 bool need_block_size_reset = false;
3758 ChanCount const max_proc = track.max_processor_streams ();
3761 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3762 end, start) << endmsg;
3766 const framecnt_t chunk_size = (256 * 1024)/4;
3768 // block all process callback handling
3770 block_processing ();
3772 /* call tree *MUST* hold route_lock */
3774 if ((playlist = track.playlist()) == 0) {
3778 /* external redirects will be a problem */
3780 if (track.has_external_redirects()) {
3784 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3786 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
3788 for (x = 0; x < 99999; ++x) {
3789 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());
3790 if (!Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
3796 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3801 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
3802 SourceFactory::createWritable (DataType::AUDIO, *this, buf, string(), false, frame_rate()));
3805 catch (failed_constructor& err) {
3806 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
3810 srcs.push_back (fsource);
3813 /* tell redirects that care that we are about to use a much larger blocksize */
3815 need_block_size_reset = true;
3816 track.set_block_size (chunk_size);
3818 /* XXX need to flush all redirects */
3823 /* create a set of reasonably-sized buffers */
3824 buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
3825 buffers.set_count (max_proc);
3827 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3828 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3830 afs->prepare_for_peakfile_writes ();
3833 while (to_do && !itt.cancel) {
3835 this_chunk = min (to_do, chunk_size);
3837 if (track.export_stuff (buffers, start, this_chunk, enable_processing)) {
3842 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
3843 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3846 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
3852 start += this_chunk;
3853 to_do -= this_chunk;
3855 itt.progress = (float) (1.0 - ((double) to_do / len));
3864 xnow = localtime (&now);
3866 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3867 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3870 afs->update_header (position, *xnow, now);
3871 afs->flush_header ();
3875 /* construct a region to represent the bounced material */
3879 plist.add (Properties::start, 0);
3880 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
3881 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
3883 result = RegionFactory::create (srcs, plist);
3889 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3890 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3893 afs->mark_for_remove ();
3896 (*src)->drop_references ();
3900 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3901 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3904 afs->done_with_peakfile_writes ();
3909 if (need_block_size_reset) {
3910 track.set_block_size (get_block_size());
3913 unblock_processing ();
3919 Session::gain_automation_buffer() const
3921 return ProcessThread::gain_automation_buffer ();
3925 Session::pan_automation_buffer() const
3927 return ProcessThread::pan_automation_buffer ();
3931 Session::get_silent_buffers (ChanCount count)
3933 return ProcessThread::get_silent_buffers (count);
3937 Session::get_scratch_buffers (ChanCount count)
3939 return ProcessThread::get_scratch_buffers (count);
3943 Session::get_mix_buffers (ChanCount count)
3945 return ProcessThread::get_mix_buffers (count);
3949 Session::ntracks () const
3952 boost::shared_ptr<RouteList> r = routes.reader ();
3954 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3955 if (boost::dynamic_pointer_cast<Track> (*i)) {
3964 Session::nbusses () const
3967 boost::shared_ptr<RouteList> r = routes.reader ();
3969 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3970 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
3979 Session::add_automation_list(AutomationList *al)
3981 automation_lists[al->id()] = al;
3985 Session::sync_order_keys (std::string const & base)
3987 if (deletion_in_progress()) {
3991 if (!Config->get_sync_all_route_ordering()) {
3992 /* leave order keys as they are */
3996 boost::shared_ptr<RouteList> r = routes.reader ();
3998 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3999 (*i)->sync_order_keys (base);
4002 Route::SyncOrderKeys (base); // EMIT SIGNAL
4004 /* this might not do anything */
4006 set_remote_control_ids ();
4009 /** @return true if there is at least one record-enabled track, otherwise false */
4011 Session::have_rec_enabled_track () const
4013 return g_atomic_int_get (&_have_rec_enabled_track) == 1;
4016 /** Update the state of our rec-enabled tracks flag */
4018 Session::update_have_rec_enabled_track ()
4020 boost::shared_ptr<RouteList> rl = routes.reader ();
4021 RouteList::iterator i = rl->begin();
4022 while (i != rl->end ()) {
4024 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4025 if (tr && tr->record_enabled ()) {
4032 int const old = g_atomic_int_get (&_have_rec_enabled_track);
4034 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4036 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4037 RecordStateChanged (); /* EMIT SIGNAL */
4042 Session::listen_position_changed ()
4044 boost::shared_ptr<RouteList> r = routes.reader ();
4046 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4047 (*i)->listen_position_changed ();
4052 Session::solo_control_mode_changed ()
4054 /* cancel all solo or all listen when solo control mode changes */
4057 set_solo (get_routes(), false);
4058 } else if (listening()) {
4059 set_listen (get_routes(), false);
4063 /** Called when a property of one of our route groups changes */
4065 Session::route_group_property_changed (RouteGroup* rg)
4067 RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4070 /** Called when a route is added to one of our route groups */
4072 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4074 RouteAddedToRouteGroup (rg, r);
4077 /** Called when a route is removed from one of our route groups */
4079 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4081 RouteRemovedFromRouteGroup (rg, r);
4085 Session::get_available_sync_options () const
4087 vector<SyncSource> ret;
4089 ret.push_back (JACK);
4090 ret.push_back (MTC);
4091 ret.push_back (MIDIClock);
4096 boost::shared_ptr<RouteList>
4097 Session::get_routes_with_regions_at (framepos_t const p) const
4099 boost::shared_ptr<RouteList> r = routes.reader ();
4100 boost::shared_ptr<RouteList> rl (new RouteList);
4102 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4103 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4108 boost::shared_ptr<Playlist> pl = tr->playlist ();
4113 if (pl->has_region_at (p)) {
4122 Session::goto_end ()
4124 if (_session_range_location) {
4125 request_locate (_session_range_location->end(), false);
4127 request_locate (0, false);
4132 Session::goto_start ()
4134 if (_session_range_location) {
4135 request_locate (_session_range_location->start(), false);
4137 request_locate (0, false);
4142 Session::current_start_frame () const
4144 return _session_range_location ? _session_range_location->start() : 0;
4148 Session::current_end_frame () const
4150 return _session_range_location ? _session_range_location->end() : 0;
4154 Session::add_session_range_location (framepos_t start, framepos_t end)
4156 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4157 _locations->add (_session_range_location);
4160 /** Called when one of our routes' order keys has changed */
4162 Session::route_order_key_changed ()
4164 RouteOrderKeyChanged (); /* EMIT SIGNAL */
4168 Session::step_edit_status_change (bool yn)
4174 send = (_step_editors == 0);
4179 send = (_step_editors == 1);
4182 if (_step_editors > 0) {
4188 StepEditStatusChange (val);
4194 Session::start_time_changed (framepos_t old)
4196 /* Update the auto loop range to match the session range
4197 (unless the auto loop range has been changed by the user)
4200 Location* s = _locations->session_range_location ();
4205 Location* l = _locations->auto_loop_location ();
4207 if (l->start() == old) {
4208 l->set_start (s->start(), true);
4213 Session::end_time_changed (framepos_t old)
4215 /* Update the auto loop range to match the session range
4216 (unless the auto loop range has been changed by the user)
4219 Location* s = _locations->session_range_location ();
4224 Location* l = _locations->auto_loop_location ();
4226 if (l && l->end() == old) {
4227 l->set_end (s->end(), true);
4232 Session::source_search_path (DataType type) const
4236 if (session_dirs.size() == 1) {
4238 case DataType::AUDIO:
4239 s.push_back ( _session_dir->sound_path().to_string());
4241 case DataType::MIDI:
4242 s.push_back (_session_dir->midi_path().to_string());
4246 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4247 SessionDirectory sdir (i->path);
4249 case DataType::AUDIO:
4250 s.push_back (sdir.sound_path().to_string());
4252 case DataType::MIDI:
4253 s.push_back (sdir.midi_path().to_string());
4259 /* now check the explicit (possibly user-specified) search path
4262 vector<string> dirs;
4265 case DataType::AUDIO:
4266 split (config.get_audio_search_path (), dirs, ':');
4268 case DataType::MIDI:
4269 split (config.get_midi_search_path (), dirs, ':');
4273 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4275 vector<string>::iterator si;
4277 for (si = s.begin(); si != s.end(); ++si) {
4283 if (si == s.end()) {
4290 for (vector<string>::iterator si = s.begin(); si != s.end(); ++si) {
4291 if (!search_path.empty()) {
4301 Session::ensure_search_path_includes (const string& path, DataType type)
4304 vector<string> dirs;
4311 case DataType::AUDIO:
4312 search_path = config.get_audio_search_path ();
4314 case DataType::MIDI:
4315 search_path = config.get_midi_search_path ();
4319 split (search_path, dirs, ':');
4321 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4327 if (!search_path.empty()) {
4331 search_path += path;
4334 case DataType::AUDIO:
4335 config.set_audio_search_path (search_path);
4337 case DataType::MIDI:
4338 config.set_midi_search_path (search_path);
4343 boost::shared_ptr<Speakers>
4344 Session::get_speakers()
4350 Session::unknown_processors () const
4354 boost::shared_ptr<RouteList> r = routes.reader ();
4355 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4356 list<string> t = (*i)->unknown_processors ();
4357 copy (t.begin(), t.end(), back_inserter (p));
4367 Session::update_latency (bool playback)
4369 DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
4371 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4375 boost::shared_ptr<RouteList> r = routes.reader ();
4376 framecnt_t max_latency = 0;
4379 /* reverse the list so that we work backwards from the last route to run to the first */
4380 RouteList* rl = routes.reader().get();
4381 r.reset (new RouteList (*rl));
4382 reverse (r->begin(), r->end());
4385 /* compute actual latency values for the given direction and store them all in per-port
4386 structures. this will also publish the same values (to JACK) so that computation of latency
4387 for routes can consistently use public latency values.
4390 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4391 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
4394 /* because we latency compensate playback, our published playback latencies should
4395 be the same for all output ports - all material played back by ardour has
4396 the same latency, whether its caused by plugins or by latency compensation. since
4397 these may differ from the values computed above, reset all playback port latencies
4401 DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
4403 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4404 (*i)->set_public_port_latencies (max_latency, playback);
4409 post_playback_latency ();
4413 post_capture_latency ();
4416 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
4420 Session::post_playback_latency ()
4422 set_worst_playback_latency ();
4424 boost::shared_ptr<RouteList> r = routes.reader ();
4426 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4427 if (!(*i)->is_hidden() && ((*i)->active())) {
4428 _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
4432 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4433 (*i)->set_latency_compensation (_worst_track_latency);
4438 Session::post_capture_latency ()
4440 set_worst_capture_latency ();
4442 /* reflect any changes in capture latencies into capture offsets
4445 boost::shared_ptr<RouteList> rl = routes.reader();
4446 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4447 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4449 tr->set_capture_offset ();
4455 Session::initialize_latencies ()
4458 Glib::Mutex::Lock lm (_engine.process_lock());
4459 update_latency (false);
4460 update_latency (true);
4463 set_worst_io_latencies ();
4467 Session::set_worst_io_latencies ()
4469 set_worst_playback_latency ();
4470 set_worst_capture_latency ();
4474 Session::set_worst_playback_latency ()
4476 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4480 _worst_output_latency = 0;
4482 if (!_engine.connected()) {
4486 boost::shared_ptr<RouteList> r = routes.reader ();
4488 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4489 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
4492 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
4496 Session::set_worst_capture_latency ()
4498 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4502 _worst_input_latency = 0;
4504 if (!_engine.connected()) {
4508 boost::shared_ptr<RouteList> r = routes.reader ();
4510 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4511 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
4514 DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
4518 Session::update_latency_compensation (bool force_whole_graph)
4520 bool some_track_latency_changed = false;
4522 if (_state_of_the_state & (InitialConnecting|Deletion)) {
4526 DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
4528 _worst_track_latency = 0;
4530 boost::shared_ptr<RouteList> r = routes.reader ();
4532 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4533 if (!(*i)->is_hidden() && ((*i)->active())) {
4535 if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
4536 some_track_latency_changed = true;
4538 _worst_track_latency = max (tl, _worst_track_latency);
4542 DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
4543 (some_track_latency_changed ? "yes" : "no")));
4545 DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
4547 if (some_track_latency_changed || force_whole_graph) {
4548 _engine.update_latencies ();
4552 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4553 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4557 tr->set_capture_offset ();
4562 Session::session_name_is_legal (const string& path)
4564 char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
4566 for (int i = 0; illegal_chars[i]; ++i) {
4567 if (path.find (illegal_chars[i]) != string::npos) {
4568 return illegal_chars[i];